二十七:RAG 优化¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484299&idx=1&sn=af20ca32d9a9d7b00fde148708fc9499&chksm=f01eb0f2c76939e46431aaac7b04d433fa76abff17e7d2542fe0c8e591c945920145ab4ec7ea#rd
1. 学习范围¶
本日主题是 RAG 优化。第 26 天覆盖了 RAG 的基础链路:加载、切分、embedding、索引、检索、上下文、生成和评估。第 27 天进一步关注当基础 RAG 效果不稳定时,如何系统优化召回、排序、上下文压缩、生成忠实性、评估和生产化。 本日覆盖: - RAG 失败的分层诊断。
-
Query transformation:rewrite、decomposition、multi-query、HyDE、step-back。
-
高级检索:hybrid search、metadata filter、self-query retriever。
-
Multi-vector retriever、parent document retriever、small-to-big retrieval。
-
Rerank、contextual compression、long-context rerank。
-
上下文组装、去重、证据合并和冲突处理。
-
多跳 RAG、GraphRAG、知识图谱辅助检索。
-
RAG hallucination、faithfulness、citation 校验。
-
生产化监控、缓存、权限、安全和成本控制。
2. RAG 优化的诊断框架¶
RAG 效果不好时,不应直接盲目换模型。应分层诊断:
数据层:知识是否存在、是否正确、是否过期、是否有权限
切分层:chunk 是否完整、粒度是否合适、元数据是否保留
索引层:embedding 是否适配、索引参数是否影响召回
查询层:query 是否表达清楚、是否需要改写/拆分
召回层:top-k 是否包含正确证据
排序层:正确证据是否排在前面
上下文层:是否噪声过多、是否超预算、是否丢标题
生成层:prompt 是否要求忠实、引用、拒答
评估层:指标是否能定位问题
3. Query Rewrite¶
Query rewrite 是把用户问题改写成更适合检索的形式。它常用于: - 多轮对话中的指代消解。
-
口语化问题标准化。
-
省略信息补全。
-
领域术语转换。
-
把用户意图转成文档中更常见的表达。
示例:
历史:用户正在询问 DeepSpeed ZeRO-3。
用户:它和 FSDP 有什么区别?
改写:DeepSpeed ZeRO-3 和 PyTorch FSDP 在参数分片、梯度分片、优化器状态分片、通信和 checkpoint 上有什么区别?
4. Query Decomposition¶
当用户问题包含多个子问题或需要多跳证据时,单次检索可能失败。Query decomposition 把复杂问题拆成多个子查询。 示例:
原问题:FlashAttention 和普通 attention 在训练显存和推理 prefill 上分别有什么差异?
子问题1:FlashAttention 如何降低训练显存?
子问题2:FlashAttention 在 prefill 阶段有什么收益?
子问题3:普通 attention 的显存瓶颈是什么?
-
多实体关系问题。
-
多跳推理。
-
长问题中包含多个意图。
风险是拆分过度导致成本增加,或子问题偏离原问题。
5. Multi-Query Retrieval¶
Multi-query retrieval 为同一个用户问题生成多个不同表达的查询,然后分别检索并合并结果。 价值: - 缓解用户表达和文档表达不一致。
-
增加召回多样性。
-
对同义词、缩写、不同角度描述更稳。
流程:
风险: - 召回噪声增加。-
调用成本增加。
-
多 query 可能偏离原意。
因此 multi-query 常与 rerank、去重和过滤配合。
6. HyDE¶
HyDE, Hypothetical Document Embeddings,假想文档嵌入, 是一种检索增强(RAG)前置检索优化方案,让模型先根据 query 生成一个“假想答案文档”,再对这个假想文档做 embedding 来检索真实文档。 直觉是:用户问题可能很短,而相关文档通常是陈述式文本。假想文档把问题扩展成更接近文档风格的语义表示。 流程:
HyDE 适合 query 过短、表达模糊【仅几个关键词(如 “人工智能发展”“期权定价”)】、文档是长篇陈述的场景。风险是模型生成的假想文档带入错误假设,导致检索偏移。7. Step-Back Retrieval¶
Step-back retrieval 先把具体问题抽象为更一般的问题,再检索背景原则或概念资料,然后结合原问题回答。 示例:
它适合概念推理、技术原理和需要背景知识的问题。风险是抽象后过于宽泛,召回背景资料但漏掉具体细节。8. Self-Query Retriever 与 Metadata Filter¶
Self-query retriever 让模型从用户问题中解析出结构化过滤条件,再结合向量检索。 示例:
用户:找 2024 年之后关于 FlashAttention 的资料。
解析:
query = "FlashAttention"
filter = updated_at >= 2024-01-01
-
文档类型。
-
作者/部门。
-
产品线。
-
权限。
-
语言。
-
版本号。
过滤能提高精度并减少越权风险。风险是过滤条件解析错误会漏召回,因此要记录解析结果。
9. Hybrid Search 与稀疏检索优化¶
第 26 天介绍了 hybrid search 的基础。优化时要进一步关注: - 向量检索召回语义相似。
-
BM25 召回关键词、编号、错误码、API 名、产品型号。
-
RRF 或加权融合合并结果。
-
对不同数据源设置不同权重。
常见调参:
如果问题中包含精确 ID、错误码、条款编号,sparse 权重通常要更高。如果问题是自然语言语义问答,dense 权重通常更重要。10. Parent Document Retriever¶
Parent document retriever 使用小 chunk 做检索,但返回更大的 parent document 作为上下文。 动机: - 小 chunk 检索更精确。
- 大 parent 保留上下文更完整。
流程:
parent document -> split into child chunks
embed child chunks
query retrieves child chunks
return corresponding parent chunks
11. Multi-Vector Retriever¶
Multi-vector retriever 为同一文档生成多个向量表示,例如: - 原文 chunk embedding(文本完整段落直接编码,匹配完整长句提问)。
-
摘要 embedding(LLM 提炼文档核心摘要编码,匹配概括类、宏观类问题)。
-
假设问题 embedding(让模型基于文档生成若干潜在用户提问,再编码(反向 HyDE 思路))。
-
标题 embedding(匹配简短关键词、概括式查询)。
-
表格说明 embedding(结构化内容单独抽取描述再编码,解决表格、代码块检索难题)。
-
关键点短句Embedding:拆分文档核心观点,生成多条短句向量,适配碎片化提问
用户 query 可以匹配到这些不同视角的向量,再返回同一原始文档。 适合: - 文档长且主题多。
-
原文表达和用户问题差异大。
-
表格、代码、图片说明等复杂内容。
风险是索引规模增加、去重复杂、召回噪声增加。
12. Small-to-Big Retrieval¶
small-to-big retrieval 先用小粒度片段做精确召回,再扩展到相邻上下文或父级章节。 示例:
它解决了“检索需要小粒度,生成需要大上下文”的矛盾。 关键是扩展范围不能过大,否则会引入噪声。13. Rerank 深度优化¶
Rerank 是提升 RAG precision 的关键环节。常见 reranker: - Cross-encoder reranker。
-
BGE reranker 等专用模型。
-
LLM reranker。
-
规则 reranker。
Rerank 输入通常是 query 和候选 chunk,输出相关性分数。优化方向: - 增加候选召回数量。
-
用更强 reranker。
-
对长文档先摘要再 rerank。
-
结合元数据和新鲜度。
-
对不同 query 类型使用不同 rerank 策略。
Rerank 成本较高,因此通常只对第一阶段 top-k 候选使用。
14. Contextual Compression¶
Contextual compression 是在把检索结果交给 LLM 前,压缩掉与 query 无关的内容,只保留相关片段。 常见方式: - LLM 抽取相关句子。
-
Embedding-based sentence filtering。
-
Reranker 过滤低相关 chunk。
-
摘要压缩。
价值: - 降低 token 成本。
-
减少噪声。
-
让关键信息更靠近 prompt。
风险: - 压缩器误删关键条件。
-
摘要引入幻觉。
-
证据粒度丢失影响引用。
15. Long-Context RAG¶
长上下文模型可以放入更多文档,但不等于不需要检索优化。 长上下文 RAG 仍需要: - 检索排序。
-
去重。
-
结构化上下文。
-
关键信息突出。
-
引用和证据定位。
-
成本控制。
原因是长上下文会带来: - 成本和延迟增加。
-
关键信息被稀释。
-
模型可能忽略中间位置内容。
-
噪声资料影响答案。
长上下文适合召回范围较大但仍需证据综合的场景,不应成为粗暴塞文档的理由。
16. 多跳 RAG¶
多跳 RAG 需要通过多个证据链回答问题。例如:
实现方式: - query decomposition。-
迭代检索。
-
agentic retrieval。
-
graph traversal。
-
intermediate answer 作为下一跳 query。
风险是每一步错误都会累积,因此需要中间结果验证和证据记录。
17. GraphRAG 与知识图谱辅助¶
GraphRAG 把实体、关系和文本证据组织成图结构,用图检索辅助回答复杂关系问题。 适合: - 多实体关系。
-
组织架构、供应链、论文引用网络。
-
需要社区摘要或全局概览的问题。
-
多跳推理。
常见流程:
风险: - 实体和关系抽取错误。-
图更新成本高。
-
全局摘要可能丢细节。
-
实现复杂度高。
GraphRAG 不是所有 RAG 的必需组件,只有当关系结构明显重要时才值得引入。
18. RAG 幻觉与忠实性控制¶
RAG 幻觉常见形式: - 上下文没有答案,模型编造。
-
答案部分来自上下文,部分来自模型先验。
-
引用存在但不支持结论。
-
多文档冲突时模型强行合并。
-
对数字、日期、限制条件回答错误。
控制方法: - prompt 明确只基于上下文回答。
-
资料不足时拒答。
-
每个关键结论强制引用。
-
citation verification。
-
answer grounding 检查。
-
对数字和条款做规则校验。
-
高风险场景人工审核。
19. RAG 评估体系优化¶
基础 RAG 评估要进一步细化为: 检索指标: - Recall@k。
-
Precision@k。
-
MRR。
-
nDCG。
-
证据覆盖率。
生成指标: - Correctness。
-
Faithfulness。
-
Answer relevance。
-
Citation accuracy。
-
Completeness。
-
Refusal accuracy。
系统指标: - 延迟。
-
成本。
-
缓存命中率。
-
检索失败率。
-
用户反馈。
-
权限拦截率。
评估集应包含普通问题、难问题、多跳问题、无答案问题、权限问题、冲突资料问题和对抗注入问题。
20. 生产化与可观测性¶
生产 RAG 应记录: - 原始 query。
-
改写 query。
-
检索结果和分数。
-
rerank 结果。
-
最终上下文。
-
prompt 版本。
-
模型版本。
-
答案。
-
引用。
-
用户反馈。
-
延迟和成本。
这些日志用于定位问题、回放实验和监控质量。 生产优化还包括: - query cache。
-
embedding cache。
-
retrieval cache。
-
prompt cache。
-
增量索引。
-
失败重试。
-
降级策略。
-
权限审计。
21. 安全与 Prompt Injection¶
RAG 的特殊安全风险是 indirect prompt injection。恶意文档可能写入:
防护原则: - 检索内容是数据,不是指令。-
系统提示明确忽略文档中的指令性文本。
-
工具调用不由检索文档直接决定。
-
敏感数据不进入无权限上下文。
-
对外部网页和用户上传文档做安全扫描。
-
高风险工具调用需要确认。
RAG 权限过滤必须在检索阶段完成,不能依赖模型自觉不泄露。
22. 成本与延迟优化¶
RAG 优化不能只追求准确率,还要控制成本和延迟。 常见优化: - 缓存 embedding 和检索结果。
-
分级检索:先轻量召回,再重模型 rerank。
-
减少不必要的 multi-query。
-
控制 top-k 和上下文长度。
-
使用更小的 reranker。
-
对高频问题离线生成答案或缓存。
-
流式输出改善体验。
-
异步构建索引。
优化目标是达到质量、成本、延迟之间的平衡。
23. RAG 优化路线图¶
一个实用优化顺序: - 建立标注评估集,包含问题、答案和支持文档。
-
检查知识库覆盖率和清洗质量。
-
调整 chunk size、overlap 和元数据。
-
评估 embedding 模型和相似度配置。
-
加入 hybrid search。
-
加入 query rewrite 和多轮指代消解。
-
提高 first-stage top-k 并加入 reranker。
-
优化上下文组装、去重和相邻 chunk 合并。
-
加入拒答、引用和忠实性校验。
-
对复杂问题加入 decomposition、多跳检索或 GraphRAG。
-
上线监控、缓存、权限、安全和成本控制。
24. 核心总结¶
RAG 优化的核心不是堆组件,而是定位瓶颈: - 没召回正确证据,优化 query、chunk、embedding、hybrid search、top-k。
-
正确证据排太后,优化 rerank。
-
证据进了 prompt 但没答对,优化上下文组装、prompt 和生成模型。
-
答案有幻觉,优化拒答、引用和忠实性校验。
-
成本太高,优化缓存、分级检索和上下文压缩。
-
多跳问题答不好,考虑 query decomposition、迭代检索或 GraphRAG。
优秀的 RAG 系统依靠评估驱动迭代,而不是凭感觉调整参数。
25. 参考资料¶
-
LangChain RAG tutorials: https://python.langchain.com/docs/tutorials/rag/
-
LangChain Query Analysis: https://python.langchain.com/docs/tutorials/query_analysis/
-
LangChain Contextual Compression: https://python.langchain.com/docs/how_to/contextual_compression/
-
LangChain MultiQueryRetriever: https://python.langchain.com/docs/how_to/MultiQueryRetriever/
-
LangChain Parent Document Retriever: https://python.langchain.com/docs/how_to/parent_document_retriever/
-
LangChain Self Query Retriever: https://python.langchain.com/docs/how_to/self_query/
-
LlamaIndex Advanced RAG: https://docs.llamaindex.ai/en/stable/optimizing/advanced_retrieval/advanced_retrieval/
-
Microsoft GraphRAG: https://microsoft.github.io/graphrag/
-
LangChain RAG from scratch playlist: https://www.youtube.com/playlist?list=PLaIDFEXuae2LXbO1_PKyVJiQ23ZztA0x
-
RAG 优化介绍: https://zhuanlan.zhihu.com/p/678893732
预览时标签不可点<div class="