要做一个知识库问答(RAG),离线建库 + 在线检索各环节怎么落地、有哪些坑?本指南把 RAG 全系列概念页(RAG、RAG运转流程 及 6+4 各环节)整合成一份端到端 checklist:离线 6 环节 + 在线 4 环节,每环节给"PM 要确认什么 + 常见坑 + 验收点",不新增方法。
一句话心法:离线决定上限(一次性投入,质量越高线上 badcase 越少),在线决定单次延迟与成本;二者靠同一个 Embedding 模型对齐。
适用场景
| 适合 | 不适合 |
|---|---|
| 做知识库问答 / 企业文档助手 / 智能客服(基于私有资料) | 验证"模型能不能做"的早期摸底 → 用 POC验证操作指南 |
| 已确定用 RAG 架构,要把各环节落地 | 纯靠模型自身知识、无需外挂资料的场景 |
| 上线后 badcase 多,要逐环节排查是哪一步出问题 | 要改模型本身能力 → 走微调,不在本指南范围 |
核心原则:RAG 是"垃圾进、垃圾出"——检索质量直接决定回答质量,90% 取决于知识库质量。
步骤总览
| 阶段 | # | 环节 | 一句话作用 | 对应概念页 |
|---|---|---|---|---|
| 离线 | 1 | 数据采集 | 圈定知识边界,按所有权采集 | RAG数据采集 |
| 离线 | 2 | 文档解析 | 非机器可读格式 → 可处理文本 | RAG文档解析 |
| 离线 | 3 | 数据清洗 | 删冗余、改写、标准化、脱敏 | RAG数据清洗与文本分割 |
| 离线 | 4 | 文本分割 | 切成语义完整、长度适配的 chunk | RAG数据清洗与文本分割 |
| 离线 | 5 | 文本向量化 | embedding 模型把 chunk 转向量 | RAG向量化与索引 |
| 离线 | 6 | 向量索引构建 | 建可高效检索的索引 | RAG向量化与索引 |
| 在线 | 7 | Query 改写 | 把"人话"翻成精准检索词 | Query增强与改写 |
| 在线 | 8 | 召回检索 | 多路召回 + 合并去重 | RAG检索-组装-生成 |
| 在线 | 9 | 重排 | 复杂模型重新打分,漏斗收窄 | RAG检索-组装-生成 |
| 在线 | 10 | 组装生成 | 拼 Prompt + 模型生成 + 后处理 | RAG检索-组装-生成 |
前置准备
- 业务场景已明确(这个问答助手服务谁、回答什么类型的问题)
- 业务方愿意提供核心数据源,并能配合专家抽样校验
- 法务可对接(公开/付费数据的版权与合规)
- 已选定一个 Embedding 模型,并约定离线与在线用同一个
离线建库(6 环节,一次性 + 增量更新)
环节 1:数据采集
PM 要确认:
- 知识边界——只采与业务场景强相关的数据(无关数据进库只会拉低召回质量)
- 数据来源三分法:企业内部(历史文档/业务系统/在线知识库/FAQ/邮件)、外网公开(爬虫/API/公开数据集)、付费外采(行业报告/专业数据库)
- 接入方式:文件类 / 数据库(增量拉取靠时间戳或 CDC)/ API(认证、限流、重试、幂等去重)
- 元数据强制:每条记录来源 ID、采集时间、所有权类型,为检索过滤、答案引用、合规审计兜底
常见坑:
- 贪多采无关数据 → 噪声拉低召回
- 不记元数据 → 后续没法做权限过滤、答案没法溯源
- 公开网页数据没过法务 → 版权风险
验收点:
- 知识边界与业务场景对齐,无明显噪声源
- 每条数据带来源 ID / 采集时间 / 所有权类型
- 公开 / 付费数据版权已过法务
环节 2:文档解析
PM 要确认:
- 目标:完整提取内容并保留基础结构(表格行列关系、章节层级)
- 按文档类型定提取重点:PDF(多栏排版、阅读顺序,扫描版需 OCR)、Word(标题层级/表格)、PPT(多文本框)、HTML(去标签去广告)、扫描件(OCR)
- 复杂排版阅读顺序方案选型:版面分析+规则排序(快、但难处理混排)vs 按顺序生成文本(处理纯文字好、但慢)
- 定保真度优先级:哪些结构必须保留(表格行列、章节层级),哪些可丢(页眉页脚)
- 与算法侧定义"解析失败"判定标准 + 人工处理流程
常见坑:
- 多栏 PDF 按行读取 → 阅读顺序错乱
- 扫描件没上 OCR → 内容丢失
- 表格被拍扁成乱序文本 → 行列关系丢失
验收点:
- 表格行列、章节层级等关键结构已保留
- 扫描件 / 图片走了 OCR
- "解析失败"判定标准 + 人工兜底流程已定
环节 3:数据清洗
PM 要确认(核心原则:保留语义核心,剔除无关信息):
- 清洗 4 项:删冗余(页眉页码/重复段落)、内容改写(错别字/语法/补全缩略语)、格式标准化(UTF-8、日期、表格转"表头:内容"、公式转 LaTeX)、敏感信息过滤(身份证/手机号/密码脱敏)
- 质量校验三件套:自动校验(解析后文本长度 ≥ 原文 90%、表格列数一致)、人工抽样(专业术语/公式/特殊符号,比例 ≥ 3%、专业文档 ≥ 10%,业务专家参与)、异常处理(模糊图片/加密文档触发人工干预)
常见坑:
- 不脱敏 PII → 合规风险,敏感信息进库被检索出来
- 不做专家抽样 → 专业术语解析错没人发现
- 清洗过度把语义核心也删了
验收点:
- PII 已脱敏
- 自动校验通过(文本长度 ≥ 90%、表格列数一致)
- 专家抽样比例达标(≥3%,专业文档 ≥10%)
环节 4:文本分割(Chunking)
PM 要确认(核心:语义边界优先,长度适配模型):
- 三要点:语义完整性(按段落/章节/句子等自然边界,别把"结论"和"论证"拆开)、长度适配(中文一般 300-800 字,按业务调整;客服 FAQ 配 Sentence-BERT 约 150-250 字)、重叠窗口(相邻 chunk 设 10%-20% 重叠,优先保留上下文衔接句)
- 选分块策略:固定长度 / 语义感知 / 文档结构 / 关键词主题 / 多粒度 / 混合分块
- 复杂文档优先多级切分:先按章节/标题切大块,再按语义切子块(章/节/句三级),缓解"一套规则只适配一种格式、参数敏感、易截断"的问题
- 定 chunk 元数据核心字段;推动建立"分割规则按检索反馈迭代"的机制
常见坑:
- 纯按字数硬切 → 语义被截断、信息不完整
- 一套规则套所有文档 → 格式一变就崩
- 没设重叠窗口 → 跨 chunk 的上下文丢失
验收点:
- chunk 长度匹配所选 embedding 模型输入限制
- 设了 10%-20% 重叠窗口
- 复杂文档用了多级 / 混合分块,抽查无语义截断
环节 5:文本向量化
PM 要确认:
- 选 embedding 模型(常用 BGE / M3E / OpenAI text-embedding-3 / Sentence-BERT),评估效果与成本,输出选型建议
- 相似度度量:RAG 主流用余弦相似度(只看方向不看长度)
- 关键铁律:在线 Query 端必须用与离线分块完全一致的 embedding 模型,否则距离不可比
- 制定向量质量监控指标(相似度、稳定性)
常见坑:
- 离线和在线用了不同 embedding 模型 → 检索距离不可比,召回全乱(最隐蔽的坑)
- 只看效果不算成本 → 大库向量化成本失控
验收点:
- embedding 模型已选型,效果 / 成本有依据
- 离线在线锁定同一模型
- 向量质量监控指标已定
环节 6:向量索引构建
PM 要确认:
- 按业务需求(检索速度 / 精度 / 数据量 / 部署成本)选索引:树状(低维、精度高)、哈希 LSH(快、省、精度低有漏检)、图索引 HNSW(速度精度兼顾,RAG 主流,Milvus/Pinecone 默认)、聚类 K-Means(千万级超大规模)、关键词倒排(字面匹配)
- 存储常混合:向量库(Milvus/Pinecone/Weaviate/FAISS)做语义模糊匹配 + 关系库(MySQL/PG)存元数据做精确过滤(时间/权限)
- 定索引参数调优评估标准;协调索引构建期的业务中断风险
常见坑:
- 超大规模还用树状索引 → 高维检索效率塌方
- 只建向量库不留元数据库 → 没法按权限/时间过滤
- 索引参数没评估标准 → 调优凭感觉
验收点:
- 索引类型与数据规模 / 速度精度需求匹配(默认优先 HNSW)
- 向量库 + 元数据库混合方案已定(支持过滤)
- 索引参数调优有评估标准
在线检索生成(4 环节,每次用户提问触发)
环节 7:Query 改写
PM 要确认(是决定召回上限的第一道关口):
- Query 向量化 6 动作:接收原始 Query → 清洗(去符号/emoji)→ 多轮上下文融合 → Query 增强 → 调 embedding(同离线模型)→ 缓存命中
- Query 增强 6 方法按需选:语义强化、歧义消解、上下文补全、意图拆解、领域术语适配、约束条件强化
- 改写路线选型:seq2seq(快、效果一般,适合高 QPS/延迟敏感)vs Few-Shot+CoT(准、慢且贵,适合高客单价/准确率优先);多数工业场景混合:seq2seq 兜底 + 关键 Query 用 LLM 改写
常见坑:
- 多轮对话不做上下文补全 → "明天呢?"这类省略 Query 检索失败
- 一词多义不消歧 → "Java 怎么泡"检索方向跑偏
- 不做缓存 → 高频 Query 重复跑全链路,浪费延迟和成本
验收点:
- 多轮场景做了上下文补全
- 改写路线与 QPS / 客单价匹配
- 高频 Query 走了缓存
环节 8:召回检索
PM 要确认:
- 检索策略:纯向量 / 关键词 BM25 / 混合(向量召回 + 关键词召回并行,结果融合)
- 复杂 Query 用多重查询(派生近邻子查询)或查询分解(拆独立子问题分别检索再融合)
- 多路召回结果用哈希表合并去重:键=文档唯一标识,值=整合信息(得分/内容/召回路径/是否多路命中)
- 明确检索目标(搜什么、怎么算成功),制定质量标准(如召回率 ≥ 90%、准确率 ≥ 85%)
常见坑:
- 只用纯向量、漏掉关键词路 → 精确名词/编号类查询召回差
- 多路召回不去重 → 同一文档重复占满上下文预算
- 没定召回率/准确率验收线 → 检索好坏说不清
验收点:
- 检索策略明确(推荐混合检索)
- 多路结果用哈希表合并去重
- 召回率 / 准确率有量化验收线
环节 9:重排
PM 要确认(重排序漏斗是工程降本核心):
- 漏斗分层:ALL Item(百万/千万级)→ 快速筛选→ 召回(万级)→ 轻量模型→ 粗排(千级)→ 复杂模型→ 精排(八十级)→ 后处理→ TOP 5-10
- 每层用复杂度递增的模型,越往后越精越贵,靠前置层先砍候选量
- 降本可用二级片段法:chunk 切三级,先检索二级片段,若 Top-K 中超 n 个属同一一级片段则用一级片段替换(拿主题完整语义),独立二级片段不输出
常见坑:
- 不做重排,直接拿向量 Top-K 当最终结果 → 相关性不够、精排缺失
- 漏斗层级设计不合理,前置层没砍量 → 精排模型在海量候选上跑,成本爆炸
验收点:
- 召回→粗排→精排漏斗已分层,模型复杂度递增
- 最终输出收窄到 TOP 5-10
- 评估过是否需要二级片段法降本
环节 10:组装生成
PM 要确认——分组装、生成、后处理三段:
① 上下文组装(3 动作):
- 整理 chunks:去重、阈值过滤(如相似度 <0.78 丢弃)、截断(按预算保前 N)、多样性控制(同文档最多保 N 个,避免单一来源)、重新分配 ID(chunk_142 → [doc-1])
- 加载 Prompt 模板 5 段:System Prompt(角色+规则+风格)、Reference Context([doc-N] 含来源)、Conversation History(最近 N 轮 / N 轮+更早摘要)、User Query(用分隔符+角色锁定,防 prompt 注入)、Output Format(自然语言 或 JSON:answer/citations/confidence/need_human_followup)
- 注入兜底策略:资料不足时明确回复"无法判断、建议联系 XX",禁止用预训练知识猜测
② 生成:
- 模型路由(route_model):空召回用小模型、要计算用大模型+Tool、多轮 follow-up 用中等模型、召回多+问题复杂用大模型
- 参数:temperature=0.1(保事实稳定)、max_tokens=800、stream=True、top_p=0.9
- 流式 4 要点:首字延迟 <1s(核心指标)、中断处理(用户关页面要优雅取消停止烧 token)、错误处理(流到一半挂了提示重试)、完整性校验(JSON 能否 parse)
③ 后处理 4 步:引用关联([doc-N] → 可点击链接 + hover 预览原文)、Markdown 渲染、敏感词/PII 过滤(扫手机号/身份证/薪资)、格式校验(JSON 不能 parse 走兜底重试/降级)
常见坑:
- 没写兜底策略 → 资料不足时模型用预训练知识硬编,幻觉
- 所有 Query 一律用大模型 → 成本高、延迟大(该用路由)
- temperature 设高 → 事实性回答不稳定
- 不做引用关联 → 答案没法溯源,用户不信
- 不过 PII 过滤 → 答案里意外暴露隐私
验收点:
- chunks 经去重 / 阈值过滤 / 多样性控制 / 重分配 ID
- Prompt 含 5 段结构 + 兜底策略
- 模型走路由,temperature 低、流式开
- 首字延迟 <1s
- 后处理做了引用关联 + PII 过滤 + 格式校验
RAG 落地检查表(可复制总表)
# RAG 落地检查表:[项目名称]
## 离线建库
[环节1 采集] □ 知识边界对齐 □ 元数据(来源ID/时间/所有权) □ 版权过法务
[环节2 解析] □ 关键结构保留 □ 扫描件OCR □ 解析失败兜底流程
[环节3 清洗] □ PII脱敏 □ 文本长度≥90%校验 □ 专家抽样≥3%(专业≥10%)
[环节4 分割] □ 长度适配模型 □ 10-20%重叠窗口 □ 复杂文档多级切分
[环节5 向量化] □ embedding选型(效果/成本) □ 离线在线同一模型 □ 向量质量监控
[环节6 索引] □ 索引类型匹配规模(默认HNSW) □ 向量库+元数据库混合 □ 调优评估标准
## 在线检索生成
[环节7 Query] □ 多轮上下文补全 □ 改写路线匹配QPS/客单价 □ 高频缓存
[环节8 召回] □ 混合检索策略 □ 哈希表合并去重 □ 召回率/准确率验收线
[环节9 重排] □ 召回-粗排-精排漏斗 □ 收窄TOP5-10 □ 评估二级片段法降本
[环节10 生成] □ chunks整理(去重/过滤/多样性/重ID) □ Prompt5段+兜底
□ 模型路由 □ temperature低+流式 □ 首字延迟<1s
□ 后处理(引用关联+PII过滤+格式校验)
## 全局对齐
□ 离线在线锁定同一 embedding 模型(最易忽略的致命坑)
□ 数据全程带元数据,答案可溯源
□ 资料不足有兜底,不用预训练知识硬编
常见坑(全局汇总)
| 坑 | 后果 | 规避 |
|---|---|---|
| 离线/在线 embedding 模型不一致 | 向量距离不可比,召回全乱 | 全局锁定同一模型 |
| 采集贪多、不记元数据 | 噪声拉低召回、答案没法溯源 | 只采强相关 + 强制元数据 |
| Chunking 纯按字数硬切 | 语义截断、信息不完整 | 语义边界优先 + 重叠窗口 + 多级切分 |
| 不做重排漏斗 | 相关性差或精排成本爆炸 | 召回-粗排-精排复杂度递增漏斗 |
| 没写兜底策略 | 资料不足时模型幻觉硬编 | Prompt 强制"资料不足就明说,禁止猜" |
| 不做引用关联 | 答案不可溯源,用户不信 | 后处理把 [doc-N] 关联回原文 |
完成检查清单
建库前:
- 业务场景与知识边界已明确
- embedding 模型已选定,离线在线统一
- 法务、业务专家已对接
上线前:
- 离线 6 环节验收点全过
- 在线 4 环节验收点全过
- 召回率 / 准确率达到验收线
- 首字延迟 <1s,兜底策略 + 引用溯源到位
- 全局对齐三项(同模型 / 带元数据 / 有兜底)确认
相关页面
→ RAG(RAG 是什么、解决截断/未知/幻觉三类问题) → RAG运转流程(四阶段 + 10 Pipeline 全景) → RAG数据采集(环节 1) → RAG文档解析(环节 2) → RAG数据清洗与文本分割(环节 3+4) → RAG向量化与索引(环节 5+6) → Query增强与改写(环节 7) → RAG检索-组装-生成(环节 8+9+10)