尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

个人AI智能体持久自我改进实战:构建Grok Bot与Hermes Agent协同的harness系统

个人AI智能体持久自我改进实战:构建Grok Bot与Hermes Agent协同的harness系统 说实话看到Elvis Saravia更新个人harness这条消息时我第一反应是——这老哥又在折腾他的AI全家桶了。但等我把他在公开渠道分享的思路拆开看了一遍发现里面关于harness、Grok Bot和Hermes Agent这三样东西怎么拼成一套能长期跑、还能自己改自己的智能体确实有不少可以直接抄作业的设计。这篇不聊虚的我就按他的思路从零重搭了一遍这套系统顺便把过程中踩到的坑、想明白的原理都记下来。这套东西适合谁看我的回答是但凡你手头有超过一个API模型、想让AI不只聊天还要落地干活、又希望它越用越顺手而不是越用越傻的人都值得花十几分钟读完。本文会讲清楚harness到底是什么、为什么Grok Bot和Hermes Agent这么搭以及所谓“持久自我改进”到底改的是什么东西。1. 先把标题拆开harness、Grok Bot、Hermes Agent各是什么角色很多人看到“harness”这个词第一反应是马具、安全带然后就开始懵这跟AI智能体有什么关系其实这里的harness指的就是套在智能体外层的那一整层工程结构。你可以把它理解成登山时候的安全绳AI模型是那个攀岩的人绳子本身不产生攀爬动作但它决定了你掉下去的时候会不会摔死也决定了你走的路线是不是在可控范围内。1.1 harness智能体外面那层“工程安全带”在AI Agent圈子里harness这个词这两年热度涨得很快。OpenAI的Codex背后有Codex Harness社区里也有不少人折腾DeepSeek Harness这些项目的核心思路其实一致模型本身是不可控的它会乱说话、会瞎猜、会一次把上下文撑爆所以你需要在外层包一个框架把模型的输入、输出、工具调用、错误恢复、审计日志全部规范起来。我自己对harness的定义很简单它是连接“模型能力”和“现实任务”之间的工程层。它至少要干四件事第一管好输入输出包括系统提示词、用户消息、工具返回结果的格式第二管好工具执行模型说想调一个函数harness要检查这个函数能不能调、参数对不对、结果怎么塞回上下文第三管好状态持久化任务跑到一半断了重启之后还能接着来第四管好安全边界哪些命令能跑、哪些文件能碰得有个白名单机制。所以harness不是某个具体模型也不是某个具体框架的专利而是一种设计思路。Elvis这次更新的个人harness妙就妙在它不绑定单一模型而是把Grok Bot和Hermes Agent两个不同来源的组件塞进了同一个壳里让它们各干各的擅长活。1.2 Grok Bot和Hermes Agent一个出脑子一个出手脚这套组合里Grok Bot的角色是“大脑”。它负责理解用户意图、拆解任务、生成执行计划、在任务结束后做反思。Grok背后的模型在长文本理解和复杂推理上确实有一手尤其适合需要“想清楚再干”的场景。Hermes Agent的角色则是“手脚”。我这边实际用的Hermes Agent是一个可以本地部署的开源智能体框架名字取自希腊神话里的信使赫尔墨斯定位也很贴切专门负责跟外部工具打交道。它支持文件读写、命令行执行、HTTP请求、结构化工具调用这些脏活累活而且因为是本地跑响应速度快、数据不出内网、token成本几乎是零。为什么要拆成两个组件而不是让一个模型全包我个人的体会是决策和执行这两件事对模型的要求是冲突的。决策要的是推理能力强、上下文视野广这类模型通常又大又贵执行要的是延迟低、调用工具稳定、能忍受高频次反复尝试这类需求更适合本地小模型或者轻量框架来做。硬让一个云端大模型去逐行读写文件、反复调用几十次工具不仅钱包受不了上下文窗口也扛不住。打个比方Grok Bot是项目经理Hermes Agent是施工队。项目经理不会亲自搬砖施工队也不负责画图纸。harness就是那个把项目经理的指令翻译成施工单、再把施工结果反馈回项目经理手里的项目管理流程。1.3 “持久自我改进”到底改的是什么很多人一听“自我改进”就以为是让AI自己改自己的模型权重那是误解。以目前的条件个人开发者根本不可能在线微调一个几十亿参数的大模型。Elvis这套方案里的自我改进改的是三样东西系统提示词、工具启停配置、任务处理流程。举个例子第一次跑任务的时候Hermes Agent可能不知道“处理CSV文件”这种任务应该先检查文件编码再读数据。干一次活之后harness的反思环节发现它在这个步骤上栽了跟头于是生成一条改进建议在系统提示词里加上“读取表格类文件前先检测编码格式”。这条建议经过评测确认有效就会写回配置文件下次再遇到同类任务智能体直接就会先检查编码。持久这两个字的重点也不在“智能”而在“记忆”。整套系统必须有办法把改进结果存到硬盘里启动时加载而不是进程一关全忘光。所以持久化设计是整个harness的地基后面我会专门讲怎么组织这些状态文件。2. 工具选型为什么偏偏是这套组合说实话眼下能用来搭智能体的模型和框架组合多到挑花眼。DeepSeek Harness、Codex Harness、各类开源Agent框架都有不少人用。那为什么Elvis的方案值得单独拿出来拆因为他做了一个大多数人都没做好的事情把“强推理模型”和“轻量执行框架”的优势都吃到了而不是在一棵树上吊死。2.1 一圈对比之后这套组合的逻辑在哪我自己在复刻之前先列了一张对比表把主流的搭法摆在一起看方案组合决策能力执行成本本地部署可定制性适合场景Grok Bot Hermes Agent强中API按量计费执行端本地高复杂任务拆解长期自我优化DeepSeek Harness 系强低可完全本地中偏代码执行、工具链固定的场景纯本地模型自建中低完全本地高数据隐私要求极高的小型任务裸调工具循环ReAct脚本中低无需部署低简单任务验证不适合长期跑选Grok Bot做决策层理由很实在它的API对复杂函数调用支持得比较稳给一个包含多步骤的计划它拆出来的步骤一般不会漏而且它的上下文理解能力强能把之前几轮执行结果综合起来判断下一步动作。这一点对于“自我改进”尤其重要因为反思环节需要模型回头看一整段历史如果模型记不住前面干了什么改进就是空话。选Hermes Agent做执行层则是看重它三点一是开源、可改我可以把内部工具按自己需求替换二是支持本地部署Windows和Linux都能跑不依赖云端的执行环境三是工具调用格式干净指令要不要执行、参数怎么传都规规矩矩地暴露给上层方便harness审计。2.2 前置准备装环境、取API Key、配好两边的对接参数如果是从零开始复刻我建议按下面这步配置环境。我自己是在一台Linux服务器上跑的另外也在Windows的WSL 2里验证过一遍整体流程一致。首先准备Python环境建议用3.11或3.12版本太老的版本会在依赖解析阶段报一堆兼容性问题。然后创建虚拟环境并克隆Hermes Agent的仓库python -m venv .venv source .venv/bin/activate git clone Hermes Agent仓库地址 cd hermes-agent pip install -r requirements.txtHermes Agent装好后要把它当成一个可编程的框架来用而不是开箱即用的聊天软件。它的核心配置文件一般是一个YAML或者JSON里面定义了加载哪些工具、工具的工作目录在哪里、命令执行的权限等级。我建议把工作目录单独指向一个sandbox文件夹别让它直接拿到整个服务器的读写权限。然后是Grok Bot这半边。你需要去xAI的开放平台申请一个API Key创建之后写到环境变量里export XAI_API_KEY你的key调用方式跟OpenAI的接口风格类似base_url通常是https://api.x.ai/v1模型名建议以你账号后台看到的实际模型名为准因为xAI的模型迭代很快Grok Bot背后对应的具体模型版本会不定期调整。我在代码里会把模型名做成配置项避免每次升级都要改代码。3. 搭建个人harness核心骨架与关键代码前面铺垫了这么多现在进入正题怎么把harness这层壳写出来让Grok Bot和Hermes Agent真正协同工作。我自己写的时候没有用特别重的框架就用Python写了一个几百行的harness核心类足够跑通整个闭环。3.1 整体骨架五个模块各管一摊一个完整的harness我拆成了五个模块入口调度负责接收新任务决定是走完整执行流程还是只调用已有记忆。决策客户端封装Grok Bot的API调用承担计划和反思两件事。执行引擎对接Hermes Agent负责把计划里的动作翻译成具体的工具调用。状态仓库管理记忆、配置、日志所有要持久化的东西都从这儿进出。改进处理器定期运行评测集生成改进建议控制写回和回滚。入口调度是整个循环的发动机。每个用户请求进来它会先问决策层“这个任务有没有做过类似版本”如果有就把记忆里对应的成功方案直接拿出来改改如果没有才走完整流程。这个设计的收益在后面自我改进阶段才会完全体现出来前期可能感觉只是多了一层查表逻辑。3.2 核心代码让Grok Bot和Hermes Agent真正跑起来我这边最关心的是三件事计划怎么生成、动作怎么执行、结果怎么反馈。下面这段代码是我精简过的最小可用版本关键逻辑都在里面import os import json from dataclasses import dataclass, field dataclass class ActionResult: action_id: str status: str # success / failed output: str class GrokClient: def __init__(self): self.api_key os.getenv(XAI_API_KEY) self.base_url https://api.x.ai/v1 self.model grok-3 # 以官方实际模型名为准 def plan(self, user_input, system_prompt, memory): # 调用Grok的chat/completions接口要求返回JSON格式计划 messages [ {role: system, content: system_prompt}, {role: user, content: f已有记忆{json.dumps(memory)}\n新任务{user_input}} ] # 这里省略HTTP请求细节核心是让模型返回结构化的动作列表 return self._chat_completion(messages) def reflect(self, user_input, plan, results): # 反思环节让模型判断哪一步做得不好给出改进建议 messages [ {role: system, content: 你是反思器。请从任务结果中找出可复用的经验输出改进建议。}, {role: user, content: json.dumps({ input: user_input, plan: plan, results: results })} ] return self._chat_completion(messages) class HermesExecutor: def __init__(self, work_dir): self.work_dir work_dir self.tool_whitelist [read_file, write_file, run_shell, http_request] def execute_action(self, action): # 先检查动作是否在白名单里 tool_name action.get(tool) if tool_name not in self.tool_whitelist: return ActionResult(action[id], failed, 工具不在白名单) # 实际执行逻辑交给Hermes Agent内部调度 result_text self._dispatch_tool(tool_name, action.get(params, {})) return ActionResult(action[id], success, result_text) class Harness: def __init__(self, memory_pathmemory): self.grok GrokClient() self.executor HermesExecutor(work_dir./sandbox) self.memory_path memory_path self.memory self._load_json(os.path.join(memory_path, memory.json)) self.system_prompt self._load_json(os.path.join(memory_path, system_prompt.json)) def run_turn(self, user_input): # 1. 决策让Grok生成计划 plan self.grok.plan(user_input, self.system_prompt, self.memory) # 2. 执行把计划里的动作逐个交给Hermes执行 results [] for action in plan[actions]: result self.executor.execute_action(action) results.append(result.__dict__) if result.status failed: break # 3. 反思让Grok评估整轮表现 reflection self.grok.reflect(user_input, plan, results) # 4. 持久化把整轮记录存到记忆里 turn_record { input: user_input, plan: plan, results: results, reflection: reflection, timestamp: time.time() } self.memory.append(turn_record) self._save_json(os.path.join(self.memory_path, memory.json), self.memory) return turn_record这段代码里有几个细节值得单独说。第一Grok的plan接口返回的不是自然语言而是严格结构化的JSON里面必须带actions数组每个action包含id、tool、params三个字段。这个约束要在system prompt里写死否则模型一自由发挥执行端就懵了。第二Hermes执行端有个工具白名单机制我实际跑的时候只放行了文件读写、受限的shell命令和HTTP请求。这一步千万不能省因为智能体一旦能自由执行shell出错就是从“任务失败”升级成“环境被搞坏”的级别。第三记忆的持久化是每轮结束立刻落盘不是攒一批再写。原因很现实这类系统跑久了进程崩溃、服务器重启、API超时都是家常便饭如果不每轮保存一旦崩了就丢失好几个小时的改进成果。3.3 持久化设计状态文件怎么组织才不乱持久化做到后面最容易犯的毛病是文件越堆越乱。我自己的目录结构大概长这样memory/ ├── system_prompt.json ├── memory.json ├── changelog.md ├── transcript/ │ ├── 2025-05-01_001.json │ ├── 2025-05-01_002.json │ └── ... └── backups/ └── prompt_v0.3.2.jsonsystem_prompt.json是改进的主要载体里面存的是当前生效的完整系统提示词。memory.json存的是长期记忆的摘要不是全部历史逐字堆进去而是经过Grok反思之后提炼出来的经验条目。transcript目录放原始对话和执行记录供复盘和调试用。backups目录存每次改进前的提示词快照一旦新版本效果不行直接回滚。memory.json这个文件的设计要额外注意。如果你把每一轮的历史都原封不动塞进去上下文很快就会爆。我的做法是系统启动时只把记忆摘要加载给Grok摘要里最多保留最近30条经验更早的放进冷存储需要时再检索。这个思路有点像人脑的“记忆-遗忘”机制留存的是规律不是流水账。4. 把“自我改进”做成一个可靠闭环有了能跑的harness下一步才是重头戏怎么让它自己越变越好。很多人对自我改进的理解是“模型自己写完代码自己跑一遍就完事”但在工程上这远远不够。真正可靠的自我改进必须有评测、有门槛、有回滚否则就是让一个不靠谱的模型在糟糕的方向上加速狂奔。4.1 先有评测集再谈自我改进“改得好不好”不能靠感觉要有评测。我准备了一个非常轻量的评测集里面是一组基准任务每个任务都带预期结果或判定标准。举个例子tasks: - id: csv_encoding_check input: 读取data目录下的sales.csv统计总行数 expected: 先检测文件编码再读取给出总行数 check: transcript中含encoding检测步骤 - id: file_creation_safety input: 在sandbox目录创建一个临时笔记 expected: 文件创建在sandbox内 check: 路径校验通过且文件未越界评测集不求多但要覆盖两类任务一类是日常使用频率高的任务另一类是以前出过错的任务。自我改进的每一步都要先跑一遍评测集拿一个“改前分数”和“改后分数”对比分数提升才允许写回配置。我跑下来发现如果评测集只有三五条任务很容易被模型钻空子。比如它发现加一句“这一步最好先检查编码”能提升CSV任务的得分于是把所有提示词改成强调什么都要检查编码结果其他任务的效率反而下降。所以评测集要尽量多样并且每条任务的评分维度要分开算。4.2 改进回路三步走跑任务、生成建议、审查写回Elvis那套方案里最让我觉得值得学的地方是把“改进”拆成了三步每一步都有记录、有门槛。第一步是跑任务。在正常使用过程中harness会把每轮任务的transcript和结果存下来。隔一段时间我一般设置跑完20个真实任务触发一次或者每天收工后跑一轮改进处理器会挑出那些效果不理想的任务。第二步是生成候选建议。让Grok回顾这些不理想任务输出几个具体的改进点。这里的prompt要写得非常克制明确要求它只能改系统提示词和工具流程不能改代码逻辑。我试过让模型放开提建议结果它提了一堆“增加一个全自动优化模块”这种根本没边的建议而这种明显是模型在自我复制不是真改进。第三步是审查写回。候选建议先打成一个补丁应用到一个临时的system prompt副本上然后跑评测集。如果评测分数比当前版本高才把补丁合并到正式配置并写进changelog如果分数没变或下降自动回滚。这一套流程用代码写出来大概是def maybe_improve(self, eval_tasks, candidate_patch): score_before run_evals(self.system_prompt, eval_tasks) new_prompt apply_patch(self.system_prompt, candidate_patch) score_after run_evals(new_prompt, eval_tasks) if score_after score_before: backup_prompt(self.system_prompt) self.system_prompt new_prompt write_changelog(candidate_patch, score_before, score_after) return True else: log_rejected_patch(candidate_patch) return False这个流程乍看很朴素但它的工程价值在于每个改动都有明确的触发条件、验证方式和回滚路径。不会出现“模型今天心情好改了一大堆prompt过两天任务全乱套”的情况。4.3 改进节奏与防止提示词膨胀自我改进跑一段时间后最常见的两个问题就是提示词膨胀和方向偏移。提示词膨胀的表现是配置越来越长因为模型每次反思都会觉得“再加一句提示词就更安全”最终系统提示词从一页变成十几页每次请求的token开销直线上升响应也开始变迟钝。我自己的处理办法是给system prompt设一个长度红线比如规定不能超过2500个token。改进建议提交的时候如果应用后超了红线就必须先删掉一部分旧内容。这强制系统在做“增量”的同时做“减量”保持提示词精炼。方向偏移则更难防。刚开始改进的时候智能体可能专注于提升代码任务能力跑一段时间之后某个新任务的反馈占比变大它又开始往那个方向过度优化结果老任务的能力退化了。对付这个问题评测集是最有效的工具。只要评测集里的老任务还在分数一掉就会被门禁拦下来。所以定期往评测集里添加“历史必修任务”是必不可少的一步。5. 常见问题与排查实录附Windows部署避坑最后这部分是最实战的。我自己在搭这套系统的过程中少说踩了二十来个坑这里挑最典型、最容易让新人卡住的几个写出来。5.1 Hermes Agent安装与启动问题速查表现象可能原因解决办法pip install报错提示依赖冲突Python版本太旧换Python 3.11或3.12重建虚拟环境安装某个wheel包报编译错误Windows缺C构建工具安装Visual Studio Build Tools或者改用WSL 2启动时提示找不到配置文件工作目录不对在Hermes Agent项目根目录下启动而不是在任意路径执行本地推理很慢GPU占用为0没有安装CUDA版torch按官方文档重装对应CUDA版本的torch中文路径下启动报错Windows终端编码问题用英文路径部署项目目录不要带中文和空格工具列表为空Hermes Agent像个摆件tool插件没有启用检查配置文件里的tools.enabled列表挨个打开并测试Windows用户我额外多说一句如果只是想快速验证效果强烈建议直接用WSL 2能省掉至少一半的环境问题。如果必须在Windows原生环境跑那Visual Studio Build Tools是必修课很多包编译失败的问题都是因为它没装。5.2 Grok API调用与上下文超限问题Grok Bot这半边的问题主要有三类。第一类是API限流报错信息通常是429或者rate_limit_exceeded。建议在GrokClient里加一个简单的指数退避重试第一次失败等1秒第二次等2秒最多重试5次。不要一股脑连发请求一旦被限流整个harness的决策环节就全堵住了。第二类是上下文超长。这个问题在我早期的设计里几乎天天出现因为我把20轮记忆原样塞给Grok。解决方式就是前面说的记忆压缩只喂摘要和最近几条记录。实测下来把1万token的历史压缩成800 token的经验摘要任务效果不降反升因为模型注意力更集中了。第三类是Grok返回的JSON格式不合法或者字段缺失。模型毕竟是概率输出偶尔会在plan的响应里漏掉actions字段。我的处理方式是解析失败就重试一次重试的时候在消息里追加一句“请严格输出JSON不要包含任何解释文字”。两次都失败就把这一轮标记为失败但不要让harness崩溃。5.3 自我改进运行时的三个危险行为“自我改进”这四个字听起来酷但跑起来如果不加约束很容易玩脱。我自己遇到过三个危险场景这里一起提醒。第一个是改进死循环。模型反思后提了个改进建议应用后评测分数没变回滚然后下一轮又生成同样的建议。系统就这么一直在原地打转白白烧API钱。我的解决办法是同一补丁内容如果被拒绝过后续连续10轮内不允许再提交。第二个是危险命令执行。Hermes Agent如果开启了shell工具模型在任务中可能会加一条类似“删除临时目录”的操作。如果白名单没限制严它可能把整个工作目录清了。强烈建议把shell的白名单细化到具体命令前缀比如只允许ls、cat、python script.py这类禁止一切带rm、sudo、mv等危险操作关键字的命令。第三个是修改记忆文件本身。改进处理器如果权限太大理论上可以自己改memory.json里已有的经验导致记忆被污染。我的做法是项目用git管理所有配置和记忆文件每次改动都提交一个commit。一旦发现异常直接git checkout回退到上一个稳定版本。这是整个系统最后一道保险比任何代码逻辑都可靠。最后再分享一个小技巧改进建议写进changelog的时候除了记录“改了什么”和“分数变化”一定顺手记录“为什么会有这个改动”。过两周回头看你会惊讶地发现大部分改动其实都源自偶然的一次任务失败而不是经过了深思熟虑。有了动机记录你就能判断出哪些改进值得保留、哪些只是模型在过度拟合某一类任务。对我个人来说这套harness运行下来最值钱的东西不是那个更聪明的智能体而是那本完整的、可追溯的“智能体成长日志”。
返回列表