AI Agent 实战避坑 02|为什么你的 Prompt 越写越长,效果却越来越差
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 个示例才能让模型理解——说明任务定义本身有问题,不是示例不够。
原则四:角色设定要极简
模型不需要读你的角色小说。它需要的是两个信息:
- 我的职责边界是什么(“只负责找缺陷”)
- 我的行为约束是什么(“不给正面评价”)
一句话角色定义 + 明确的行为约束,比 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 长度:
- 领域术语多且易混淆 — 花 200 token 定义清楚 3 个容易混淆的概念,比让模型猜错后返工值
- 输出要求有硬约束 — 安全相关的红线规则(“永远不要执行 rm -rf”)值得重复一遍
- 任务有反直觉的要求 — 如果你的要求和模型的"常识"相悖,需要额外解释
判断标准:加了这段话之后,跑一轮 eval,通过率有没有提升? 如果没有——删掉它。
Prompt 不是文档,是注意力的分配方案。每一个 token 都在和其他 token 竞争模型的注意力。你的 prompt 越长,每条指令被"认真执行"的概率就越低。
与其写一个面面俱到的长 prompt 然后祈祷模型全部执行,不如写一个短而精准的 prompt 然后用代码验证执行结果。
更多推荐


所有评论(0)