RETRIEVAL-AUGMENTED GENERATION · 01
理解为什么需要 RAG、标准工作流程、完整数据流以及它与 LangChain 的关系。
- RAG
- LangChain
本文目录
RAG 基础原理与完整流程
适合零基础复习。本篇只整理今天已经学习的内容:RAG 基础、LangChain 的定位、Models、消息、多轮对话、
invoke()、Prompt Template、Zero-shot,以及最基础的 Chain/LCEL。
学习边界:本文不讲 Few-shot 的实现代码,也不展开后续 RAG 模块。
一、今天的知识地图
大模型的局限
↓
为什么需要 RAG
↓
RAG 的标准流程
↓
为什么常用 LangChain 组织流程
↓
Models:LLM / Chat Model / Embedding Model
↓
Messages 与多轮对话
↓
Prompt 与 PromptTemplate
↓
Zero-shot
↓
prompt | llm → Chain(LCEL)
二、为什么需要 RAG?
2.1 普通大模型的三个常见局限
把普通大模型想象成一个正在“闭卷考试”的人。它很聪明,但可能遇到三个问题:
- 不了解私有知识:例如公司制度、内部文档、个人资料通常不在训练数据里。
- 知识可能过时:模型训练时掌握的知识存在时间边界。
- 可能产生幻觉:不知道答案时,模型仍可能生成看似合理但并不真实的内容。
例如,直接问模型:
我们公司的年假申请流程是什么?
模型没有看过公司的内部制度,无法可靠回答。
2.2 RAG 的核心思想
RAG 全称:
Retrieval-Augmented Generation,检索增强生成。
一句话理解:
先查资料,再让大模型根据查到的资料回答。
用户问题
↓
从知识库检索相关资料
↓
把“资料 + 问题”交给大模型
↓
大模型基于资料生成答案
RAG 相当于给大模型提供了一场“开卷考试”。检索到的资料是本次回答使用的参考材料。
2.3 RAG 没有修改模型参数
RAG 通常不是重新训练模型,也不是“优化模型参数”。它是在模型生成答案前,动态提供相关上下文。
正确表达:
把检索到的上下文和用户问题一起交给大模型,由大模型生成答案。
三、RAG 的标准流程
RAG 可以分成两个阶段:知识库准备阶段和问答阶段。
3.1 知识库准备阶段
原始文档(PDF / Word / TXT 等)
↓
文档读取
↓
文本清洗 / 处理
↓
文本切块 Chunk
↓
Embedding 文本向量化
↓
存入向量数据库
为什么要切块?一份文档可能很长,既不适合整篇交给模型,也不利于精确检索。切成多个较小的 Chunk 后,可以找出与问题最相关的片段。
为什么要向量化?Embedding Model 会把文本转换成向量,使计算机能够比较文本之间的语义相似度。
3.2 用户问答阶段
用户提出问题
↓
问题 Embedding 向量化
↓
在向量数据库中进行语义相似度检索
↓
召回最相关的若干 Chunk
↓
把“相关 Chunk + 用户问题”填入 Prompt
↓
交给大模型生成答案
↓
返回结果
3.3 完整数据流
flowchart TD
A[原始文档] --> B[文档读取]
B --> C[清洗与处理]
C --> D[文本切块 Chunk]
D --> E[Embedding 向量化]
E --> F[向量数据库]
Q[用户问题] --> G[问题向量化]
G --> F
F --> H[相似度检索]
H --> I[相关文本 Chunk]
Q --> J[Prompt Template]
I --> J
J --> K[完整 Prompt]
K --> L[LLM / Chat Model]
L --> M[最终答案]
四、为什么 RAG 项目常用 LangChain?
一个完整 RAG 项目涉及很多环节:
Loader → Splitter → Embedding → Vector Store
→ Retriever → Prompt → Model → Output
如果不用框架,也完全可以自己调用 PDF 解析库、Embedding API、向量数据库 API 和大模型 API,再手动编写连接逻辑。但组件越多,代码越容易与具体厂商的接口耦合。
LangChain 的价值在于:
- 为常见组件提供相对统一的抽象和调用方式;
- 帮助组织不同组件之间的数据流;
- 方便把多个步骤组合成完整工作流;
- 降低更换模型、Embedding 或向量数据库时的耦合。
注意:“降低耦合”不等于所有组件都能无成本地一行替换。不同服务仍可能有自己的参数和特性。
4.1 RAG 与 LangChain 的关系
RAG:一种技术架构思想
LangChain:实现大模型应用的一种开发框架
RAG 并不依赖 LangChain:
RAG
├── 自己用 Python 实现
├── 使用 LangChain 实现
├── 使用 LlamaIndex 等其他框架实现
└── 使用其他技术组合实现
所以:
RAG ≠ LangChain。LangChain 可以帮助我们更方便地实现 RAG。