RAG评测:如何定位错误
RAG回答错了,第一步不应只改提示词。先判断知识库是否包含答案,再看正确证据有没有进入上下文,最后检查生成内容是否忠于证据。否则召回错误、语料缺失和生成错误会被混成一个“模型不行”。
把错误定位到三个环节
RAG的基本思路是把检索到的外部文本与生成模型结合。2020年的原始论文研究的是特定检索器与生成器组合;工程中的任意“检索加提示词”系统不能直接继承论文的评测结果。
先为问题建立人工审核的答案与必要证据集合。若语料没有这些证据,生成模型应承认缺乏依据;这不是召回率能够修复的缺失。若语料有证据却没检索到,才定位到检索或过滤环节。
召回与忠实度分别统计
用四个虚构问题演示:一个有证据且回答正确,一个有证据但检索漏掉,一个检索成功却生成错误,一个语料没有答案。可回答问题有3个,其中2个检索到了必要证据,所以本例检索召回为2/3。
这里把“必要证据均进入上下文”简化为布尔值,只适用于此教学例子。真实问题可能需要多段证据,应记录逐问题证据覆盖情况、过滤策略和上下文截断。不要让无答案问题混入同一个召回分母。
| 现象 | 优先检查 |
|---|---|
| 知识库没有答案 | 语料覆盖与拒答 |
| 存在证据但漏检 | 索引、过滤、召回、排序 |
| 上下文有证据却答错 | 引用匹配、提示与生成 |
相关文档不等于支持结论
例如一份虚构产品文档说明“支持导出”,却没有导出格式。回答“可以导出为CSV”不能仅凭这段文字成立。链接确实存在,也不代表它支持每一个句子。
审核时把回答拆成可以核对的事实主张,再逐项寻找相应段落。答案与证据冲突时,明确区分错误推断与引用到错误版本。对资料之间的矛盾,应保留日期与版本,不凭语气选择一个。
def diagnose(answerable, retrieved, faithful):
if not answerable:
return "no corpus evidence"
if not retrieved:
return "retrieval miss"
return "grounded answer" if faithful else "generation failure"
cases = [(True,True,True),(True,False,False),
(True,True,False),(False,False,False)]
assert [diagnose(*c) for c in cases] == [
"grounded answer", "retrieval miss",
"generation failure", "no corpus evidence"]
answerable_cases = [c for c in cases if c[0]]
retrieval_recall = sum(c[1] for c in answerable_cases)/len(answerable_cases)
assert retrieval_recall == 2/3
print(round(retrieval_recall,6))
做一个可复现的小评测
代码已执行,只验证四条诊断路径与2/3的教学计算,不运行检索器或LLM。上线评测还需要固定问题集、语料快照、参数、模型版本和人工标注标准,保留失败样例而非只看总分。
每次只改变一个可解释因素。例如固定召回结果比较不同提示词,或固定生成器比较不同检索配置。可结合CrossEncoder重排与文档分块分别检查排序与文本边界。
资料来源
Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
本文于2026年10月12日整理;文章日期保留原计划时段。
支持
如果这篇文章对你有帮助,欢迎支持本站。
二维码可点击放大。更多支持方式见支持页面。


