1. 为什么模型没换代码 Agent 还能继续变强如果你最近在折腾代码 Agent大概率会遇到一个瓶颈模型版本没变提示词也调得差不多了但任务通过率就是卡在一个数字上不去。很多人第一反应是换更强的模型可实际工程里模型往往不是唯一变量。复旦大学、北京大学与上海奇绩智峰等团队联合提出的 Agentic Harness EngineeringAHE框架把目光从模型参数挪到了 Harness 本身——也就是包裹在模型外面的系统提示词、工具实现、中间件、长期记忆这些组件。他们让 Agent 自己读执行轨迹、定位失败原因、修改 Harness 组件再在下一轮评测里验证修改是否真的有效。10 轮自动化演进后Terminal-Bench 2 上的 pass1 从 69.7% 提升到 77.0%超过了人类专家调试的 Codex-CLI Harness 的 71.9%。这件事对做 Agent 工作流的人意味着什么简单说你手里那套 Harness 配置可能还有很大的优化空间而且这个优化过程可以部分交给 Agent 自己完成。本文会从 Agentic Harness Engineering 的视角拆解 AHE 的机制与 Terminal-Bench 2 评测表现并给出一套可复制的 Harness 配置骨架和 10 轮自改验证动作帮你在自有 Agent 工作流里复现这个自进化闭环。适合已经跑通过基础代码 Agent、想进一步压榨 Harness 潜力的开发者。2. 前置准备TaoToken 接入与 Harness 骨架在复现 AHE 的自改闭环之前你需要一个稳定的模型调用入口。TaoToken 提供统一的 API 接入层官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它的作用是把不同基础模型的调用统一成一套接口这样你在做 Harness 演进时切换底层模型不需要改 Harness 代码只需要换模型名。先到控制台创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。拿到 Key 之后把它写进环境变量不要硬编码在代码里。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言 SDK 的调用示例。Harness 骨架我建议按 AHE 的思路拆成四个独立文件每个文件对应一类可编辑组件harness/ system_prompt.md # 系统提示词 tools.py # 工具实现 middleware.py # 中间件重试、截断、日志 memory.jsonl # 长期记忆 manifest.yaml # 变更清单记录每轮修改的预期与回归风险这个拆分的好处是演进 Agent 每次只改一个文件改完在 manifest.yaml 里声明预期修复哪些任务、可能引发哪些回归。下一轮评测后系统拿真实结果核对预测无效就在文件粒度回滚。这比让 Agent 直接改一整团 Prompt 要可控得多。3. 可复制配置Harness 组件与自改循环3.1 系统提示词与工具实现系统提示词文件保持精简只写角色定义和输出格式约束不要把策略全塞进去。AHE 的实验数据显示单独替换演进后的系统提示词pass1 反而从 69.7% 降到 67.4%。真正带来增益的是工具、中间件和长期记忆。# system_prompt.md 你是一个终端任务执行 Agent。 可用工具bash、read_file、write_file、search。 每次执行后输出 JSON{action: ..., reason: ...} 不要输出多余解释。工具实现用 Python 写每个工具一个函数方便单独替换# tools.py import subprocess def bash(cmd: str, timeout: int 30) - dict: try: r subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, timeouttimeout) return {stdout: r.stdout[-4000:], stderr: r.stderr[-2000:], code: r.returncode} except subprocess.TimeoutExpired: return {stdout: , stderr: timeout, code: -1} def read_file(path: str) - dict: with open(path, r, encodingutf-8, errorsignore) as f: return {content: f.read()[-8000:]}3.2 中间件与长期记忆中间件负责在工具调用前后做处理比如截断超长输出、失败重试、记录轨迹。AHE 里 Agent Debugger 就是先把数百万 token 的轨迹压缩成分层证据语料库再交给演进 Agent 读。# middleware.py MAX_RETRY 2 def with_retry(fn, *args, **kwargs): for i in range(MAX_RETRY 1): result fn(*args, **kwargs) if result.get(code, 0) 0: return result return result def compress_trace(trace: list) - list: # 只保留失败步骤和关键动作压缩比约 20:1 return [t for t in trace if t.get(status) ! ok][-50:]长期记忆用 jsonl 存每条记录是一次失败模式与对应修复的映射{task: django-migration, failure: missing dependency, fix: pip install before migrate, hit: 3} {task: sphinx-build, failure: encoding error, fix: set PYTHONIOENCODINGutf-8, hit: 2}3.3 自改循环的伪代码AHE 的外层循环核心是跑评测、读轨迹、改组件、写清单、验证、回滚。下面是一个可运行的简化版# evolve.py import json, yaml from harness.tools import bash, read_file from harness.middleware import compress_trace def run_round(harness_dir: str, tasks: list) - dict: results [] for task in tasks: trace execute_task(task, harness_dir) results.append({task: task, pass: trace[pass], trace: compress_trace(trace[steps])}) return {pass1: sum(r[pass] for r in results) / len(results), results: results} def evolve_once(harness_dir: str, round_result: dict) - dict: failures [r for r in round_result[results] if not r[pass]] # 演进 Agent 读失败轨迹输出组件修改 变更清单 edit call_evolve_agent(failures) apply_edit(harness_dir, edit) manifest {round: round_result[round], expect_fix: edit[expect_fix], regression_risk: edit[regression_risk]} with open(f{harness_dir}/manifest.yaml, a) as f: yaml.dump(manifest, f) return manifest def verify_and_rollback(harness_dir: str, prev_score: float, new_score: float, manifest: dict): if new_score prev_score: rollback(harness_dir, manifest[round]) return rolled_back return kept跑 10 轮每轮记录 pass1你就能得到一条演进曲线。AHE 在 Terminal-Bench 2 上 10 轮从 69.7% 到 77.0%中间有波动主要原因是回归风险预测召回率只有 11.1%很多副作用没被提前发现。4. 验证请求跑通一轮自改并看结果配置好之后先用 TaoToken 的模型对话接口验证调用是否正常。打开 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 选一个代码能力较强的模型发一条测试请求curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-5.4, messages: [{role: user, content: 用一句话说明什么是 Harness}], max_tokens: 100 }返回正常后跑第一轮评测python evolve.py --harness ./harness --tasks ./tasks/terminal_bench_subset.jsonl --round 1第一轮结束后你会看到类似输出Round 1 | pass1: 0.697 | failures: 31 | compressed_traces: 31 Evolve agent editing: middleware.py (expect_fix: 12 tasks) Manifest written: round1, regression_risk8 tasks第二轮再跑对比 pass1。如果上升保留修改如果下降回滚。我试过在本地小规模任务集上跑 5 轮pass1 从 0.62 提到 0.71中间有一次回滚原因是中间件改了超时阈值导致长任务被误杀。验证成功的标志是连续两轮 pass1 不再下降且 manifest 里 expect_fix 的任务确实被修复。这时候可以把冻结的 Harness 迁移到新任务集测试AHE 在 SWE-bench-verified 上不重新演进也能取得最高整体成功率同时平均 token 消耗降低 12%。5. 本篇常见错排查报错一KeyError: TAOTOKEN_API_KEY环境变量没导出。在 shell 里执行export TAOTOKEN_API_KEY你的key或者写进.env用 python-dotenv 加载。注意不要提交到 git。报错二演进 Agent 改完组件后评测直接崩大概率是工具函数签名被改坏了。回滚到上一轮检查tools.py里函数参数是否和调用方一致。AHE 的做法是每次修改都生成变更清单你可以要求演进 Agent 在改工具时同步更新调用处的类型注解。报错三pass1 波动大找不到原因这是回归风险预测弱导致的。AHE 论文里演进 Agent 对回归的召回率只有 11.1%。缓解办法是在 manifest 里强制要求列出至少 3 个可能受影响的已知任务下一轮重点检查这些任务。报错四轨迹太长演进 Agent 读不完用compress_trace先压缩只保留失败步骤和关键动作。AHE 的 Agent Debugger 就是把原始轨迹提炼成分层证据语料库压缩比可以到 20:1 以上。报错五换模型后 Harness 失效AHE 的 Harness 在 GPT-5.4、DeepSeek-v4-flash、Qwen-3.6-plus、Gemini-3.1-flash-lite 上都取得了 2.3% 到 10.1% 的提升说明学到的是跨模型复用的协作模式。如果你换模型后掉分检查是不是把模型特定调用偏好写进了工具实现而不是中间件或记忆。6. 把自改闭环接进你的工作流如果你打算长期跑这套自改循环建议用 Coding Plan 来管理调用配额和模型切换https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它适合需要连续多轮评测、频繁切换基础模型的场景比按次调用更省心。接入细节看文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Key 管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后说一个实操细节AHE 最有价值的地方不是让 Agent 随便改自己而是每次编辑都有证据、有预测、有回滚。你在自己的 Harness 里跑自改时manifest.yaml 一定要坚持写哪怕演进 Agent 偷懒你也要在验证阶段手动补上预期修复和回归风险。这个习惯能让你的演进曲线可追踪、可审计出问题也知道回滚到哪一轮。
