RAG生成和融合
- 1.检索到的内容如何和用户问题一起喂给 LLM?Prompt 怎么设计?
- 1.1 Prompt 设计核心原则
- 1.2 标准 RAG Prompt 模板
- 1.3 上下文窗口管理策略
- 2. 如果检索到的内容与问题无关,模型会怎么表现?如何缓解?
- 3. 如何评估 RAG 系统的效果?有哪些指标?
- 4. RAG 的幻觉问题怎么产生的?如何降低?
RAG面试系列共分为四篇文章:【RAG面试系列】基础概念、【RAG面试系列】检索优化、【RAG面试系列】生成和融合、【RAG面试系列】工程落地。上一篇【RAG面试系列】检索优化讲解了RAG检索优化,现在我们聊聊RAG生成和融合。
1.检索到的内容如何和用户问题一起喂给 LLM?Prompt 怎么设计?
核心思路:RAG 的本质是把检索到的外部知识“注入”到 Prompt 里,让 LLM 基于这些知识回答,而不是凭空生成。关键点在于 检索内容不是附加信息,而是回答的真实依据,Prompt必须明确告诉模型“只能基于给定材料回答”。
检索内容通过“分隔符+编号”的结构化方式拼进Prompt,并用system指令强约束“只依据资料回答+资料不足时明说”。
1.1 Prompt 设计核心原则
- 明确角色和任务边界
- 清晰区分检索上下文和用户问题
- 给出"不知道"的退路
- 要求引用来源
1.2 标准 RAG Prompt 模板
最常见的做法是三段式结构,按固定模板拼进Prompt:
## 指令 你是一个专业的知识助手。请**仅根据**下面提供的参考文档回答问题。 - 如果参考文档中包含答案,请准确回答并引用来源(用 [来源X] 标注)。 - 如果参考文档中**没有**相关信息,请明确说"根据现有资料无法回答",不要猜测或编造。 - 不要使用参考文档以外的知识。 ## 参考文档 [来源1] {chunk_1_content} [来源2] {chunk_2_content} [来源3] {chunk_3_content} ## 用户问题 {user_query} ## 回答1.3 上下文窗口管理策略
| 策略 | 做法 | 适用场景 |
|---|---|---|
| Top-K 截断 | 只取 Rerank 后的 Top-3~5 | 大多数场景 |
| 上下文压缩 | 用 LLM 先对检索内容做摘要再注入 | 文档很长但相关信息分散 |
| 递归摘要 | 对多篇文档分别摘要后合并 | 需要综合大量文档 |
| 自适应窗口 | 根据查询复杂度动态调整注入数量 | Agentic RAG |
关键设计要点:
- 检索内容按相关性排序(最相关的放最前/最后,利用"首尾效应")
- 每条 chunk 附带元数据(来源、章节),方便引用
- 设置
temperature较低(0-0.3)以减少幻觉
2. 如果检索到的内容与问题无关,模型会怎么表现?如何缓解?
无关检索的典型表现:
- 强行关联:LLM 试图从无关内容中"找出"答案,产生牵强附会的回答
- 幻觉:LLM 忽略检索内容,转而使用自身预训练知识生成(可能正确也可能错误)
- 拒绝回答:如果 Prompt 设计得当,LLM 应说"无法回答"
- 答非所问:基于无关内容生成的答案与用户问题不匹配
缓解策略:
| 策略 | 做法 | 效果 |
|---|---|---|
| 相关性阈值过滤 | 设置相似度分数阈值(如 cosine < 0.7 则丢弃) | 简单但可能误杀 |
| Rerank 过滤 | Cross-Encoder 分数低于阈值的 chunk 不注入 | 更精准 |
| 拒答机制 | Prompt 中明确"不知道就说不知道" | 减少幻觉 |
| CRAG(Corrective RAG) | 检索后先评估相关性,不相关则改写查询重试或触发外部搜索 | 自适应处理 |
| Self-RAG | 模型自己判断是否需要检索、检索结果是否相关 | 按需检索 |
| LLM-as-Judge 过滤 | 用轻量 LLM 对每个 chunk 做二分类(相关/不相关) | 灵活但增加延迟 |
3. 如何评估 RAG 系统的效果?有哪些指标?
评估框架:RAGAS(Retrieval Augmented Generation Assessment)
RAGAS 是当前最主流的 RAG 评估框架,开源、LLM-as-Judge 范式,覆盖检索和生成两侧。
核心四大指标:
| 指标 | 测量什么 | 计算方式 | 目标值 |
|---|---|---|---|
| Context Precision | 检索到的 chunk 中有多少是真正相关的(信噪比) | 加权 Precision@k | > 0.75 |
| Context Recall | 回答所需的信息是否都被检索到了(覆盖度) | 从 ground truth 提取 claims,检查是否在 context 中 | > 0.8 |
| Faithfulness(忠实度) | 生成的答案是否完全基于检索上下文(有无幻觉) | 将答案拆为原子 claims,逐一验证是否被 context 支撑 | > 0.9 |
| Answer Relevancy | 答案是否直接回应了用户问题 | LLM 从答案反推问题,与原始问题做语义相似度 | > 0.8 |
检索侧补充指标:
| 指标 | 公式/含义 | 说明 |
|---|---|---|
| Recall@k | Top-K 结果中包含相关文档的比例 | 按实际注入 LLM 的 chunk 数来定 k,k 通常取 5/10/20 ,多 k 值联合报告(Recall@5, Recall@10, Recall@20)更全面 |
| MRR(Mean Reciprocal Rank) | 第一个相关文档排名的倒数均值 | 关注"正确答案排第几" |
| NDCG@k | 归一化折损累计增益 | 考虑排名位置和相关度分级 |
生成侧补充指标:
- 幻觉率(Hallucination Rate):Vectara HHEM Leaderboard 提供模型级幻觉率对比
- BERTScore:与参考答案的语义相似度(比 BLEU/ROUGE 更鲁棒)
- Citation Accuracy:引用标注的准确率
评估方法论补充(离线 vs 在线):
- 离线评估:使用标注数据集(BEIR、MS MARCO、KILT 等)评测检索质量;用 RAGAS 在自建 ground truth 上评测端到端效果
- 在线评估:A/B 测试、用户点赞/点踩、点击率、会话完成率
- 评估数据集构建:RAGAS 支持用 LLM 合成高质量评估数据(synthetic data generation),无需大量人工标注
4. RAG 的幻觉问题怎么产生的?如何降低?
RAG 幻觉的两类根因:
内在幻觉(Intrinsic Hallucination):生成内容与检索上下文矛盾
- 原因:LLM 未能正确理解或遵循检索内容,被自身预训练知识"覆盖"
- 例子:检索到"产品 A 价格 100 元",LLM 输出"产品 A 价格 150 元"
外在幻觉(Extrinsic Hallucination):生成内容超出检索上下文范围
- 原因:LLM 补充了检索中不存在的信息(即使是正确的也是幻觉)
- 例子:检索内容没提产地,LLM 自己加了"产地中国"
系统性降低幻觉的方法:
| 方法 | 原理 | 效果 |
|---|---|---|
| 优化 Prompt | 明确"仅基于上下文回答,不要补充" | 基础但有效 |
| Rerank 过滤 | 减少噪声注入,降低 LLM 被无关内容误导的概率 | 提升 15-35% |
| Faithfulness 监控 | 用 RAGAS 持续监控忠实度,发现退化及时修复 | 持续保障 |
| CRAG(Corrective RAG) | 检索后评估→不相关则重试→仍不行则拒答 | 显著降低 |
| Self-RAG | 模型自反思:需要检索吗?检索结果相关吗?生成忠实吗? | 开放域 QA 幻觉显著降低 |
| Citation 强制 | 要求逐句标注来源,倒逼模型忠实 | 可解释+可验证 |
| 知识冲突处理 | 检测检索内容间的矛盾,提示 LLM 注意或由仲裁模块处理 | 减少混淆 |