Deep Dive into Skills: Self-Evolving Agent Capabilities
title: "Deep Dive into Skills: Self-Evolving Agent Capabilities" summary: "" sortOrder: 30 status: "published"
[Translation Pending]\n\n# 第 03 期 | Skills 系统深度剖析:让 Agent 自我进化
🎯 学习目标
- 深入理解 Hermes Agent 的 Skills 系统,掌握其在代理自进化中的核心作用。
- 了解 Hermes Agent 如何通过内置学习循环自动创建、改进和持久化 Skills。
- 学会从
agentskills.io社区平台加载和使用预定义的 Skill。 - 掌握自定义 Skill 的创建方法,并能够将其集成到 Hermes Agent 中。
📖 核心概念讲解
Hermes Agent 的核心魅力之一,便是其强大的 Skills 系统。这不仅是其实现“自进化”愿景的基石,也是区分其与传统 LLM 应用的关键特性。Skills 赋予了 Hermes Agent 执行复杂任务、从经验中学习并不断提升自身能力的能力。
3.1 什么是 Hermes Agent 的 Skills?
在 Hermes Agent 的语境中,Skill (技能) 是一段封装了特定功能、工具使用逻辑或知识的模块化代码与指令。它允许 Agent 执行超出其基础 LLM 能力范围的操作,例如:
- 与外部世界交互:执行 shell 命令、进行网络请求、访问文件系统。
- 处理复杂数据:解析 JSON、处理文本、进行数据转换。
- 执行特定任务流程:例如,一个“网页搜索”Skill 可以封装调用搜索引擎 API 的逻辑;一个“代码生成”Skill 可以封装调用特定代码模型的逻辑。
每个 Skill 都包含:
- 指令 (Instruction):描述 Skill 的用途和如何使用它。
- 工具代码 (Tool Code):实际执行任务的 Python 代码。
- 参数 (Parameters):Skill 接受的输入。
- 依赖 (Dependencies):Skill 运行所需的 Python 包。
通过 Skills,Hermes Agent 可以将复杂任务分解为一系列可执行的子任务,并利用合适的 Skill 来完成每个子任务。
3.2 自进化核心:Skills 的自动创建、改进与持久化
Hermes Agent 最引人瞩目的特性是其内置的 学习循环,该循环使得 Agent 能够从经验中自动创建、改进和持久化 Skills。
3.2.1 学习循环工作原理
当 Hermes Agent 尝试完成一个复杂任务时,如果它发现现有 Skill 无法直接解决问题,或者某个操作模式被重复多次并产生了良好的结果,它就会触发学习机制:
- 问题识别:Agent 遇到一个它无法直接解决的问题,或者识别出可以被抽象为可重用步骤的序列。
- 规划与执行:Agent 可能会尝试通过分解问题、组合现有工具或直接利用 LLM 的推理能力来解决。
- 成功经验捕捉:当 Agent 成功完成一个复杂步骤或整个任务时,它会分析其执行路径、使用的工具和中间结果。
- Skill 提炼与生成:如果 Agent 识别出一种新的、有用的操作模式,它会将其抽象为一个新的 Skill。这个新 Skill 会包含执行该操作所需的指令、工具代码和参数。
- 例如,如果你让 Agent 查找某个项目的 GitHub 仓库,然后克隆它,再列出文件。Agent 可能会从这些步骤中学习并创建一个“克隆并探索 GitHub 仓库”的 Skill。
- Skill 持久化:新生成的 Skill 会被保存到 Agent 的本地 Skill 库(通常是
~/.hermes/skills目录)中,以便在未来的会话中重用。 - Skill 改进:随着 Agent 执行更多任务,它可能会发现现有 Skill 的不足之处,或者有更优化的执行方式。它会根据新的经验,对现有 Skill 进行修改和完善,使其更健壮、更高效。
3.2.2 持久化机制
所有自动创建和手动添加的 Skills 都会以 YAML 或 JSON 文件的形式存储在 Agent 的本地配置目录中。这确保了 Skills 的 跨会话持久性,意味着 Agent 在重启后依然能够记住并使用它所学到的所有技能。
~/.hermes/
├── config.yaml
├── gateway.yaml
├── memory/
│ └── ...
└── skills/
├── auto_generated_skill_1.yaml
├── my_custom_skill.yaml
└── arxiv_researcher.yaml
这种机制是 Hermes Agent 能够真正“自进化”的关键。每次成功完成任务,Agent 都有机会变得更聪明、更强大。
3.3 agentskills.io:社区共享的 Skill 宝库
为了加速 Agent 的能力建设,NousResearch 团队还提供了一个社区驱动的 Skill 共享平台:agentskills.io。这个平台汇集了由社区成员贡献和维护的各种预定义 Skill,涵盖了从基础工具(如文件操作、网络请求)到高级功能(如特定 API 调用、数据分析)的广泛领域。
3.3.1 agentskills.io 的优势
- 开箱即用:无需手动编写,可以直接安装和使用。
- 社区维护:许多 Skill 经过社区测试和改进,质量较高。
- 快速启动:为 Agent 快速扩充能力,让它能立即处理更复杂的任务。
3.3.2 Skill 的结构与组成
无论是一个从 agentskills.io 下载的 Skill,还是 Agent 自动生成的,或是你手动创建的 Skill,它们都遵循一个相似的结构,通常以 YAML 或 JSON 格式定义。
以下是一个简化版的 Skill 结构示例:
# ~/.hermes/skills/simple_calculator.yaml
name: simple_calculator
instruction: |
这是一个简单的计算器,可以执行加法、减法、乘法和除法。
请提供两个数字和操作符。
tool_code: |
def execute(num1: float, num2: float, operator: str) -> float:
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
if num2 == 0:
raise ValueError("除数不能为零。")
return num1 / num2
else:
raise ValueError(f"不支持的操作符: {operator}")
parameters:
num1:
type: number
description: 第一个数字
num2:
type: number
description: 第二个数字
operator:
type: string
description: 运算操作符 (+, -, *, /)
enum: ['+', '-', '*', '/']
return_type: number
meta:
author: Your Name
version: 1.0.0
description: 一个基本的四则运算工具。
name: Skill 的唯一标识符。instruction: Agent 理解和使用此 Skill 的自然语言描述。这非常重要,因为 Agent 会根据这个描述来决定何时以及如何调用该 Skill。tool_code: 包含 Skill 核心逻辑的 Python 代码。它必须定义一个execute函数,该函数接收parameters中定义的参数。parameters: 定义 Skill 接受的输入参数。每个参数都有type和description,有时还会有enum、default等。return_type: Skillexecute函数的预期返回类型。tool_dependencies(可选): Skill 运行时所需的 Python 包,例如requests、pandas等。Hermes Agent 会尝试自动安装这些依赖。meta(可选): 包含 Skill 的元数据,如作者、版本、详细描述等。
3.4 创建你的第一个自定义 Skill
手动创建 Skill 允许你为 Hermes Agent 扩展任何你想要的功能。这对于集成公司内部 API、自动化特定工作流或封装私有工具非常有用。
3.4.1 自定义 Skill 的步骤
- 定义需求:明确你的 Skill 要做什么,需要哪些输入,产生什么输出。
- 编写
tool_code:用 Python 实现核心逻辑,确保它有一个execute函数,并能处理所有必要的参数。 - 创建 Skill YAML/JSON 文件:根据上一节的结构,定义 Skill 的
name,instruction,parameters,return_type等。 - 放置 Skill 文件:将
.yaml或.json文件保存到~/.hermes/skills/目录下。 - 告知 Agent:Hermes Agent 会自动加载
~/.hermes/skills/目录下的 Skills。你也可以通过hermes skills reload命令强制重新加载。
3.4.2 示例:一个简单的“重复文本”Skill
我们将创建一个 Skill,它接收一个文本字符串和一个重复次数,然后将文本重复指定次数。
需求分析:
- 功能: 重复一个给定的文本字符串。
- 输入:
text(字符串): 要重复的文本。times(整数): 重复的次数。
- 输出: 重复后的字符串。
tool_code 构思:
Python 中字符串可以直接用 * 运算符重复。
def execute(text: str, times: int) -> str:
return text * times
Skill YAML 文件:
# ~/.hermes/skills/repeat_text.yaml
name: repeat_text
instruction: |
这个技能可以将一个文本字符串重复指定的次数。
请提供要重复的文本和重复的次数。
tool_code: |
def execute(text: str, times: int) -> str:
if not isinstance(text, str):
raise TypeError("文本参数必须是字符串。")
if not isinstance(times, int) or times < 0:
raise ValueError("重复次数参数必须是非负整数。")
return text * times
parameters:
text:
type: string
description: 要重复的文本字符串。
times:
type: integer
description: 文本重复的次数。
return_type: string
meta:
author: Your Name
version: 1.0.0
description: 一个简单的文本重复工具。
通过以上步骤,你就可以为 Hermes Agent 赋予全新的、定制化的能力。
💻 实战演示
我们将进行三个实战演示:
- 从
agentskills.io安装并使用一个社区 Skill。 - 观察 Hermes Agent 的自动 Skill 创建机制。
- 手动创建并使用一个自定义 Skill。
前提条件:你已经按照 第 01 期 的教程安装并初始化了 Hermes Agent。
场景 1:安装并使用 arxiv_researcher Skill
arxiv_researcher 是一个非常有用的 Skill,它允许 Hermes Agent 执行网页搜索。
启动 Hermes Agent:
hermes你应该会看到 Agent 启动并等待输入。
列出当前可用的 Skill (可选,确认
arxiv_researcher不在其中): 在新终端窗口中运行:hermes skills list如果
arxiv_researcher不在列表中,说明尚未安装。从
agentskills.io安装arxiv_researcherSkill:agentskills.io上的 Skill 都有一个唯一的 ID。我们可以通过访问网站查找,或者猜测常用的名称。arxiv_researcher是一个非常常见的 Skill。hermes skills install arxiv_researcher预期输出:
Installing skill 'arxiv_researcher'... Skill 'arxiv_researcher' installed successfully. Reloading agent skills... Skills reloaded.现在,Hermes Agent 已经可以使用
arxiv_researcherSkill 了。在 Agent 中使用
arxiv_researcherSkill: 回到 Hermes Agent 交互界面,提出一个需要搜索的问题。Hermes > What is the capital of France and what is its population?预期输出 (简化): Agent 会识别出需要外部信息,并可能会显示它正在使用
arxiv_researcherSkill。[THOUGHT] I need to find the capital of France and its population. I will use the `arxiv_researcher` skill to find this information. [CALL] arxiv_researcher(query='capital of France') [RESULT] The capital of France is Paris. [CALL] arxiv_researcher(query='population of Paris') [RESULT] The population of Paris is approximately 2.1 million (as of recent estimates). [RESPONSE] The capital of France is Paris, and its population is approximately 2.1 million.可以看到,Agent 成功地调用了
arxiv_researcherSkill 来获取信息。
场景 2:观察 Hermes Agent 的自动 Skill 创建机制
自动 Skill 创建通常发生在 Agent 解决一个复杂问题,并识别出可重用模式之后。这个过程不是每次交互都会发生,而是当 Agent 认为它学习到了一个新且有价值的抽象时。为了演示,我们可以尝试给 Agent 一个需要多步骤、且可能形成新模式的任务。
我们将尝试让 Agent 完成一个稍微复杂的文件操作任务,这可能会促使它学习文件相关的 Skill。
确保 Agent 拥有文件操作能力 (例如,通过
data_cleaning_pipelineSkill,如果尚未安装,请安装它):hermes skills install data_cleaning_pipeline在 Agent 交互界面中,提出一个复杂的文件操作任务: 我们将要求 Agent 创建一个目录,然后在一个文件中写入内容,再读取这个文件,最后删除这个目录。
Hermes > Create a directory named 'test_dir' in the current working directory. Then, inside 'test_dir', create a file named 'hello.txt' and write "Hello, Hermes Agent!" into it. After that, read the content of 'hello.txt' and finally, delete the 'test_dir' directory.预期输出 (简化): Agent 会逐步执行这些操作,可能会调用
create_directory,write_file,read_file,delete_directory等 Skill。在完成任务后,Agent 可能会在后台进行学习。[THOUGHT] I need to perform several file system operations: create a directory, create a file, write to it, read from it, and then delete the directory. I will use the data_cleaning_pipeline. [CALL] create_directory(path='test_dir') [RESULT] Directory 'test_dir' created successfully. [CALL] write_file(path='test_dir/hello.txt', content='Hello, Hermes Agent!') [RESULT] File 'test_dir/hello.txt' written successfully. [CALL] read_file(path='test_dir/hello.txt') [RESULT] Content of 'test_dir/hello.txt': "Hello, Hermes Agent!" [CALL] delete_directory(path='test_dir') [RESULT] Directory 'test_dir' deleted successfully. [RESPONSE] I have successfully completed all the requested file operations: created 'test_dir', wrote "Hello, Hermes Agent!" to 'test_dir/hello.txt', read its content, and then deleted 'test_dir'.检查 Skill 目录: 任务完成后,退出 Agent 交互界面 (输入
exit或Ctrl+D),然后检查~/.hermes/skills/目录。ls -l ~/.hermes/skills/你可能会看到一些新的
.yaml文件,它们的名称可能以auto_开头,或者基于 Agent 提炼出的操作模式命名。这些就是 Agent 在执行任务后,认为值得抽象和保存的新 Skill。例如,你可能会看到一个名为
auto_create_write_read_delete_file_in_dir.yaml或类似的 Skill。打开它,你会发现它封装了刚才一系列文件操作的逻辑。注意:自动 Skill 创建的触发条件和命名方式是动态的,取决于 Agent 的具体实现和当前任务的复杂性。不保证每次都能创建出显式的新 Skill,但 Agent 确实在后台不断学习和优化其内部模型。
场景 3:手动创建并使用自定义 Skill
我们将创建之前讨论的 repeat_text Skill。
创建 Skill 文件: 使用你喜欢的文本编辑器,创建一个名为
repeat_text.yaml的文件,并将其保存到~/.hermes/skills/目录下。mkdir -p ~/.hermes/skills/ nano ~/.hermes/skills/repeat_text.yaml将以下内容粘贴到文件中:
# ~/.hermes/skills/repeat_text.yaml name: repeat_text instruction: | 这个技能可以将一个文本字符串重复指定的次数。 请提供要重复的文本和重复的次数。 tool_code: | def execute(text: str, times: int) -> str: if not isinstance(text, str): raise TypeError("文本参数必须是字符串。") if not isinstance(times, int) or times < 0: raise ValueError("重复次数参数必须是非负整数。") return text * times parameters: text: type: string description: 要重复的文本字符串。 times: type: integer description: 文本重复的次数。 return_type: string meta: author: Your Name version: 1.0.0 description: 一个简单的文本重复工具。保存并退出编辑器。
重新加载 Agent Skills: 为了让 Hermes Agent 识别新创建的 Skill,我们需要重新加载。
hermes skills reload预期输出:
Reloading agent skills... Skills reloaded.启动 Hermes Agent 并使用自定义 Skill:
hermes在 Agent 交互界面中,请求它使用新创建的
repeat_textSkill。Hermes > Can you repeat the word "hello" 3 times?预期输出: Agent 会识别出你的意图与
repeat_textSkill 的instruction相匹配,并调用它。[THOUGHT] The user wants to repeat a word multiple times. I have a 'repeat_text' skill that can do this. [CALL] repeat_text(text='hello', times=3) [RESULT] hellohellohello [RESPONSE] The word "hello" repeated 3 times is: hellohellohello恭喜!你已经成功地创建并使用了你的第一个自定义 Skill。这展示了 Hermes Agent 强大的可扩展性,你可以根据需要为其添加任何功能。
🔧 涉及的命令与工具
| 命令/工具 | 描述 | 示例 |
|---|---|---|
hermes |
启动 Hermes Agent 的交互式会话。 | hermes |
hermes skills |
Skill 管理命令的父命令。 | hermes skills list |
hermes skills list |
列出当前 Hermes Agent 可用的所有 Skill。 | hermes skills list |
hermes skills install <skill_id> |
从 agentskills.io 安装指定的 Skill。skill_id 是 Skill 的名称,例如 arxiv_researcher。 |
hermes skills install arxiv_researcher |
hermes skills remove <skill_id> |
从本地 Skill 库中删除指定的 Skill。 | hermes skills remove repeat_text |
hermes skills reload |
重新加载 ~/.hermes/skills/ 目录中的所有 Skill。对于手动创建或修改 Skill 后很有用。 |
hermes skills reload |
~/.hermes/skills/ |
Hermes Agent 存储所有 Skill 定义文件(.yaml 或 .json)的目录。 |
ls ~/.hermes/skills/ |
nano / vim / code |
任何文本编辑器,用于创建或修改 Skill 定义文件。 | nano ~/.hermes/skills/my_custom_skill.yaml |
📝 本期要点回顾
- Skills 是 Hermes Agent 的核心扩展机制:它们是封装了特定功能或工具使用逻辑的模块化单元,赋予 Agent 执行复杂任务的能力。
- 自进化通过学习循环实现:Hermes Agent 能够从成功经验中自动创建、改进和持久化 Skills,从而不断提升自身能力。
- Skill 结构统一且可扩展:所有 Skills 都遵循 YAML/JSON 格式,包含
name,instruction,tool_code,parameters等关键部分,便于 Agent 理解和调用。 agentskills.io是社区 Skill 宝库:通过hermes skills install命令,可以方便地从社区平台加载预定义的、经过验证的 Skill,快速扩充 Agent 功能。- 自定义 Skill 赋予无限可能:用户可以手动创建 Skill YAML 文件,将其放置在
~/.hermes/skills/目录下,并通过hermes skills reload命令使其生效,从而为 Agent 添加任何特定功能。
🔗 参考资料
- Hermes Agent 官方文档 - Skills: https://hermes-agent.nousresearch.com/docs/concepts/skills
- agentskills.io 社区 Skill 平台: https://agentskills.io/
- Hermes Agent GitHub 仓库: https://github.com/NousResearch/hermes-agent