🌙

Harness 不是一个具体的软件或代码库,而是一种设计和架构 AI Agent 的工程范式。其核心公式为:

Agent = Model + Harness

模型决定 Agent 的智商上限,Harness 决定 Agent 的交付下限。


总体架构全景

业界目前比较认可的架构是六层模型,从底层到顶层依次为:

┌─────────────────────────────────────────────┐
│         第六层:约束与恢复层                 │
├─────────────────────────────────────────────┤
│         第五层:评估与观测层                 │
├─────────────────────────────────────────────┤
│         第四层:状态与记忆层                 │
├─────────────────────────────────────────────┤
│         第三层:编排与规划层                 │
├─────────────────────────────────────────────┤
│         第二层:工具与执行层                 │
├─────────────────────────────────────────────┤
│         第一层:上下文管理层                 │
└─────────────────────────────────────────────┘

第一层:上下文管理层(Context Management)

核心问题:如何让模型在有限的窗口里,看到此刻应该看到的东西。

虽然大模型上下文窗口已卷到 200K 甚至 1M token,但仍不能把所有 context 一股脑塞进去,原因有三:

  • 长上下文衰减:模型在中间段的注意力明显下降(Lost in the Middle 效应)

  • 成本爆炸:每次调用都带着几十万 token,费用极高

  • 噪声干扰:无关信息太多,模型抓不住重点

工程实践

  • 动态组装上下文:每轮对话前,根据当前任务动态检索相关文件、历史决策、工具输出

  • 上下文压缩:当上下文接近上限时,自动摘要早期对话,释放空间

  • 分层加载:核心指令常驻,工作记忆按需加载,长期记忆按查询拉取

  • 结构化切片:把大文件切成语义块,用 embedding 或关键词检索按需注入

OpenAI 的实战经验

OpenAI 放弃了早期"给 Agent 塞一个 1000 页规则文档"的做法,转而构建层次化知识库:AGENTS.md 仅保留约 100 行作为"地图",指向深层次的架构、设计与参考文档。同时设置专门的"知识库检修 Agent",定期扫描文档,发现过时时自动提交 PR 修正。


第二层:工具与执行层(Tool & Execution)

核心问题:如何让模型精准地调用工具。模型输出的本质是文本,要使文本"动起来",必须依赖工具调用。这一层决定了 Agent 的物理能力边界

两大工具类型

MCP 工具(Model Context Protocol):提供标准化的工具发现与调用接口,Harness 作为 MCP 客户端连接多个 MCP 服务器(文件系统、数据库、第三方 API 网关等)。

  • 工具发现:启动时通过 tools/list 获取所有可用工具及其 JSON Schema 定义

  • 延迟绑定:LLM 根据 Observation 动态选择工具,而非预编译工具链

  • 流式响应:通过 MCP 的流式扩展,支持长耗时工具的进度观测

Shell 工具:本地系统的最强接口,不是简单的 subprocess.run(),而是:

  • PTY 模拟:支持交互式命令(如 vimssh

  • 会话持久化:维护 Shell 会话的工作目录和环境变量,支持多步操作上下文

  • 输出智能截断:对超大输出流进行 LLM 引导式摘要,防止上下文窗口溢出

两种工具通过统一的 ToolExecutor 抽象调度,对外暴露一致的调用接口:(tool_name, params) -> Observation

关键设计原则

  • 工具描述的精确性:工具名、参数 schema、描述文案,每一个字都会影响模型的调用准确率

  • 执行沙箱:代码执行、Shell 命令、浏览器等操作都需要隔离环境

  • 结果结构化反馈:执行成功/失败、错误信息、输出摘要,都要以模型能理解的方式回传


第三层:编排与规划层(Orchestration & Planning)

核心问题:面对一个复杂目标,如何把任务拆解成模型能一步步执行的动作序列。这一层是 Agent 从"单轮问答"升级为"多步任务执行"的关键。

四种编排模式

ReAct 循环:Reason(思考)→ Act(行动)→ Observe(观察)→ 再思考,这是最经典的单 Agent 循环。

Plan-and-Execute:先生成完整计划,再逐步执行,中途可重规划。Claude Code 的 Plan Mode 就是这个思路。

多 Agent 协作:主 Agent 负责统筹,子 Agent 负责专项任务(如一个负责搜索、一个负责写代码、一个负责审查)。Anthropic 实践中采用三智能体架构:规划器(Planner)、生成器(Generator)和评估器(Evaluator)。

任务图(Task Graph)调度:把任务拆成 DAG(有向无环图),有并行、有依赖,像 CI/CD 流水线一样执行。

通信与事件总线

在分布式场景中,Agent 之间通过 A2A(Agent-to-Agent)协议 实现协作:

  • 状态广播:代理上线、下线、任务进度

  • 子任务委托:主代理将子任务发布到 A2A 通道,工作代理领取并回传 Observation

  • 心跳与熔断:断连检测和任务重分配

  • WebSocket 传输层:全双工推拉,支持 Protocol Buffers 序列化


第四层:状态与记忆层(State & Memory)

核心问题:如何让 Agent 记得自己是谁、做过什么、还要做什么。这是 Agent 和 Chatbot 最本质的区别之一——Agent 有状态。

三层记忆体系

工作记忆(Working Memory):当前任务的状态、当前执行到哪一步、中间变量等。

会话记忆(Session Memory):本次会话的完整历史、用户偏好、已做的决策等。

长期记忆(Long-term Memory):跨会话的持久偏好、知识库、文件存储。

工程实现

  • 向量记忆库:用 embedding 存储历史经验,检索相似场景

  • 结构化记忆文件:如 CLAUDE.md、AGENTS.md,把稳定知识固化成文件,每次会话自动加载

  • 状态快照与恢复:长任务中断后能断点续传

  • TODO 系统:规划任务清单,把计划物化成可追踪的状态

Knowledge 层的混合存储设计

Knowledge 层远超简单的 RAG,它是一个动态更新的认知状态机

  • 结构化知识:基于 JSON Schema 的任务图和状态树,存储在内存或轻量级数据库中

  • 非结构化知识:基于嵌入向量的长程记忆,支持语义检索

  • 知识融合引擎:Observation 数据到达后,结构化数据直接合并入任务图;文本日志经 LLM 摘要后注入上下文窗口


第五层:评估与观测层(Evaluation & Observability)

核心问题:如何知道 Agent 到底在干什么、干得好不好。这一层往往不受重视,但特别重要。

反馈循环(Feedback Loop)

这是 Harness 中最核心的闭环机制——写-测-修循环(Write-Test-Fix Cycle)

用户请求 → Agent 生成结果 → 沙箱测试/评估
                              ↓
                    通过 → 交付结果
                    失败 → 错误信息回传 Agent → 修正 → 再次测试

关键设计原则:

  • 错误信息要具体(指明哪个用例失败、期望 vs 实际)

  • 反馈要及时(每次测试结果立即回传)

  • 循环要有上限(如最多 5 次,避免无限循环)

确定性约束门控

这是 Harness Engineering 与传统 AI 应用最大的不同——不请求代理遵循规则,而是通过工程手段强制执行

  • 架构 Linter:自动检测代码变更是否违反预定义的依赖规则

  • 重试上限(Retry Caps):Stripe 发现两轮重试是平衡成本与成功率的临界值

  • 前置提交钩子(Pre-commit Hooks):代理生成的任何内容都必须先通过死代码检测、静态类型检查(如 Pyright)和 Shell 脚本校验

可观测性

  • 全链路 Tracing:每一次模型调用、工具调用、上下文变化都可追溯

  • 结构化日志:带有 trace_id、span、token 消耗、延迟、成本的结构化事件

  • 自动化 Eval:用测试集定期回归,监控准确率、完成率、幻觉率的变化

  • LLM-as-a-Judge:用更强的模型评估 Agent 输出质量,实现规模化自动评估


第六层:约束与恢复层(Constraints & Recovery)

核心问题:当 Agent 做错事、卡死、或被诱导时,谁来踩刹车。越是能力强、权限大的 Agent,这一层越不能省。

三大机制

约束:哪些能做,哪些不能做。通过权限控制实现——哪些命令可以自动执行,哪些必须人工确认。

校验:输出前怎么检查。通过评估层的 Linter、类型检查、测试用例实现。

恢复:失败以后怎么重试、切路径、回滚到稳定状态。包括重试上限、Fallback 策略、人工接管机制。

安全沙箱分级

级别隔离方式适用场景
L1 进程级隔离 受信任的内部工具
L2 容器隔离(Docker) 大多数工具执行
L3 微虚拟机(Firecracker) 多租户/不受信任代码
L4 完全虚拟机 最高安全性场景

三大典型失败模式与 Harness 的应对

Anthropic 工程师总结了 Agent 在长时间运行中的三种典型翻车姿势:

失败模式表现Harness 应对
试图一步到位(One-shooting) 上下文窗口耗尽,留下半成品代码 任务分解 + 增量开发 + 结构化交接
上下文焦虑(Context Anxiety) 上下文过长后模型行为退化 上下文重置 + 子代理隔离噪声
熵增失控(Entropy Drift) 复制现有坏代码模式,质量逐步下降 定期运行"园艺 Agent"执行代码重构

业界标杆实践数据

  • OpenAI:3~5 名工程师在 5 个月内,通过 Codex Agent 交付超过 100 万行生产级代码,无一行人类手写,效率达传统模式的 10 倍

  • LangChain:在 Terminal Bench 2.0 基准测试中,仅通过优化 Harness,同一模型得分从 52.8% 提升至 66.5%,排名从第 30 名跃升至第 5 名

  • Anthropic:双智能体设计(初始化智能体 + 编码智能体)可稳定完成数小时至数天的长时任务


一句话总结

Harness Engineering 的本质:模型像 CPU 负责计算,Harness 像操作系统负责调度、内存、IO、约束、恢复和反馈。没有操作系统,再强的 CPU 也只是裸奔的计算单元。

posted on 2026-07-20 21:18  星火撩原  阅读(8)  评论(0)    收藏  举报

本站已运行:0
🌙 夜间模式
🌙
🌙