Skip to content

从一次 LLM 调用到完整 Harness

一句话定义(stated):Agent 决定下一步做什么;Harness 决定这一步在什么上下文、权限、生命周期与持久化规则下发生。今天的 Agent 看起来像小型操作系统,不是因为一开始就想造操作系统,而是模型每次撞上边界,工程系统就在外面补上一层。

定义

最朴素的大模型只是一次前向调用:answer = LLM(question)。它能在参数里编码世界知识,却不会天然记住上一轮对话,也不知道自己刚输出的命令有没有被执行。

真正能干活的系统,是在模型外面一层层补上的运行时:

模型撞上的边界外面补上的部件
不知道此前聊了什么上下文装配(Working Memory)
无法改变世界工具 / Tool Calling
一次动作解决不了任务Agent Loop(ReAct)
上下文装不下历史长期记忆
循环开始产生真实副作用权限、审批、沙箱
一个循环不够并行子 Agent / Thread 谱系
客户端、崩溃、恢复同时出现会话、事件、持久化 —— 即 Harness

Agent 是决策者;Harness 是让这些决策可以持续、可控、可恢复发生的外围执行系统。这与本站锚点词条「Agent = Model + Harness」一致,本文补的是这条公式是怎么长出来的。

背景 / 为什么重要

2023 年许多 Agent 原型仍把 Prompt、Loop、Tools 写在同一个应用里。2024 年 MCP 开始统一外部连接;2025 年 Claude Code 与开源 Codex CLI 把终端 Agent 推进真实软件工程。任务变长、副作用变强、客户端变多之后,Loop 外围的会话、权限、沙箱、事件和扩展机制逐渐凝结成独立的 Harness 层。

同一模型换一套 Harness,能看见的上下文、走过的工具路径、循环轮数和停止条件都会变。后文 Pi、Codex 的测评数字说明:Harness 已经不是模型配件,而是成本和正确率的第一性变量。

核心机制:五层能力栈

1. LLM:一次前向调用

2020 年 GPT-3 证明大规模语言模型可靠文本提示完成多种任务;2022 年底 GPT-3.5 支撑 ChatGPT;2023 年 2 月 LLaMA 推动开放权重进入主流。GPT、LLaMA、Claude、Gemini、Qwen 能力不同,对应用仍共享同一形态:接收上下文,predict next token。

模型参数里的知识来自训练;一次对话中的名字、偏好和任务状态,必须由应用在每次调用时重新提交。

2. Q&A Bot:上下文装配层

第一项工程进步不是换更聪明的模型,而是在模型前面增加装配层:把系统指令、当前输入和对话历史拼成一次请求。ChatGPT 把多轮对话带给大众后,开发者开始普遍维护 System Prompt、User Prompt 和 Chat History。

text
working_context = [system_prompt, recent_chat_history, user_prompt]
answer = LLM(working_context)

Working Memory 不是长期存储,而是这一轮真正提交给模型的全部上下文。由此奠定 Harness 的核心原则:模型看见的一切,都是运行时为它构造出来的。 选择哪些历史进入、哪些指令优先级更高、哪些必须裁剪,都会改变 Agent 行为。

3. ReAct:最早的 Agent Runtime

Bot 只回答一次;Agent 必须根据行动结果继续决策。2022 年 10 月公开、ICLR 2023 发表的 ReAct 把 Chain-of-Thought 与外部行动连成 Thought → Action → Observation。分水岭不是「会思考」,而是建立 模型 → 动作 → 环境 → 观察 → 模型 的闭环。

text
while not finished:
    response = model(context)
    if response.has_action:
        observation = environment.execute(response.action)
        context.append(response.action, observation)
    else:
        return response.answer

这个 while 就是最早的 Agent Runtime。模型仍然只生成 token;解析输出、判断结束、调用环境、把结果写回上下文的,是模型外面的程序。今天许多模型把内部推理藏起来,但不改变结构:运行时仍要识别动作、执行动作、把反馈送回模型。

4. Tool Calling:可验证的动作协议

早期 Agent 让模型输出 Search[Wikipedia] 一类文本,再用正则解析,格式易漂移。2023 年 6 月 OpenAI Function Calling 把工具名和参数做成 API 的结构化输出;2024 年 11 月 Anthropic 发布 MCP,尝试标准化 Agent 与外部数据源、工具服务的连接。

三个部件构成动作协议:

  • Tool Schema:名称、用途、参数类型与约束,划定动作空间
  • Tool Router:按名称找到实现、校验参数,把模型输出变成程序调用
  • Tool Result:携带调用 ID、状态与返回值,保证观察能对上原始动作

此后的文件、终端、浏览器、数据库、MCP,本质都是在扩展这套协议。Agent 不再「生成看起来像命令的文本」,而是获得可验证、可路由、可审计的动作接口。

5. Memory:工作记忆与长期记忆分家

Loop 解决「如何连续行动」,不解决「如何跨会话积累」。完整历史会越来越长,上下文窗口始终有限,于是拆成两个空间:本轮可见的 Working Memory,以及模型外部可持久化、可检索的 Long-term Memory。

谱系上:2020 年 RAG 区分参数内知识与外部可检索知识;2023 年 MemGPT 借用操作系统分层存储,在有限上下文与外部存储之间调度。此后记忆从「检索几段文档」扩展到摘要、用户偏好、会话归档、技能文件和后台知识整理。

三类记忆(逻辑能力,不是每个 Harness 都实现同一套模块):

类型内容典型载体
程序记忆 Procedural技能、习惯、操作流程、用户约定规则文件、SKILL.md
语义记忆 Semantic稳定事实、概念、偏好、项目知识摘要、全文索引、向量检索
情景记忆 Episodic某次任务发生了什么、动作与结果会话日志、事件轨迹

真正困难的不是存储,而是写入与读取策略:什么值得保存、何时合并重复、如何处理冲突、检索多少才不挤压当前任务、错误记忆如何纠正。因此记忆系统很快会长出提炼、整合、门控与反思流程。

演变:Loop 被包进 Harness

有了上下文、循环、工具和记忆之后,只要系统承担真实工作,下一批工程问题会同时出现:

  • 会话能否恢复(崩溃或退出后从一致状态重来)
  • 副作用是否安全(命令、写文件、网络不能只靠模型「自觉」)
  • 上下文如何压缩(长任务保留关键事实并释放窗口)
  • 客户端如何连接(TUI、IDE、桌面、Web、SDK 观察同一运行状态)
  • 扩展如何装配(工具、MCP、Skills、Hooks、配置的发现与加载)
  • 任务如何并行(子 Agent 要有隔离的上下文、权限、历史与生命周期)

于是 Agent Loop 不再直接面对所有东西,而被包进更大的运行时:装配资源、管理会话、约束工具、持久化事件、暴露 API、在多个 Agent 之间调度。这一层就是 Agent Harness

设计空间:四条 Harness 路线

下面四个项目共享 Agent Loop、Tool Calling 和 Context Assembly,却选择了不同演化方向。数字均来自原文引用的公开测评,任务集有限,不作通用排行榜。

路线代表交换的东西核心抽象
把核心收到最小Pi低成本、少轮次;权限需外部补Resource Loader + 四工具 + Compaction
事件驱动的服务OpenCode可恢复、可审计、多客户端;状态工程更重Agent Profile + Session Events + Projector
安全执行与任务生命周期Codex可监督、可中断、可恢复、可并行;Harness tax 更高Thread / Turn / Item + Approval + Sandbox
跨会话自进化Hermes第二次少走弯路;要维护会变化的外部认知系统Session Archive + Memory/Skills + Background Review

Pi:先看清最小 Harness

Composio 把 DeepSeek V4 Flash 放进 Pi、Prime、Deep Agents、Hermes,跑同一批 30 个 Agentic Tasks:Pi 通过率 66.7%,中位任务成本 0.012 美元,完成最多、花费最少。

Databricks 内部基准用真实 PR、数百万行多语言代码库比较单任务成本与通过率。Pi 占据 Pareto 前沿多段:Opus 4.8 + Pi xhigh 接近 90%;同模型同推理强度换到 Pi 后,质量基本不变,单任务成本可差两倍以上。原因是每轮送入上下文约少三倍、工作集更紧、轮次更少。

Pi 的做法:

  • 默认只暴露 readwriteeditbash 四个工具
  • Resource Loader 显式装配 SYSTEM.mdAGENTS.md、Skills、Prompt Templates —— 资源不是模型自己去磁盘「感知」的
  • Session Manager 用活动分支和 Compaction 把完整会话投影成更紧的 Working Memory

极简在这里直接变成成本和效率。代价是:Pi 当前不内置限制文件系统、进程、网络或凭证的权限系统,默认继承启动用户权限;高风险环境要用容器或外部沙箱补边界。Pi 也是很多开源 Harness 魔改的起点。详见 Pi 词条

OpenCode:把过程存成可投影的事件

OpenCode 不把一轮回复存成一整块文本。一次 Assistant Message 下可挂 Reasoning、Text、Tool、Step Start/Finish、Patch、Compaction 等 Part。过程可结构化记录,退出界面不等于丢失现场,恢复 Session 也不再依赖重放终端字符。

  • Agent ProfileAgent.Info)不只是 Prompt,还包含模型、Mode、Permission、步数与生成参数。Build / Plan 是主 Agent,General / Explore 是子 Agent,Compaction / Title / Summary 是隐藏后台 Agent。同一个 Loop 可装载不同身份。
  • Session Events 留下事实;Projector 把 Session、Message、Part 投影进 SQLite。
  • 接近上下文上限时,隐藏 Compaction Agent 汇总较早历史,裁剪旧工具输出,再与近期消息组成下一轮 Working Memory。记忆管理更接近可重建的上下文管线,而不是外挂向量库。

TUI、Web、桌面、SDK 共享同一运行时,是结构化状态的结果:界面只提交请求、消费事件流,身份、历史与进度由服务端 Session 统一管理。代价是要维护配置合并、权限组合、事件顺序、数据库投影和压缩边界,后台 Agent 还会引入额外模型调用。

Codex:两道安全边界 + Thread 生命周期

Q&A Bot 的错误停在屏幕上;Coding Agent 的错误可能覆盖文件、跑错命令、越出工作区。Codex 把「允许」拆成两层:

  1. Approval Policy:这个动作是否获准(可停下来问人,请求绑到具体 Thread / Turn / Item)
  2. Sandbox Policy:命令能写到哪里、能否上网、能碰哪些系统资源

用户点允许,不等于模型拿到整台电脑;接受一次命令,也不会自动取消剩余限制。安全不是模型答应会谨慎,而是执行路径上存在模型无法自行跨过的边界。

OpenBench(2026-07)把同一个 gpt-5.6-sol 放进 7 套 Coding Agent Harness,只比较各组都跑完的 42 个任务:Codex 完成 31 个(73.8%),中位耗时 94.6 秒,每成功任务平均 117,107 个新 token,是该组最重的一档。Codex 选的不是最轻的路,而是让长任务可监督、中断、恢复和并行管理的路。

协议骨架:

text
Thread
└── Turn
    ├── User Input Item
    ├── Reasoning / Agent Message Item
    ├── Command Execution / File Change Item
    ├── Tool Call / Approval Item
    └── Turn Completed
  • Thread:可跨多轮的任务容器,可 Start / Resume / Fork / Interrupt
  • Turn:用户推动任务向前的一次过程,运行中可 Steer
  • Item:模型消息、推理、命令、文件修改、工具调用、审批等可观察单元
  • Thread Manager:内存中的活跃任务表;冷 Thread 从 Thread Store / Rollout 装回。Fork 不是复制聊天文字,而是按持久化快照裁切历史、生成新 Thread ID;派生子 Agent 前会先物化父 Thread 的 Rollout
  • StepContext:每次模型采样的短暂执行现场,捕获此刻的环境、Capability Roots、MCP Binding、Tool Router 与 AGENTS.md,避免后台配置中途变化导致工具集不一致

记忆也分管线:当前模型看见的是装配压缩后的上下文;Rollout / Thread Store 保存可恢复轨迹;SQLite 提供查询;启用 Memory 后,后台管线从历史 Rollout 提取稳定事实,再由整合 Agent 更新 ~/.codex/memories/。恢复一次任务,与从许多任务中学习,是两条不同管线。

产品界面上的「Agent 群聊」(如 Newton / Franklin / Dirac / Peirce)并不是四段推理挤在同一份上下文里,而是 Thread Manager 维护的独立子 Thread。详见 Codex Harness 词条DSH vs Codex 对比

Hermes:让第二次少走弯路

Pi 关心如何用尽量少的 Harness tax 做完眼前这次任务;Hermes 问的是:第二次遇到类似任务,能不能少走一遍弯路。这要求 Harness 不只保存聊天记录,还要判断哪些是稳定事实、哪些是可复用流程、哪些旧知识该被新修正覆盖。

PAST-Bench(2026-08)安排 26 个场景、204 个跨会话 Episode:早期留下偏好/流程/修正,后续清空当前上下文,再测 Memory、Procedural Reuse、Information Gathering、Update,并关掉持久化重跑,以拆开模型能力与历史经验增益。固定 MiniMax-M2.7 后,Hermes 是现有基线里唯一在四类能力上全部正向增益的框架(总体 +0.13);机制证据分 0.64(写入、检索、正确应用路径),同增益的 nanobot 为 0.57。

结构上:前台 Loop 解决当前任务,Session Archive 留下原始经历,Memory 与 Skills 分别承载稳定事实与可复用流程,Background Review 决定哪些经验值得影响未来。Cronjob 让任务可以由时间而非用户触发 —— Agent 从「打开终端才存在的进程」变成长期在线的个人运行时。自我改进发生在模型外部那层会随使用变化的认知系统上。

选型含义

四条路线没有标准答案,交换的是成本、控制力、可恢复性和长期学习:

  • 要看清「Loop 外面最少要有什么」、并压低 token / 轮次 → 从 Pi 的四工具 + 显式资源装配开始
  • 要多客户端共享现场、退出后能精确恢复 → 需要 OpenCode 式的事件、Part 与投影
  • 要在真实电脑上长期跑、可审批可沙箱可 Fork 子任务 → 需要 Codex 式的 Thread 生命周期与两道安全边界
  • 要让跨会话经验变成下一次的默认能力 → 需要 Hermes 式的归档、记忆、技能与后台整合,并认真处理错误记忆

模型还会继续变强,但 Harness 不会消失。模型越能行动,外面的运行时越不能含糊。未来分水岭未必只是谁的模型更聪明,也是谁能为同一个模型搭出更好的上下文、更稳的循环、更清晰的边界,以及一套不会在长期使用中越学越乱的记忆。

关联词条