跳到主要内容

技巧与最佳实践

一份快速见效的实用技巧合集,让你能立即更高效地使用 Hermes Agent。每个部分针对不同方面 —— 浏览标题,跳转到相关部分。


获得最佳结果

明确表达你的需求

模糊的提示词产生模糊的结果。不要说“修复代码”,而要说“修复 api/handlers.py 第 47 行的 TypeError —— process_request() 函数从 parse_body() 收到了 None。” 你提供的上下文越多,需要的迭代次数就越少。

预先提供上下文

在请求的开头就放上相关细节:文件路径、错误信息、预期行为。一条精心构思的消息胜过三轮澄清。直接粘贴错误堆栈跟踪 —— 智能体能解析它们。

为重复指令使用上下文文件

如果你发现自己重复相同的指令(“用制表符而不是空格”、“我们使用 pytest”、“API 在 /api/v2”),把它们放到一个 AGENTS.md 文件中。智能体每次会话都会自动读取它 —— 设置好后无需额外努力。

让智能体使用它的工具

不要试图手把手指导每一步。说“找到并修复失败的测试”,而不是“打开 tests/test_foo.py,看第 42 行,然后……”。智能体具备文件搜索、终端访问和代码执行能力 —— 让它去探索和迭代。

为复杂工作流使用技能

在写长篇提示词解释如何做某事之前,先检查是否已有对应的技能。输入 /skills 浏览可用技能,或者直接调用一个,如 /axolotl/github-pr-workflow

CLI 高级用户技巧

多行输入

Alt+Enter(或 Ctrl+J)插入换行符而不发送。这让你可以编写多行提示词、粘贴代码块,或在按 Enter 发送前构建复杂请求。

粘贴检测

CLI 会自动检测多行粘贴。直接粘贴代码块或错误堆栈跟踪即可 —— 它不会将每一行作为单独的消息发送。粘贴的内容会被缓冲并作为一条消息发送。

中断与重定向

按一次 Ctrl+C 可在智能体响应过程中中断它。然后你可以输入新消息来重定向它。在 2 秒内按两次 Ctrl+C 可强制退出。当智能体开始走错路时,这非常有用。

使用 -c 恢复会话

忘记了上次会话的内容?运行 hermes -c 可以精确恢复到上次离开的地方,并恢复完整的对话历史。你也可以通过标题恢复:hermes -r "我的研究项目"

剪贴板图片粘贴

Ctrl+V 将剪贴板中的图片直接粘贴到聊天中。智能体使用视觉能力来分析截图、图表、错误弹窗或 UI 线框图 —— 无需先保存到文件。

斜杠命令自动补全

输入 / 并按 Tab 查看所有可用命令。这包括内置命令(/compress/model/title)和每个已安装的技能。你无需记忆任何东西 —— Tab 补全已为你准备好。

提示

使用 /verbose 循环切换工具输出显示模式:关闭 → 仅新 → 全部 → 详细。“全部”模式非常适合观察智能体的操作;“关闭”模式对于简单问答最简洁。

上下文文件

AGENTS.md:你项目的“大脑”

在项目根目录创建一个 AGENTS.md,包含架构决策、编码规范和项目特定指令。这会自动注入到每次会话中,因此智能体始终知道你项目的规则。

# 项目上下文
- 这是一个使用 SQLAlchemy ORM 的 FastAPI 后端
- 数据库操作始终使用 async/await
- 测试放在 tests/ 目录下并使用 pytest-asyncio
- 切勿提交 .env 文件

SOUL.md:自定义个性

希望 Hermes 有一个稳定的默认“声音”吗?编辑 ~/.hermes/SOUL.md(或者如果你使用自定义的 Hermes 主目录,则是 $HERMES_HOME/SOUL.md)。Hermes 现在会自动生成一个初始 SOUL,并使用该全局文件作为实例范围内的人格来源。

完整教程请参阅 在 Hermes 中使用 SOUL.md

# 灵魂
你是一名资深后端工程师。言简意赅,直截了当。
除非被问及,否则跳过解释。倾向于简洁的解决方案而非冗长的方案。
始终考虑错误处理和边界情况。

使用 SOUL.md 来定义持久的人格。使用 AGENTS.md 来定义项目特定指令。

.cursorrules 兼容性

已经有 .cursorrules.cursor/rules/*.mdc 文件了吗?Hermes 也会读取它们。无需重复你的编码规范 —— 它们会自动从工作目录加载。

层级发现

Hermes 会遍历目录树,并在每个层级发现所有 AGENTS.md 文件。在单体仓库中,将项目范围的规范放在根目录,将团队特定的规范放在子目录中 —— 它们都会与路径标题一起被拼接起来。

提示

保持上下文文件重点突出且简洁。因为每个字符都会计入你的令牌预算,它们会被注入到每一条消息中。

记忆与技能

记忆 vs. 技能:什么放哪里

记忆用于事实:你的环境、偏好、项目位置,以及智能体了解到的关于你的信息。技能用于流程:多步骤工作流、特定工具的指令和可复用的配方。用记忆存储“是什么”,用技能存储“怎么做”。

何时创建技能

如果你发现一个任务需要 5 步以上并且你还会再做,请让智能体为其创建一个技能。说“把你刚才做的保存为一个名为 deploy-staging 的技能”。下次,只需输入 /deploy-staging,智能体就会加载完整的流程。

管理记忆容量

记忆是有意限制容量的(MEMORY.md 约 2,200 字符,USER.md 约 1,375 字符)。当它填满时,智能体会合并条目。你可以通过说“清理你的记忆”或“替换旧的 Python 3.9 备注 —— 我们现在用 3.12 了”来帮忙。

让智能体记住

在富有成效的会话后,说“记住这个,下次用”,智能体会保存关键要点。你也可以更具体:“保存到记忆中,我们的 CI 使用 GitHub Actions,工作流是 deploy.yml。”

注意

记忆是一个冻结的快照 —— 在会话期间所做的更改,直到下一次会话开始才会出现在系统提示词中。智能体会立即写入磁盘,但提示词缓存在会话期间不会失效。

性能与成本

不要破坏提示词缓存

大多数 LLM 提供商会缓存系统提示词前缀。如果你保持系统提示词稳定(相同的上下文文件,相同的记忆),会话中的后续消息会获得缓存命中,这要便宜得多。避免在会话中途更改模型或系统提示词。

在达到限制前使用 /compress

长会话会积累令牌。当你注意到响应变慢或被截断时,运行 /compress。这会总结对话历史,保留关键上下文,同时大幅减少令牌数量。使用 /usage 检查当前状态。

委派以实现并行工作

需要同时研究三个主题吗?要求智能体使用 delegate_task 处理并行子任务。每个子代理都在自己的上下文中独立运行,只有最终摘要会返回 —— 这极大地减少了主对话的令牌使用量。

使用 execute_code 进行批量操作

与其一次运行一个终端命令,不如让智能体编写一个一次性完成所有操作的脚本。“写一个 Python 脚本将所有 .jpeg 文件重命名为 .jpg 并运行它”比逐个重命名文件更便宜、更快。

选择合适的模型

使用 /model 在会话中途切换模型。对于复杂的推理和架构决策,使用前沿模型(Claude Sonnet/Opus, GPT-4o)。对于格式化、重命名或样板代码生成等简单任务,切换到更快的模型。

提示

定期运行 /usage 查看你的令牌消耗情况。运行 /insights 可以查看过去 30 天使用模式的更广泛视图。

消息平台使用技巧

设置主频道

在你偏好的 Telegram 或 Discord 聊天中使用 /sethome 将其指定为主频道。Cron 作业结果和计划任务输出会发送到这里。没有它,智能体将无处发送主动消息。

使用 /title 组织会话

/title auth-refactor/title research-llm-quantization 为你的会话命名。命名的会话很容易通过 hermes sessions list 找到,并通过 hermes -r "auth-refactor" 恢复。未命名的会话会堆积起来,变得难以区分。

使用 DM 配对实现团队访问

与其手动收集用户 ID 用于白名单,不如启用 DM 配对。当队友向机器人发送私信时,他们会获得一个一次性配对码。你用 hermes pairing approve telegram XKGH5N7P 批准它 —— 简单又安全。

工具进度显示模式

使用 /verbose 控制你看到多少工具活动。在消息平台上,通常少即是多 —— 保持“仅新”模式,只看到新的工具调用。在 CLI 中,“全部”模式让你满意地实时查看智能体所做的一切。

提示

在消息平台上,会话在空闲时间后(默认:24 小时)或每天凌晨 4 点自动重置。如果你需要更长的会话,可以在 ~/.hermes/config.yaml 中按平台调整。

安全

对不受信任的代码使用 Docker

在处理不受信任的仓库或运行不熟悉的代码时,使用 Docker 或 Daytona 作为你的终端后端。在你的 .env 中设置 TERMINAL_BACKEND=docker。容器内的破坏性命令无法损害你的主机系统。

# 在你的 .env 中:
TERMINAL_BACKEND=docker
TERMINAL_DOCKER_IMAGE=hermes-sandbox:latest

避免 Windows 编码陷阱

在 Windows 上,某些默认编码(如 cp125x)无法表示所有 Unicode 字符,这可能导致在测试或脚本中写入文件时出现 UnicodeEncodeError

  • 倾向于使用显式的 UTF-8 编码打开文件:
with open("results.txt", "w", encoding="utf-8") as f:
f.write("✓ All good\n")
  • 在 PowerShell 中,你也可以将当前会话切换到 UTF-8,用于控制台和原生命令输出:
$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false)

这使 PowerShell 和子进程保持 UTF-8 编码,有助于避免仅限 Windows 的故障。

在选择“始终”前仔细审查

当智能体触发危险命令批准(rm -rfDROP TABLE 等)时,你会看到四个选项:一次本次会话始终拒绝。在选择“始终”前请仔细考虑 —— 它会永久地将该模式加入白名单。先从“本次会话”开始,直到你感到放心。

命令批准是你的安全网

Hermes 在执行前会检查每个命令是否符合精心策划的危险模式列表。这包括递归删除、SQL DROP、将 curl 管道传输到 shell 等。不要在生产环境中禁用此功能 —— 它的存在有充分的理由。

注意

当在容器后端(Docker、Singularity、Modal、Daytona)中运行时,危险命令检查会被跳过,因为容器本身就是安全边界。请确保你的容器镜像已正确锁定。

为消息机器人使用白名单

切勿在具有终端访问权限的机器人上设置 GATEWAY_ALLOW_ALL_USERS=true。始终使用平台特定的白名单(TELEGRAM_ALLOWED_USERSDISCORD_ALLOWED_USERS)或 DM 配对来控制谁可以与你的智能体交互。

# 推荐:每个平台使用显式白名单
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=123456789012345678

# 或者使用跨平台白名单
GATEWAY_ALLOWED_USERS=123456789,987654321

有应该出现在本页的技巧吗?提交 Issue 或 PR —— 欢迎社区贡献。