Complete RAG Pipeline:Retrieve → Augment → Generate 完整全流程详解

Complete RAG Pipeline:Retrieve → Augment → Generate 完整全流程详解

RAG = Retrieval-Augmented Generation,检索增强生成,用来解决大模型知识过时、幻觉、私有资料无法读取三大痛点。 标准流水线固定三段式:Retrieve(检索)→ Augment(上下文增强)→ Generate(生成回答),结合你上面那段 Python 代码同步讲解。

一、总流程逻辑

用户提问 → 向量数据库召回相关文档片段 → 把文档拼进 Prompt 作为参考上下文 → 交给 LLM 依据参考资料输出答案 核心目的:不让模型凭空编造,所有回答严格依托私有知识库

1. Retrieve 检索阶段(召回资料)

作用

把用户自然语言问题,转换成向量,在向量库中匹配相似度最高的知识库片段,拿到参考素材。

分步执行

  1. Embedding 向量化使用嵌入模型(如 all-MiniLM)将用户问题文本转为浮点向量数组:

    python

    运行

    query_embedding = model.encode(user_question).tolist()
  2. 向量库语义检索(ChromaDB)向向量集合发起查询,返回 Top-N 最相似片段(示例取 3 条)

    python

    运行

    results = collection.query( query_embeddings=[query_embedding], n_results=3 )
    • query_embeddings:接口要求向量数组,单向量需套[]
    • n_results=3:召回 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 生成依托文档的回答,最后附加文档来源引用。

分步执行

  1. 组装 OpenAI 标准对话消息格式

python

运行

messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt} ]
  1. 调用大模型客户端推理

python

运行

response = client_llm.invoke(messages) answer = response.content
  1. 文档来源去重、添加引用标注

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基于给定资料生成通顺、合规、可溯源的回答带引用的最终答案

四、整体优缺点

优势

  1. 支持私有知识库(企业文档、本地文件、内部手册),不依赖模型训练数据
  2. 实时更新资料,无需微调模型,成本低
  3. 大幅降低大模型幻觉,可标注文档来源,便于核对

局限

  1. 检索质量决定最终效果:召回无关文档会误导模型
  2. 存在上下文长度限制,检索过多片段会超出 LLM 窗口上限

五、简易调用演示

python

运行

# 调用整条RAG流水线 result = rag_pipeline("What's the company data storage rule?") print(result)

控制台完整输出流程:

  1. 打印用户问题
  2. 打印检索日志,展示召回的文档名称与章节
  3. 打印上下文构建完成提示
  4. 调用模型生成答案
  5. 输出回答 + 文末引用来源