Skip to content

RAG 标准流程

🎯 学习目标

  • 复述 RAG 离线索引与在线查询两条路径
  • 理解各步骤的输入输出与常见失败点
  • 能搭建最小可运行的端到端 Demo 蓝图
  • 知道引用 metadata 应从哪一步开始保留

引言

标准 RAG 流水线看起来是线性九步,实则是一条数据契约链:每一步输出都是下一步的输入,metadata 丢得越早,后面越难做引用与过滤。我们逐步走通这条链。

章节正文

第 1 步:离线索引路径

text
原始文档
  → Loader(转 Document)
  → Splitter(chunk + metadata)
  → Embedding(向量)
  → Vector Store(持久化 + 索引)

离线任务应可重跑、可增量:文档变更时只 re-index 受影响文件,而非 nightly 全量重建(视规模而定)。

第 2 步:在线查询路径

text
用户问题
  → Query Embedding(同模型)
  → Retrieval Top-K(相似度 / Hybrid)
  → Context 拼装(排序、去重、截断)
  → Prompt 注入
  → LLM 生成
  → 返回答案 + source 引用

在线路径延迟 = Embedding + 检索 + LLM。优化时常先 profiling 检索是否瓶颈(K 过大、无索引)。

第 3 步:最小 Python 蓝图(结构示意)

python
# 离线
docs = load_documents("./data")
chunks = split_documents(docs, chunk_size=512, overlap=64)
vectors = embed_texts([c.page_content for c in chunks])
vector_store.upsert(chunks, vectors)

# 在线
query_vec = embed_query(user_question)
hits = vector_store.search(query_vec, top_k=5)
context = format_hits(hits)
answer = llm.generate(system=SYS, user=f"上下文:\n{context}\n\n问题:{user_question}")
return {"answer": answer, "sources": [h.metadata for h in hits]}

同一 embedding 模型用于文档与 query;换模型通常需 re-embed 全库

第 4 步:Prompt 注入与引用约束

text
你是企业知识助手。仅根据以下「参考资料」回答;资料不足时明确说不知道,不要编造。
每条结论后标注来源编号,如 [1]。

参考资料:
[1] (path: policies/expense-2025.md) ...
[2] (path: faq/travel.md) ...

引用编号与 metadata 中的 sourcepage 对应,前端可渲染成可点击链接。

第 5 步:逐步失败诊断

现象优先怀疑
完全答非所问chunk 太大 / embedding 不匹配 / K 太小
说不知道但文档里有索引未更新 / metadata 过滤错了
有答案无引用Prompt 未强制 / metadata 丢失
引用对但内容错模型归纳错误,需 rerank 或更强模型

建立 golden questions 集,每次改 chunk 或 embedding 跑回归(见 7.1 Eval)。

动手练习

  1. 手写九步流水线,为每步写「输入 / 输出 / 失败信号」三列。
  2. 用 mock 数据实现 format_hits,输出带 [1][2] 编号与 path 的上下文块。
  3. 设计 SYS Prompt 三条硬规则:仅基于上下文、不足则拒答、必须带引用。
  4. 假设 embedding 模型从 A 换到 B,列出必须重做的步骤与可复用的步骤。
  5. 为一个 golden question 写期望引用的 source 路径,供后续自动化测试使用。

常见问题

Q:Top-K 设多少合适?

常见 3–8。K 太小易漏召回;K 太大噪声多且占窗口。应结合 rerank(4.6)与窗口预算 A/B 测试。

Q:要先 rerank 再进 LLM 吗?

检索量大或精度要求高时,先召回较大 K(如 20),rerank 到 5 再注入,通常比直接 K=5 向量检索更准,但增加延迟与成本。

Q:离线和在线能用不同语言框架吗?

可以,但向量维度、距离度量、metadata schema 必须一致。更常见是统一栈(如 Python + 同一 vector store client)降低集成错误。

本节小结

标准 RAG = 离线建索引 + 在线检索增强生成。metadata 从 Loader 起就要保留;Prompt 要强约束引用与拒答;用 golden set 做逐步诊断。