Agent 的 Prompt 如何压缩以减少 Token 消耗
1️⃣ 考察意图
面试官想看你能否系统性地减少 Agent 的 prompt token 消耗。刁钻点在于:压缩不是简单删字——需要在"信息保持"和"token 减少"之间平衡。过度压缩导致信息丢失、Agent 决策质量下降。答好了能展示你对 prompt 工程的深度理解和成本优化能力。
2️⃣ 标准答
1. Prompt Token 消耗分析
Agent 的 prompt 通常包含:
- System prompt(500-2000 tokens)
- 工具 Schema(1000-5000 tokens,取决于工具数量)
- 对话历史(1000-10000+ tokens,随轮数增长)
- RAG 检索结果(2000-10000 tokens)
- 当前用户输入(50-500 tokens)
总消耗可达 5000-30000 tokens/次调用。以 GPT-4o($2.5/1M input tokens)计算,单次调用成本 0.0125-0.075
2. 六种压缩策略
- 策略 1:System Prompt 精简删除冗余指令:如"你是一个专业的AI助手"可以简化为"AI助手"
- 合并重复规则:如"用中文回复"和"回复必须是中文"合并
- 用列表替代段落:列表比段落省 20-30% tokens(减少连接词)
- 实测:2000 tokens 的 system prompt 可压缩到 1200 tokens(减少 40%) 策略 2:工具 Schema 优化
- 精简 description:
"搜索企业知识库,当用户询问公司政策、产品信息、历史记录时使用"→"搜索企业知识库" - 删除冗余参数描述:如果参数名已经自解释(如
query),不需要额外描述 - 按需加载工具:不把所有工具 schema 都放入 prompt,只加载当前步骤可能用的工具
- 实测:15 个工具的 schema 从 3000 tokens 压缩到 1500 tokens(减少 50%) 策略 3:对话历史压缩
- 滑动窗口:只保留最近 N 轮(如 5 轮),旧轮次丢弃
- 摘要压缩:用 LLM 对旧对话做摘要("用户之前询问了RAG分块策略,Agent推荐了语义分块"),用摘要替换原始对话
- 关键信息提取:从旧对话中提取"事实性信息"(如"用户偏好Python"),存入结构化格式
- 实测:10 轮对话(8000 tokens)压缩到摘要+最近3轮(2000 tokens,减少 75%) 策略 4:RAG 结果压缩
- Top-K 减少:从 top-10 减到 top-3(检索精度足够时)
- 文档截断:每个文档只取前 500 tokens(关键信息通常在开头)
- 摘要替代:用 LLM 对每个文档做 1 句话摘要,用摘要替代原文
- 实测:10 个文档 × 1000 tokens = 10000 tokens → 3 个摘要 × 100 tokens = 300 tokens(减少 97%) 策略 5:格式优化
- JSON → 紧凑格式:去掉缩进和换行,省 15-20% tokens
- 自然语言 → 结构化格式:用列表/表格替代段落,省 20-30% tokens
- 重复信息去重:工具返回值和RAG结果中的重复内容去重 策略 6:上下文裁剪
- 移除已完成步骤的详细输出:如工具调用的完整返回值在后续步骤中不需要时,替换为"[工具调用成功,返回了5条搜索结果]"
- 移除中间推理过程:CoT 在后续步骤中不需要时,只保留结论
- 动态上下文:根据当前步骤的需要,只加载相关部分的上下文
3. 压缩效果量化
| 策略 | Token 减少 | 信息损失 | 适用场景 |
|---|---|---|---|
| System Prompt 精简 | 40% | 低 | 所有场景 |
| 工具 Schema 优化 | 50% | 低 | 工具多(>10) |
| 对话历史压缩 | 75% | 中 | 长对话(>10轮) |
| RAG 结果压缩 | 90%+ | 中高 | 文档多(>5) |
| 格式优化 | 20% | 无 | 所有场景 |
| 上下文裁剪 | 50% | 中 | 多步Agent |
综合应用可减少 60-80% 的 prompt token,单次调用成本从 $0.075 降到 0.015-0.030
3️⃣ 答题模板(30 秒电梯版)
"Agent Prompt 压缩六策略。System Prompt精简(删冗余指令,-40%)。工具Schema优化(精简description+按需加载,-50%)。对话历史压缩(滑动窗口+摘要+关键信息提取,-75%)。RAG结果压缩(Top-K减少+文档截断+摘要替代,-90%)。格式优化(JSON紧凑+列表替代段落,-20%)。上下文裁剪(移除已完成步骤的详细输出,-50%)。综合减少60-80%token,成本从0.075降到0.015-0.030。核心:在信息保持和token减少间平衡,用LLM-as-Judge验证压缩后的决策质量不下降。"
4️⃣ 高频追问 & 应对
追问 1:对话历史压缩用摘要替换原始对话,如果后续用户引用了旧对话的具体内容怎么办?
三层保障:(1) 关键信息提取——摘要时不仅生成概述,还提取"关键事实列表"(如"用户提到的数据:营收100万、成本30万"、"用户偏好:Python、深度学习")。保留具体数字和偏好,只压缩寒暄和中间推理;(2) 按需恢复——摘要中标注"详见第N轮"。如果用户说"刚才你说的那个数字是多少",Agent 从长期存储中加载第 N 轮的原始对话。代价是增加 1 次 LLM 调用(约 500ms),但只在需要时触发;(3) 混合策略——最近 3 轮保留原始对话(覆盖 80% 的引用场景),4-10 轮用摘要,10 轮以上只保留关键事实。实测:混合策略的信息保留率约 90%,token 减少 70%。
追问 2:工具 Schema 按需加载怎么实现?Agent 怎么知道当前步骤需要哪些工具?
两种方式:(1) Planner 指定——Planner LLM 在生成计划时,标注每步需要的工具。如"Step 1: search_web(搜索)→ Step 2: execute_python(分析)→ Step 3: send_email(报告)"。Executor 只加载当前步骤的工具 Schema;(2) Router 分类——用小模型(GPT-4o-mini)判断"当前步骤属于哪类任务"(搜索类/代码类/通信类),只加载对应类别的工具 Schema(3-5 个而非全部 15 个)。延迟增加 200ms 但 token 减少 60%。挑战:Router 分类错误导致需要的工具没加载。兜底:如果当前步骤执行失败(工具不可用),回退到加载全部工具重新执行。
追问 3:RAG 结果用摘要替代原文,会不会丢失关键细节?
取决于任务:(1) 事实性任务(需要精确数字/引用)——摘要会丢失细节。解法:保留原始文档的"关键段落"(包含数字/引用的句子),只对非关键段落做摘要。用 NER 检测"哪些句子包含数字/实体";(2) 理解性任务(需要整体把握)——摘要足够。如"总结这篇文章的核心观点"——摘要保留了核心观点,细节不重要;(3) 混合策略——Top-1 文档保留原文(最重要的),Top-2-3 用摘要。实测:Top-1 原文 + Top-2-3 摘要的效果与 Top-3 原文的效果接近(任务完成率差 <3%),但 token 减少 60%。关键:Reranker 确保最相关的文档排第 1。
5️⃣ 避坑 · 常见错误答法
- ❌ "Prompt 越短越好" → ✅ "过度压缩导致信息丢失,Agent 决策质量下降。需要在 token 减少和信息保持间平衡。用 LLM-as-Judge 验证压缩后的任务完成率不下降。"
- ❌ "删掉 system prompt 中的示例可以省很多 token" → ✅ "Few-shot 示例对 LLM 的行为引导至关重要。删掉示例可能导致输出格式错误、工具调用错误,反而增加重试的 token 消耗。应该精简示例(1-2 个而非 5-10 个)而非完全删除。"
- ❌ "工具 Schema 可以完全省略,让 LLM 自己猜" → ✅ "没有工具 Schema,LLM 不知道有哪些工具可用、参数格式是什么。会导致工具调用格式错误、调用不存在的工具。Schema 可以精简但不能省略。"
6️⃣ 简历呼应
- 如果你有 Prompt 优化项目:从"Token 成本优化"切入,描述你的压缩策略和效果,给出数据(如平均 token 从 20k 降到 6k、成本降低 70%、任务完成率保持 90%+)
- 如果你有 NLP 经验:用"文本摘要"迁移——对话历史压缩本质是文本摘要任务。核心差异是 Agent 的摘要需要保留"可操作信息"(参数、偏好、决策)而非仅语义概括
- 如果你是校招无项目:用 LangChain 实现对话历史压缩(滑动窗口+摘要),对比压缩前后的 token 消耗和任务完成率
- "Prompt Compression for LLM Applications" (Jiang et al., 2023)
- "LLMLingua: Compressing Prompts for LLMs" (Jiang et al., 2023)
- "Context Window Optimization for Agent Systems" (LangChain, 2024)