05. 生成效果差时你会怎么判断问题在 Prompt、模型还是上下文?

整理生成效果差时你会怎么判断问题在 Prompt、模型还是上下文?的面试回答思路与拆解方式。

简单回答

生成效果差的归因要用"控制变量"的思路。先看上下文——把检索到的 Chunk 打印出来看是不是相关且完整(上下文不对则调检索)。再看 Prompt——把上下文换成手工准备的"完美上下文"看模型能不能答对(Prompt 或模型的问题)。最后看模型——同样的 Prompt 和上下文换一个更强的模型看效果(模型能力不足)。三步做下来基本能定位问题在哪个环节。

详细解释

为什么归因很重要

生成效果差的表现可能是"答非所问""回答不准确""信息不完整""自己编造了内容"等。但这些表现可能来自完全不同的原因——上下文里根本没有正确信息(检索问题)、上下文有正确信息但 Prompt 没引导好(Prompt 问题)、Prompt 和上下文都没问题但模型理解能力不足(模型问题)。

如果不做归因就动手改,可能白费力气——检索有问题的时候去调 Prompt 没有意义,模型能力不足的时候改 Prompt 效果也有限。

三步归因法

第一步:检查上下文。 把最终送给模型的完整 Prompt 打印出来,人眼看一下检索到的 Chunk——正确答案在不在里面?如果不在,问题出在检索端,去优化检索(前一道题的内容)。如果在但被淹没在一堆无关信息中,可能是上下文信噪比太低,需要优化 Rerank 阈值或减少 Chunk 数量。

第二步:控制上下文看 Prompt 和模型。 手工准备一个"完美的上下文"——把正确答案所在的 Chunk 手动放进 Prompt 中(确保信息完整、相关性高、排在前面),然后看模型能不能正确回答。如果用"完美上下文"模型也答不对,说明问题不在检索而在 Prompt 设计或模型能力。

这时候再区分是 Prompt 还是模型:调整 Prompt 的指令——加更明确的回答约束("仅基于以下参考资料回答,不要使用自己的知识")、改变 Chunk 的排列顺序、加 few-shot 示例。如果调 Prompt 后效果改善了,说明之前是 Prompt 不够好。如果怎么调 Prompt 都不行,说明是模型能力不足。

第三步:换模型确认。 把同样的 Prompt 和上下文发给一个更强的模型(比如 GPT-4o 或 Claude Sonnet),看效果如何。如果强模型能答对、当前模型答不对,说明是模型能力的问题——要么换更大的模型,要么用 SFT 微调提升模型在这个任务上的能力。

常见生成问题的根因分析

答非所问。 通常是上下文中检索到的内容和用户问题不匹配(检索问题),或者上下文信息太多模型"走神"了(上下文管理问题)。少数情况是 Prompt 指令不明确,模型不知道应该回答什么。

回答不完整。 答对了一部分但遗漏了关键信息。可能是上下文中关键信息被分散在多个 Chunk 中模型没有全部利用,也可能是 Prompt 没要求完整回答,还可能是上下文太长关键信息在中间被忽略(Lost in the Middle)。

自信地编造(幻觉)。 上下文中没有相关信息时模型自己编了一个答案。根因可能是检索失败(没召回正确文档),也可能是 Prompt 没有明确告诉模型"不知道就说不知道"。部分是模型本身的倾向——LLM 不喜欢说不知道。

格式或风格不对。 比如希望用表格回答但模型用了段落,或者语气不符合要求。这基本都是 Prompt 的问题——指令中没有明确的格式和风格要求。

引用了上下文中的错误信息。 如果上下文中有一个过时或错误的 Chunk,模型"忠实地"引用了它。这不是模型的幻觉而是数据质量问题——需要清理知识库中的过时和错误内容。

工程化的归因流程

在生产环境中不可能每次都手动做三步归因。需要建立自动化的归因辅助工具:记录每次请求的完整上下文和模型输出、标注 bad case 的问题类型、统计各类问题的占比。如果 60% 的 bad case 是"上下文中没有正确信息",那优化重点应该在检索端;如果大部分是"上下文有信息但模型没用好",优化重点在 Prompt 或模型。

面试时可以这样答

我判断生成效果差的根因用的是控制变量法,三步走。

第一步看上下文——打印最终 Prompt 检查检索到的 Chunk 是否包含正确答案。不包含就是检索问题,去优化检索链路。第二步控制上下文——手动放一个完美的 Chunk 进去看模型能不能答对。答不对就是 Prompt 或模型的问题。第三步换强模型确认——同样的 Prompt 发给 GPT-4o,能答对说明是当前模型能力不足。

实际项目中大部分 bad case 的根因在检索端——上下文里就没有正确信息。这也是为什么我一直强调"先把检索做好再优化生成"。Prompt 问题占一部分,通常是指令不够明确或没要求"不知道就说不知道"。真正因为模型能力不足导致的问题反而是少数。

常见追问

  1. Lost in the Middle 问题你怎么验证和处理?
  2. 你在项目中 Prompt 迭代了几个版本?每次改了什么?
  3. 什么情况下你会选择换模型而不是继续调 Prompt?