Appearance
11.3.3 一次失败回答上线后,应该如何快速定位问题出在哪一层?
先给结论:定位失败案例的最快路径,是沿链路顺序排查:先看证据有没有进候选,再看证据有没有进入最终上下文,最后看生成是否忠实使用证据。
很多排查低效,是因为一上来就去改 Prompt 或怀疑模型,而不是先确认:
- 证据到底有没有回来
一、最小排查顺序
你可以用下面这四步快速定位:
- 正确证据是否存在于库中
- 证据是否进入召回候选
- 证据是否进入最终上下文
- 生成是否忠实使用证据
这四步基本能把大部分问题定位到链路层级。
二、如果证据根本没召回
问题更像在检索前段:
- query 理解或 rewrite 出错
- metadata filter 配错
- 检索策略或索引问题
- chunk 切法破坏语义
这时去改 Prompt 基本无效。
三、如果证据召回了但没进最终上下文
问题更像在选择和构造层:
Rerank排序不稳TopK太小或截断过早- 去重或聚合把关键证据挤掉
- 长上下文排序不利于关键证据
这时需要优先检查:
- 重排与上下文构造逻辑
四、如果证据进了上下文但回答仍然错误
问题更像在生成层:
- Prompt 约束不够
- 证据组织方式不利于使用
- 模型出现外推或误合并
这时再考虑:
- 加强忠实性约束
- 调整输出结构
五、一个更实用的定位记录
更稳的做法是让每个失败案例都留下几项结构化记录:
gold_evidence_in_recallgold_evidence_in_final_contextanswer_groundedprimary_failure_stage
这样你们在排查时不会每次都从头争论。
一个最小定位示意
python
def locate_failure(case):
if not case["gold_evidence_in_recall"]:
return "retrieval_or_filter"
if not case["gold_evidence_in_final_context"]:
return "rerank_or_context"
if not case["answer_grounded"]:
return "prompt_or_generation"
return "needs_deeper_analysis"一句话总结
失败回答的快速定位,核心是“先证据、后生成”。先确认证据是否进入候选和上下文,再判断生成是否忠实使用证据,这样才不会在错误层级上浪费时间。