一个 30 轮对话的 AI Agent,平均消耗 150K tokens,按 GPT-5.5 计费约 $2.25/次。如果你的 Agent 每天运行 10 次自动化任务,一个月光 API 费用就可能超过 $600。本文拆解 5 个生产级优化技巧,用真实代码示例展示如何把成本降到 $180 以下——每个技巧都有可落地的 Python/Shell 实现。
前言
AI Agent 正在从"玩具"走向"生产工具"。无论你是用 Hermes Agent 管理内容流水线、OpenClaw 做多平台运营、还是 Claude Code 写代码,核心成本只有一个:Token 消耗。
大多数人关注的是模型单价(GPT-5.5 vs DeepSeek vs Qwen),却忽略了一个事实:同样的任务,不同 Agent 的 Token 效率可以差 5-10 倍。差的 Agent 会反复调用同样的工具、返回冗余数据、在上下文中堆积无用信息——而你按 Token 为每一字节付费。
我在运营 AI 创业内参的 45 天里,从日均消耗 380K tokens 优化到 105K tokens,成本从 $170/月降到 $47/月。本文分享 5 个经过生产验证的优化技巧。
技巧一:工具描述精简化(节省 15-25% 上下文 Token)
问题
每个工具调用前,Agent 都要把所有可用工具的定义(name + description + parameters JSON Schema)塞进 system prompt。一个典型的 Agent 有 10-15 个工具,工具定义本身就可能占 3,000-5,000 tokens。
很多工具的 description 写得像技术文档——实际上 Agent 只需要知道三件事:这个工具干什么、输入是什么、输出是什么。
对比:优化前 vs 优化后
优化前(典型 MCP Server 的工具描述,127 tokens):
{
"name": "search_web_content",
"description": "Search the internet for recent news articles and blog posts related to a specific topic. This tool uses multiple search backends including Google, Bing, and DuckDuckGo to provide comprehensive coverage. Results are ranked by relevance and recency. Use this tool when you need to find current information about technology trends, market analysis, competitor intelligence, or any topic that requires up-to-date data from the web. The tool returns title, URL, and a brief snippet for each result.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The search query string. Use natural language or boolean operators. Max 200 characters."
},
"limit": {
"type": "integer",
"description": "Maximum number of results to return, between 1 and 20. Default 5."
}
}
}
}
优化后(42 tokens,节省 67%):
{
"name": "search_web_content",
"description": "Search web for {query}, return up to {limit} results with title/URL/snippet.",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"},
"limit": {"type": "integer", "description": "1-20, default 5"}
}
}
}
优化规则
- 删除营销语言
:"comprehensive coverage"、"use this tool when..."——Agent 不需要被说服 - 用参数名代替解释
: search for {query}比 "search for the query string provided in the query parameter" 清晰 10 倍 - 参数描述不超过 15 词
:Agent 是靠参数名推断语义的,不是靠读长描述 - 删除默认值描述
:default 值在 JSON Schema 里已经有了
落地脚本
# 批量优化所有 MCP 工具的 description
# 规则:description > 100 chars → 压缩到一句话
python3 -c "
import json, re
with open('mcp_tools.json') as f:
tools = json.load(f)
for t in tools:
desc = t.get('description', '')
if len(desc) > 100:
# 保留第一个句子(通常包含核心语义)
first_sent = re.split(r'[.。]', desc)[0]
t['description'] = first_sent.strip()
for pname, pinfo in t.get('parameters', {}).get('properties', {}).items():
pdesc = pinfo.get('description', '')
if len(pdesc) > 30:
pinfo['description'] = pdesc[:30].rsplit(' ', 1)[0]
with open('mcp_tools_optimized.json', 'w') as f:
json.dump(tools, f, indent=2)
print(f'Optimized {len(tools)} tools')
"

▲ 图1:Token消耗优化前后对比——从380K/天降至105K/天,成本降低72%
技巧二:工具结果智能截断(节省 20-30% 上下文 Token)
问题
Agent 调用工具后,整个返回值会被追加到对话历史。如果你的 read_file 工具返回了一个 3,000 行的日志文件,或者 web_search 返回了 20 条结果,这些全部计入下一轮的上下文。
更糟的是,Agent 往往只需要结果中的一小部分——比如搜索结果的标题和 URL,而不是完整的摘要段落。
解决方案:分层截断策略
# truncate_tool_result.py — 生产级工具结果截断
import re
def truncate_tool_result(tool_name: str, raw_output: str, max_chars: int = 2000) -> str:
"""根据工具类型智能截断返回结果"""
# 搜索结果:只保留 title + url + 首句摘要
if tool_name in ('web_search', 'search_files', 'grep'):
lines = raw_output.split('\n')
short_lines = []
for line in lines:
if len(line) > 150:
# 截断长行:保留前 120 字符 + "..."
short_lines.append(line[:120] + '...')
else:
short_lines.append(line)
truncated = '\n'.join(short_lines[:15]) # 最多 15 条结果
if len(short_lines) > 15:
truncated += f'\n... ({len(short_lines) - 15} more results omitted)'
return truncated[:max_chars]
# 文件读取:保留首尾 + 行号
if tool_name in ('read_file', 'cat'):
lines = raw_output.split('\n')
if len(lines) <= 50:
return raw_output[:max_chars]
# 保留前 20 行 + 后 10 行
head = '\n'.join(lines[:20])
tail = '\n'.join(lines[-10:])
return f'{head}\n... [{len(lines) - 30} lines omitted] ...\n{tail}'
# 终端命令输出:只保留 stdout(不要 stderr),截断到 max_chars
if tool_name in ('terminal', 'shell', 'bash'):
# 去掉 ANSI 转义码
clean = re.sub(r'\x1b\[[0-9;]*m', '', raw_output)
return clean[:max_chars]
# 默认:直接截断
return raw_output[:max_chars]
# 在 Hermes Agent 的工具调用包装器中使用
# 修改 run_agent.py 中的 handle_function_call 或工具注册时的 post_process
def tool_result_post_processor(tool_name: str, result: str) -> str:
return truncate_tool_result(tool_name, result, max_chars=2000)
效果数据(实测,30 轮 Agent 对话):
技巧三:上下文自动压缩(节省 30-50% 历史 Token)
问题
Agent 的对话历史会无限增长。30 轮对话中,前 20 轮的上下文通常已经无关紧要了——但模型还是要为这些历史 Token 付费。
三种压缩策略
策略 A:滑动窗口(最简单)
# 只保留最近 N 轮对话
MAX_HISTORY_TURNS = 15
def sliding_window(messages: list, max_turns: int = MAX_HISTORY_TURNS) -> list:
"""保留 system prompt + 最近 N 轮对话"""
system_msgs = [m for m in messages if m['role'] == 'system']
conversation = [m for m in messages if m['role'] != 'system']
# 每轮 = user + assistant(可能 + tool results)
# 从末尾往前保留完整轮次
return system_msgs + conversation[-(max_turns * 2):]
策略 B:智能摘要(最省 Token,但需额外一次 API 调用)
def summarize_history(messages: list, summary_model: str = "gpt-4o-mini") -> str:
"""用廉价模型对历史对话做摘要"""
# 取前 80% 的消息做摘要
split_point = int(len(messages) * 0.8)
old_messages = messages[:split_point]
recent = messages[split_point:]
# 用 mini 模型生成摘要(~500 tokens 的摘要请求,成本 ~$0.001)
summary_prompt = "Summarize this agent conversation in 3-5 bullet points, preserving key facts, decisions, and context:"
conversation_text = '\n'.join([f"{m['role']}: {str(m.get('content', ''))[:500]}" for m in old_messages[-20:]])
# 返回摘要文本 + 最近 20% 消息
return f"[Previous conversation summary]\n{summary_text}\n\n[Recent messages]\n" + \
'\n'.join([f"{m['role']}: {str(m.get('content', ''))[:200]}" for m in recent])
策略 C:Hermes Agent 原生 compaction
Hermes Agent v0.15 内置了自动压缩机制。配置方法:
# ~/.hermes/config.yaml
compaction:
enabled: true
auto_compaction_trigger_tokens: 64000 # 当上下文超过 64K tokens 时触发
keep_last_n_messages: 10 # 压缩后保留最近 10 条消息
compaction_model: "gpt-4o-mini" # 用廉价模型做压缩
或在 Hermes Agent 初始化时传入:
from run_agent import AIAgent
agent = AIAgent(
model="deepseek-v4-pro",
auto_compaction=True,
compaction_trigger_tokens=64000,
keep_recent_messages=10,
)
关键原则:压缩不是删除。压缩后必须保留:
用户的原始目标和约束 工具调用产生的关键数据(文件路径、版本号、金额) 已做出的决策和原因

▲ 图2:5大Token优化技巧一览——从工具描述精简到记忆分层,每项节省比例标注
技巧四:并行工具调用(节省 40-60% 轮次 Token)
问题
很多 Agent 的工作方式是串行的:读取文件 A → 读取文件 B → 搜索关键词 C → 写入文件 D。每轮都要等待上一轮完成,每轮都要把完整的上下文传给模型。
如果文件 A、B 的读取和关键词 C 的搜索互相独立,完全可以并行执行——模型一次性发出 3 个 tool call,一轮就完成。
实现:用 Hermes Agent 的并行工具调用
# Hermes Agent 原生支持并行 tool calls
# 模型在一次响应中返回多个 tool_calls 时,Hermes 并行执行它们
# 在你的 prompt 中引导模型使用并行调用:
system_prompt = """
When you need to gather information from multiple independent sources,
call all tools SIMULTANEOUSLY in a single response rather than one at a time.
Example — DON'T do this (3 rounds):
Round 1: read_file("src/auth.py")
Round 2: read_file("src/db.py")
Round 3: search_files("config*.yaml")
DO this instead (1 round):
Round 1: read_file("src/auth.py") + read_file("src/db.py") + search_files("config*.yaml")
"""
实测对比(读取 5 个文件 + 3 次搜索的 Agent 任务):
| 节省 | -63% | -44% | -73% |
何时不能用并行
以下情况必须串行:
工具 B 的输入依赖工具 A 的输出(如:先搜索文件,再用搜索结果中的路径读取文件) 有副作用的操作需要顺序保证(如:先创建文件再写入,或先 stop 服务再 start) 写入操作(避免竞态条件)
判断规则:如果两个工具调用之间没有数据依赖,就并行。
技巧五:记忆分层——短期 vs 长期(节省 10-20% 上下文 Token)
问题
Agent 经常在长对话中"回忆"起 20 轮之前提到的一个细节——但为了能回忆,你必须把 20 轮前的消息全部留在上下文里。
解决方案:两级记忆架构
# memory_tiers.py — 短期工作记忆 + 长期持久化记忆
import json, os
from datetime import datetime
class AgentMemory:
"""两级记忆:短期(上下文内) + 长期(持久化检索)"""
def __init__(self, storage_path: str = "~/.hermes/memory/"):
self.storage = os.path.expanduser(storage_path)
os.makedirs(self.storage, exist_ok=True)
def store_fact(self, key: str, value: str, ttl_hours: int = 24):
"""存储可检索的事实——不进上下文,用时再取"""
fact = {
"key": key,
"value": value,
"stored_at": datetime.now().isoformat(),
"ttl_hours": ttl_hours
}
# 写入记忆文件
mem_file = os.path.join(self.storage, f"{key[:30].replace('/', '_')}.json")
with open(mem_file, 'w') as f:
json.dump(fact, f)
def recall_fact(self, key: str) -> str | None:
"""按需检索——仅在需要时占用上下文"""
mem_file = os.path.join(self.storage, f"{key[:30].replace('/', '_')}.json")
if not os.path.exists(mem_file):
return None
with open(mem_file) as f:
fact = json.load(f)
# 检查是否过期
stored = datetime.fromisoformat(fact["stored_at"])
if (datetime.now() - stored).total_seconds() > fact["ttl_hours"] * 3600:
return None
return fact["value"]
def get_context_brief(self) -> str:
"""仅在每轮对话中保留 100 tokens 的「记忆索引」"""
# 不把完整记忆塞进上下文,只放索引
files = sorted(os.listdir(self.storage))[:10]
briefs = []
for f in files:
with open(os.path.join(self.storage, f)) as fp:
fact = json.load(fp)
briefs.append(f"- {fact['key']}: {fact['value'][:60]}")
return "Stored facts (use recall_fact to retrieve details):\n" + '\n'.join(briefs)
使用模式
优化前(所有信息留在上下文):
User: 开始写周报
Agent: (上下文中有 15 轮前的 5 篇文章信息、10 轮前的发布记录、5 轮前的用户反馈...)
总共 45K tokens 的历史
优化后(信息存入记忆,按需检索):
User: 开始写周报
Agent: (上下文仅有 100 tokens 的记忆索引)
→ recall_fact("articles_this_week") → 获取文章列表
→ recall_fact("publish_log") → 获取发布记录
→ 总共 12K tokens(上下文 3K + 3 次检索结果 9K)

▲ 图3:投入$47/月,产出自动化内容流水线——优化后的一人公司AI运营成本模型
实战案例:一个 AI 内容流水线的 Token 优化全记录
优化前的状态
我的 AI 创业内参内容流水线是一个 Hermes Agent,负责:
每 15 分钟扫描热点 发现重大新闻后写草稿 每天定时发布文章
优化前,这个 Agent 日均消耗 380K tokens,30 天费用 $171(GPT-5.5 定价)。
Token 消耗拆解(优化前)
优化清单与效果
| 105K |
最终结果:日均 105K tokens,月费 $47,节省 72%。
具体配置(Hermes Agent)
# ~/.hermes/config.yaml — 生产级优化配置
model: "deepseek-v4-pro" # 用 DeepSeek 而非 GPT-5.5,单价更低
compaction:
enabled: true
auto_compaction_trigger_tokens: 64000
keep_last_n_messages: 8
compaction_model: "deepseek-chat"
tools:
result_max_chars: 2000 # 所有工具返回值截断到 2000 字符
parallel_execution: true # 允许并行工具调用
memory:
provider: "file" # 用文件系统做记忆存储
context_brief_max_tokens: 100 # 上下文中只保留记忆索引
常见问题(FAQ)
Q1:截断工具结果会不会导致 Agent 丢失关键信息?
不会——前提是你按工具类型做智能截断。搜索结果的第 15-20 条、日志文件的中间 500 行、终端输出的 ANSI 转义码——这些对 Agent 的决策几乎没有价值。关键是保留:标题+URL(搜索)、首尾行(文件)、stdout(终端)。
Q2:压缩上下文后,Agent 会不会"忘记"用户最初的指令?
需要区分两种"记忆":目标(用户要什么)必须在压缩后保留;过程(怎么做的)可以丢弃。好的压缩策略会保留 system prompt + 用户原始目标 + 关键决策点,只压缩中间的工具调用细节。
Q3:并行工具调用有风险吗?
有。如果两个工具操作同一个资源(如写入同一个文件),并行执行可能导致竞态条件。规则:读操作可以并行,写操作必须串行,有依赖关系的工具不能并行。
Q4:这些优化会导致 Agent 能力下降吗?
在我的 45 天实测中,优化后 Agent 的任务完成率从 94% 降到 92%(下降 2%),但成本降了 72%。这 2% 的失败通常是截断导致搜索不够深——可以通过"如果前 5 条不相关,Agent 可以再次搜索"来补救。
总结
AI Agent Token 优化的本质是:把模型的计算资源花在刀刃上。5 个技巧按优先级排列:
- 工具结果截断
(立即见效,节省 20-40%) - 上下文自动压缩
(长期收益最大,节省 30-50%) - 工具描述精简
(一次性优化,持续受益) - 并行工具调用
(零成本,但需判断依赖关系) - 记忆分层
(适合长期运行的 Agent)
如果你只做一件事:给你的工具返回值加一个 max_chars=2000 的截断。这是 5 分钟就能落地的优化,效果立竿见影。
本文由AI辅助创作,经人工审核编辑发布
夜雨聆风