news 2026/5/3 23:52:40

深度:Hermes Engineering如何用agent记忆升级skill?为什么说它只是半成品

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度:Hermes Engineering如何用agent记忆升级skill?为什么说它只是半成品

最近Hermes agent被讨论得沸沸扬扬的,今天,我们来深度拆解下它是怎么做Skills 闭环系统的。

相比市面上大多数 Agent 框架,它最大的特点在于能从历史交互中,提取经验、存储知识、做智能检索,然后不断更新skills,形成一个学习循环(Learning Loop)。

毋庸置疑,这个思路对复杂任务来说,带来的突破是革命性的。它让agent变得可以自主进化、不断学习,把历史记忆真正变成了工具能力,从而在类似场景中复用。

但说实话,现在的这套系统,最核心的检索系统做的实在是太粗糙了,还停留在关键词检索阶段,连找到相关历史经验都费劲,更别说打通从memory到skills的鸿沟,做到真正的进化了。

接下来,本文将用 Hermes Agent + Milvus 2.6 + 飞书的方式,搭一套能理解语义、跨会话记住操作方式、自主迭代skill的个人知识库 Agent,来解决这个问题。

一、Hermes Agent:架构与核心机制

要理解Hermes 的记忆设计到底厉害在哪里,我们需要现对其架构进行一个拆解。总共分四层:

L1 上下文记忆:当前会话窗口内的实时信息,会话结束后清空

L2:跨会话持久化的事实性知识,如项目技术栈、团队约定、已知结论

L3 原生检索:基于 SQLite FTS5 的关键词全文检索,用于在本地文件中定位信息

L4 Skills:以 Markdown 文档形式存储的操作流程,记录的是完成某类任务的具体步骤

L4 是四层里和其他agent最本质的区别,但原因不是其他框架没有类似概念。LangChain、AutoGPT 都有 Tool 和 Skill 的设计。区别在于来源:它们的skills需要开发者在部署前手动定义,用什么工具、按什么顺序、传什么参数,全部写在代码里,用户无法在使用过程中增加新skills。

Hermes 的 Skills 是从实际执行中自动提炼的。你用它完成一次检索任务,跨会话触发相同类型的工作流后,Learning Loop 自动评估这个流程是否值得固化,若值得就写入 Skill 文档,返回 💾 Memory updated · Skill ‘xxx’ created. 从此这个流程成为可复用的操作记忆,无需任何代码改动。其他框架的技能是开发者预先设计的,Hermes 的技能是 Agent 在使用中自己积累的。

但深度调研之后,我发现一件事情,要想让Hermes 学会高质量的“干中学”,其实仅靠 Hermes 的原生检索不够用。接下来,我们来拆解其原生检索系统的问题,以及我们如何使用 Milvus 对其改造的方式。

二、为什么加 Milvus:Hermes 原生检索有边界

Hermes 跨会话触发相同类型的历史工作流,需要使用检索系统先精准找到历史上的相似操作。

但是在检索系统的搭建上,它自带的 L3 检索是基于 SQLite FTS5,关键词倒排全文搜索只擅长精确匹配字面内容,在语义检索场景有明显短板。

典型案例:知识库里记录的是 asyncio 事件循环、异步任务调度、非阻塞 I/O,检索 Python 并发处理时,FTS5 可能一条都找不到,因为字面没有交集。

也是因此,当知识库规模超过数百份文档后,就需要我们引入向量语义检索来补齐 Hermes 的检索短板。这也是引入 Milvus 的直接原因。

2.1 选 Milvus 2.6 的两个实际理由

理由一:Hybrid Search(混合检索)

Milvus 2.6 支持在同一次查询中同时执行向量检索(语义)和 BM25 全文检索(关键词),用 RRF(Reciprocal Rank Fusion)算法合并两路结果。

比如,我们问 asyncio 的原理是什么,向量检索能命中语义相关内容;问 find_similar_task 这个函数在哪,BM25也能精确匹配代码中的函数名。

问涉及某个函数的某种类型任务时,Hybrid Search也能一次检索调用,就能给出正确结果,无需手写路由逻辑。

理由二:分层存储,实际部署内存可控

Milvus 2.6 引入三层存储(Hot 内存 / Warm SSD / Cold 对象存储),按访问频率自动冷热分级。500 份文档向量化后的知识库,无需全量常驻内存,按需加载可将内存控制在 2GB 以内,$5/月的 VPS 完全可以运行。

选型原因明确后,下面介绍系统整体架构与落地步骤。

三、系统架构

在这个新的体系里,Hermes思考需要做什么(Skill),Milvus回答检索什么(知识内容)。

四、安装部署

4.1 安装并初始化 Hermes

curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash

安装完成后运行 hermes,进入交互式初始化向导,完成:

LLM Provider 配置:支持 OpenAI、Anthropic、OpenRouter(含免费模型)

渠道配置:本文使用飞书机器人

4.2 部署 Milvus 2.6 Standalone

个人部署使用 Standalone 模式(单节点)足够:

curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh \ -o standalone_embed.sh bash standalone_embed.sh start 验证服务状态 docker ps | grep milvus

4.3 创建知识库 Collection

Schema 设计决定检索能力上限。以下结构同时支持稠密向量检索和 BM25 全文检索:

from pymilvus import MilvusClient, DataType, Function, FunctionType client = MilvusClient( uri="http://192.168.x.x:19530", ) schema = client.create_schema(auto_id=True, enable_dynamic_field=True) schema.add_field("id", DataType.INT64, is_primary=True) # 原始文本(BM25 全文检索用) schema.add_field( "text", DataType.VARCHAR, max_length=8192, enable_analyzer=True, enable_match=True ) # 稠密向量(语义检索) schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=1536) # 稀疏向量(BM25 自动生成,Milvus 2.6 特性) schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR) schema.add_field("source", DataType.VARCHAR, max_length=512) schema.add_field("chunk_index", DataType.INT32) # 告诉 Milvus 用BM25 把text 自动转换为 sparse_vector bm25_function = Function( name="text_bm25", function_type=FunctionType.BM25, input_field_names=["text"], output_field_names=["sparse_vector"], ) schema.add_function(bm25_function) index_params = client.prepare_index_params() # HNSW 图索引(稠密向量) index_params.add_index( field_name="dense_vector", index_type="HNSW", metric_type="COSINE", params={"M": 16, "efConstruction": 256} ) # BM25 倒排索引(稀疏向量) index_params.add_index( field_name="sparse_vector", index_type="SPARSE_INVERTED_INDEX", metric_type="BM25" ) client.create_collection( collection_name="hermes_milvus", schema=schema, index_params=index_params )

Hybrid_search脚本

import sys, json from openai import OpenAI from pymilvus import MilvusClient, AnnSearchRequest, RRFRanker client = MilvusClient("http://192.168.x.x:19530") oai = OpenAI() COLLECTION = "hermes_milvus" def hybrid_search(query: str, top_k: int = 5) -> list[dict]: # 1. 向量化查询 dense_vec = oai.embeddings.create( model="text-embedding-3-small", input=query ).data[0].embedding # 2. 稠密向量检索(语义相关性) dense_req = AnnSearchRequest( data=[dense_vec], anns_field="dense_vector", param={"metric_type": "COSINE", "params": {"ef": 128}}, limit=top_k * 2 # 候选集适当放大,交给 RRF 做最终排序 ) # 3. BM25 稀疏向量检索(精确词项匹配) bm25_req = AnnSearchRequest( data=[query], anns_field="sparse_vector", param={"metric_type": "BM25"}, limit=top_k * 2 ) # 4. RRF 融合排序 results = client.hybrid_search( collection_name=COLLECTION, reqs=[dense_req, bm25_req], ranker=RRFRanker(k=60), limit=top_k, output_fields=["text", "source", "doc_type"] ) return [ { "text": r.entity.get("text"), "source": r.entity.get("source"), "doc_type": r.entity.get("doc_type"), "score": round(r.distance, 4) } for r in results[0] ] if __name__ == "__main__": query= sys.argv[1] if len(sys.argv) > 1 else "" top_k = int(sys.argv[2]) if len(sys.argv) > 2 else 5 output = hybrid_search(query, top_k) print(json.dumps(output, ensure_ascii=False, indent=2))

环境与知识库就绪后,进入关键验证环节:观察 Hermes 的跨会话学习能力是否真实生效。

五、实战:Skills自动生成过程

Step 1 会话 1:首次指定脚本执行检索

打开 Hermes,在飞书发送指令,明确告知脚本路径和检索目标:

Hermes 通过 Terminal Tool 调用脚本,返回带本地文档来源的回答。此时 Skill 尚未创建,这只是一次普通的工具调用。

Step 2 重新提问

在飞书中清空对话记录,开启全新会话。不提脚本名称,不提路径,直接提问:

Step 3 从 Memory 更新到 Skill 正式创建

Learning Loop 触发,Memory 先行写入,Hermes 返回检索结果和回答,并明确告知:

这是 Learning Loop 的第一步动作。Memory 在此刻记录的是本次工作流的执行经验,包括:调用了哪个脚本、传入了什么参数、返回了什么结构的结果。这一步是积累,还不是固化。

Skill 正式创建

在跨会话触发确认复用价值后,Learning Loop 自动完成第二步,三个 Skill 被正式创建:

Skill 名称作用
hybrid-search-doc-qa对 Memory 中的文档执行混合语义检索并生成回答
milvus-docs-ingest-verification验证文档是否已正确摄取进知识库
terminal执行终端命令,如运行脚本、设置环境变量等

需要注意,Memory 和 Skill 是两个不同层级的概念:Memory 是经验记录,Skill 是可被反复执行的封装能力。Memory 存的是发生过什么,Skill 存的是下次遇到同类问题,按什么步骤执行。Hermes 在这一刻完成的,是从积累经验到生成可复用技能的跃迁。

之后当用户提问时,Hermes 无需任何提示,自动识别意图、路由到对应 Skill、从 Memory 中召回相关文档片段,最终生成回答。用户不需要指定用哪个 Skill,这一切在后台自动完成。

另外,有一点值得单独说清楚。绝大多数 RAG 系统解决的是知识的存和取,但如何取这条链路是写死在代码里的,换个问法或者换个场景就可能失效。这套方案的不同之处在于:检索策略本身被存成了 Skill,变成了可持久化、可修改、有历史记录的对象。

在这之后💾 Memory updated · Skill ‘hybrid-search-doc-qa’ created. 出现,其实不是系统配置完成的标志,而是 Agent 第一次把某种行为模式判定为值得保留。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 23:47:29

Python第三方库Emoji库的使用教程

0. 背景Emoji库是一个Python第三方库,用于在程序中处理和使用表情符号。表情符号(Emoji)起源于日本,最初由栗田穣崇(Shigetaka Kurita)在1999年创建,用于在移动通信中传达情感和信息。随着智能手机的普及,表情符号已成为全球通用的…

作者头像 李华
网站建设 2026/5/3 23:44:30

3分钟快速上手:qmcdump终极指南——轻松解码QQ音乐加密文件

3分钟快速上手:qmcdump终极指南——轻松解码QQ音乐加密文件 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump …

作者头像 李华
网站建设 2026/5/3 23:36:43

云计算终极指南:从零到架构专家的10个技术突围秘籍

云计算终极指南:从零到架构专家的10个技术突围秘籍 【免费下载链接】geektime-books :books: 极客时间电子书 项目地址: https://gitcode.com/GitHub_Trending/ge/geektime-books 在数字化时代,云计算已成为企业数字化转型的核心引擎。极客时间电…

作者头像 李华
网站建设 2026/5/3 23:35:52

Go-Patterns项目测试驱动开发:22个模式的单元测试完全解析

Go-Patterns项目测试驱动开发:22个模式的单元测试完全解析 【免费下载链接】go-patterns Design patterns in Golang 项目地址: https://gitcode.com/gh_mirrors/gop/go-patterns Go-Patterns项目(GitHub加速计划/gop)是一个专注于Gol…

作者头像 李华