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 中的 source、page 对应,前端可渲染成可点击链接。
第 5 步:逐步失败诊断
| 现象 | 优先怀疑 |
|---|---|
| 完全答非所问 | chunk 太大 / embedding 不匹配 / K 太小 |
| 说不知道但文档里有 | 索引未更新 / metadata 过滤错了 |
| 有答案无引用 | Prompt 未强制 / metadata 丢失 |
| 引用对但内容错 | 模型归纳错误,需 rerank 或更强模型 |
建立 golden questions 集,每次改 chunk 或 embedding 跑回归(见 7.1 Eval)。
动手练习
- 手写九步流水线,为每步写「输入 / 输出 / 失败信号」三列。
- 用 mock 数据实现 format_hits,输出带 [1][2] 编号与 path 的上下文块。
- 设计 SYS Prompt 三条硬规则:仅基于上下文、不足则拒答、必须带引用。
- 假设 embedding 模型从 A 换到 B,列出必须重做的步骤与可复用的步骤。
- 为一个 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 做逐步诊断。