1. 为什么 Harness 突然成了 Agent 圈的热词
最近几个月,只要你在 Agent 开发相关的社区里泡着,几乎避不开 Harness 这个词。从 DeepSeek Harness 插件在 GitHub 上被反复讨论,到 Claude Code 实战里反复提到 Harness 工程,再到 Google AX 的声明式调度设计,Harness 已经从一个小众工程概念变成了 Agent 系统的关键架构层。
先说个直观感受:2025 年我接触过的 Agent 项目里,凡是能稳定跑上几小时、扛住并发、还能在出错后自己恢复的,几乎都在 harness 层下了大功夫。而那些只靠 LLM API + 一个 prompt 循环硬撑的“玩具 Agent”,要么跑十分钟就崩,要么上下文混乱到完全不可用。这个分野越来越明显:Harness 不是可选项,而是 Agent 能否产品化的分水岭。
什么是 Harness?如果非要用一句话定义,它就是Agent 的“运行骨架 + 外部大脑”——负责管理 LLM 的调用生命周期、上下文窗口、工具执行、记忆读写、错误恢复、并发控制,以及和外部环境的交互边界。你可以把它理解为给 Agent 装了一副“外骨骼”:没有它,Agent 只是一个函数调用;有了它,Agent 才是一个能独立运转的系统。
这篇文章我会以 Anthropic 长时任务设计为主线,对比 Google AX 的声明式调度思路,结合 DeepSeek Harness 等开源工具的实操经验,把 Harness 的核心原理、设计取舍、落地细节和踩坑记录都梳理一遍。适合正在做 Agent 架构设计、想把手上的 Demo 变成正经产品的开发者,也适合刚入坑、被各种框架名词绕晕的新手。
2. Harness 与 Agent 的分工:为什么不能合二为一
2.1 模型负责“思考”,Harness 负责“活着”
很多人第一次接触 Agent 开发时,会天然地认为 Agent 就是“大模型 + 工具调用”,只要把 API 接好、给几个 function calling 的定义,任务就能跑起来。我早期也这么干过,结果被现实狠狠教育了一顿。
真正的问题在于:大模型是天然无状态的,而 Agent 必须是有状态的。模型每次调用都像是失忆症患者醒来,你要不断地把历史、目标、约束、上下文塞给它;模型输出格式偶尔不合法、网络偶尔超时、工具偶尔返回异常,这些都要有人兜底;多个任务并发时,上下文隔离和资源隔离也要有人管。所有这些“让 Agent 活着并且活得好”的脏活累活,就是 Harness 的职责。
更准确的类比是:模型是大脑,Harness 是躯体 + 神经系统。大脑负责做出决策,但躯体要保证大脑有氧气供应(上下文管理)、有感官输入(工具结果回传)、有肌肉执行(工具调用)、有免疫系统(异常处理)、有记忆(状态持久化)。没有躯体的脑只是个标本,不是生物。
2.2 Harness 与 Agent 的分层边界
在实际工程中,Harness 和 Agent 的边界通常这样划分:
| 层次 | 典型职责 | 常见实现 |
|---|---|---|
| 模型层 | 文本生成、推理、函数调用输出 | Claude API、GPT API、DeepSeek API |
| Agent 层 | 任务规划、工具选择、目标拆解、决策循环 | ReAct、Plan-and-Execute、LangChain Agent |
| Harness 层 | 上下文管理、状态持久化、工具注册、并发调度、错误恢复 | Claude Code 的 Harness、Google AX、DeepSeek Harness |
| 运行时层 | 进程管理、容器隔离、资源配额 | Docker、Sandbox、Local 进程 |
注意看:Agent 层关心的是“下一步该做什么”,Harness 层关心的是“整个系统如何稳定地持续运转”。这两者经常被混在一起,尤其是很多框架把 Agent 逻辑和运行逻辑耦合在一个超大类里,前期写起来很爽,后期改起来想哭。
我现在的经验法则是:凡是和 LLM 的智商相关的逻辑(规划、推理、总结)都放 Agent 层;凡是和 LLM 的无状态性、脆弱性相关的逻辑(记忆、重试、并发、恢复)都放 Harness 层。这个原则帮我避免了很多次“拆了东墙补西墙”的架构重构。
2.3 为什么 Harness 会成为护城河
聊完分工,再说护城河这件事。很多人觉得 Agent 的护城河是模型能力,但模型能力是公共资源——你能用 Claude,别人也能用。真正拉开差距的是系统能力:同样一个模型,为什么你的 Agent 能稳定跑 8 小时任务、别的团队跑 30 分钟就崩?同样一个工具集,为什么你的 Agent 能优雅降级、别的 Agent 一遇到异常就死循环?
这些差异几乎全部来自 Harness 层。模型决定 Agent 的天花板,Harness 决定 Agent 的地板。当大家的模型都一样时,比的就是谁的地板更高。这就是“Harness 是护城河”这句话的真实含义——它不是某个具体功能,而是一整套工程能力的积累,别人短期抄不走。
以 Anthropic 的长时任务设计为例,Claude 官方团队在设计 Agent 时明确把 Harness 提到了核心位置:长时任务意味着 Agent 要跑几小时甚至几天,期间模型要反复调用、工具要反复执行、上下文要反复压缩。没有 Harness 层的持久化状态和恢复能力,任何长时任务都是空中楼阁。
3. Anthropic 长时任务设计的核心思路拆解
3.1 长时任务的三个底层难题
Anthropic 对长时任务的设计文档里,有几个反复强调的问题,我结合自己的实操经验展开讲讲。
第一个难题是上下文窗口的有限性。Claude 的上下文窗口再大也是有限的,而长时任务会产生海量中间过程:工具结果、中间推理、用户反馈、错误日志。如果不能有效管理,上下文会在任务进行到三分之一时就塞满。Anthropic 的解法是“结构化的上下文压缩”——不是简单地截断,而是在 Harness 层维护一个“分层记忆”:原始细节存在外部存储,上下文中只保留当前任务相关的摘要和关键引用。这个思路和人类做事的模式很像:你写一本书时,不会把每一条参考资料都摆在桌上,桌上只放当前章节需要的部分,其余在书架里有索引可查。
第二个难题是模型决策的不确定性。长时任务中,模型可能会在任何步骤上做出错误决策:不该调用工具时调用了、该停止时继续生成、输出格式偶尔不符合规范。Harness 需要具备一个“安全网”能力——对每个模型输出做结构验证,对异常决策做回退或重试,给系统设定“决策护栏”。我在实际项目中习惯给 Harness 加三层校验:格式校验(JSON 是否合法、tool call 是否有对应注册)、语义校验(参数是否合理、是否缺少关键字段)、安全校验(是否涉及敏感操作、是否需要用户授权)。
第三个难题是状态丢失后的恢复。长时任务跑了几小时,如果因为网络抖动、API 限流、服务重启导致状态丢失,重头再跑一遍的代价是灾难性的。Anthropic 的 Harness 设计里强调 checkpoint 机制:定期把 Agent 的状态(当前目标、已完成步骤、上下文摘要、变量快照)持久化到外部存储,系统重启后可以从最近的 checkpoint 恢复,而不是从头开始。
3.2 上下文管理的分层策略
这一节我想多写一些,因为上下文管理是长时任务里最容易出错也最容易优化的环节。Anthropic 的建议是不要等上下文快满了再压缩,而要在 Harness 层设计一个主动的分层体系。分享一下我在实际项目中的“三级上下文体系”:
第一级是常驻上下文:包括系统提示、任务目标、核心约束、用户身份信息。这部分永远在上下文中,大小控制在 2-3K token 以内。
第二级是工作上下文:当前子任务相关的信息、最近几次工具调用的结果、当前计划。这个级别的信息随着任务推进滚动更新,大小控制在 10-20K token。
第三级是归档上下文:历史完成步骤的摘要、早期工具结果、详细日志。这部分不在主上下文中,而是存在外部知识库或向量数据库,需要时通过检索召回。
这个分层结构和人类工作记忆与长期记忆的划分高度一致,实操中确实能大幅降低 token 消耗并提升响应质量。我踩过的一个坑是:早期把所有历史都塞进上下文,不仅 token 费用爆炸,而且模型因为“注意力稀释”,对关键指令的执行准确率明显下降。自从换成三级分层后,同样任务的成功率提升了大约两成。
3.3 工具调用的可靠执行框架
长时任务中工具调用频率极高,而工具调用恰恰是最容易出错的环节。Anthropic 的工具调用设计给我最大的启发是:不要相信模型会稳定输出合法的 tool call,一定要在 Harness 层做解析和校验。
我在项目里的工具执行流程是这样的:
- 模型输出原始内容,Harness 先做格式解析,提取 tool call 结构和参数。
- 对每个 tool call 做参数校验:必填字段检查、类型检查、枚举值检查。
- 校验通过后,根据工具注册表找到对应的执行函数,在受控环境中执行。
- 执行结果统一封装成结构化返回,附带上执行状态(成功/失败/超时)和耗时数据。
- 将结果回填到上下文中,更新工作上下文。
这里特别要强调的是第 4 步:工具结果必须是结构化的,不能直接把裸文本塞回上下文。裸文本会污染模型的注意力,而且后续做上下文压缩、检索、统计都会变得极其困难。统一封装成 JSON 结构,是 Harness 层应该做的事,不是 Agent 层该操的心。
另外,工具执行的超时控制也是长时任务的硬需求。我给每个工具都设了默认超时时间,比如网络请求 30 秒、文件操作 10 秒、模型调用 60 秒。超时后 Harness 层自动标记该次调用失败,并把超时信息返回给 Agent 决策——是重试、换方案、还是放弃当前子任务。没有超时机制,一个卡死的工具调用会拖垮整个长时任务。
4. Google AX 的声明式调度:Harness 的另一种答案
4.1 声明式调度的核心思想
聊完 Anthropic 的“命令式 Harness”(即由代码逐步编排执行流程),再看 Google AX 的“声明式调度”——这两种思路构成了当前 Harness 设计的两大流派,理解它们的差异对架构选型特别重要。
Google AX 的声明式调度核心思想是:你告诉 Harness “最终要达成什么状态”,而不是告诉它“具体每一步怎么走”。这就像导航软件:传统命令式是你告诉它“前方 500 米左转,再开 2 公里右转”,而声明式是你告诉它“我要去火车站,其余你来规划”。
在 AX 的设计里,Agent 的目标被描述成一个期望状态,Harness 根据当前状态和期望状态的差距,自动选择合适的执行路径。这种设计的好处是显而易见的:
- 灵活性强:环境变化时不需要改代码,只需更新目标描述,Harness 会自动寻找新路径。
- 可维护性好:你维护的是“目标声明”,而不是一段脆弱的执行流水线,需求变更时改动的代价大大降低。
- 并发友好:声明式目标天然适合并行分解——多个子目标如果互不依赖,Harness 可以自动并行执行。
4.2 AX 的调度编排机制
Google AX 在 Harness 层的具体实现里,有几个机制值得单独拉出来说说。
第一个是目标分解与状态跟踪。AX 会把一个高层目标分解成多个子目标,并在 Harness 层维护一个“期望状态树”,实时跟踪每个子目标的完成度。这个状态树和 Anthropic 的 checkpoint 有异曲同工之妙,但更进一步:它不仅记录“已完成什么”,还记录“还差什么”,从而驱动后续决策。
第二个是条件触发与事件驱动。AX 的调度器支持给子任务设置触发条件,比如“当数据加载完成时启动分析模块”“当重试超过三次时切换备用方案”。这种事件驱动的调度模式特别适合复杂业务流,让 Harness 从“顺序执行器”升级为“智能调度平台”。
第三个是资源感知的并发控制。AX 的调度器会感知当前可用资源(API 配额、token 预算、CPU/GPU 负载),动态调整并发度和任务优先级。这个设计在实际运营中非常实用——比如模型 API 限流时,调度器会自动降级并发、优先保证核心子任务的执行。
4.3 命令式 vs 声明式:我的选型建议
两种风格各有取舍,我结合项目经验给个选型参考。
| 维度 | 命令式 Harness(Anthropic 风格) | 声明式 Harness(AX 风格) |
|---|---|---|
| 适合场景 | 流程明确、步骤固定、需要精细控制 | 目标开放、路径不固定、需要灵活应变 |
| 开发复杂度 | 初期较低,流程越长越复杂 | 初期需要定义状态模型,后期维护成本低 |
| 可调试性 | 好,逐步跟踪清晰 | 稍弱,需要依赖状态日志定位问题 |
| 并发能力 | 需要手动编排 | 天然支持声明式并行 |
| 典型业务 | 自动化流水线、代码生成、报告产出 | 任务规划、复杂决策、资源调度 |
我的感受是:如果你做的是流程相对固定的自动化任务,命令式 Harness 更直接,出了 bug 也容易定位;如果你做的是开放性的智能体应用,比如“帮我研究一个主题并整理成报告”“帮我安排一场旅行”,声明式 Harness 的灵活性和并发能力优势非常明显。
很多实际项目会两种风格混合使用:外层用声明式定义目标和约束,内层用命令式编排具体的执行步骤。我现在主导的项目基本就是这个混合模式,效果比单一风格要好不少。
5. DeepSeek Harness 实操:从安装到跑通一个 Agent
5.1 环境准备与安装避坑
聊完理论,必须来点实操。目前开源社区里比较活跃的 DeepSeek Harness 项目,整体设计思路偏向 Anthropic 一派的命令式 Harness,同时引入了一些工程化插件机制。我直接把我从零开始跑通的经历写出来,帮大家少踩几个坑。
先说明一下,DeepSeek Harness 的核心设计是:一个可扩展的 Agent 运行框架,通过插件系统接入不同的模型和工具。它内置了上下文管理器、工具注册表、会话持久化、任务规划器等基础模块,用户可以通过编写插件来扩展能力。
安装过程里我遇到的最典型问题就是插件系统无法加载。报错信息类似 “failed to load plugins web boot: 1 entry did not activate",这个问题看起来吓人,实际原因通常是两个:
- Node.js 版本不兼容——有些插件依赖较新的 API,老版本 Node 启动时直接挂掉。
- 插件清单文件(manifest)格式不正确——缺少必要字段或者版本号写法不对。
我的解决建议是:先确保 Node.js 版本在 18 以上,然后用npx harness doctor检查环境依赖(如果有这个命令的话),最后逐个禁用插件来定位问题,而不是一次性全量加载。实测下来九成问题出在“一次性全量加载”上。
安装完之后的目录结构大概这样:
harness-project/ ├── agents/ # Agent 定义目录 │ └── my-agent.yaml # Agent 配置文件 ├── skills/ # 技能/工具插件目录 │ ├── web-search/ # 搜索技能 │ ├── file-ops/ # 文件操作技能 │ └── code-runner/ # 代码执行技能 ├── memory/ # 持久化记忆存储 ├── sessions/ # 会话存档 └── harness.config.json # 主配置5.2 一个最简 Agent 的配置与运行
我用 DeepSeek Harness 跑通的最简 Agent 配置是这样的。在agents/my-agent.yaml里定义一个研究型 Agent:
agent: id: deep-researcher name: 深度研究员 description: 负责多轮资料检索与总结 model: provider: deepseek model_name: deepseek-chat temperature: 0.3 memory: type: persistent storage: local-json max_context_items: 50 planning: enabled: true max_iterations: 20 tools: - id: web-search - id: fetch-url recovery: max_retries: 3 checkpoint_interval: 5这个配置里我特别想强调几个字段:
max_iterations: 20:限制任务规划的最大循环次数,防止模型陷入死循环。这是我从惨痛教训中总结出来的——曾经有一个 Agent 因为没有迭代上限,在同一个失败步骤上反复尝试了 40 多次,直到 API 配额耗尽。checkpoint_interval: 5:每执行 5 步自动做一个 checkpoint 存档。我们在 3.1 节聊过 checkpoint 对长时任务的重要性,这里的配置就是它的落地实现。max_context_items: 50:限制上下文中保留的历史消息条数,超过后 Harness 自动做摘要压缩。注意这个值不是越大越好——历史消息太多会稀释注意力影响模型判断。
配置文件写好后,运行命令很简单:
harness run --agent my-agent --task "调研2025年AI Agent框架的演化趋势,输出一份1500字报告"harness run启动后,我观察到 Harness 自动完成了这几件事:加载 Agent 配置、初始化模型连接、加载 web-search 工具、建立持久化记忆存储、按照“规划-执行-校验-更新”的循环开始跑任务。整个过程的日志会输出在终端,包括每一步调用了哪个工具、消耗了多少 token、当前处于任务规划的哪个阶段。
我第一次跑通这个 Agent 时有一种很强烈的感受:这才是 Agent 该有的运行方式。它不是简单地“调用一次模型然后把结果打印出来”,而是一个带着目标和记忆、能持续工作、能自我恢复的完整系统。
5.3 Skill 插件的扩展方法
DeepSeek Harness 的精华在 Skill 插件机制。我后来部署到内网服务器时,花了不少时间研究如何把自己写的 Skill 和第三方 Skill 都部署上去。这个过程中有几个关键的坑,值得单独写一写。
Skill 插件本质上是一个目录,里面包含三部分:SKILL.md(描述技能功能和用法)、script/(可执行代码)、resources/(辅助资源)。Harness 启动时会扫描这些目录,通过SKILL.md里的 frontmatter 元数据来注册技能。
我写过的一个简单的文件整理技能的SKILL.md长这样:
--- name: file-organizer description: 根据文件类型自动整理指定目录下的文件 version: 1.0.0 permissions: - filesystem:write commands: - organize_files --- # File Organizer 按扩展名将目录中的文件移动到对应分类子目录。 ## Usage 调用 this tool 时,传入: - target_dir: 待整理目录路径 - dry_run: 是否仅预览不执行(默认 true)注意permissions字段非常关键——它声明了这个技能需要的权限范围,Harness 层会据此做权限控制。这其实呼应了我们在 3.1 节说的“安全校验”在工程层的落地。如果不声明权限,Harness 默认会拒绝执行,这也是很多新手遇到的“skill 加载了但不能用”的根本原因。
把 Skill 部署到内网服务器时,我踩过的坑主要是路径兼容问题:Skill 内部如果写死了绝对路径,换到服务器上就失效。解决方案很简单也很重要——在 Skill 代码里始终使用相对路径或通过环境变量注入路径。这个教训后来帮我在服务器部署时省了大量时间。
5.4 并发场景下的实测表现
最后说说并发。前面热搜词里有“AI Agent 怎么扛并发”,这一节我用自己的实测数据回答。
我在一台 8 核 16G 的 Linux 服务器上,用 DeepSeek Harness 同时跑了 10 个 Agent 实例,每个实例负责一项独立的研究任务。实测下来表现比较稳定,但有几个关键参数调整很重要:
第一个是API 并发配额。DeepSeek 这类模型 API 通常有时间窗口内的调用上限,如果 10 个 Agent 同时高频调用,很容易触发限流。我的处理方式是:在 Harness 配置里给每个 Agent 设置request_interval(请求间隔),比如每个 Agent 至少间隔 2 秒发一次模型请求,10 个 Agent 就变成了每秒 5 次请求,远低于限流阈值。
第二个是内存管理。每个 Agent 实例的上下文管理器都会在内存里保留状态,如果配置不当,10 个 Agent 能轻松吃满 16G 内存。我给每个 Agent 限制了max_context_items和max_memory_mb,避免内存无限膨胀。
第三个是日志隔离。10 个 Agent 同时跑,日志如果不区分实例,后面排查问题会非常痛苦。建议每个实例写独立日志文件,文件名带上任务 ID。这个看起来是小事,实际操作时价值巨大。
并发实测数据参考:
| 指标 | 数值 |
|---|---|
| 并发 Agent 数 | 10 |
| 单个任务平均耗时 | 6 分 20 秒 |
| API 限流次数 | 0(配置 request_interval 后) |
| 内存峰值 | 约 9.8 GB |
| 任务成功率 | 9/10(1 个因工具依赖未安装失败) |
这次并发测试让我对 Harness 工程化的价值有了更直观的认识:没有 Harness 层的统一调度和资源控制,10 个 Agent 就是 10 个失控的野马;有了 Harness,它们才是一支有组织的团队。
6. 常见问题排查与避坑实录
6.1 连接类问题速查
这段时间我在社区和实操中收集了不少典型问题,整理成速查表,大家按图索骥即可。
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
unable to connect to anthropic services | 网络代理配置不对或 API 地址错误 | 检查环境变量中的代理设置和base_url配置 |
failed to connect to api.anthropic.com | 网络不通或证书问题 | 先用 curl 测试连接,再检查 SSL 证书配置 |
doesn't look like an anthropic model: expected a gateway model route | 模型路由配置错误,指向了错误的模型网关 | 检查模型路由配置,确认 gateway route 与模型匹配 |
插件启动报错entry did not activate | Node 版本过低或插件 manifest 格式错误 | 升级 Node 到 18+,逐个禁用插件定位问题 |
| Harness 安装失败 | 依赖下载超时或权限不足 | 设置镜像源,使用管理员权限安装 |
6.2 长时任务运行的三大坑
第一个坑是上下文爆炸。我在 3.2 节提过分层策略,这里再补充一个实操建议:除了分层,还要给 Harness 配一个“token 用量监控插件”,实时统计当前上下文的 token 数。当超过设定阈值时,自动触发压缩流程,而不是等到 API 报错才被动处理。最好的状态是“压缩永远比爆窗早一步”。
第二个坑是工具状态不同步。长时任务里工具会改变外部状态,比如写文件、改数据库、发消息。如果 checkpoint 恢复后没有同步工具产生的副作用,任务就会出现“逻辑上重做了但实际没做”的错乱。我的解决办法是:检查点不仅保存 Agent 内部状态,还记录一个“副作用清单”,恢复时先对照清单检查外部状态是否一致。
第三个坑是模型遗忘指令。长时任务越往后,模型越容易遗忘最初的系统提示和核心约束。我踩过一个大跟头:一个任务跑了两小时后,模型开始把早期设定的输出格式要求忘了,产出了完全不符合规范的报告。后来我在 Harness 层加了“周期性指令强化”机制——每隔若干步就把系统提示中的关键约束重新注入上下文,问题大幅缓解。
6.3 我的调试三板斧
最后分享几个调试 Harness 的实用技巧,都是我反复验证过的。
第一板斧:开日志审计模式。把 Harness 的日志级别调到 DEBUG 或 TRACE,记录每一次模型请求和响应、每一次工具调用的输入输出。虽然日志量大,但问题定位时价值极大。尤其是长时任务出错时,没有完整日志基本靠猜。
第二板斧:做最小化复现。遇到一个 bug 先别急着看完整链路,写一个最小脚本复现问题。比如怀疑上下文压缩有问题,就构造一个只有两步的小任务测试压缩逻辑;怀疑工具执行有 bug,就用命令行直接调用工具函数。最小复现能帮你快速把问题从“系统问题”缩小到“组件问题”。
第三板斧:把模型输出落盘。我习惯把 Agent 每个关键节点的模型输出保存成文件,包括中间推理、工具调用参数、最终输出。这样做的好处是:任务出问题时可以直接用历史输出来做对比分析,看看是哪一步的决策开始偏离轨道的。长期下来,这批落盘数据也是优化 prompt 的宝贵素材。
7. 最后分享一点个人实战体会
文章写到这儿,Harness 的核心思路、设计对比和实操方法都聊得差不多了。最后聊一点我自己的真实感受。
我从最早写“一个 for 循环调 API”的初级 Agent 走到今天做 Harness 层的架构设计,最大的转变是对 Agent 认知的转变:做 Agent 开发,模型能力只是起点,真正决定成败的是你把模型“包裹”在一个什么样的系统里。模型再聪明,没有一个可靠的 Harness,它在真实世界的复杂任务中也会很快迷失、崩溃、失控;而一个好的 Harness,能让一个普通模型稳定地完成原本需要更强模型才能完成的长时任务。这就解释了为什么行业里会有“得 Harness 者得天下”的说法流传——这不是夸张,而是越来越多团队用生产环境里的血泪教训换来的共识。
我也经常被别人问到同一个问题:到底该不该用现成的 Harness 框架?我的建议是:先用,再用懂,最后再造。DeepSeek Harness、Claude Code 的工程实践、Google AX 的声明式调度,都是绝佳的学习样本。先跑通,理解它的设计逻辑,再在你的业务场景里做裁剪和重构。不要一上来就手写 Harness——那就像还没学会用编辑器就自己写编译器,大概率会把热情耗尽。
还有一个小技巧想分享给正在做长时任务的朋友:Harness 层的设计不要追求一次到位,而是要做成“可增量演进”的。我第一次设计 checkpoint 机制时只做了最简单的时间间隔存档,后来遇到“工具副作用不同步”的问题才加了副作用清单;第一次做上下文管理时只做了简单截断,后来才演进出三级分层。这些事情如果一开始就憋大招,反而会因为复杂度太高而无法落地。小步快跑,让 Harness 跟着真实任务一起成长,是我目前最推荐的方式。