Skip to content

4.2.3 为什么索引阶段的设计失误很难在 Prompt 层补回来? ​

先给结论:因为 Prompt 只能约束模型如何理解和组织“已经拿到的上下文”,但它不能替你找回没有召回到的内容,也不能把错误候选变成正确知识。

所以当问题根因发生在索引阶段时,继续堆 Prompt 往往只会让系统看起来更复杂,而不会真正更稳。

Prompt 真正擅长解决什么 ​

先别把 Prompt 说得太弱。

Prompt 在 RAG 里确实很重要,它擅长解决的是这类问题:

  • 如何让模型优先依据给定资料回答
  • 如何约束回答格式、语气和输出结构
  • 如何要求模型说明不确定性
  • 如何在多段上下文之间组织回答

这些都属于“模型拿到上下文以后,怎么用这些上下文”的问题。

但索引阶段的问题,很多发生在这之前。

索引阶段的错误,为什么 Prompt 很难补 ​

1. 没召回到,就没有可补的材料 ​

如果真正相关的内容根本没有进入候选集,Prompt 再强也没法让模型凭空知道它。

比如:

  • 应该命中的块没有被索引进去
  • 块切得太碎,核心信息分散到多个没召回的对象里
  • metadata 过滤条件错了,把该参与的内容挡掉了

这时候模型拿到的上下文先天就不完整,Prompt 没法弥补缺失事实。

2. 召回错了,Prompt 也只能在错候选里组织语言 ​

如果召回回来的候选本身就是:

  • 旧版本
  • 跨租户内容
  • 权限外内容
  • 模板噪声
  • 表面相似但实际不相关的片段

那么 Prompt 最多只能让模型“更谨慎地使用这些错误内容”,但不能把它们变成对的知识。

很多时候,Prompt 反而会把错误上下文组织得更像一段流畅答案,让问题更难看出来。

3. Prompt 不能替代边界控制 ​

有些人会尝试这样写:

  • “请只使用最新版本内容回答”
  • “请忽略无关内容”
  • “请不要引用没有权限的资料”

这些约束可以作为兜底提示,但不能当主控制手段。

原因很简单:

  • 如果旧版本已经进了上下文,模型需要自己判断谁新谁旧
  • 如果权限外内容已经进了上下文,泄露风险已经发生
  • 如果无关内容太多,模型仍然要在噪声里做高难度判断

这类边界更稳的做法,应该发生在检索前过滤和索引阶段设计上,而不是只交给模型临场判断。

一个更直观的对比 ​

假设用户问:

“定制类商品能不能七天无理由退货?”

情况一:索引阶段做得比较稳 ​

  • 新旧版本已经分开
  • status = active
  • 当前版本 metadata 齐全
  • 召回对象粒度合适

这时 Prompt 只需要做两件事:

  • 要求基于资料回答
  • 要求回答清楚条件和边界

系统通常就比较稳。

情况二:索引阶段做得很乱 ​

  • 新旧版本都进了索引
  • 没有状态字段
  • 一块里混了多个规则
  • 噪声文本也一起入库

这时你即使写很多 Prompt:

  • “优先最新版本”
  • “忽略旧内容”
  • “如果冲突就选择更可信的一条”

模型仍然只能在混乱上下文里猜测。

问题不在它会不会表达,而在它拿到的证据本来就不干净。

一个最小示意 ​

python
prompt = """
请严格根据提供的上下文回答。
如果上下文冲突,优先采用当前有效版本。
"""

contexts = [
    "退款规则 v2:定制类商品支持七天无理由退货。",
    "退款规则 v3:定制类商品不支持无理由退货。"
]

这段示意代码想说明的问题是:

  • Prompt 已经在努力兜底
  • 但系统把冲突版本同时送进来,本身就是上游设计问题

更稳的做法通常不是继续补一句更长的 Prompt,而是让索引和检索阶段先只保留当前有效版本。

哪些问题更应该回到索引阶段重做 ​

如果你遇到的是下面这些情况,优先怀疑索引阶段,而不是继续改 Prompt:

  1. 新旧版本经常混进同一轮回答
  2. 常见问题总召回到页眉页脚、模板或导航文本
  3. 精确术语、规则编号、型号类问题命中很不稳
  4. 多租户或权限边界偶尔串数据
  5. 同一主题经常被切成互相孤立的小片段

这些问题的共同点是:它们不是“模型没按要求说话”,而是“模型拿到的材料本来就不对”。

一个更稳的排查顺序 ​

当你怀疑系统回答质量不好时,可以先按这个顺序排:

  1. 先看召回结果本身对不对
  2. 再看索引对象是否合理、边界字段是否齐全
  3. 然后看重排或聚合逻辑有没有进一步放大问题
  4. 最后才看 Prompt 是否表达不清或约束不足

这个顺序的意义在于:先确认模型是不是拿到了对的材料,再讨论它怎么使用这些材料。

一个常见误区 ​

很多团队会在系统不稳时优先做这件事:

  • 不断追加更长、更严格、更复杂的 Prompt

这样做有时会带来一点局部改善,但也常常带来新的副作用:

  • Prompt 越来越长,难以维护
  • 行为看似变稳,实际只是偶尔被约束住
  • 真正的索引问题被掩盖,后面更难查

所以更稳的思路通常是:

  • 用 Prompt 约束模型如何回答
  • 用索引和检索保证模型拿到正确材料

不要让 Prompt 去承担本来属于上游数据组织的责任。

一句话总结 ​

索引阶段的设计失误很难在 Prompt 层补回来,因为 Prompt 只能约束模型如何使用已经拿到的上下文,不能补足缺失召回、修正错误候选,也不能替代版本、权限和边界控制。很多看似是提示词问题的现象,根因其实早在索引阶段就已经出现了。