别再死磕提示词优化,真正该优化的是上下文
本文为 AgentScript 系列第二篇,承接上篇「模型到底看到了什么?」,提出一个核心认知:Agent 开发的核心优化方向,不是打磨提示词话术,而是管控模型可见的上下文信息。
提示词优化,是提示词工程之后最顺理成章的进阶方向。 既然手写提示词脆弱、不稳定,那就交给优化器自动迭代:调整指令措辞、挑选示例、基于数据与指标编译出更优质的提示词。
这个思路本身合理,也诞生了不少实用工具。最典型的代表就是 DSPy,它将自身定位为面向大模型的编程框架,而非简单的提示词工具;内置优化器可以根据自定义指标,自动调优程序内的提示词甚至模型权重。
但对绝大多数智能体(Agent)而言,提示词优化并不是优先级最高的优化目标。
问题不在于提示词不重要。 而是:提示词往往不该是最先优化的部分。
一个 Agent 的完整提示词,从来不是单纯的一句指令,而是多部分混合而成:
完整提示词 = 系统指令 + 角色设定 + 上下文数据 + 示例 + 用户指令
常规的提示词优化,大多只聚焦指令相关部分:措辞润色、示例选择、任务话术调整、Few‑Shot 样例设计。 可实际上,Agent 的行为表现,更多由上下文数据决定:检索文档、工具返回结果、记忆记录、中间状态、历史输出、摘要引用、其他智能体的返回内容。
只要模型能看到正确的证据,哪怕指令平平无奇,也能给出不错的结果; 反之,如果模型获取的信息本身有误,再精妙的指令,只会让错误答案看起来更通顺、更像真的。
本文要讲的,就是另一个更关键的优化目标:
不要只优化你对模型说了什么,更要优化模型能看到什么。

提示词,不是智能体的最小单元
单次大模型调用中,提示词似乎是天然的优化单元。 我们写指令、给示例、测试输出、微调话术,一套流程非常直观。
但这套思维,放到 Agent 多轮执行场景里就彻底失效了。 Agent 不止有一个固定提示词,它拥有不断变化的上下文边界。
一个科研类智能体,上下文通常包含:
- 用户原始问题
- 检索关键词
- 搜索结果
- 召回文档
- 文档摘要
- 历史运行记忆
- 中间观测信息
- 失败尝试记录
- 工具调用异常
- 辅助智能体的输出
- 最终答案格式约束
这些信息里,一部分需要传入下一轮模型调用,另一部分则必须过滤。
Agent 出问题,很少是因为:
指令描述不够清晰。
更多是因为这三类问题:
模型看到了错误的上下文。
正确的上下文存在于程序中,却没有传入提示词。
上下文传入了,但格式、粒度不对。
工具返回内容过长、记忆查询到过时信息、摘要丢失关键引用、规划步骤需要精简摘要而回答步骤需要完整原文…… 这些本质都不是话术问题,而是上下文选择问题。
提示词文本:一个极难优化的软变量
提示词优化听起来很美好:用算法替代人工反复调试。 以 DSPy 的 MIPROv2 为例,它可以联合优化指令与 Few‑Shot 示例,基于下游任务指标,在无梯度、无模块标签的前提下,优化多阶段模型程序。 这是非常扎实且有价值的研究方向。
但它优化的对象,本质上是软性变量。 提示词文本存在这些天然缺陷:
- 维度极高、自由文本无约束
- 高度依赖特定模型特性
- 约束困难、语义难以量化对比
- 极易过拟 合
- 效果好时难以解释,效果差时难以排查
对比两次提示词的修改,只能看到文字变化,却很难解释系统为什么变得更稳定: 是指令本身真的更好? 还是某句话刚好契合当前模型的行为偏好? 还是示例刚好贴合验证集? 还是优化器找到了一个会随模型迭代失效的小技巧? 还是下游评估指标本身不完善?
这些问题不是否定提示词优化的价值,而是说明:自由文本形式的提示词,是一个非常难优化的目标。 它太贴近模型本身的黑盒行为,却远离了 Agent 内部真实的数据流问题。
上下文,才是更优质的优化目标
上下文和提示词完全不同。 上下文的核心不是一句话,而是一系列结构化决策:
模型该看原始工具结果,还是精简摘要? 该看前3条文档,还是前10条? 该读取近期记忆、长期经验,还是完全不使用记忆? 该保留带引用的原文片段,还是压缩后的观测总结? 最终回答步骤需要完整证据,规划步骤是否只需要极简摘要?
这些都是清晰、可枚举的结构化选择:
- 不使用上下文
- 精简摘要
- 常规总结
- 高相关文档
- 带引用的原文片段
- 记忆+文档组合
同时它也更容易排查、追踪:
- 本次运行用了前5条文档,token上限4k
- 本次运行用了精简摘要,上限500token
- 本次运行完全禁用记忆