Prompt Budgeting
Prompt Budgeting 是 prompt assembly 阶段的 token 配额分配策略:在已知上下文窗口约束下,为 system、history、retrieval、tools 与 output reserve 分配可执行预算。
#concept
#evergreen
#ai
[!info] related notes
- 所属 MOC: Context Engineering MOC
- 上位约束: 上下文窗口预算
- 组装阶段: Prompt Assembly
- 相邻概念: Context Window Management
Prompt Budgeting
一句话定义
Prompt Budgeting 是为上下文的各个组件分配 token 预算的策略。总预算是有限的(如 128K),需要决定每个组件分多少。
边界:窗口约束 vs 组装配额
上下文窗口预算 回答的是系统级问题:
当前模型窗口与运行时约束下,总共能安全使用多少 token,哪些内容必须预留?
Prompt Budgeting 回答的是组装级问题:
在这个可用预算已经确定后,本轮 prompt 的各组成部分各分多少?
因此它不是“上下文窗口大小”的同义词,而是一个资源分配策略。同一个 128K 模型,在 research、tool-heavy、long-form generation 等不同阶段,可以有不同的 Prompt Budgeting。
核心原理
预算分配表
| 组件 | 预算范围 | 优先级 | 说明 |
|---|---|---|---|
| System Prompt | 1-2K | 最高 | 角色和规则 |
| 当前用户输入 | 0.5-2K | 最高 | 当前任务 |
| 结构化状态 | 1-2K | 高 | 任务进度 |
| 最近消息 | 5-15K | 高 | 对话上下文 |
| 检索知识 | 3-10K | 中 | 外部知识 |
| 工具结果 | 2-5K | 中 | 工具返回 |
| 对话摘要 | 0.5-2K | 中 | 历史压缩 |
| 用户画像 | 0.5-1K | 低 | 长期记忆 |
| 输出预留 | 4-8K | - | LLM 生成空间 |
动态预算调整
class DynamicBudgetAllocator:
def allocate(self, context: ContextBundle, phase: str) -> dict:
if phase == "information_gathering":
# 信息收集阶段:给工具结果更多空间
return {
"tool_results": 10000,
"retrieved_knowledge": 8000,
"recent_messages": 5000,
"output_reserve": 4000,
}
elif phase == "generation":
# 生成阶段:给输出更多空间
return {
"tool_results": 3000,
"retrieved_knowledge": 5000,
"recent_messages": 10000,
"output_reserve": 8000,
}
常见坑
- 不做预算: 所有内容无限制地塞进去
- 预算太死: 不同阶段用相同的预算分配
- 不留输出空间: 上下文填满了,LLM 没空间回答
- 不监控实际使用: 不知道预算是否合理
学习检查
- 为什么“模型支持 128K context”仍不足以决定每一层 prompt 应该放多少内容?
output_reserve为什么必须在组装输入之前预留,而不是等超限后再处理?- 如果检索阶段与最终生成阶段共用一套固定配额,会出现什么资源错配?
- 给定一个 tool-heavy Agent,本轮预算紧张时你会优先压缩哪一层,哪些层不能机械裁掉?