Hermes Agent 优化迭代实录:一个AI Agent的持续进化之路
前言:当AI Agent成为你的量化队友
做量化交易的人都知道——80%的时间花在”不是交易”的事情上。
每天早上打开电脑,先跑一遍数据下载脚本;收盘后导出今日行情,跑一遍信号计算;周末整理持仓分析,看周报。这些事情本身不难,但它们反反复复吃掉你的精力,让你没有时间去思考真策略、真逻辑。
我一直在想,能不能找个”人”来帮我干这些活?
2026年5月,我遇到了 Hermes Agent——一个开源的AI Agent框架,由Nous Research开发。跟当时市面上的其他Agent框架相比,Hermes有一个让我眼前一亮的特点:它天然支持cron调度。这意味着Agent可以像Linux的定时任务一样,到点自动执行,不需要手动触发。
“就是它了。”
从那天起,我开始了长达数十天的Hermes Agent深度使用与迭代之旅。这篇文章就是这段旅程的完整记录——没有理论,全是实战。
第一阶段:基础搭建
WSL环境下的Hermes安装
我日常工作在Windows上,但量化工具链(DuckDB、pytdx、akshare这些)对Linux更友好。所以选择了WSL(Windows Subsystem for Linux)作为运行环境。
安装过程其实相当顺利。Hermes的文档很清晰,基本上就是:
git clone https://github.com/NousResearch/hermes-agent.git
cd hermes-agent
pip install -e .
两行命令就能跑起来。但真正开始用的时候,才意识到配置才是最花时间的部分。
网关配置:飞书 + 微信双平台接入
Hermes支持”网关”(Gateway)的概念,就是你可以在多个IM平台上跟Agent对话,它会把消息统一路由到背后的LLM处理。
我配了两个网关:
飞书(Feishu/Lark) 是主力平台。飞书的开放平台支持度很高——机器人API、消息卡片、富文本、图片、文件——几乎你想要的功能都有。配置过程需要:
- 在飞书开放平台创建应用
- 配置事件回调(Event Callback)和消息卡片
- 获取App ID和App Secret
- 在Hermes的gateway配置中填好对应参数
微信 作为备选。一开始想用企业微信做推送,但后来发现个人微信的限制太多——主动推送消息非常困难。最终选用了iLink Bot作为微信接入方案,但它有一个致命问题(后面会详说)。
模型提供商配置
Hermes支持多种LLM后端。我配置了三家:
- GLM(智谱):主力模型,处理日常对话和技能调用
- DeepSeek:备用模型,写代码和做数据分析时表现很好
- OpenAI兼容接口:用于测试和对比
配置方式是在Hermes的profile配置中指定provider和model name。我一开始主力用的是 GLM-5.2(智谱的第五代旗舰模型),后来因为限流问题不得不降级——这是后话了。
# provider配置示例(简化)
providers:
- name: glm
api_key: ${GLM_API_KEY}
base_url: https://open.bigmodel.cn/api/paas/v4
- name: deepseek
api_key: ${DEEPSEEK_API_KEY}
base_url: https://api.deepseek.com
第二阶段:技能系统
从0到20+技能的建设过程
Hermes最核心的概念是”技能”(Skills)。技能就是Agent可以调用的工具——Python脚本、命令行、API调用、数据分析函数——你把它包装成一个技能,Agent就能在对话中自动调用它。
最开始,我只写了3个技能:
- 数据下载:每日从pytdx拉取行情数据
- 信号计算:跑一下策略信号
- 日报生成:产出每日市场概览
然后就发现:Agent的真正威力在于,你每加一个技能,它的能力边界就扩大一圈。
一个月下来,我写出了20多个技能。这二十几个技能大概分成这几类:
技能分类
量化策略类(核心)
- 可转债低溢价轮动策略分析
- 双低策略打分排序
- ETF轮动信号计算
- 布林带均值回归信号
- Barra因子选股
- 全市场估值监控
数据工程类
- pytdx数据同步(日线 / 分钟线)
- akshare实时行情获取
- DuckDB查询接口(支持任意SQL)
- 数据完整性校验
- 增量更新与去重
AI工具类
- 调用LLM生成分析报告
- 舆情情绪分析(新闻情感打分)
- 研报关键信息提取
DevOps类
- 磁盘空间检查
- 定时任务状态监控
- 日志分析与告警
- 文件清理
技能的持续迭代
每个技能都经历了 创建 → 使用 → 发现问题 → patch修复 的循环。
比如”数据下载”这个看似简单的技能,迭代了至少5次:
- 初版:直接调用pytdx,全量拉取所有股票
- 问题:太慢了,4500只股票要跑十几分钟
- 修复:改为增量模式,只拉取上次同步后新增的数据
- 新问题:偶尔有几只股票同步失败,没报错
- 修复:增加逐只股票的状态检查和重试机制
- 再迭代:加入进度条和预计完成时间
每次迭代,我都在技能的文档字符串(docstring)里更新使用说明和注意事项,这样Agent调用时能看到最新信息。
后来我养成了一个习惯:每次技能出问题,立刻修,不拖延。因为一个有bug的技能不仅耽误事,还可能污染Agent的判断——它会以为这个技能”不可靠”,转而用更复杂的方式解决问题。
第三阶段:cron调度系统
这是整个过程里最让我兴奋的部分。
Hermes Agent的cron机制,本质上是把技能跟定时触发器绑定。你可以写一个cron表达式,告诉Agent “每天早上6点执行这个任务”,然后就不用管了。
我最终搭建了这么一套调度系统:
每日06:00 — 早间检查
早上6点,Agent自动醒来,执行一系列检查:
- 磁盘空间是否充足(低于10%报警)
- 昨日数据同步是否正常完成
- 检查是否有技能执行失败需要重试
- 如果一切正常,推送一条”早安”消息到飞书,附上今日待办
这个模块很薄,但作用巨大——它取代了我每天早上第一件事”检查系统状态”的习惯。现在起床后看一眼飞书消息,就能知道一切是否正常。
每日18:00 — 数据同步
收盘后,Agent自动执行:
- 调用pytdx拉取当日最新行情
- 数据清洗和去重
- 写入DuckDB数据库
- 更新缓存数据
这大概需要5-15分钟,取决于当日数据量。Agent会在完成后推送一条简短的同步报告。
每周一 09:30 — 全市场估值周报
周一开盘前,Agent生成一份完整的周度报告:
- 各大指数估值(PE、PB、百分位)
- 行业轮动分析
- 风格因子表现
- 宏观数据更新
这份报告通过飞书消息卡片发送,包括文本摘要和图片附件。为了这个功能,我专门写了媒体文件上传的逻辑——因为飞书的消息卡片支持插入图片(通过 image_key),需要先上传图片文件到飞书服务器。
每周六 10:00 — 可转债推荐
周六上午,Agent跑一遍可转债策略:
- 拉取全市场可转债数据
- 用低溢价 + 双低策略打分排序
- 筛选出Top 10推荐
- 生成分析报告推送
这是我最满意的技能之一。以前我手动做这件事需要跑脚本、看数据、写笔记,前后至少半小时。现在Agent十分钟搞定,而且它还会在报告里附上每个转债的基本面概要说明。
每周日 20:00 — 记忆 + Wiki 更新
周末晚上,Agent做一次”自我维护”:
- 记忆优化:清理不重要的短期记忆,整理长期记忆
- Wiki更新:把本周踩坑的经验教训结构化存入Wiki
- 系统复盘:检查这周的cron执行记录,看有没有异常
这部分实际上是在维护Agent本身的知识库。一开始我没重视,后来发现如果不做定期整理,Agent的记忆会越来越”胖”,关键信息淹没在废话里。
自我进化系统
除了固定的cron任务,我还设置了一套”自我进化”机制:
- 每日19:00:Agent搜索行业最新的量化研究和技术博客
- 整理成摘要存入自己的Wiki
- 如果发现有用的新技能或新工具,会自己评估是否值得接入
听起来很科幻对吧?实际上实现起来没那么复杂——就是一个搜索 + 摘要 + 存入Wiki的技能链。但它确实产生了实际价值:有一天Agent自己发现了一篇关于 “DuckDB全内存查询优化” 的文章,然后主动建议我把某些慢查询改成内存模式。
第四阶段:记忆与知识管理
记忆系统的容量管理
Hermes Agent有记忆系统(Memory),它会记住你和它的对话历史。但有一个现实约束:每个记忆条目最大约2200字符。
这意味着你不能把一大段对话塞进去,必须精炼。我摸索出的套路是:
- 好的记忆:一句话说清楚事实,比如 “用户偏好使用双低策略做可转债筛选,阈值是价格<130且溢价率<30%”
- 坏的记忆:冗长的对话片段,包含大量上下文和无关细节
我还写了一个”记忆压缩”技能,定期把多条相似记忆合并成一条精炼的。
经验教训的沉淀
Agent会踩坑,也会学会不踩同一个坑。
比如有一次,Agent在执行数据下载时没检查网络连接,导致脚本超时挂了。我在记忆里写了一条:
“执行数据下载前,先用
ping检查pytdx服务器是否可达。如果不可达,等待60秒后重试,最多3次。”
之后Agent再执行数据下载,就会自动检查网络。这个”教训”一次都没再犯过。
Wiki 与第二大脑的联动
Hermes Agent的Wiki机制类似于一个结构化的知识库。我把Wiki分成了几个板块:
- 量化配置:数据源配置、API密钥使用规范
- 策略文档:每个策略的详细说明、参数、注意事项
- 运维手册:cron任务说明、故障处理流程
- 学习笔记:Agent从外部搜索中整理的新知识
Wiki的存在极大地缓解了记忆容量问题——记忆存”索引”,Wiki存”正文”。Agent先查记忆找到线索,再去Wiki获取详细信息。
踩坑与优化(重点)
这部分是全文最有价值的章节。每一个坑都是用时间换来的教训。
1. 模型限流:从GLM-5.2到deepseek-v4-flash的三级降级
这是最大的坑,没有之一。
第一周:我用 GLM-5.2 做主力模型,效果很好。回复质量高,技能调用准确。
第二周:cron任务跑起来之后,问题来了。每天18:00的数据同步需要反复调用Agent执行多个子任务,再加上飞书网关的实时对话消耗,API调用量暴增。智谱的API开始返回 429 Too Many Requests。
第一次降级:从 GLM-5.2 降到 GLM-5.1。限流问题缓解了一些,但每天高峰期还是会触发。GLM-5.1的回复质量略有下降,但技能调用准确率还能接受。
第二次降级:GLM-5.1 仍然扛不住cron密集调用的压力。我开始研究Hermes的模型降级机制——在配置里设置fallback provider,当主模型触发限流时自动切换到备用模型。
最终方案:GLM-5.2 → GLM-5.1 → deepseek-v4-flash 三级降级链。主模型GLM-5.2,触发限流降级到GLM-5.1,再限流就降到deepseek-v4-flash。DeepSeek的v4-flash模型虽然不如GLM-5.2智能,但胜在速度快、限流宽松,做数据同步和脚本调用足够用了。
这个三级降级方案稳定运行至今,再也没因为限流而中断过cron任务。
2. WSL的WARP代理导致的DNS问题
非常隐蔽的一个问题。
WSL的网络模式默认跟Windows共享网络栈。我的Windows上开着WARP(Cloudflare的VPN),它会接管DNS请求。
有一天,Agent突然无法访问任何外部API——飞书网关连不上,pytdx也连不上。排查了很久,发现是WSL的 /etc/resolv.conf 被WARP改成了 127.0.0.53 的本地DNS代理,而这个代理在WSL里工作不正常。
解决方案:在WSL里显式配置DNS:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
然后锁住 /etc/resolv.conf 防止被覆盖:
sudo chattr +i /etc/resolv.conf
之后DNS问题再没出现过。
3. 飞书API token刷新机制
飞书的机器人API使用 tenant_access_token 进行鉴权,这个token的有效期是2小时。你需要定期刷新。
Hermes的gateway机制有自动token刷新,但有一个触发条件:只有在收到飞书消息的时候才会检查并刷新token。这意味着如果Agent在cron任务中主动向飞书推送消息,而token又恰好过期了,推送就会失败。
修复:在推送消息前增加一次显式token刷新检查,不管有没有消息事件,都主动调一次token刷新API。
4. 微信推送限制(iLink Bot不支持主动推送)
我一开始想用微信做Agent的告警推送渠道,选用了iLink Bot方案。配置完成后发现一个问题:iLink Bot只能被动回复消息,不能主动向用户推送。
这就尴尬了。cron任务执行完毕后,Agent需要主动推送报告,但微信这条路走不通。
解决方案:放弃微信作为主动推送渠道,只保留飞书。微信作为”备选对话入口”保留——如果飞书挂了,还能从微信手动触发技能。主动推送全部走飞书。
5. cron no_agent脚本路径问题
Hermes在执行cron任务时,有一个 no_agent 模式:就是不经过LLM,直接执行一个预定义的脚本。这在某些场景下很高效——比如数据同步没必要让LLM参与,直接跑脚本就行。
但问题来了:no_agent 脚本的工作路径和标准技能的环境不一样。我的脚本开头有用相对路径引用的数据文件,用 no_agent 模式跑起来就找不到文件。
修复:把所有脚本里的相对路径改成绝对路径,或者在脚本开头强制 cd 到项目目录。
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
这个很小的改动,节省了我不知道多少调试时间。
6. 文件变更冲突
当cron任务和手动对话同时在跑的时候,偶尔会出现两个进程同时修改同一个文件的情况。
最典型的场景是:Agent在cron里写DuckDB数据库,同时我通过飞书给Agent发了一条消息,它也触发了数据查询——两个进程同时读写DuckDB文件,导致写入冲突。
解决方案:
- DuckDB层面:所有写入操作改为”写入临时文件 + 原子重命名”的模式
- 调度层面:调整cron任务的执行时间,尽量避开我使用的高峰时段
- 互斥锁:为关键资源(DuckDB、配置文件)增加文件锁
7. 磁盘空间监控
这个教训来得比较”肉疼”。
WSL的虚拟硬盘(ext4.vhdx)默认是动态增长,但不会自动收缩。我每天下载行情数据、生成报告、保存日志,磁盘占用稳步上升。有一天发现WSL虚拟硬盘膨胀到了硬盘快要放不下的程度。
解决方案:
- 写了一个磁盘监控技能,每天检查
/的使用率 - 设置告警阈值:使用率超过80%推送提醒
- 写日志清理脚本:删除7天前的日志
- 定期执行 WSL 磁盘压缩
# WSL磁盘压缩(需要在Windows的PowerShell中执行)
wsl --shutdown
# 然后在Windows上执行DiskPart或者使用Optimize-VHD
效果评估
到现在,这套系统已经稳定运行了相当长一段时间。来算一笔时间账:
每天自动化覆盖的工作量
| 任务 | 原来耗时 | 现在耗时 | 节省 |
|---|---|---|---|
| 每日行情下载 + 清洗 | 15分钟 | 0(自动) | 15分钟 |
| 收盘后数据同步 | 10分钟 | 0(自动) | 10分钟 |
| 策略信号计算 | 10分钟 | 0(自动) | 10分钟 |
| 每日市场简报 | 20分钟 | 0(自动) | 20分钟 |
| 每周估值周报 | 45分钟 | 0(自动) | 45分钟 |
| 每周可转债推荐 | 30分钟 | 0(自动) | 30分钟 |
| 数据校验 + 查错 | 不定时 | 自动告警 | 大量精力 |
每天保守估计节省 55分钟,每周 6小时+。而这些时间都用来做真正有价值的事:研究新策略、优化参数、测试新想法。
系统架构(文字描述)
整个系统可以抽象为四层架构:
┌─────────────────────────────────────────┐
│ 交互层(飞书 / 微信) │
│ 消息卡片 · 文本对话 · 图片 · 文件 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ 网关层(Hermes Gateway) │
│ 消息路由 · token刷新 · 多平台适配 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ Agent层(Hermes Core) │
│ 技能调度 · LLM推理 · 记忆管理 · Wiki │
│ cron调度 · 模型降级 · 上下文管理 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ 执行层(技能 & 脚本) │
│ DuckDB · pytdx · Python · Shell │
│ 数据同步 · 策略计算 · 报告生成 │
└─────────────────────────────────────────┘
Agent层是最核心的部分——它负责理解意图、拆解任务、调度技能、管理上下文。cron调度器跑在Agent层之上,定时触发任务链。
总结与心法
经过这段时间的持续迭代,我总结了几条心法:
-
先跑起来,再优化。不要试图一次性搭好完整系统。先搞一个最简单的cron任务,跑通,再慢慢加。
-
每个技能都要有”自我修复”能力。Agent不是人,它不会”感觉不对”。你必须把异常处理写进技能里——重试、降级、告警,一个都不能少。
-
记忆要精简。一条好的记忆就是一句话。长篇大论的记忆只会让Agent更困惑。
-
日志就是一切。cron跑在后台,你看不到它的执行过程。没有好的日志,出了问题只能盲猜。每个技能至少输出
[INFO]、[ERROR]、[WARN]三档日志。 -
接受不完美。Agent偶尔会犯错——选错参数、调用错技能、推理逻辑出错。追求100%正确率会让你陷入无穷无尽的优化。我的经验是:AI不是取代你,而是放大你。90%的正确率,乘以每天的自动执行次数,带来的收益远大于手动做100%。
未来规划
系统的开发永远不会停。接下来的方向:
- 可视化仪表盘:在飞书上做一个行情看板,不用打开终端就能看到实时数据
- 更为智能的错误恢复:当技能执行失败时,Agent能自己分析错误日志并尝试修复
- 多Agent协作:不同Agent负责不同版块(策略A、策略B、数据运维),它们之间可以互相通信
- 实时行情接入:从pytdx的实时接口或WebSocket获取盘中数据,实现盘中信号推送
- 自动策略回测:当Agent发现一个新想法时,自动拉取历史数据做回测并给出报告
如果你也在用Hermes Agent做量化自动化,或者在搭建自己的AI Agent系统,欢迎交流。这条路还在继续,每一次迭代都让系统变得更强一点点。
而最强的那个版本——永远是下一个。
📚 相关文章推荐
- 用AI Agent做量化投资:Hermes Agent 20+自动化任务的架构与实践 — 同为Hermes Agent实战系列,架构设计与优化迭代相辅相成
- 个人博客从零到上线全记录:Astro + GitHub + Cloudflare + 自定义域名 — Agent实战系列的延伸,记录量化博客的搭建全过程
- DuckDB搭建A股量化数据库:4589只股票本地数据库实战教程 — Agent自动化调度的数据底座,cron任务的核心数据源