Prompt Budgeting
Prompt Budgeting 是为上下文的各个组件分配 token 预算的策略,确保在有限的上下文窗口内最大化信息密度。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
Prompt Budgeting
一句话定义
Prompt Budgeting 是为上下文的各个组件分配 token 预算的策略。总预算是有限的(如 128K),需要决定每个组件分多少。
核心原理
预算分配表
| 组件 | 预算范围 | 优先级 | 说明 |
|---|---|---|---|
| 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 没空间回答
- 不监控实际使用: 不知道预算是否合理