RAG 检索精度已经较好但生成答案仍不准确时,除了优化检索还能怎样改进?

考查重点:检索后证据使用与生成错误。核对上下文是否冲突、过长或缺关键约束,改写生成指令与引用格式并增加逐结论校验;用固定正确证据集单独评估生成端

本题目录

参考答案

核心回答

正确证据已经检索到时,应沿着上下文组装、生成指令、模型输出和答案校验继续排查。先核对模型实际收到的消息,确认关键条件没有被截掉、旧版本和历史回答没有形成干扰;再明确按证据回答、保留适用条件、信息不足时澄清或拒答,并对关键结论逐项核对依据。

可以固定一组正确、完整的证据,单独比较不同提示词、上下文组织和生成模型的结果。这样能区分“检索结果不错,但送入模型的材料不完整”与“材料完整,模型仍然用错”两类问题,避免继续围绕检索相似度调参。

先看模型到底读到了什么

检索日志里的完整片段,不一定等于最终发送给模型的上下文。需要检查最终消息中的片段、顺序、来源、版本和长度,尤其是:

  • 条件是否完整。 规则正文被保留,但“仅适用于正式员工”“不含跨月退款”等限制被截掉,模型就可能把局部规则扩大使用。压缩应保留条件、结论和例外,不能只留下概括句。
  • 证据是否冲突。 新旧制度、不同产品版本或不同地区规定混在一起时,应保留版本和适用范围;无法确认采用哪一份时,回答应指出冲突。
  • 历史是否干扰。 用户前面讨论的对象、模型先前给出的错误答案,都可能影响当前回答。只保留解决指代所需的历史,并明确当前问题对应的对象和条件。
  • 关键内容是否被淹没。 删除重复、无关内容,保持同一规则与其例外相邻;必要时比较不同长度和顺序的输入。长上下文能容纳材料,并不代表模型能同样有效地利用所有位置的材料。Lost in the Middle在所测试模型和任务中验证了内容位置与上下文长度对答案的影响。

再改生成与校验

提示词要说明证据的使用方式,例如:“先确认规则适用对象,再回答;保留期限、金额、例外;关键结论标明来源;材料缺失或互相冲突时说明无法确定。”对容易漏条件的任务,可以先提取相关原句或字段,再依据这些内容组织答案。少量正确示例可展示期望格式和如何处理资料不足,而非只要求“准确、专业”。

生成后检查的是结论是否被证据支持,不只是有没有引用编号。逐项核对金额、日期、对象、否定词与条件;计算任务交给确定性程序或工具,并校验输入口径。没有依据的结论应删除、重新生成或转为澄清。模型自检可以作为辅助,重要规则与关键样本仍需人工或确定性校验。Anthropic 的幻觉缓解指南介绍了提取原句和逐结论核对引用的做法。

如果完整证据和指令都正确,再用同一批样本比较模型的阅读、归纳和指令遵循能力,检查输出长度是否导致答案中断,并适当降低采样随机性。更稳定的输出不等于事实更正确,应同时比较答案正确性、证据忠实度、条件完整性和拒答表现。

怎样验证改动有效

保存问题、人工确认的证据、最终消息、答案和配置,固定证据后每次只改变一个因素。样本要覆盖正常问答、条件在段尾、版本冲突、多轮指代、资料不足和需要计算的情况;分别记录答案是否答对、是否遗漏条件、是否得到引用支持,以及是否在无法回答时停止编造。

忠实度与正确性要分开看:模型可能忠实地复述一份过期材料,也可能引用正确材料却答非所问。评测结果应回到具体失败样本,再决定调整上下文、提示词、模型还是业务规则。

MaxKBPython

基于 MaxKB

核心回答

在 MaxKB 中,应对照命中的分段、实际引用文本、历史消息和最终回答分支排查。命中完整段落后,引用字符预算仍可能截掉段尾条件;历史对话也不属于这项引用预算。另一方面,符合直接回答条件时可能直接返回分段,问题未必发生在大模型生成阶段。

以企业制度问答为例,命中“可以报销”的规定,但发送给模型的引用漏掉了后面的适用对象,模型仍可能答错。应先把最终输入中的条件补完整,再调整生成提示词或模型;对于适合原文回答的标准问题,还可以配置直接回答,并验证其命中条件。

引用字符数控制的是哪部分内容

工作流的知识库检索节点同时输出完整的 paragraph_list 和供提示词引用的 data。data 将标题、正文拼接后,按 max_paragraph_char_number 做字符切片。因此,完整列表里有答案,并不能证明 AI 节点使用的 data 也保留了完整条件。若连接了独立重排节点,还要查看它实际输出的 result,而不是只看上游分段列表。检索节点输出、重排节点的字符裁剪。

仓库还保留独立的 chat_simple 流水线,依次执行检索、用户消息组装和回答。它按顺序保留 title:content,超过剩余字符容量时截取当前段落,再包成 <data> 填入提示词。这项限制不包含标签、换行、系统提示词和历史消息,也不是整次请求的 Token 上限。简单应用入口、简单应用消息组装。

历史按 dialogue_number 选择最近的对话记录,再组装用户与 AI 消息,并非自动按剩余 Token 容量截断。排查时可比较关闭历史与保留必要历史的结果,确认旧回答有没有覆盖当前资料;同时检查实际模型输入长度。简单应用历史组装、工作流 AI 节点历史选择。

先确认答案走了哪条分支

内置“知识库问答助手”工作流模板有三条分支:满足直接回答条件时,回复节点引用 directly_return;有分段但未满足直接回答条件时,AI 节点读取 data 与用户问题;无分段时,返回预设的无资料回复。检索节点只是提供结果和命中标记,实际走向由后续判断器与连线决定,用户修改过的工作流也应按其实际连线核对。模板判断条件、直接回复、AI 与无资料节点。

chat_simple 则在检索阶段优先选出满足文档直接回答配置的候选,回答步骤再次检查相似度条件后直接输出分段内容。无分段且配置为 designated_answer 时返回指定回复;配置为 ai_questioning 时,可继续将无引用提示词发给模型,并不会自动拒答。直接候选选择、回答分支、无引用提示词。

直接返回能保留原分段措辞,但仍依赖命中的文档版本、适用对象与阈值是否正确。如果当前答案来自直接回复分支,应先改相应资料或分支条件;修改 AI 提示词不会改变这条分支的输出。

可用哪些样本复核

可以准备三组对照:同一段规则的适用条件放在引用预算内外;同一问题带有或不带有旧历史回答;同一问题分别触发直接回答、模型生成和无资料回复。每组都记录实际节点输出、最终消息和所走分支,再核对条件是否保留、是否调用模型以及答案依据。

对应教程

参考资料

相关面经

1 篇

腾讯音乐

后端开发工程师
实习一面
查看原面经 →
我看你有提到对 RAG 的文档分割和检索参数进行了调优,那如果检索的精度已经比较不错了,但生成答案的准确性仍然不高(也就是常见的幻觉问题),除了优化检索还有哪些方面可以入手改进?

收录题集

2 个来源,共2 份题集

相关题目

4 题