外观
RAG 优化策略面试题
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. RAG 各模块的优化策略
| 模块 | 优化策略 |
|---|---|
| 文档块切分 | 设置适当的块间重叠、多粒度文档块切分、基于语义的文档切分、文档块摘要 |
| 文本嵌入模型 | 基于新语料微调嵌入模型、使用动态嵌入(Dynamic Embedding) |
| 提示工程 | 优化模板增加提示词约束、提示词改写 |
| 大模型生成 | 基于正反馈微调模型、量化感知训练、提供大 Context Window 的推理模型 |
| 检索后处理 | 元数据过滤、重排序(Rerank)减少文档块数量 |
2. 知识图谱增强 RAG(KG+RAG)
2.1 向量数据库的局限性
- 无法获取长程关联知识
- 信息密度低(尤其在 LLM Context Window 较小时)
2.2 解决方案
在向量库(VS)旁增加一路知识图谱(KG)上下文增强:
- 从 Query 中抽取实体作为种子节点
- 在知识图谱中进行图采样(必要时先通过向量相似度筛选种子节点)
- 将子图转换为文本片段,作为额外上下文输入 LLM
- 可使用 NL2Cypher 进行图查询增强
3. Self-RAG:让大模型自主筛选召回结果
3.1 经典 RAG 的问题
经典 RAG 无差别地将所有召回的上下文与 Query 合并输入 LLM。但有时召回的上下文可能与 Query 无关甚至矛盾,应当舍弃(尤其在 Context Window 仅为 4K 时)。
3.2 Self-RAG 的核心流程
- 按需检索(Retrieve on Demand):判断是否需要额外检索事实信息,仅当需要时才召回
- 并行处理:对每个召回片段独立生成 Prompt 和结果
- 反思字段(Reflection Tokens):使用特殊标记检查输出是否相关、完整
- 选择最优片段:选择最符合需求的片段
- 可重复检索:支持多轮检索优化
3.3 Self-RAG 的创新:反思字符(Reflection Tokens)
- Retrieve 类型:标记是否需要检索
- Critique 类型:标记输出的相关性、完整性、检索片段对输出的支持程度
3.4 Self-RAG 的训练过程
- 使用 GPT-4 生成反思字符作为训练数据
- 将知识蒸馏到内部 Critic 模型
- Critic 模型评估检索段落和任务输出质量
- 使用标准的 Next Token 目标在增强语料库上训练生成模型
- 比 PPO 等方法更具成本效益
3.5 Self-RAG 的推理过程
- 使用反思字符自我评估输出,使推理具有适应性
- 可根据任务类型定制行为(事实准确性 vs 创意输出)
- 段落级 Beam Search 获取最佳序列
- 无需额外训练即可通过调整权重改变模型行为
4. 多模态 RAG
4.1 半结构化 RAG(文本 + 表格)
- 版面分析(基于 Unstructured 工具)生成原始文本和表格
- Summary LLM 生成文本摘要和表格摘要
- 同一嵌入模型向量化后存入多向量检索器
- 用户 Query 向量化后用 ANN 检索召回原始文本和表格
- 构造完整 Prompt 送入 LLM 生成最终结果
4.2 多模态 RAG(文本 + 表格 + 图片)
三种技术路线:
| 路线 | 方案 |
|---|---|
| 选项 1 | 对文本/表格生成摘要,使用多模态嵌入模型对所有内容向量化;查询时召回原始文本/表格/图像,送入多模态 LLM |
| 选项 2 | 使用多模态 LLM(GPT-4V、LLaVA、FUYU-8b)生成图片摘要;向量化文本/表格/图片摘要;查询时召回原始文本/表格 + 图片摘要 |
| 选项 3 | 前置同选项 2;查询时召回原始文本/表格/图片,送入多模态 LLM |
4.3 私有化部署
使用开源组件:LLaVA-7b(图片摘要)、Chroma(向量库)、Nomic GPT4All(嵌入模型)、Ollama LLaMA2-13b-chat(生成)。
5. RAG Fusion 优化策略
思路:接收用户 Query 时,让 LLM 生成 5-10 个相似 Query,每个 Query 匹配 5-10 个文本块,对所有返回的文本块进行倒序融合排序(可选精排),取 Top-K 拼接至 Prompt。
优点:
- 增加相关文本块召回率
- 自动进行文本纠错和长句分解
缺点:无法从根本上解决理解用户意图的问题
6. 模块化 RAG 架构
在基础 RAG 的检索-生成模块之外,可灵活增加:
| 模块 | 功能 |
|---|---|
| 搜索模块 | 融合代码/SQL/Cypher 等查询语言,搜索多元化数据源 |
| 记忆模块 | 利用 LLM 自身记忆引导检索,寻找与输入最匹配的记忆 |
| 额外生成模块 | 面对检索冗余和噪声时,由 LLM 生成必要上下文而非检索 |
| 任务适应模块 | 将 RAG 调整以适应各种下游任务 |
| 对齐模块 | 在检索器中添加可训练 Adapter 解决 Query 与文本的对齐问题 |
| 验证模块 | 评估检索文档与 Query 的相关性,提升 RAG 鲁棒性 |
7. 查询转换(Query Transformations)
利用 LLM 将用户的原始 Query 改写为更适合检索的形式。用户原始查询可能存在表述不清、需求复杂、内容不相关等问题。LLM 确保转换后的查询更有可能获取准确答案。
8. 索引优化策略
8.1 嵌入优化
- 微调嵌入:让检索内容与查询的相关性更紧密,尤其在专业领域效果显著
- 动态嵌入:不同于静态嵌入,根据单词上下文动态调整向量表示
8.2 块大小优化
- 小块:可能导致关键信息缺失
- 大块:可能引入无关噪声
- 最佳实践:在测试集上运行评估并计算指标(LlamaIndex 支持此功能),通过实验找到最佳平衡
8.3 混合检索
结合向量搜索和关键词搜索的优势:
- 向量搜索:语义相关性
- 关键词搜索:精确匹配特定术语
例如:搜索 "阿迪达斯 XYZ 运动鞋白色",混合检索既能匹配颜色和品牌的语义,又能精确匹配型号 XYZ。
8.4 重排序(Rerank)
Top-K 结果不一定按最优相关度排序。重排序将最相关信息重新定位到 Prompt 的边缘位置。
常用策略:Diversity Ranker(基于文档多样性排序)、LostInTheMiddleRanker(在 Context Window 首尾交替放置最佳文档)。
9. 数据质量优化
Garbage In, Garbage Out 原则:
- 清理噪声:去除特殊字符、奇怪编码、不必要的 HTML 标签
- 删除无关文档:通过主题提取、降维和数据可视化发现并删除
- 去除冗余:通过相似度度量删除重复文档
- 维护更新:添加机制更新过时文档
10. 元数据增强
将元数据与索引向量结合使用,在向量搜索之上增加结构化搜索层:
- 时间维度:按日期元数据排序
- 文档结构:按章节/部分过滤
- 来源标识:区分内外部文档
11. 查询与文档对齐优化
问题:用户简短查询与文档之间存在语义不一致。
解决方案:不通过段落的嵌入来索引段落,而是通过"段落能回答的问题"的嵌入来索引段落。即将块与它们回答的问题一起索引,优化与底层问题的相似度而非与原始文档的相似度。
12. Prompt 压缩
研究表明,检索上下文中的噪声会对 RAG 性能产生不利影响。解决方案:
- 选择性上下文(Selective Context):使用小型 LLM 计算即时互信息或困惑度,估算元素重要性
- LLMLingua:使用小型 LLM 进行压缩
- 在检索后应用后处理步骤,压缩无关上下文,突出重要段落,减少总体上下文长度
13. RAG 结合 SFT
RA-DIT 方法:
- 更新 LLM,最大化在给定检索增强指令下正确答案的概率
- 更新检索器,最小化文档与查询在语义上的差异
使 LLM 更好地利用相关背景知识,即使在检索出错时也能产生较准确的预测。
14. RAG 未来发展方向
垂直优化
- 长上下文处理
- RAG 鲁棒性研究
- 大规模知识库检索效率
- 企业数据安全(防止 LLM 泄露文档来源和敏感信息)
水平扩展
- 从文本 QA 拓展到图像、代码、结构化知识、音视频
生态系统
- 技术栈:LangChain、LlamaIndex、HayStack、Flowise AI、Cohere Coral
- 评估体系:上下文相关性、内容创新性、无害性
- 可解释性增强