语言模型读取和写入 token,你要为两者付费。token 优化就是把它们花在能改善回答的地方,其他地方一个也不花。做得好,既能降低成本和延迟,也常常能提升质量,因为聚焦的提示词更容易被遵循。
什么是 token
token 是模型词表中的一段文本:一个单词、单词的一部分、一个标点符号,或一个空格加一个单词。对于英文文本,粗略的经验是每个 token 约四个字符,即四分之三个单词。这个经验经常失灵:
- 代码、JSON 和不常见的标识符比普通文本使用更多 token。
- 英语以外的语言,每个词通常使用更多 token。
- 每个提供商都有自己的分词器,所以同一段文本在不同模型上的计数不同。
用真正的分词器计数
估算适合作初步判断,却不适合做预算。OpenAI 公开了它的分词器,所以离线也可以得到精确计数。Anthropic 和 Google 提供 token 计数端点;没有它们,计数就只是近似值。
PromptFlowEngine 遵循这一区分:OpenAI 模型的计数用其分词器计算,并标注为精确;其他提供商标注为近似。你可以在工作区或通过 HTTP API 检查提示词:
curl -s https://promptflowengine.com/api/v1/tokens \
-H 'content-type: application/json' \
-d '{"prompt":"Summarize the notes below in 5 bullets.","model":"gpt-4.1"}'
成本从哪里来
每次调用的成本是输入 token 乘以输入单价,加上输出 token 乘以输出单价。三个事实决定了所有优化:
- 输出 token 通常比输入 token 贵好几倍。 限制回答长度往往比精简提示词省得更多。
- 提示词的固定部分每次调用都要付费。 在运行一百万次的系统提示词里浪费五十个 token,就是五千万个 token。
- 在对话或智能体循环中,历史记录每一轮都会重新发送。 成本增长得比轮数更快。
提示词压缩:删什么
从最安全的删减做到风险最大的删减。
冗词和客套话。 “你好”“请”“我希望你”“需要注意的是”。这些不承载任何指令。
Before: Hello! I would like you to please summarize the notes below.
Please make sure to keep it brief.
After: Summarize the notes below in 3 sentences.
重复。 同一条指令说了两次,往往是经过数月修改后出现在不同的段落里。
啰嗦的表达。 “为了”可以简化为“为”,“由于……的缘故”可以简化为“因为”。
未使用的上下文。 没有任何测试用例依赖的背景信息。删掉它,然后重新运行测试。
过多的示例。 用三个示例代替八个,然后测量。
冗长的格式。 带缩进、键名很长的 JSON,比键名很短的紧凑 JSON 更耗 token。对于插入提示词的数据,紧凑格式能在每次调用中节省 token。
前三项是机械性的。PromptFlowEngine 提示词优化器会应用它们,并验证原文中的每个句子、要求、代码块和变量都还在,这正是手工检查时最繁琐的部分。
不要删什么
- 要求与约束。 删掉了某条规则的更短提示词,就是另一个提示词。
- 输出格式。 删掉它只省十个 token,却会让你失去一个解析器。
- 输入周围的分隔符。 它们很便宜,并能防止注入。
- 结构。 章节标题只花几个 token,却可能提升遵循度。过度压缩、去掉了冠词和连接词的文本,对模型来说会含糊不清,对下一个编辑它的人来说也难以阅读。
上下文窗口优化
上下文窗口是模型一次能考虑的 token 最大数量,输入和输出加在一起。窗口已变得非常大,这把问题从“放得下吗”变成了“该不该放进去”。
更多上下文并非免费。 除了成本和延迟,输入变大时质量还可能下降:被成千上万无关 token 包围的相关段落,更难被模型利用。只发送任务所需的内容。
检索,而不是全部包含。 搜索与问题相关的段落,只插入这些段落。参阅 RAG 提示词。
在长提示词中顺序很重要。 许多模型对长输入的开头和结尾最为关注。把长文档放在前面,把问题或指令放在其后,或者在末尾重复关键指令。
管理对话历史。 总结较早的轮次,丢弃不再需要的工具结果,话题变化时开启新的对话。
为回答留出空间。 如果输入占满窗口,输出就会被截断。为你预期的最长回答留出空间。
拆分工作。 提示词链只给每一步它所需的上下文。
使用缓存
主要提供商都提供提示词缓存:当提示词的开头与最近的请求一致时,重复的部分按折扣价计费,处理也更快。要从中受益:
- 把稳定内容放在最前面:系统提示词、工具定义、示例、参考文档。
- 把可变内容放在最后:用户的问题和每次请求的数据。
- 避免在调用之间改动稳定部分的任何内容,例如时间戳。
缓存能让很长的固定提示词便宜得多,但并不能消除无关上下文带来的质量代价。
控制输出长度
- 给出数字:“不超过 100 个词”“恰好 5 个要点”。
- 只要你需要的:一个标签,而不是带解释的标签。
- 把 API 的最大输出 token 数设为硬性上限。
- 对推理模型,在简单任务上降低推理强度。
设定预算并强制执行
确定每个生产环境提示词可以使用多少 token,并自动检查。当提示词文件超过 token 上限时,提示词测试门禁会使构建失败:
{ "include": ["prompts/**/*.md"], "model": "gpt-4.1", "maxTokens": 1500 }
这样,token 增长就从你在账单上才发现的事,变成了你在拉取请求里审查的事。关于通过度量来改进提示词的更完整流程,参阅提示词优化。