如果你正在使用Nous Research开发的开源AI智能体Hermes Agent,尤其是通过Gateway模式接入飞书、Telegram等平台,大概率会遇到这样的痛点:发送一条消息后,需要等待10-15秒才能收到回复。
这既不是你的网络问题,也不是Hermes本身存在程序bug,而是其架构设计带来的固有代价——它需要加载大量工具定义、技能描述与记忆系统,导致每轮对话发送给大语言模型(LLM)的prompt高达18万tokens。
昨日我对生产环境中的一个Hermes Agent实例完成了全面的响应速度优化,本文将完整记录每一步的实测数据与决策依据,最终实现了从15秒到2.6秒的响应速度提升,整体效率提高了5倍。
环境说明
- 硬件:Linux服务器
- Hermes Agent版本:v2026.5.x(最新稳定版)
- 连接方式:飞书消息(Feishu Gateway)
- 记忆系统:Hindsight(Docker部署)
- 初始LLM:MiMo v2.5(小米token-plan套餐)
- 替代LLM:DeepSeek V4 Flash
一、慢在哪里?先做精准诊断
1.1 每轮对话的时间线拆解
完整的消息流转链路及时长分布如下: 用户发消息 → 飞书Webhook(200ms)→ Gateway(50ms)→ 组装Prompt(50ms)→ LLM推理(核心耗时)→ 返回结果(200ms)
通过命令tail -f ~/.hermes/logs/agent.log可以查看每条消息的详细延迟分布,以MiMo v2.5的运行日志为例:
API call #10: model=mimo-v2.5 provider=xiaomi in=185K out=94 latency=13.5s cache=100%
API call #11: model=mimo-v2.5 provider=xiaomi in=180K out=716 latency=15.4s cache=99%
结论非常明确:90%的耗时都集中在LLM推理环节,其余所有环节的总耗时不足1秒。
1.2 每轮对话的token消耗分析
通过查询~/.hermes/state.db数据库,得到每轮对话的token平均消耗数据:
- 新Input(需LLM处理):5,645 tokens
- 缓存命中(跳过处理):107,735 tokens
- 总Input:113,380 tokens
- 缓存命中率:95.0%
即便达到了95%的高缓存命中率,剩余5%的新token(约5,600个)叠加MiMo v2.5自身的推理延迟,依然导致了13-15秒的响应时间。
1.3 System Prompt的冗余内容排查
深入分析Hermes的agent/system_prompt.py文件,发现每轮发送给LLM的system prompt由三层组成,其中存在大量无效冗余:
- Stable层(跨轮不变):包含人格身份、记忆引导、技能清单等,总计约6,000 tokens
- Context层:包含Hermes开发指南AGENTS.md,约17,000 tokens(最大浪费)
- Volatile层(每轮变化):包含记忆快照、用户信息、工具JSON Schema等,其中工具定义约23,000 tokens(第二大浪费)
核心问题总结:
- AGENTS.md是50KB的项目开发指南,记录了项目结构、工具添加方法等开发相关内容,与日常用户聊天完全无关,却被自动注入每一轮对话。
- 工具JSON Schema包含79个工具的完整定义,但browser、video、spotify等大部分工具在飞书文字聊天场景中根本不会被使用。 这两项内容合计占用了40,000 tokens,是prompt体积过大的核心原因。
二、优化一:移除冗余的AGENTS.md
具体操作
AGENTS.md由Hermes的prompt_builder.py自动扫描当前工作目录加载,文件位于~/.hermes/hermes-agent/AGENTS.md。只需备份并重命名该文件,使其不再被自动扫描即可:
# 备份并重命名,避免被自动加载
cp AGENTS.md AGENTS.dev.md
rm AGENTS.md
影响与说明
- 效果:每轮对话直接减少约17,000个新token,大幅降低LLM的处理压力。
- 日常使用:零影响,开发指南与普通用户的聊天交互完全无关。
- 开发场景:需要时执行
mv AGENTS.dev.md AGENTS.md即可快速恢复。
核心代码原理
Hermes的prompt_builder.py中通过以下代码扫描AGENTS.md文件,只要文件名不匹配"AGENTS.md"或"agents.md",就不会被加载:
def _load_agents_md(cwd_path: Path) -> str:
"""AGENTS.md — top-level only (no recursive walk)."""
for name in ["AGENTS.md", "agents.md"]:
candidate = cwd_path / name
if candidate.exists():
content = candidate.read_text(encoding="utf-8").strip()
return _truncate_content(result, "AGENTS.md")
return ""
三、优化二:禁用场景无关的工具集
具体操作
在~/.hermes/config.yaml配置文件中,添加disabled_toolsets字段,禁用飞书文字聊天场景中不需要的工具集:
agent:
disabled_toolsets:
- browser
- video
- video_gen
- spotify
- tts
- discord
- discord_admin
- computer_use
影响与说明
- 效果:工具JSON Schema的体积从约23K tokens减少到约15K tokens,进一步压缩prompt总长度。
- 灵活性:后续需要使用某类工具时,只需在配置中删除对应项并重启服务即可恢复。
四、优化三:更换为速度优化型LLM模型
这是本次优化中效果最显著的一步,直接决定了最终的响应速度提升幅度。
同prompt实测对比
在完全相同的prompt(约185K tokens)下,对两款模型进行了多轮测试,结果如下:
| 模型 | 调用次数 | 延迟 | 缓存率 |
|---|---|---|---|
| MiMo v2.5 | 13次 | 13-15秒 | 99-100% |
| DeepSeek V4 Flash | 首次 | 4.7秒 | 80% |
| DeepSeek V4 Flash | 第3次 | 2.6秒 | 98% |
| DeepSeek V4 Flash | 第9次 | 2.6秒 | 98% |
速度差异的核心原因
两款模型的核心特性对比如下,解释了为何DeepSeek V4 Flash更适合Hermes Agent场景:
| 对比维度 | MiMo v2.5 | DeepSeek V4 Flash |
|---|---|---|
| 模型定位 | 推理型模型,擅长复杂逻辑推理 | Flash速度优化型模型,优先保障低延迟 |
| 首token延迟 | 高(依赖完整思考链生成) | 低(流式输出优化,快速返回首token) |
| 缓存机制 | 内存级缓存,TTL仅5分钟 | 硬盘级持久缓存,保留数小时至数天 |
| 缓存命中计费 | 套餐内1x标准计费 | ¥0.02/M tokens,成本极低 |
| 网络延迟 | token-plan-cn约143ms | api.deepseek.com约143ms |
其中DeepSeek的硬盘级缓存机制优势尤为突出:只要缓存仍在被使用,就不会被自动清理,不仅跨天使用时缓存依然有效,甚至在飞书与Web UI等不同平台切换时,system prompt部分也能继续命中缓存。
配置方法
- 修改
~/.hermes/config.yaml中的模型配置:
model:
default: "deepseek-v4-flash"
provider: "deepseek"
- 在
.env文件中添加DeepSeek API密钥:
DEEPSEEK_API_KEY=sk-your-key-here
五、优化四:优化Prompt Caching策略
背景
GitHub Issue #20880指出了Hermes默认缓存策略的关键缺陷:工具密集型智能体约70%的输入token开销来自工具定义,而默认的system_and_3策略仅对system prompt和最后3条消息设置缓存断点,工具JSON Schema部分每次调用都不会被缓存。
具体操作
修改~/.hermes/config.yaml中的缓存配置,将缓存范围扩展至工具定义:
prompt_caching:
strategy: system_tools_and_2 # 缓存system+工具定义+最后2条消息
cache_ttl: "5m"
效果
工具定义部分也将从缓存中读取,进一步减少每轮对话需要LLM处理的新token数量,同时提升缓存命中率。
六、完整优化效果对比
Token维度对比
| 指标 | 优化前 | 优化后 | 变化 |
|---|---|---|---|
| 每轮新Input token | 5,645 | ~1,926 | ↓ 66% |
| 每轮Cache token | 107,735 | ~138,794 | ↑ |
| 缓存命中率 | 95.0% | 98% | ↑ 3个百分点 |
时间维度对比
| 场景 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 简单问答 | 13-15秒 | 2-3秒 | 5倍 |
| 多工具调用 | 15-20秒 | 3-5秒 | 4-5倍 |
日志对比
优化前(MiMo v2.5):
API call #10: model=mimo-v2.5 provider=xiaomi in=178,977 out=692 total=179,669 latency=13.5s cache=98%
API call #13: model=mimo-v2.5 provider=xiaomi in=180,951 out=403 total=181,354 latency=15.4s cache=99%
优化后(DeepSeek V4 Flash):
API call #3: model=deepseek-v4-flash provider=deepseek in=180,659 out=118 total=180,777 latency=2.6s cache=98%
API call #9: model=deepseek-v4-flash provider=deepseek in=185,232 out=109 total=185,341 latency=2.6s cache=98%
七、费用影响分析
DeepSeek官方定价
| 项目 | 价格 |
|---|---|
| 缓存命中 | ¥0.02 / M tokens |
| 输入(未命中) | ¥1 / M tokens |
| 输出 | ¥2 / M tokens |
实际运行成本
按每轮对话约185K input tokens、98%缓存命中率计算:
- 缓存命中成本:181K × ¥0.02/M = ¥0.0036
- 未命中输入成本:4K × ¥1/M = ¥0.004
- 输出成本:120 × ¥2/M = ¥0.00024
- 每轮总成本:约¥0.008
若每天运行500轮对话,每日成本仅约¥4,每月约¥120,远低于MiMo套餐的¥411/月,实现了速度与成本的双重优化。
八、总结与建议
优化清单(按效果优先级排序)
| 优先级 | 优化措施 | 实施难度 | 核心效果 |
|---|---|---|---|
| ⭐⭐⭐ | 更换为DeepSeek V4 Flash模型 | 低 | 5倍响应速度提升 |
| ⭐⭐ | 移除冗余的AGENTS.md文件 | 低 | 减少约17K token输入 |
| ⭐⭐ | 禁用场景无关的工具集 | 低 | 减少约8K token输入 |
| ⭐ | 优化Prompt Caching策略 | 低 | 实现工具定义缓存 |
其他可参考的进阶优化
- 使用Hermes内置的
/compress命令压缩长对话,减少历史上下文token消耗。 - 调低Hindsight recall tokens参数,从默认的4096改为1024,平衡记忆能力与速度。
- 调整对话压缩比例,设置
compression.target_ratio: 0.15,实现更激进的上下文压缩。
排错指南
遇到响应延迟问题时,第一步应通过日志定位瓶颈:
tail -f ~/.hermes/logs/agent.log | grep -E 'latency|model'
根据输出结果针对性排查:
- 延迟集中在LLM调用:优先更换速度更快的模型或优化prompt体积。
- 缓存率低于80%:检查prompt_caching策略和cache_ttl配置。
- 工具调用频繁:进一步禁用不必要的工具集。
- 前几轮慢后续变快:属于缓存预热的正常现象,无需额外处理。
补充:搭配TreeRouter实现更极致的API调用体验
在AI智能体的性能优化中,除了上述针对Hermes Agent本身的调优,API调用层的优化同样至关重要。TreeRouter作为专业的LLM API中转站,能够为本次优化方案提供强力补充,让Hermes Agent的运行更稳定、响应更迅速。




