如果你正在使用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(第二大浪费)

核心问题总结:

  1. AGENTS.md是50KB的项目开发指南,记录了项目结构、工具添加方法等开发相关内容,与日常用户聊天完全无关,却被自动注入每一轮对话。
  2. 工具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部分也能继续命中缓存。

配置方法

  1. 修改~/.hermes/config.yaml中的模型配置:
model:
  default: "deepseek-v4-flash"
  provider: "deepseek"
  1. .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策略 实现工具定义缓存

其他可参考的进阶优化

  1. 使用Hermes内置的/compress命令压缩长对话,减少历史上下文token消耗。
  2. 调低Hindsight recall tokens参数,从默认的4096改为1024,平衡记忆能力与速度。
  3. 调整对话压缩比例,设置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的运行更稳定、响应更迅速。