AI Agent 实战避坑 02|为什么你的 Prompt 越写越长,效果却越来越差

上个月优化一个 Code Review Agent 的 system prompt。初版 800 token,效果还行,能抓住主要问题。团队陆续加了各种要求:代码规范要检查、安全漏洞要扫描、性能问题要提醒、文档一致性要校验……

两周后 prompt 膨胀到 6200 token。跑了一轮 eval,通过率从 78% 跌到 52%。

prompt 长度变化        eval 通过率
──────────────        ──────────
800 tokens            78%
2400 tokens           81% ← 峰值
4000 tokens           69%
6200 tokens           52% ← 加了更多要求,反而更差

加了三倍的细节,效果反而砍了三分之一。这不是个例——几乎每个认真做 Agent 的团队都会走到这一步。


直觉陷阱:越详细 ≠ 越好

写 prompt 时有一个天然的直觉:AI 漏了什么,就在 prompt 里补上。Review 漏了安全检查?加一段"务必检查 SQL 注入"。格式不对?加三段输出格式说明。

这个直觉在 prompt 短的时候是对的。但当 prompt 超过一个临界点,每增加一段新要求,不仅那段新要求的执行效果打折,连原来已经在做的事情也开始退化。

根因在 Transformer 的注意力机制:

Context Window = 一块有限的画布

短 prompt(800 tokens):
┌──────────────────────────────────────────┐
│ [核心指令]  [代码]  [工具输出]             │
│  注意力集中 ████████                       │
│  每条指令都被充分"看到"                     │
└──────────────────────────────────────────┘

长 prompt(6200 tokens):
┌──────────────────────────────────────────┐
│ [规范][安全][性能][格式][示例][代码][工具]  │
│  注意力稀释 ██ █ █ █ ██ █ █               │
│  每条指令被分到的注意力变少                  │
│  模型开始"选择性忽略"                       │
└──────────────────────────────────────────┘

这就是为什么你加了"必须检查安全漏洞",但模型有时候就是不检查——不是它不知道要做,是它在 6000 token 的指令海洋里,给这条指令分配的注意力权重不够了。


Prompt 的收益曲线是倒 U 形

不是"越长越好"也不是"越短越好",而是有一个最优区间:

效果
  ↑
  │          ┌───┐
  │         ╱     ╲
  │        ╱       ╲
  │       ╱    最优  ╲
  │      ╱    区间    ╲
  │     ╱               ╲
  │    ╱                  ╲
  │   ╱                    ╲
  ├───┴─────────┴──────────┴───→ Prompt 长度
  太短           刚好          太长
  信息不够      信息充分       注意力稀释
              噪声低

这条曲线的峰值位置取决于任务复杂度:

  • 简单分类任务:峰值在 500-1000 tokens
  • 中等复杂的 review/分析:峰值在 1500-3000 tokens
  • 复杂多步推理:峰值在 3000-5000 tokens

超过峰值之后,你付出的不只是多花了 token 钱——你还在损害模型对已有指令的执行质量。


五个常见的 Prompt 膨胀模式

你的 prompt 很可能正在经历其中几种:

膨胀模式 表现 真实需要的解法
堆砌防御 每次 AI 犯错就加一条"不要做 X" 用验证门控替代 prompt 约束
示例过多 放了 5 个 few-shot 例子"确保理解" 保留 1-2 个最有代表性的即可
格式细说 用 200 字描述 JSON 输出格式 给一个 JSON Schema,让代码验证
重复强调 同一条规则换三种说法出现 说一遍,用检查命令保障执行
角色小说 500 字的角色背景故事 一句话定义角色 + 核心约束

实战:把 6200 token 砍到 2000 token

回到开头那个 Review Agent。我做了四轮精简:

第一轮:删除重复表述(-1200 tokens)

# 删除前:三种说法说同一件事
"你必须仔细检查每一行代码。不要跳过任何代码段。
确保所有代码都被审查到,不能有遗漏。"

# 删除后:一句话
"逐行检查,不跳过。"

第二轮:用结构化约束替代自然语言描述(-1800 tokens)

# 替代前:200 字描述输出格式
"请按照以下格式输出你的 review 结果:首先列出文件名,
然后是行号,然后是问题类型(可以是 bug、安全、性能、
风格四种之一),然后是问题描述,最后是修复建议..."

# 替代后:一个 schema
输出 JSON,schema:
{"file": str, "line": int, "type": "bug|security|perf|style",
 "issue": str, "fix": str}

第三轮:把防御性指令迁移到验证层(-800 tokens)

# 从 prompt 中删除:
"不要输出空的 findings"
"不要遗漏安全相关问题"
"不要给出模糊的行号"

# 迁移到代码验证:
def validate_review(output):
    assert len(output["findings"]) > 0, "findings 不能为空"
    for f in output["findings"]:
        assert f["line"] > 0, "行号必须具体"

第四轮:精简角色设定(-400 tokens)

# 删除前:
"你是一位拥有 15 年经验的高级软件工程师,曾在 Google、
Meta 等公司工作,专精于代码质量和安全审计。你对代码有
极高的标准,不会放过任何潜在问题..."

# 删除后:
"你是严格的代码审计员。只报告缺陷,不给正面评价。"

精简结果:

阶段          tokens    eval 通过率
──────        ──────    ──────────
原始          6200      52%
第一轮        5000      58%
第二轮        3200      71%
第三轮        2400      79%
第四轮        2000      82%    ← 超过了初版的 78%

token 数砍掉 68%,通过率反而提高了 4 个百分点。


Prompt 精简的四个原则

原则一:一条规则只说一遍,用检查命令保障执行

不要在 prompt 里反复强调"不要生成 pass 空实现"。说一遍就够了,然后在验证层加一行:

grep -rn 'pass$' output.py  # 退出码非 0 就打回

能用代码验证的事情,不要用 prompt 祈祷。

原则二:结构化 > 自然语言

描述输出格式不要写小作文。给一个 JSON Schema 或者一个具体示例,比 500 字的描述有效 10 倍。

模型对结构化指令的遵循率远高于自然语言描述——因为结构化格式在训练数据中有大量精确匹配的模式。

原则三:示例贵精不贵多

Few-shot 示例的边际收益递减极快:

0 个示例 → 1 个示例:效果提升 ~20%
1 个示例 → 2 个示例:效果提升 ~8%
2 个示例 → 3 个示例:效果提升 ~3%
3 个示例 → 5 个示例:效果可能下降(注意力被示例占据)

选最有代表性的 1-2 个即可。如果你的任务需要 5 个示例才能让模型理解——说明任务定义本身有问题,不是示例不够。

原则四:角色设定要极简

模型不需要读你的角色小说。它需要的是两个信息:

  1. 我的职责边界是什么(“只负责找缺陷”)
  2. 我的行为约束是什么(“不给正面评价”)

一句话角色定义 + 明确的行为约束,比 500 字的背景故事有效得多。


Token 预算的概念

与其让 prompt 自然生长,不如一开始就设定 token 预算:

一个 Review Agent 的 token 预算分配:

总预算:200K tokens(模型窗口上限)

固定开销:
  system prompt        ≤ 2000 tokens(15%)
  few-shot 示例        ≤ 800 tokens
  输出格式定义         ≤ 200 tokens
  角色 + 约束          ≤ 200 tokens

可变开销:
  待 review 代码       ~10K-50K tokens
  工具调用输出         ~5K-20K tokens
  对话历史            ~10K-30K tokens

安全余量:            ≥ 30K tokens(给模型思考和输出)

有了预算,你就不会无限制往 prompt 里塞东西。每加一段新内容,必须问自己:这段话值得占用有限注意力的多少比例?


什么时候该加长 Prompt

精简不是目的,有效才是。以下场景值得增加 prompt 长度:

  1. 领域术语多且易混淆 — 花 200 token 定义清楚 3 个容易混淆的概念,比让模型猜错后返工值
  2. 输出要求有硬约束 — 安全相关的红线规则(“永远不要执行 rm -rf”)值得重复一遍
  3. 任务有反直觉的要求 — 如果你的要求和模型的"常识"相悖,需要额外解释

判断标准:加了这段话之后,跑一轮 eval,通过率有没有提升? 如果没有——删掉它。


Prompt 不是文档,是注意力的分配方案。每一个 token 都在和其他 token 竞争模型的注意力。你的 prompt 越长,每条指令被"认真执行"的概率就越低。

与其写一个面面俱到的长 prompt 然后祈祷模型全部执行,不如写一个短而精准的 prompt 然后用代码验证执行结果。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐