很多团队在构建 RAG(检索增强生成)系统时,容易陷入一个简单的误区:将文档丢进向量数据库,把用户问题向量化后检索出 topK 结果,然后直接拼接到提示词里让大模型回答。
上线后,却频频遇到以下典型问题:
- “明明知识库里有相关内容,但模型就是答不出来。”——这是召回失败。
- “检索到了相关段落,但回答还是胡编乱造。”——可能是生成未被证据约束或证据噪声过大。
- “模型引用了一堆段落,但仔细看都不相关。”——说明相似度不等于相关性,可能分块不合理或缺少重排。
- “系统效果时好时坏,不稳定。”——问题可能出在查询改写、topK值、分块策略或嵌入模型本身。
先说结论:一个健壮的 RAG 系统是一条包含 4 段核心的检索-生成链路,每一段都有可观测、可优化的指标。效果不佳时,首要任务是定位问题究竟出在哪一段。
1. RAG 的第一性原理:为何有效?
纯大模型回答如同“闭卷考试”,它仅依赖训练时存储在参数中的记忆进行概率生成。当缺乏确切知识时,模型倾向于“补全”,从而产生幻觉。
RAG 则将答题过程转变为“开卷考试”。它首先从外部知识库中检索相关信息,并将其作为上下文注入到模型中,使模型的回答严格条件化于提供的证据。
从工程视角看,RAG 的核心价值不在于让模型“更聪明”,而在于将真值来源外置。这使得输出更加可控、可验证(能够引用具体来源、可追溯),极大地提升了可信度。
2. RAG 的四段核心链路:分块 → 召回 → 重排 → 生成
将系统拆解为以下四个阶段,才能进行针对性优化,而非盲目调整提示词。
2.1 Chunk:分块与索引
- 输入:原始文档(如 PDF、网页、Markdown、数据库导出)。
- 输出:分块列表,每个块应包含 id、来源、时间、权限、内容等元数据。
- 常见误区:
- 分块过大:导致召回不精准,且可能超出上下文窗口限制。
- 分块过小:造成语义断裂,回答复杂问题时需要跨多个块拼接信息。
- 丢失文档结构:标题、小节、表格等信息丢失,导致检索到的证据难以直接利用。
- 经验起点(供参考):
- 以“语义段落”为单位进行分块,每块约 200-500 个 tokens,块间重叠 50-100 个 tokens。
- 分块元数据必须包含:
doc_id, section, updated_at, ACL, source_url。
2.2 Retrieve:召回(向量/关键词/混合)
- 目标:找出所有“可能相关”的证据,宁可多一点,后续再筛选(优先追求高召回率)。
- 典型策略:
- 向量检索(语义相似度)
- BM25(关键词匹配)
- 混合检索(结合两者,通常是效果最佳的选择)
2.3 Rerank:重排(将最相关的放在前面)
向量相似度高,并不完全等同于与当前问题的相关性高。重排器(如 cross-encoder 模型或专用的重排大模型)会对召回阶段得到的 topK 个候选片段进行重新打分和排序,最终选出最相关的 topN 个片段进入生成上下文。
- 工程收益:
- 使生成上下文更“干净”,减少噪声导致模型胡编的概率。
- 在有限的上下文 Token 预算内,提升“有效证据的密度”。
2.4 Generate:生成(基于证据回答并引用)
这一阶段你应当建立明确的“输出契约”,例如结构化输出、引用校验,以及定义好回答、追问、拒答等动作。
生成阶段最常见的失败原因不是模型“不会写”,而是:
- 证据中根本没有答案,却强制模型必须回答(导致编造)。
- 证据之间存在冲突,但未要求模型指出这种不确定性。
- 缺乏引用校验机制,产生“虚假引用”。
3. 每段链路的核心量化指标
要让工程团队持续投入优化,必须将“效果”转化为可测量的指标。建议从以下最小指标集开始:
3.1 Chunk 指标
avg_chunk_tokens / p95_chunk_tokens:衡量分块大小。
chunk_coverage:分块能否覆盖常见问题(需抽样人工评估)。
structure_retention_rate:标题、表格等关键结构是否被保留(抽样评估)。
3.2 Retrieve 指标(离线评测的关键)
需要一个小规模的人工标注集:(query, relevant_chunk_ids),几十到几百条即可起步。
Recall@K:相关的分块是否出现在检索结果的 topK 中(最重要)。
MRR@K:第一个相关分块排名的倒数平均值,衡量排名靠前程度。
No-hit rate:topK 结果中完全不相关的比例。
3.3 Rerank 指标
nDCG@N 或更简单的 Precision@N。
evidence_density:最终进入上下文的 topN 个分块中,真正相关的比例。
3.4 Generate 指标(线上最实用)
citation_success_rate:模型给出的引用是否能在 evidence 中准确定位(子串匹配或偏移量)。
grounded_answer_rate:回答是否能被所提供的引用支撑(抽样人工或 LLM-as-judge 评估)。
ask_clarify_rate:模型发起追问的比例(过高可能意味着检索不足,过低可能意味着爱编造)。
fallback_rate:转人工或拒答的比例。
- 成本与体验:
avg_tokens(消耗), p95_latency(延迟)。
核心理念:RAG 的多数问题往往不在于“生成”阶段,而在于“Recall@K 不够高”。
4. RAG 效果排障指南
当 RAG 效果不佳时,可以按以下顺序排查,命中率很高:
Step 1:先判定是“召回问题”还是“生成问题”
抽取 20-30 条失败样本,问一个关键问题:“正确答案所在的 chunk 是否出现在检索结果的 topK 中?”
- 如果不在:优先修复 Retrieve(召回)或 Chunk(分块)阶段(别急着折腾 prompt)。
- 如果在:再检查 Rerank(重排)或 Generate(生成)阶段。
Step 2:召回不全(Recall@K 低)
优先检查:
- 分块是否切坏:答案是否跨越了多个分块?表格是否被打散?章节标题是否丢失?
- 查询表述问题:用户 query 是否与文档用词偏离?是否需要 query rewrite 或引入混合检索?
- 嵌入模型是否适配:当前 embedding 模型是否适用于你的语料(如中英混杂、专业术语)?
- K 值是否过小:先将 K 值调大,验证系统的召回上限。
- 过滤条件是否误杀:ACL、时间、文档类型等过滤条件是否排除了相关文档?
快速修复路线:
- 采用混合检索(BM25 + 向量)。
- 增加查询改写(Query Rewrite)模块,将口语化问题改写为更利于检索的形式。
- 调整分块策略(尝试语义分段并增加重叠区域)。
Step 3:召回到了但不相关(Precision 低,噪声大)
优先检查:
- 分块过大导致“沾边就进来”。
- 语料中重复或模板化内容干扰(如公告、页眉页脚、目录)。
- 缺少重排环节,或重排后进入上下文的 N 值设置过大。
修复方案:
- 增加重排器(Reranker)。
- 进行文档清洗:去除页眉页脚、目录、重复分块。
- 降低进入生成上下文的 topN 数量,提升证据密度。
Step 4:证据相关,但模型仍胡答或不引用
优先检查:
- 生成阶段的 prompt 是否缺乏“必须基于 Evidence、信息不足时要追问或拒答”的硬约束。
- 输出是否没有结构化,且缺乏引用校验机制(导致假引用)。
- 上下文是否过长,关键证据被淹没(注意 Token 预算和证据排序)。
修复方案:
- 强制要求模型以 JSON 等结构化格式输出,并包含引用字段。
- 建立引用校验机制,确保每个引用都能在上下文中定位,否则进行重试或降级处理。
- 将最相关的证据放在上下文的前部(重排后按得分排序)。
5. 一个可工程落地的 RAG 参考架构
建议将 RAG 系统设计为一条可观测的流水线,而非一坨杂乱的提示词工程。一个清晰的后端架构通常包含以下模块:
- Ingress:处理鉴权、限流、日志追踪。
- Query Processor:进行意图识别、查询改写、语言检测。
- Retriever:执行混合检索(如 BM25 + 向量)。
- Reranker:对召回结果进行重排序。
- Context Builder:管理 Token 预算、去重、排序,并组装最终证据上下文。
- LLM Generator:基于上下文生成结构化输出或调用工具。
- Validator:进行模式(schema)校验、引用校验和安全策略检查。
- Observability:实现样本回放、指标监控和告警。
- Store:存储向量、原始文档、评测集和用户反馈数据。
关键工程点:每个阶段都必须输出中间产物(例如 retrieved_ids, rerank_scores, final_context),否则线上出现问题将难以定位根因。
6. 搭建“RAG 最小评测集”(低成本方案)
很多团队卡在“无法有效评测”这一步。一个最小可行方案是:
- 从真实用户日志中抽取 50~200 条查询(覆盖高频场景)。
- 人工为每条查询标注出相关的 chunk(1~3 个即可)。
- 离线运行检索流程,计算
Recall@K / MRR 等核心指标。
- 每次对分块、召回、重排策略进行修改后,都回归测试一次这个评测集。
完成这一步,你的团队将从“感觉好点了”的模糊状态,进入“Recall@20 从 0.62 提升到 0.81”的精确优化阶段。
7. 总结
- RAG 不是简单的“向量库 + 提示词”,而是一个包含分块、召回、重排、生成四段链路的系统工程。
- 优化顺序通常遵循:召回率(Recall) > 证据密度(Rerank) > 生成约束(Grounded Generation)。
- 没有可量化的指标和详细的中间产物日志,就没有真正的可迭代性。
希望这份从工程实践角度梳理的指南,能帮助你更系统地构建和优化 RAG 应用。欢迎在云栈社区交流讨论更多关于人工智能与检索增强生成的实践经验。