跳到正文
Elaine Blog
返回

生产中的 Harness 怎样设计:从单进程到可管理的任务系统

更新于:
Agent Harness

本地报告助手只处理一份文件,进程一直活着,失败后可以人工重跑。上线以后,同一用户可能同时提交多份报告,另一个用户的任务正在等待审批,Worker 随时可能重启。生产设计要把这些现实条件变成明确接口。

不必先拆成很多服务。先在单个应用里划清职责,只有隔离、负载或团队边界要求独立部署时再拆分。一个图中画了十个框,并不意味着必须部署十套微服务。

从一次请求进入系统开始

入口认证用户,解析目标订单并建立任务记录。任务记录应包含业务目标、输入策略、完成契约和预算,而不是只存用户原始文本。若缺少必要信息,先进入等待状态,避免启动昂贵执行环境后才发现无法推进。

接下来固定 Harness 配置:模型选择、指令与 Skill 版本、工具集、策略和验证器版本。记录这些信息是为了能够解释结果,也方便恢复和比较不同配置。固定版本不意味着忽略紧急权限撤销,权限仍需实时检查。

几个核心接口怎样配合

模块输入与输出必须说清的边界
任务服务请求 → task ID 与状态身份、预算、取消和完成状态
装配器任务与版本 → 模型上下文和能力集合来源、作用域和当前权限
执行器动作建议 → 结果与回执校验、授权、限额和错误分类
环境管理环境需求 → Workspace/Sandbox 引用隔离、装载、回收
验证与交付候选与输入 → 检查结果和产物引用版本绑定、事实与访问权限
Runtime 接口待执行阶段 → 持续推进所有权、持久化、恢复与等待

共享工具注册和连接管理可以复用前面的工具平台设计。Harness 在其上增加任务环境、工作方法和交付闭环,不需要重新实现一份互不一致的权限系统。

控制逻辑与实际执行环境分开

可信控制逻辑持有任务状态和必要服务凭证;执行环境负责运行文件或命令。模型提出动作后,控制逻辑决定是否执行,并向环境提供必要输入。执行环境返回结果,控制逻辑更新进度。

这里的分开首先是信任边界。若把长期凭证和控制器数据库访问权一起注入任意代码沙箱,即使网络图上画了两个服务,信任实际上仍然混在一起。

最小生产形态可以是 API、任务数据库、一个 Worker 池和受控文件存储。需要运行不可信代码时,增加独立执行单元;需要长时间审批时,让任务持久等待而不是占着一个线程睡眠。

排队和并发怎样影响预算

总延迟由排队、环境准备、模型、工具、验证和导出组成。只优化模型响应时间,不能解决排队十分钟的问题。预算也应区分任务总截止时间和单次动作超时。

一个租户大量提交任务时,需要租户并发或资源配额,避免挤占所有 Worker。子 Agent 的消耗应记回父任务和所属租户,而不是成为统计盲区。

同一会话并发修改状态需要明确策略:串行化、乐观版本比较,或显式分支。使用同一个 session ID 并不能自动保证顺序。若输入资料会变化,还要明确采用快照还是提交时重新读取。

用一次崩溃检查设计是否完整

Worker 写出 H1 后失联。调度器让新 Worker 接管,新 Worker 应获取有效所有权,检查 H1 和输入版本,查询未知上传操作,然后决定下一阶段。它不能只根据“旧日志里没有成功消息”重新上传。

如果旧 Worker 再次出现,存储和外部动作入口要拒绝过期所有权或重复操作。恢复篇解释的租约与 fencing 只有在下游参与检查时才生效。

同样,沙箱超时不能只把任务标红。系统还要取消或终止环境、保留必要诊断、回收凭证,并确认是否有后台任务继续运行。清理状态最好可观察,失败可以再次处理。

观测应回答具体问题

一次失败至少要能关联 task、run、模型请求、工具调用、operation 和 artifact。它们的生命周期不同,不能都叫 request ID。链路信息帮助把“报告写错”追到某次输入和动作。

指标可以关注完成率、事实校验失败率、平均修复次数、排队时间、任务费用和孤儿环境数量。分母必须清楚:用户取消是否计入失败,等待补资料是否计入未完成,重试是否算新任务。没有统一口径,两个版本的“成功率”无法比较。

日志保存必要事件和受控引用,敏感全文进入更严格的存储。生产排查需要事实,并不需要把所有用户资料复制到每个观测平台。

版本发布影响正在执行的任务

更换工具 Schema、Skill 或验证器可能使旧 Checkpoint 无法继续。可采用任务启动时固定配置,旧任务使用旧配置完成;若旧版本有严重问题,则停止相关动作并迁移状态,而不是静默接上新逻辑。

灰度发布需要比较同类任务和失败样本,不应依据单个漂亮演示决定上线。本文介绍应当怎样评估,配套材料本次没有执行测试、模型调用或构建,也没有测量性能。

回滚代码不一定回滚外部副作用。报告已经上传,业务记录已经写入,需要补偿或后续修正,而不是简单恢复 Git 版本。

从可解释的小实现走向生产

下一篇提供一个普通 Python 工程,接口直接对应本篇职责。它有真实文件、校验和恢复逻辑,但不承诺数据库事务、多 Worker、沙箱或线上身份认证。读者可以明确看到升级生产时需要替换哪一块,而不是把教学脚本当作平台。

之后四篇分别阅读 Pi、Deep Agents、DeepSeek Harness 和 AgentScope Java,比较它们怎样组织这些职责。比较的是具体实现与取舍,不按工具数量或项目热度排高低。


分享这篇文章:

上一篇
子 Agent 怎样协作:委派、隔离、并行与结果合并
下一篇
从头实现一个 Harness:把指令、工具、工作区与验证串起来