本文由 AI 辅助生成并经结构化整理,示例仅用于技术说明。
RAG Agent 的瓶颈通常不是模型,而是检索链路。把用户原句直接丢进向量库,只能覆盖最简单场景。更稳的管线应包含:意图识别、查询改写、混合召回、重排、证据压缩和引用校验。
1. 先区分是否需要检索
闲聊、格式转换不必访问知识库;涉及内部制度、动态数据或来源引用时才检索。路由输出应是结构化结果:
{"need_retrieval":true,"domain":"support","freshness":"30d"}
2. 查询改写
多轮对话中的“它”必须补全:
def rewrite(question, history):return llm.structured_output({"standalone_query": "...","keywords": ["..."],"filters": {"product": "..."}})
改写结果要保留用户原意,不能擅自加入结论。
3. 混合召回
向量检索擅长语义相似,BM25 擅长专有名词和错误码。两路结果可用 RRF 合并:
def rrf(rank, k=60):return 1 / (k + rank)
同一文档多块命中要去重,并保留最高分和邻近上下文。
4. 过滤必须前置
租户、权限、语言、产品版本等过滤条件应在数据库查询阶段生效,不能先召回再让模型删除。否则越权内容已经进入上下文和日志。
5. 重排与证据压缩
先召回 30~50 条,再用 reranker 选 5~8 条。证据压缩只抽取与问题直接相关的句子,同时保留文档 ID、段落号和时间戳:
{"doc_id":"D42","section":"3.2","quote":"...","score":0.91}
6. 生成阶段强制引用
提示模型:每个事实必须关联证据编号;证据不足时明确说不知道。生成后再做程序化校验:引用是否存在、租户是否一致、文档是否过期。
7. 用可诊断指标评估
不要只看最终答案分数,至少拆成:
- Recall@K:正确证据是否召回;
- MRR/NDCG:正确证据排序是否靠前;
- Faithfulness:答案是否被证据支持;
- Citation precision:引用是否真的支撑句子;
- 拒答准确率:无证据时是否停止编造;
- 检索延迟和 Token 成本。
8. 最小实现流程
用户问题-> 检索路由-> 查询改写-> 权限过滤-> BM25 + Vector-> RRF 合并-> Rerank-> 证据压缩-> 带引用生成-> 引用校验
常见反模式
- Chunk 越小越好:会切断语义;
- TopK 越大越好:噪声和成本同步上涨;
- 相似度高就是正确:相似不等于能支撑答案;
- 把权限交给 Prompt:这不是安全边界;
- 只测答案,不测检索:失败时无法定位。
结语
好的 RAG Agent 不是“接一个向量库”,而是一条可评估、可过滤、可追溯的证据生产线。先保证证据正确,再讨论模型如何表达。