1. 先说清楚:Agent 和 Harness 到底谁在干活
1.1 一个尴尬的现实:Agent 能聊天,但"不干活"
过去两年我帮不少人搭过 AI Agent。多数人一开始的预期,是给大模型套一层 Prompt、挂几个工具,它就能像员工一样自主完成任务。真跑起来就露馅了:让它查资料,它能给你编一个不存在的链接;让它连续操作三步,第二步开始就忘了第一步的目标;同一个任务换个问法,结果能差出十万八千里。
这就是"Demo 一时爽,落地火葬场"的来源。模型本身是个能力很强但毫无纪律的"实习生"——知识面广、反应快、悟性好,但没有时间观念、没有工作台账、不知道哪些事必须先审批再动手,干到一半还会自己给自己加戏。
所以圈子里慢慢形成了一个共识:光有 Agent 模型远远不够,你需要一套东西把它"管起来"。这套东西的通用叫法就是 Harness。概念上它脱胎于软件工程里的"测试夹具"和"流水线运控"思想,放到 AI 场景里,它指的是:承接模型能力、连接外部工具、管理执行过程、约束行为边界的那一层工程骨架。
1.2 Harness 不是框架,是干活的"驾驶舱"
总有人把 Harness 和理解为一个"类似 LangChain 的新框架",这是最常见的误解。框架解决的是"怎么调模型、怎么拼链路",Harness 解决的却是"一个 Agent 项目从启动到交付,中间的每个环节谁负责、怎么协作、怎么兜底"。
我的类比是:模型是发动机,框架是传动轴,而 Harness 是驾驶舱。发动机马力再大,没有仪表盘你不知道剩多少油;没有方向盘你控制不了方向;没有制动系统你不敢踩油门。所谓"让 AI 真正下地干活",指的不是把发动机造得更大,而是把驾驶舱配齐,让人敢把车开上真实公路。
这也是为什么我看任何 Agent 项目,第一件事不是看它接了什么大模型,而是翻它的工程结构——有没有明确的上下文管理模块?有没有工具注册和鉴权机制?有没有循环步数上限?有没有成本熔断?这些才是"能不能干活"和"敢不敢让它干活"的分水岭。
1.3 7 个子系统不是 7 个模块,是一条流水线
标题里说"原来就这 7 个子系统",我拆过好几个主流 Harness 实现,包括热门的 DeepSeek Harness、ClaudeCode 工程化改造、自研的 RPA 编排框架,最后留下的骨架确实高度一致。这 7 个子系统按数据流的顺序排下来,就是一条完整的流水线:
- 上下文工程:把目标、约束、历史、事实组装成模型能理解的一段话。
- 工具编排:让模型通过函数调用真正触达外部系统。
- 记忆系统:管好短期窗口和长期知识。
- 执行循环:控制"计划-行动-观察"的节拍和终止条件。
- 并发调度与沙箱:回答"AI Agent 怎么扛并发"。
- 插件系统:把能力扩展变成可插拔、可共享的协议。
- 可观测性与护栏:每一次动作都留痕,每一分成本都可控。
下面逐个拆给你看,不堆概念,直接说它是干嘛的、怎么设计的、哪里最容易翻车。
2. 7 个子系统拆解:Harness 之所以能落地,靠的是这几根骨头
2.1 上下文工程:把"该说的"和"不该说的"塞进同一段话
大模型没有记忆,一次推理只看得到你喂进上下文窗口的那一串 token。"上下文工程"这五个字听起来玄,干的事其实很朴素:在你把请求发给模型之前,先把任务目标、背景约束、历史对话、检索到的知识、当前可选动作,组织成一份结构清晰、无冗余的"工作简报"。
很多人写 Prompt 只关心"怎么措辞能让模型输出更好",但 Harness 里的上下文工程关注的是"哪些信息必须给、哪些信息要省略、信息之间的优先级怎么排"。我见过最典型的翻车现场,是把整个知识库的检索结果不分主次全塞进上下文,结果模型被无关信息干扰,把核心指令忘了。投票给模型的信息就像给新同事安排工作——你一次性扔给他 50 份材料,他只会先看最厚的那份。
实操上需要处理几件具体事:
- 任务定义注入。每一轮循环开始时,都要把总目标原文或摘要重新放回上下文,防止模型在中途"跑偏"。
- 历史窗口滚动。多轮工具调用之后,对话历史会指数膨胀。要设定窗口上限,比如保留最近 10 轮完整记录,更早的做成摘要。
- 截止摘要。一旦历史超过阈值,触发一次"到目前为止已完成 A/B,还剩 C/D"的提炼,作为后续轮次的固定开头。
- 工具结果回填。工具返回的结构化数据,要格式化后再进上下文,最好增加一层合法性校验,防止外部数据里夹带提示词注入。
我见过一些 Harness 实现把上下文工程做成了"动态模板 + 优先级裁剪器",核心参数就三个:窗口长度、摘要触发阈值、各信息块优先级。这三个参数调好,同样的模型能力,回答稳定性能有质的提升。这不是玄学,而是信息组织效率的差异。
2.2 工具编排:给模型一双能真正碰到系统的手
模型本身只会吐 token,让 Agent"干活"的全部秘密在于函数调用(Function Calling / Tool Use):模型输出一个结构化指令,Harness 解析后执行真实操作——查数据库、写文件、调 API、发消息,再把结果回传给模型。工具编排子系统就是这套机制的支撑骨架。
设计上是这样一层层叠出来的:
- 工具注册表:每一个工具是一个条目,包含 name、description、parameters(JSON Schema)、executor(真正的执行函数)。模型看到的是 name 和 description,executor 永远在沙箱里被调用。
- 参数校验兜底:模型偶尔会生成不合法参数——类型对不上、必填字段缺失、枚举值乱给。Harness 要在执行前先做一轮校验,不合法就直接返回错误信息让模型自己修正,而不是把错误扔给业务系统。
- 结果结构化回流:工具执行完,要按约定格式返回(成功/失败、数据、耗时、错误码),这些信息会被上下文工程格式化后送回模型,供下一轮推理使用。
- 权限边界:哪些工具可以被自动调用,哪些必须经过人工审批,必须在注册表里声明,而不是在执行时才问。
拿自动化办公举例:一个 Agent 要写周报,它需要调用"查项目进度"工具拿到任务列表,调用"读聊天记录"工具提取关键信息,调用"生成文档"工具产出周报。没有工具编排层,这三个动作只能靠人手动串;有了它,模型天然地学会"先查、再读、最后写"这种结构化流程。
我最想提醒的一点:工具注册表里 description 的措辞质量,直接决定模型能不能正确挑中工具。写得模糊,模型就会乱选。我见过有人给工具写"处理数据",结果模型不知道该不该用它处理 Excel——正确的写法是"把 Excel 文件每行转换为 JSON 对象,输入参数为文件路径"。
2.3 记忆系统:临时草稿纸和长期笔记本要分开
执行循环里要用的短期记忆,和跨任务复用的长期记忆,是两种完全不同的东西。把这两者混在一起是新手 Harness 常见病。
- 短期记忆:指当前会话的上下文窗口,由上下文工程负责滚动和压缩,本质是"工作台上的草稿纸"。它的目标是让模型知道当前任务进行到哪一步。
- 长期记忆:指跨会话的知识沉淀,包括从知识库检索到的文档片段、用户偏好、历史任务结论、向量 Embedding 索引。它的目标是让 Agent 在下次任务里不需要重新教一遍。
长期记忆的存储方案不必一开始就上向量数据库。小规模场景下,一个带 Embedding 检索的 SQLite 表都够用;规模大了再考虑向量库。真正容易被忽视的是血缘和过期:每条记忆要记录来源(哪个工具、哪个文档、哪个会话)和时效(哪天失效)。否则 Agent 用着三个月前的旧数据答复今天的用户,还一本正经。很多 Harness 里记忆系统只是"存取数据",但合格的记忆系统应该做到"存取 + 溯源 + 失效清理"。
我个人的处理原则:短期记忆尽量薄,长期记忆尽量结构化。模型需要的是线索,不是把数据库搬进提示词。
2.4 执行循环:Plan-Act-Observe 的节拍器与刹车片
Agent 和普通 API 调用的本质区别,在于它有循环:模型先提出计划,Harness 执行动作,观察结果,再送回模型决定下一步。这个"Plan-Act-Observe"循环是 Agent 的工作方式,也是风险放大器——循环跑得好是自主干活,跑不好就是无限烧钱。
执行循环子系统要管四件事:
- 循环控制器:按"目标 → 当前状态 → 可选动作 → 选择动作"的节奏驱动每一轮推理,不让模型自由发挥到偏离任务。
- 终结条件:这是最重要的一环。最大步数(比如 15 步)、目标达成置信度、无进展判定(连续两轮动作相同且无状态变化)都必须硬编码。没有这些,一个任务失败了模型会反复重试到天荒地老,"AI Agent 怎么扛并发"就变成了"AI Agent 怎么烧钱"。
- 重试与退避:工具调用超时、上游 API 限流这些事一定会发生,重试策略要写在循环里,指数退避 + 最大重试次数,别让模型自己决定"再试一次"。
- 人工审批钩子:把敏感操作定义为"需审批"状态。Agent 执行到这一步时,循环暂停,挂起等待人工确认,而不是默默执行完。
我见过最惨的一次事故,是同事的 Agent 在循环里调用支付接口,因为上游响应慢导致重试,同一笔订单被提交了三次。事后我把执行循环的评审标准加了一条:"会产生外部副作用/不可逆效果的自动动作,必须幂等且必须留人工审批钩子"。这句话建议写进你自己的 Harness 设计文档第一页。
2.5 并发调度与沙箱:回答"AI Agent 怎么扛并发"
"AI Agent 怎么扛并发"这个问题最近特别热,因为单人玩 Harness 没什么压力,一旦放到公司内部多团队共用,或者做成中台服务,立刻暴露问题。
并发调度的核心不是把请求一股脑打进模型 API。模型侧有速率限制,工具侧有外部服务依赖,真正的并发瓶颈往往在中间的调度层。一个合格的并发子系统至少要做三件事:
- 请求队列与限流:所有 Agent 任务进入队列,用令牌桶控制对模型 API、外部工具 API 的访问速率,避免触发上游限流导致重试风暴。
- 任务分片与幂等:一个大型任务拆成多个子任务并行时,每个子任务要有唯一 ID 和幂等键。中断后重跑,不会重复执行副作用操作。
- 沙箱隔离:每个 Agent 项目有独立工作区——独立文件目录、独立环境变量、独立依赖容器。不同项目跑在同一个 Harness 进程里,互不干扰。这是"AI Agent 中台"必须要过的一关,否则十个团队共用一个部署,一个项目写坏全局环境,整个平台全挂。
压测过的人都知道一个反直觉的结论:模型推理通常不是瓶颈,工具执行和队列调度才是。你压 50 个并发任务,模型 API 消耗可能只占三成,剩下七成消耗在数据库查询、文件读写、外部 HTTP 调用上。所以调优第一刀永远砍在工具执行层——加缓存、加连接池、异步化,而不是抱怨模型 API 慢。
2.6 插件系统:热插拔的扩展能力
插件系统是 Harness 生态的生命线。没有插件系统,每加一个新工具就得改核心代码、重新部署;有了插件系统,能力扩展就变成了"按约定放一个目录、写一个清单文件、执行一次加载"。
一个规范插件系统要处理三个问题:
- 插件协议:约定 manifest 字段(名称、版本、入口、依赖、权限声明),约定入口函数签名,约定生命周期钩子(加载、激活、卸载)。
- 动态加载机制:运行时扫描插件目录,读取 manifest,校验字段,加载入口模块,逐个激活。激活失败不能影响其他插件,要有独立隔离和错误上报。
- 依赖与权限声明:插件声明自己需要哪些系统工具、哪些环境的变量、访问哪些目录。没有这层约束,一个恶意或写坏的插件就能随意读你的文件系统。
DeepSeek Harness 这一波热度里,插件系统是最吸引人的部分,很多人就是冲着"工作流插件"去的。但我在社区里看到最多的求助帖,恰恰卡在插件加载上,后面第三章我会完整讲一次排查过程。这里先记住一个原则:插件系统的第一目标是隔离失败,不是堆功能。
2.7 可观测性与护栏:干活的代价可见、风险可控
最后一个子系统最容易被忽略,但长期看最值钱。一个没有可观测性的 Harness,就像一台没有日志服务器的业务系统——出了问题只能靠猜。
可观测性要落到四个层面:
- 动作留痕:每一次模型调用,记录 prompt 快照、模型响应、工具入参出参、耗时、token 消耗。将来任何一次业务异常,都能回放完整链路。
- 成本审计:按项目、按用户、按工具维度汇总 token 和 API 费用。没有这层数据,"AI Agent 项目"就永远是个无底洞,你也说不清它到底值不值。
- 护栏策略:敏感内容检测、成本熔断、权限裁决要统一在 Harness 层配置,而不是散落在每个业务代码里。达到单任务成本上限就自动终止循环,检测到可疑指令就升级人工。
- 失败注入演练:定期模拟上游超时、API 返回异常、插件加载失败,验证执行循环和调度层是否正确兜底。
写到这里,7 个子系统的骨架已经完整了。它们不是七个并列模块,而是像流水线一样层层咬合:上下文工程给模型喂料,工具编排让模型动手,记忆系统保证不健忘,执行循环控制节奏,调度沙箱扛住并发,插件系统扩展边界,观测护栏控制风险。任何一环缺失,Agent 都会退化成那个"能聊天但不能干活"的玩具。
3. 拿到手却跑不通:插件激活失败与并发瓶颈的完整排查
3.1 现象:Harness 装好了,插件却一个都加载不出来
最近在社区里帮人排查 DeepSeek Harness 相关问题,出现频率最高的一条报错是:
harness failed to load plugins, web boot: 2 entries did not activate
很多人看到这条消息就直接懵了,以为是安装包损坏,或者干脆重装一遍。懒人安装法在这里帮了大忙——重装大概率没有任何变化,因为问题根本不在安装环节。
先解读一下这条报错:它说的是"web boot 阶段,两个插件条目没有成功激活"。"web boot"指的是 Harness 启动时先拉起 Web 容器再加载插件的过程;"entries did not activate"说明插件已经被发现、被扫描到了,但在执行激活步骤时失败。注意这里的关键词是"被发现但没激活成功"——它被扫到,说明目录或配置基本没错;卡在激活,说明问题出在插件自身的生命周期上。这个区分能让排查范围缩小一半。
3.2 从报错信息反推:web boot 阶段到底发生了什么
为了让你能复现排查思路,我把 web boot 阶段的事件顺序捋一遍:
- Harness 扫描插件目录,收集所有符合命名规则的子目录或文件。
- 读取每个插件的 manifest 配置,校验字段格式。
- 按 manifest 声明加载入口模块。
- 调用入口模块的激活函数,等待初始化完成。
- 激活成功后,把插件注册到工具注册表/工作流引擎。
报错说"2 entries did not activate",说明至少有一个插件已经走完了 1-3 步,卡在第 4 步或第 5 步。接下来按这个顺序逐项排查。
**第一步:先确认插件目录和 manifest 字段。**编解码器错误、字段缺失、名称重复是高频原因。有一个不值得深挖但要快速排除的:manifest 里的 id 或 name 如果和另一个内置插件重复,Harness 会直接忽略后来者,报错信息未必直接告诉你"名称冲突"。
**第二步:看入口模块能否独立加载。**很多插件的报错根源是入口文件里引用了不存在的依赖模块。Harness 帮你装了默认依赖,但它不会知道你额外引用的那个 library 有没有装全。这时候在插件目录单独执行一条命令,看入口模块能不能成功 import 进来。
# 以 Node 生态为例:先验证入口模块是否能被正常加载 node -e "require('./path/to/entry')" # 以 Python 生态为例: python -c "import plugin_entry"如果这一步就抛 ModuleNotFoundError 或者 SyntaxError,那问题直接定位到依赖缺失或代码语法错误,跟 Harness 本身毫无关系。
**第三步:检查激活函数的签名约定。**不同 Harness 对激活函数的约定不一样,有的要求返回 Promise,有的要求在同步执行时先调用注册接口。最常见的坑是:平台文档里写明"activate 必须返回 Promise,异步完成后 resolve",你写的却是同步逻辑且没有返回 Promise,那么插件框架侧怎么等都等不到激活完成的信号,最终判定超时失败。这个错误在本地测试时未必暴露——因为同步逻辑在激活函数内部已经执行完了,只是返回结果不符合框架预期。
3.3 插件激活失败的最常见三类根因
我统计过二十多例"entries did not activate"的求助,根因基本落在三类:
| 根因分类 | 具体表现形式 | 排查手段 |
|---|---|---|
| manifest 字段不合法 | 入口文件路径写错、版本格式非法、依赖声明与清单不符 | 逐字段对照文档,用校验器离线验证 |
| 入口模块依赖缺失 | 插件引用了未安装的第三方库,或本地环境与预期环境不一致 | 目录内独立运行入口模块,捕获异常信息 |
| 激活函数不匹配 | 未返回 Promise、激活超时、同步流程未注册回调 | 检查插件协议,写最小复现用例测试激活流程 |
有一个非常实用的小技巧:写一个最小复现插件。新建一个目录,manifest 只留名称和入口,入口文件只做一件事——打印一行日志然后返回成功。
{ "name": "minimal-test-plugin", "version": "1.0.0", "entry": "./index.js" }module.exports = { activate() { console.log("[minimal-test-plugin] activated"); return Promise.resolve(); }, };把它放进插件目录再启动一次 Harness,如果这次不报错,说明你的 Harness 环境和加载机制是好的,问题 100% 出在真正插件自身的代码或依赖上。这个"最小化二分法"看起来笨,但效率极高,能直接把人从"怀疑 Harness"的泥潭里拉出来。我在前面加一条提醒:不要第一时间怀疑框架坏了,先证明框架是好的。
3.4 并发压测显示 QPS 上不去,先砍哪一刀
除了插件问题,"AI Agent 怎么扛并发"是另一个高频求助点。我在 2.5 里已经说过可疑顺序,具体压测时建议按这个链路排查:
**第一刀:看任务积压在哪个环节。**在队列、模型调用前、工具执行前各打一条耗时日志。如果耗时集中在"工具执行前等待",说明调度队列配置不合理或模型 API 速率被占满。如果耗时集中在"工具执行"本身,说明外部服务(数据库、HTTP 接口)是瓶颈。
**第二刀:看模型调用是否串行。**很多初版 Harness 会用一个共享的模型客户端实例,而有的 SDK 客户端默认是串行请求。你想发 20 个并发任务,结果模型调用在 SDK 内部被排队了。解决办法是给每个任务独立的客户端实例,或者开启连接池模式。
**第三刀:检查工具层的缓存。**高频工具如果每次查询都直接打数据库,并发一上来必然拖垮连接池。给只读型工具加一层 TTL 缓存,压测数据通常能翻倍。
**第四刀:检查幂等和重试风暴。**并发上来了,上游偶发超时会出现,而重试如果设计成全量重试,会把一个小抖动放大成雪崩。把重试改成增量重试,即只重试失败的动作,别把整个 Agent 循环从头跑一遍。
我压测时用的简化脚本框架就三行逻辑:构造 N 个独立任务对象,每个任务独立 Harness 进程,统计总耗时/成功数/各阶段耗时分布。先跑 5 并发摸底,再逐步加到 20、50,总能在某一步看到明显的瓶颈瓶颈——按上面几刀依次做,通常砍到第二刀就有很大改善。
4. 别急着全盘照搬:三种典型落地场景的取舍判断
4.1 和 RPA 结合:把流程从"录屏式"升级成"意图式"
"Harness + RPA 落地"这个组合最近讨论度很高。传统 RPA 靠录屏和固定流程节点,稳定的代价是脆弱——页面一改版,流程就断。把 Harness 嵌进去之后,流程从"录制好的固定步骤"升级成"模型根据页面状态动态决定下一步动作"。
我实际做过的方案里,Harness 的角色是中央决策,RPA 的角色是执行双手:Harness 观察页面截图和 DOM 摘要,通过工具编排调用 RPA 执行点击和输入。这套组合最大的收益是抗页面变更能力强了很多,很大的成本是决策延迟——每走一步都要等一次模型推理,所以只适合"低频高价值"的流程,不适合毫秒级响应的操作。
我的取舍判断是:如果流程步骤固定、量特别大,传统 RPA 依然是成本最优解;如果页面变化频繁、流程需要临场判断,Harness + RPA 才值得上。别为了技术时髦硬换方案。
4.2 个人研究型 Agent:自动化的边界必须画清楚
热搜词里有"个人使用 AI Agent 可以做期货交易吗",从技术上讲,信息聚合、数据整理、复盘分析、盯盘提示这类研究辅助工作是完全可以自动化的——Agent 定时拉行情、整理新闻、生成复盘简报,这些都没问题。但我强烈不建议任何人把"自动下单"这类不可逆操作交给 Agent 全自动执行,不是能力问题,而是风险模型问题:模型幻觉、上游延迟、策略漏洞都可能在不可逆操作中被瞬间放大。
我在自己的研究 Agent 里设置的护栏是:所有交易相关动作一律走人工审批钩子——Agent 可以生成"建议交易清单",但实际下单必须由人在终端确认。技术团队看到的是"Harness 执行循环 + 人工审批钩子"的设计,本质上就是给不可逆操作加一道闸门。这一条对任何涉及资金、权限、删除、发布的 Agent 项目都适用。
至于更激进的玩法,我的态度是:工具本身没有错,但自动化的边界要画在最坏情况你能兜得住的位置。
4.3 团队级 Agent 中台:控制、复用与审计才是重点
公司要搭"AI Agent 中台"的话,7 个子系统里优先级要重新排。个人用的时候,上下文工程和执行循环最重要;团队用的时候,并发调度、权限隔离、可观测性直接决定了这个平台能不能活过试用期。
团队场景里,每个业务线都有自己的工具、知识库、数据访问权限。中台要做的是:统一的工具注册仓库、按团队划分的环境变量和数据权限、统一的成本审计和调用链追踪、插件开发规范与审核发布流程。这时候 Harness 就不再只是"让 Agent 干活"的脚手架,而是一个内部开发者平台——不同团队在这个平台上有自己的 Agent,平台提供的能力是"安全地干活的保障"。
这个场景没有太多技巧可讲,核心就一句话:先解决谁能用什么、谁花了多少钱、出了问题找谁负责,再谈模型调优。顺序反了,中台上线三个月就会被业务线吐槽成"模型代理平台"。
5. 自己动手:从最小骨架开始搭一个能干活的 Harness
5.1 最小 Harness 骨架:四个文件先跑起来
不依赖重型框架,你也可以在半天内搭出一个验证用 Harness 骨架。我建议的最小结构是四个部分:
context.py:上下文组装与裁剪器。tools.py:工具注册表与执行器。loop.py:执行循环与终止条件控制。main.py:入口,串联前三个模块。
核心执行循环伪代码长这样:
import json def run_agent(task: str, max_steps: int = 15, confidence_threshold: float = 0.8): context = build_initial_context(task) for step in range(max_steps): response = llm_call(build_prompt(context)) action = parse_action(response) if action["type"] == "final": return action["answer"] if action["type"] == "tool_call": result = tool_executor.execute(action["tool"], action["params"]) context["history"].append({"step": step, "action": action, "result": result}) # 检查无进展 if detect_stagnation(context["history"]): return {"error": "stagnation", "history": context["history"]} else: context["history"].append({"step": step, "action": action}) return {"error": "max_steps_exceeded", "history": context["history"]}这套骨架当然很简陋,但它已经把最关键的三件事焊死了:最大步数上限、停滞检测、结构化动作解析。我强烈建议你亲手把这个循环写一遍——只要你写过一次,就会明白为什么"用 Agent 干活"和"调一个模型接口"是完全不同的工程问题。
5.2 给骨架插上插件和工具
最小骨架跑通之后,下一步是按 2.6 的插件协议给它加扩展能力。我的建议是先做一个最简单的工具,比如"读取本地文件"或"执行 SQL 查询",跑通"模型说一句话 → 骨架解析出工具调用 → 工具执行 → 结果回填上下文"的全链路。这一定是出 bug 最多的一段,但也是最值得调试的一段。
5.3 用六项验证清单确认它能"干活"
骨架搭完之后,建议按这份清单逐项验证,每项在我前面拆解的 7 个子系统里都有对应:
- 连续执行一个 5 步工具调用任务,中途不出现目标偏移(上下文工程 + 执行循环)。
- 故意传一个不合法参数给工具,确认模型能被引导修正,而不是直接崩溃(工具编排)。
- 把对话拉长到 30 轮以上,确认窗口滚动和摘要生效,token 消耗不失控(上下文工程 + 记忆)。
- 并发跑 10 个任务,确认队列限流生效,不会触发上游 API 限流(并发调度)。
- 故意放一个坏插件进目录,确认只影响该插件,其他插件照常加载(插件系统)。
- 记录每个任务的 token 成本和动作链路,确认任何一次异常都能重放(可观测性)。
能在半天里把这六项全部跑通,"AI Agent 真正干活"就不只是口头承诺了。第 6 项我多说一句:可观测性清单最好从第一天就加上,不要等出了问题再补,否则到时候你连问题是怎么发生的都不知道。
我个人走到这一步最大的体会是:Harness 这 7 个子系统,没有一个是需要顶级的算法或者复杂的数学才能实现的,它们的难点全部在"想得完整"和"边界慎密"上。搭的时候你会觉得处处在写防御性代码,觉得建模怎么到处在断后路,可一旦上了并发和真实业务,你会感谢当初那个"过度警惕"的自己。