📄 文档列表
🎬 口播文案
✏️ 编辑文档
标题
工具栏
加粗
H2 标题
H3 标题
引用
无序列表
有序列表
代码块
📷 上传图片
点击或拖拽上传图片
支持 PNG, JPG, GIF, WebP 格式
内容 (Markdown 格式)
--- title: Hermes /goal 深度讲解:让AI自己持续干活,你只管定目标 description: 深入解析 Hermes Agent 的 /goal 功能——持续目标、auto-resume、subgoal 子目标机制,以及为什么它比"多轮对话催它继续"更优雅。 --- # Hermes /goal 深度讲解:让AI自己持续干活,你只管定目标 ## 01 被"继续"这个词折磨过的举手 你应该有过这种经历:让AI写一段代码,它给你了;你让它改,它改了;你让它"继续完善",它又给你一版;然后你再说"还是不对,继续",然后继续继续…… 每一步都要你说一句,它才动一步。这不叫"AI干活",这叫"你指挥AI干活"。 **Hermes 的 /goal 功能,就是来解决这个问题的。** 你只需要做一件事:定目标。然后 Hermes 会自己持续工作下去,不需要你一遍遍地喊"继续"。 --- ## 02 /goal 是什么 简单说:**/goal 是"目标"命令,设置一个长期任务,Hermes 会自动持续推进,直到完成。** 它的完整描述是(来源:`hermes_cli/commands.py`): ``` Set a standing goal Hermes works on across turns until achieved ``` 支持子命令: | 命令 | 作用 | |------|------| | `/goal <text>` | 设置目标,立刻开始执行 | | `/goal` 或 `/goal status` | 查看当前目标状态 | | `/goal pause` | 暂停,不清除目标 | | `/goal resume` | 继续(重置轮数计数器) | | `/goal clear` | 清除目标 | --- ## 03 它是怎么做到的——Ralph Loop 机制 这是最核心的部分。 **/goal 的实现叫做"Ralph Loop",灵感来自 OpenAI Codex CLI 0.128.0 的同名功能**(官方文档明确致谢)。但 Hermes 这里是独立实现。 整个机制分为三层: ### 第一层:Agent 执行 你设置 `/goal` 之后,Hermes 像正常对话一样开始工作,只是这个"目标"会一直"挂"在上下文里。 ### 第二层:Judge 评判 每轮执行完毕后,Hermes 会调用一个辅助模型(Judge)来判断:**"目标达成了吗?"** Judge 会收到: - 目标文本 - Agent 最近的回复(最近约 4KB 内容) - 一个系统提示,要求它返回严格 JSON 格式:`{"done": true/false, "reason": "原因"}` Judge 的判断规则非常保守(来源:`JUDGE_SYSTEM_PROMPT`,`hermes_cli/goals.py`): > 目标只有在以下情况才视为 DONE: > - 回复明确确认目标已完成 > - 回复清楚显示最终交付物已产生 > - 回复说明目标不可实现/被阻塞(也视为 DONE,避免浪费预算) ### 第三层:自动继续或停止 根据 Judge 的判断: ``` if done == true → 停止,告诉用户"✓ Goal achieved" if done == false → 自动注入 continuation prompt,Hermes 继续执行下一轮 ``` 这个 continuation prompt 长这样(来源:`CONTINUATION_PROMPT_TEMPLATE`,`hermes_cli/goals.py`): ``` [Continuing toward your standing goal] Goal: <你的目标> Continue working toward this goal. Take the next concrete step. If you believe the goal is complete, state so explicitly and stop. If you are blocked and need input from the user, say so clearly and stop. ``` 整个循环就是这样: ``` 执行 → Judge评判 → 继续/停止 → 执行 → Judge评判 → ... ``` **整个过程不需要你说一个字。** --- ## 04 为什么要用 Judge 单独评判 你可能会问:让主模型自己判断"做完了没有"不就行了?为什么还要单独调用一个 Judge? 有道理,但 Hermes 选择了分离设计,原因有两点: **第一,主模型可能"当局者迷"** 大模型有个特点:它倾向于认为自己在做的事很有价值。让它自己判断"做完了吗",它可能永远说"还没呢,再来一轮"。用一个独立的小模型做 judge,可以更客观。 **第二,不浪费主模型的 token 和缓存** Judge 是一个轻量调用(~200 output tokens),每轮只跑一次。用小模型处理这个 side task,主模型的上下文缓存完全不受影响。如果让主模型同时做 judge 和执行,两件事混在一起,prompt 缓存策略会复杂很多。 默认情况下 Judge 会复用主模型,但你可以单独配置一个便宜的模型来当 Judge(后面会讲)。 --- ## 05 子目标:给目标加条件 `/goal` 支持一个兄弟命令:`/subgoal`。 `/subgoal` 允许你在目标运行时**追加额外条件**。 举例子: ``` /goal 写一个用户注册 API /subgoal 必须包含邮箱格式验证 /subgoal 密码要求至少8位且有数字和字母 ``` 设置了子目标之后: - **Agent 会在 continuation prompt 里看到这些额外条件** - **Judge 也会同时检查所有子目标是否都被满足** 源码里处理子目标的逻辑(`hermes_cli/goals.py`): ```python CONTINUATION_PROMPT_WITH_SUBGOALS_TEMPLATE = ( "[Continuing toward your standing goal] " "Goal: {goal} " "Additional criteria the user added mid-loop: " "{subgoals_block} " "Continue working toward the goal AND all additional criteria." ) ``` Judge 的提示词也变成了检查 ALL 条件(来源:`JUDGE_USER_PROMPT_WITH_SUBGOALS_TEMPLATE`): ``` For each numbered criterion above, find concrete evidence in the agent's response that the criterion is satisfied. If ANY criterion lacks specific evidence, return CONTINUE. ``` --- ## 06 状态管理与持久化 ### 四个状态 | 状态 | 含义 | |------|------| | `active` | 目标进行中,自动继续 | | `paused` | 暂停,需要你手动 resume 或轮数耗尽 | | `done` | 完成 | | `cleared` | 清除 | ### 什么情况会暂停? 1. **轮数耗尽**:`max_turns` 默认 20,每轮执行完计数 +1。20 轮用完后自动暂停。 2. **Judge 模型持续输出非 JSON**:连续 3 轮 Judge 返回不可解析的内容,触发自动暂停,并提示你换一个 Judge 模型。 3. **你手动暂停**:`/goal pause` ### 持久化:关掉电脑明天继续 **目标状态存在 SessionDB 的 `state_meta` 表里**,key 是 `goal:<session_id>`。 这意味着: - 设定好目标,关掉电脑 - 明天 `/resume` 恢复会话 - 目标还在那里,`active` 状态,完整保留 这和多轮对话的"上下文续接"不一样——普通对话续接的是聊天历史,而 `/goal` 续接的是**任务执行状态**,包括已用轮数、目标内容、子目标列表。 --- ## 07 配置参数 在 `~/.hermes/config.yaml` 里: ```yaml goals: # 最大自动继续轮数,默认 20 max_turns: 20 ``` ### 指定 Judge 模型 默认 Judge 复用主模型。也可以单独指定一个便宜的模型: ```yaml auxiliary: goal_judge: provider: openrouter model: google/gemini-3-flash-preview ``` 官方建议用便宜快速的模型,因为 Judge 调用很小(~200 tokens),执行快且成本低。 --- ## 08 实际效果演示 官方文档里的完整示例(`website/docs/user-guide/features/goals.md`): ``` You: /goal Create four files /tmp/note_{1..4}.txt, one per turn ⊙ Goal set (20-turn budget): Create four files... Hermes: Creating /tmp/note_1.txt 💻 echo "1" > /tmp/note_1.txt Created /tmp/note_1.txt. ↻ Continuing (1/20): Only 1 of 4 files created; 3 remain. Hermes: [Continuing toward your standing goal] 💻 echo "2" > /tmp/note_2.txt Created /tmp/note_2.txt. ↻ Continuing (2/20): 2 of 4 files created; 2 remain. ...(第3轮、第4轮同理) Hermes: [Continuing toward your standing goal] 💻 echo "4" > /tmp/note_4.txt All four files created. ✓ Goal achieved: All four files were created. ``` **4 个文件,1 次 /goal,0 次"继续"。** --- ## 09 适用场景 vs 不适用场景 ### 适合用 /goal 的场景 - "把 `src/` 下所有 lint 错误修了,并验证 `ruff check` 通过" - "把 X 功能的代码从 repo Y 移植过来,包括测试,CI 要绿" - "调查 session ID 在压缩时有时会漂移的问题,写一份报告" - "给我搭一个 CLI 工具来处理照片的 EXIF 日期改名,然后测试一下" **核心特征:需要多轮迭代、目标明确、不需要你实时盯着。** ### 不适合的场景 - 简单的一问一答(直接问就行,不需要挂目标) - 目标本身很模糊(你都不知道要什么,AI 更不知道) - 需要大量人工确认的创意类任务(AI 持续产出但你不满意,容易浪费轮数) --- ## 10 Fail-Open 设计哲学 **如果 Judge 报错了呢?** Hermes 的回答是:继续干活。 源码里(`hermes_cli/goals.py`): > This is deliberately fail-open: any error returns ("continue", "...") > so a broken judge doesn't wedge progress. 网络抖动、API 超时、Judge 模型不可用——一律视为"继续",不打断目标推进。 **真正的保底是轮数预算。** 即使 Judge 完全坏了,20 轮之后也会自动暂停,不会无限燃烧 token。 --- ## 写在最后 /goal 的本质,是把"人指挥AI一步一动"变成了"人定目标,AI自己跑"。 背后的 Ralph Loop 机制——执行 → 独立评判 → 自动继续——让 AI 真正变成了一个持续干活的主体,而不是一个你每句话都要回复的对话机器。 如果你经常觉得"这个任务明明很简单但要催 AI 七八遍才做完",试试 `/goal`,可能就一回合的事了。 **你用过 /goal 吗?有没有遇到 Judge 判断不准的情况?评论区聊聊。**
摘要
标签
多个标签用逗号分隔
分类
技术文章
教程指南
工具测评
项目实战
行业观察
默认
💾 保存修改
← 返回查看
返回列表