Hermes Agent 学习笔记 04:工具调用系统,让 Agent 从“会说”变成“会做”

1. 为什么工具调用是 Agent 的核心?

学习 Hermes Agent 时,我发现一个很关键的问题:如果一个大模型只能生成文本,那么它本质上仍然是一个问答系统。它可以解释概念,可以生成代码,可以给出建议,但它无法直接进入真实环境完成任务。

例如,用户让它"帮我分析当前项目",如果没有工具调用能力,它只能要求用户把目录结构、文件内容和报错信息复制给它。用户提供多少,它就分析多少。它无法自己查看文件,也无法自己运行测试,更无法根据执行结果继续调整判断。

但是有了工具调用之后,情况就不同了。

Agent 可以自己读取目录、打开文件、搜索网页、执行命令、分析浏览器页面、管理记忆、调用外部 API。它不再只是根据用户粘贴的信息生成回答,而是可以主动从环境中获取信息,并根据任务目标执行下一步操作。

这就是工具调用的意义:

复制代码
没有工具调用:模型只能回答问题。
有了工具调用:模型可以围绕任务采取行动。

所以,工具调用系统是 Hermes Agent 从 Chatbot 走向 Agent 的关键环节。

2. 工具调用的基本流程

从用户体验上看,工具调用好像很自然:用户提出任务,Agent 就开始读文件、执行命令、搜索信息。但从机制上看,这个过程可以拆成几个步骤。

一个典型流程是:

复制代码
用户提出任务
        ↓
模型理解任务目标
        ↓
模型判断是否需要工具
        ↓
选择合适工具
        ↓
生成工具调用参数
        ↓
系统执行工具
        ↓
工具返回结果
        ↓
模型根据结果继续推理
        ↓
输出回答或继续调用工具

例如,用户输入:

复制代码
请分析当前项目的主要模块,并告诉我入口文件在哪里。

Hermes Agent 可能会先调用终端工具查看目录:

复制代码
ls

然后读取 README:

复制代码
read_file README.md

接着查看配置文件:

复制代码
read_file pyproject.toml

最后根据这些工具返回的内容,给出项目结构分析。

这里需要注意,真正做出最终判断的仍然是模型,但模型的判断已经不再只依赖训练知识,而是结合了当前环境中的真实信息。

因此,工具调用可以看作是 Agent 的"感知与行动接口"。

3. Hermes Agent 中的工具类型

Hermes Agent 的工具可以按用途分成几类。

3.1 Web 工具:获取外部信息

Web 工具主要用于搜索网页和提取网页内容。

这类工具适合处理需要最新信息或外部资料支撑的任务。例如:

复制代码
请搜索 Hermes Agent 最新文档,并总结它当前支持哪些工具类型。

或者:

复制代码
请查找某个开源项目的官方文档,并总结安装流程。

Web 工具的作用是让 Agent 不再只依赖模型训练时的知识,而是可以访问当前网络上的信息。

对于开源项目学习、论文调研、技术文档查询、产品资料核对等任务来说,Web 工具非常重要。

3.2 Terminal 工具:执行命令

Terminal 工具让 Hermes Agent 可以执行命令。

例如:

复制代码
ls
pwd
git status
pytest
npm test
python script.py

这类工具非常强大,因为它让 Agent 能够真正进入本地开发环境。它可以查看目录,运行测试,检查依赖,读取程序输出,定位报错原因。

但是,Terminal 工具也是最需要谨慎使用的工具之一。因为终端命令不仅可以读取信息,也可以修改系统状态。

例如:

复制代码
rm -rf
git reset --hard
pip install
npm install
docker stop

这些命令可能删除文件、重置代码、修改环境或影响运行服务。

所以使用 Terminal 工具时,我认为最重要的习惯是:

复制代码
先让 Agent 说明计划,再让它执行。

比如:

复制代码
请先告诉我你准备执行哪些命令,以及每条命令的作用。不要立即执行。

这样可以减少误操作风险。

3.3 File 工具:读取和修改文件

File 工具主要用于文件读取、文件编辑和补丁应用。

这类工具和 Terminal 工具经常配合使用。例如,Agent 可以先通过终端查看目录,再用 File 工具读取具体文件,最后通过 patch 修改代码。

在学习源码或分析项目时,File 工具通常用于只读分析:

复制代码
请读取 README.md 和 src/main.py,解释项目启动流程。不要修改文件。

在代码修改场景中,File 工具则可以用于精确改动:

复制代码
请只修改 src/utils.py 中的 parse_config 函数,不要改动其他文件。

需要注意的是,文件修改最好小步进行。不要一开始就让 Agent "重构整个项目"。更稳妥的方式是先让它提出修改计划,再让它修改一个文件或一个函数。

3.4 Browser 工具:与网页进行交互

Web 搜索和 Browser 工具有明显区别。

Web 搜索更像是"查资料",适合搜索和提取网页内容。Browser 工具则更像是"操作网页",适合打开页面、点击按钮、填写表单、读取页面状态、截取页面快照等。

例如:

复制代码
请打开这个本地前端页面,检查登录按钮是否可以点击。

或者:

复制代码
请访问项目文档页面,并查看导航栏中有哪些模块。

Browser 工具适合处理动态网页和交互式任务。比如测试本地 Web 应用、查看页面元素、分析控制台错误等。

这类能力让 Agent 更接近一个自动化浏览器操作员,而不仅是一个网页摘要工具。

3.5 Vision 与 Media 工具:处理图像、语音和多模态内容

Hermes Agent 还支持与图像、语音、多媒体相关的工具,例如图像分析、图像生成、文本转语音等。

这些工具让 Agent 不再局限于纯文本任务。比如用户可以让它分析截图、理解界面、生成图片或把文本转成语音。

对于普通源码学习来说,这类工具不是最核心的。但如果要把 Hermes Agent 用在产品分析、UI 测试、内容生成或多模态任务中,这类工具就很有价值。

Memory 工具用于持久记忆,Session Search 用于搜索过去的会话。

这类工具很特殊,因为它们不是直接操作外部文件或网页,而是让 Agent 能够利用自己过去积累的信息。

例如,用户之前多次讨论某个项目,Hermes 可以通过 session search 找回相关历史对话,再结合当前任务继续推进。

这类能力是长期 Agent 的基础。没有记忆和会话搜索,Agent 每次都像重新开始;有了记忆和历史检索,Agent 才能在长期任务中形成连续性。

3.7 Cron 与 Messaging 工具:自动化和结果投递

Cron 工具用于创建、更新、暂停、恢复和删除定时任务。Messaging 工具则用于把结果发送到外部平台。

这类工具让 Hermes Agent 具备更强的长期自动化能力。

例如:

复制代码
每周五下午帮我总结这个项目的 issue 和 PR 状态,并把结果发给我。

这个任务背后可能涉及:

复制代码
定时触发
读取 GitHub 状态
总结信息
发送消息

这已经不是一次普通对话,而是一个长期自动化工作流。

3.8 MCP 工具:连接外部工具生态

MCP 是 Model Context Protocol 的缩写。简单理解,MCP 提供了一种标准化方式,让 Agent 可以连接外部工具服务器。

Hermes Agent 支持通过 MCP 接入外部工具。例如 GitHub、数据库、文件系统、浏览器工具、内部 API 等,都可以通过 MCP server 暴露给 Hermes 使用。

这意味着 Hermes 的工具能力不是固定的。除了内置工具外,它还可以通过 MCP 扩展到更大的工具生态。

从架构角度看,MCP 的意义很大。因为如果每个 Agent 项目都自己定义工具协议,那么工具生态会非常割裂;而 MCP 提供了一种更统一的连接方式,让外部工具更容易被 Agent 使用。

4. Tool 和 Toolset 的区别

在 Hermes Agent 中,除了 tool,还有一个很重要的概念叫 toolset。

简单理解:

复制代码
tool:一个具体工具。
toolset:一组工具的集合。

例如:

复制代码
read_file 是一个 tool
terminal 是一个 toolset
web 是一个 toolset
browser 是一个 toolset
memory 是一个 toolset

Toolset 的作用是把相关工具组合起来,方便用户按场景启用。

比如用户只想让 Hermes 做网页资料检索,可以启用 web toolset;如果要分析本地项目,可以启用 file 和 terminal toolset;如果要做网页交互测试,可以启用 browser toolset。

在命令行中,可以指定 toolsets:

复制代码
hermes chat --toolsets "web,terminal"

这表示本次对话启用 web 和 terminal 相关工具。

也可以使用:

复制代码
hermes tools

进入交互式工具管理界面,查看和启用具体工具。

Toolset 的意义在于控制 Agent 的能力边界。

如果所有工具都默认打开,Agent 可能拥有过强权限,容易带来风险;如果工具过少,Agent 又无法完成任务。因此,合理选择 toolset 是使用 Hermes Agent 的关键。

5. 工具调用并不等于完全自动化

这里需要特别强调一点:工具调用不等于完全自动化。

很多人一看到 Agent 可以调用工具,就会以为它可以完全自主完成任务。但实际上,工具调用只是给模型提供了行动能力,并不保证它每次都能做出正确判断。

Agent 可能会选错工具,可能会生成错误参数,也可能误解工具返回结果。尤其是在复杂任务中,它需要多次调用工具,每一步都可能产生偏差。

因此,使用工具调用型 Agent 时,要把它看成:

复制代码
一个可以执行操作的智能助手,而不是完全可靠的自动驾驶系统。

用户仍然需要设定边界、检查计划、确认高风险操作,并在关键步骤进行监督。

6. 一个典型工具调用案例:分析代码项目

下面以分析一个代码项目为例,梳理 Hermes Agent 如何使用工具。

用户进入项目目录:

复制代码
cd ~/projects/demo
hermes

然后输入:

复制代码
请只读分析当前项目。先查看目录结构,再读取 README 和主要配置文件,最后总结项目功能、技术栈和主要模块。不要修改任何文件。

Hermes 可能会执行以下步骤:

复制代码
1. 调用 terminal 工具查看当前目录;
2. 调用 terminal 工具查看文件树;
3. 调用 file 工具读取 README.md;
4. 调用 file 工具读取 package.json 或 pyproject.toml;
5. 根据文件内容判断项目类型;
6. 总结项目功能、技术栈和模块结构。

如果用户继续问:

复制代码
请找出项目主入口文件,并解释程序启动流程。

Hermes 可能继续读取入口文件和相关模块。

如果用户再问:

复制代码
请判断这个项目应该如何运行测试。先说明命令,不要立即执行。

Hermes 可能会读取测试配置,然后给出:

复制代码
pytest

或者:

复制代码
npm test

然后等待用户确认。

这个过程体现了 Agent 的典型工作方式:先感知环境,再选择工具,再基于结果继续推理。

7. 工具调用中的安全边界

Hermes Agent 的工具能力越强,安全边界就越重要。

我认为至少需要注意以下几类风险。

7.1 文件修改风险

如果 Agent 可以修改文件,就可能误改代码、覆盖配置或删除重要内容。

所以在只读分析阶段,最好明确写:

复制代码
不要修改、删除或创建任何文件。

在允许修改时,也要限制范围:

复制代码
只修改 src/parser.py 这个文件。

或者:

复制代码
只生成 patch,不要直接应用。

7.2 命令执行风险

Terminal 工具可以执行命令,这意味着它可能影响系统环境。

高风险命令包括:

复制代码
rm
mv
chmod
chown
sudo
git reset
pip install
npm install
docker
systemctl

不是说这些命令永远不能用,而是不能让 Agent 在没有说明计划的情况下直接执行。

更安全的提示词是:

复制代码
涉及安装、删除、重置、覆盖、权限修改的命令,都必须先向我说明并等待确认。

7.3 网络访问风险

Web 和 Browser 工具可以访问外部网站。如果任务涉及登录、账号、Token、后台管理系统,就需要特别谨慎。

比如不要让 Agent 随意在真实业务系统中提交表单,不要把敏感凭据直接暴露给 Agent,也不要在不清楚后果的情况下让它执行交易、付款、删除数据等动作。

7.4 MCP 工具风险

MCP 可以把很多外部系统接入 Hermes。它很强大,但也意味着风险更复杂。

例如,GitHub MCP 可能可以创建 issue、修改 PR;数据库 MCP 可能可以查询甚至修改数据;企业内部 API MCP 可能触发业务流程。

所以 MCP 工具更需要权限最小化。只暴露任务需要的工具,不要把所有接口都直接开放给 Agent。

8. 如何写适合工具调用的提示词?

使用 Hermes Agent 时,提示词不能只写"帮我看看"。更好的方式是把目标、步骤、边界和输出格式说清楚。

一个通用模板是:

复制代码
请完成以下任务:

目标:
......

步骤:
1. 先......
2. 再......
3. 最后......

限制:
1. 不要......
2. 如果需要执行高风险操作,先说明并等待确认。
3. 不要修改指定范围以外的文件。

输出:
请按照......格式输出。

例如:

复制代码
请只读分析当前 Python 项目。

目标:
判断项目的主要功能、技术栈和启动流程。

步骤:
1. 查看目录结构;
2. 读取 README.md;
3. 读取 pyproject.toml 或 requirements.txt;
4. 找出主入口文件;
5. 总结核心模块。

限制:
1. 不要修改任何文件;
2. 不要安装任何依赖;
3. 执行命令前先说明目的;
4. 只使用只读命令。

输出:
请用"项目概述、技术栈、入口文件、核心模块、下一步阅读建议"五个部分回答。

这种提示词对 Agent 更友好,因为它明确告诉 Agent 应该如何使用工具,而不是让它自由猜测。

9. 工具系统背后的架构理解

从开发者角度看,Hermes Agent 的工具系统大致可以理解为三层。

第一层是工具注册层。

每个工具需要声明自己的名称、所属 toolset、参数 schema、执行 handler 和可用性检查。

第二层是工具选择层。

模型在对话过程中根据用户任务和当前工具 schema 判断是否需要调用工具,以及调用哪个工具。

第三层是工具执行层。

当模型生成工具调用请求后,Hermes 的运行时负责实际执行对应 handler,并把结果返回给模型。

这个架构有一个好处:工具本身和模型推理相对解耦。工具可以不断扩展,模型只需要看到工具 schema,就能根据任务选择调用。

这也是为什么 MCP 很重要。MCP 本质上进一步扩大了工具注册和发现的范围,让外部工具也可以进入 Agent 的工具列表。

10. 学习 Hermes 工具系统的路线

如果只是普通使用者,可以按照下面的顺序学习:

复制代码
第一步:学会查看当前可用工具;
第二步:学会用 toolsets 控制工具范围;
第三步:学会让 Hermes 只读分析文件;
第四步:学会让 Hermes 执行安全命令;
第五步:学会在修改文件前要求计划;
第六步:学会配置浏览器和 Web 工具;
第七步:再学习 MCP 扩展。

如果是开发者,后续可以进一步学习:

复制代码
工具注册机制
工具 schema 设计
工具 handler 执行流程
可用性检查 check_fn
toolset 组合机制
MCP 工具发现
插件工具注册

这样就可以从"会使用工具"进一步走向"会扩展工具"。

11. 小结

这一期主要学习了 Hermes Agent 的工具调用系统。

我的理解是,工具调用是 Hermes Agent 成为 Agent 的关键。没有工具,模型只能生成回答;有了工具,模型才能读取环境、执行命令、操作网页、调用外部系统,并围绕真实任务持续推进。

Hermes Agent 的工具体系包括 Web、Terminal、File、Browser、Media、Memory、Cron、Messaging、MCP 等多种能力。Tool 是具体能力,Toolset 是能力集合。通过合理配置 toolsets,用户可以控制 Agent 的能力边界。

不过,工具调用也带来了新的风险。Agent 一旦可以修改文件、执行命令、访问网页、调用外部 API,就必须重视权限、确认机制和安全边界。

因此,使用 Hermes Agent 的正确方式不是把所有权限全部交给它,而是让它在明确目标、明确步骤、明确限制的前提下完成任务。

下一期,我将继续学习 Hermes Agent 的 Memory 系统,重点分析长期记忆如何让 Agent 跨会话保存用户偏好、项目背景和任务经验,以及 memory 与普通上下文窗口之间的区别。

相关推荐
Volunteer Technology1 小时前
SpringSecurity请求流转的本质
java·spring
楼田莉子1 小时前
C++20新特性:协程
开发语言·c++·后端·学习·c++20
心之伊始1 小时前
Spring AI MCP Client 实战:让 Java 后端通过 stdio 调用本地工具服务
java·spring boot·agent·spring ai·mcp
plainGeekDev1 小时前
文件读写(Java IO)→ Kotlin 扩展函数
android·java·kotlin
Full Stack Developme1 小时前
AspectJ 详解
java·后端
weixin_428005301 小时前
C#调用 AI学习从0开始-第2阶段(Function Calling+工具调用智能体)-第9天实战-实现计算器工具
开发语言·学习·c#·functioncalling·ai实现计算器工具
Deepoch1 小时前
Deepoc VLA开发板:除草机器人的持续学习与协同作业系统
人工智能·学习·机器人·开发板·具身模型·deepoc
John_ToDebug1 小时前
在 Windows 上搭建 Chromium 148 内核编译环境:一份实战笔记
chrome·经验分享·笔记
武子康1 小时前
Java-20 深入浅出 MyBatis - 手写ORM框架1 从原始 JDBC 暴露的 6 大问题开始
java·后端