Complete RAG Pipeline:Retrieve → Augment → Generate 完整全流程详解
Complete RAG Pipeline:Retrieve → Augment → Generate 完整全流程详解
RAG = Retrieval-Augmented Generation,检索增强生成,用来解决大模型知识过时、幻觉、私有资料无法读取三大痛点。 标准流水线固定三段式:Retrieve(检索)→ Augment(上下文增强)→ Generate(生成回答),结合你上面那段 Python 代码同步讲解。
一、总流程逻辑
用户提问 → 向量数据库召回相关文档片段 → 把文档拼进 Prompt 作为参考上下文 → 交给 LLM 依据参考资料输出答案 核心目的:不让模型凭空编造,所有回答严格依托私有知识库。
1. Retrieve 检索阶段(召回资料)
作用
把用户自然语言问题,转换成向量,在向量库中匹配相似度最高的知识库片段,拿到参考素材。
分步执行
- Embedding 向量化使用嵌入模型(如 all-MiniLM)将用户问题文本转为浮点向量数组:
python
运行
query_embedding = model.encode(user_question).tolist() - 向量库语义检索(ChromaDB)向向量集合发起查询,返回 Top-N 最相似片段(示例取 3 条)
python
运行
results = collection.query( query_embeddings=[query_embedding], n_results=3 )query_embeddings:接口要求向量数组,单向量需套[]n_results=3:召回 3 段相关性最高的文档块
- 分离文本与元数据
python
运行
retrieved_chunks = results['documents'][0] # 检索到的文本内容 metadatas = results['metadatas'][0] # 文档来源、章节等信息
阶段产出
若干段和用户问题强相关的知识库文本 + 每段文档的来源标记(用于文末引用)
2. Augment 上下文增强阶段(构造限定 Prompt)
作用
把上一步检索到的文档,格式化拼接进提示词,给大模型提供专属参考上下文,同时设置规则约束模型输出。
两步构成:System Prompt + User Prompt
(1)System Prompt 系统指令(全局约束规则)
固定规则,全程控制模型行为:
python
运行
system_prompt = """You are TechCorp's helpful AI assistant. Answer ONLY based on the provided context. If the answer is not in the context, say: 'I don't have that information in the provided documents.'"""核心约束:
- 仅能使用下文给出的文档作答
- 无对应信息禁止编造,统一固定话术回复,杜绝幻觉
(2)拼接上下文文本
标准化格式化检索片段,区分不同文档,方便模型阅读:
python
运行
context_text = "Context from TechCorp documents:\n\n" for i, chunk in enumerate(retrieved_chunks, 1): context_text += f"[Document {i}]\n{chunk}\n\n"输出格式示例:
plaintext
Context from TechCorp documents: [Document 1] 员工数据安全规范... [Document 2] 公司存储权限规则...(3)组装完整用户输入 Prompt
把上下文、用户原始问题合并,引导模型输出答案:
python
运行
user_prompt = f"{context_text}\nQuestion: {user_question}\n\nAnswer:"阶段产出
一套完整、带私有知识库参考、带行为约束的对话 Prompt
3. Generate 生成阶段(调用大模型输出答案)
作用
将 system + user 两段提示词封装为标准对话消息,调用 LLM 生成依托文档的回答,最后附加文档来源引用。
分步执行
- 组装 OpenAI 标准对话消息格式
python
运行
messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ]- 调用大模型客户端推理
python
运行
response = client_llm.invoke(messages) answer = response.content- 文档来源去重、添加引用标注
python
运行
sources = [meta['source'] for meta in metadatas] unique_sources = list(set(sources)) # set自动去重 final_response = f"{answer}\n\n📎 Sources: {', '.join(unique_sources)}"阶段产出
最终完整回答:模型答案 + 参考文档来源列表,方便溯源校验
三、三段式流水线核心价值对比
表格
| 阶段 | 解决什么问题 | 关键输出 |
|---|---|---|
| Retrieve | 海量知识库快速找到和问题相关内容,降低上下文长度 | 相关文档片段 chunks |
| Augment | 规范输入格式、约束模型,强制模型以知识库为依据 | 带参考资料的完整 Prompt |
| Generate | 基于给定资料生成通顺、合规、可溯源的回答 | 带引用的最终答案 |
四、整体优缺点
优势
- 支持私有知识库(企业文档、本地文件、内部手册),不依赖模型训练数据
- 实时更新资料,无需微调模型,成本低
- 大幅降低大模型幻觉,可标注文档来源,便于核对
局限
- 检索质量决定最终效果:召回无关文档会误导模型
- 存在上下文长度限制,检索过多片段会超出 LLM 窗口上限
五、简易调用演示
python
运行
# 调用整条RAG流水线 result = rag_pipeline("What's the company data storage rule?") print(result)控制台完整输出流程:
- 打印用户问题
- 打印检索日志,展示召回的文档名称与章节
- 打印上下文构建完成提示
- 调用模型生成答案
- 输出回答 + 文末引用来源
