Harness Engineering for Self-Improvement
Harness Engineering for Self-Improvement
learn from https://lilianweng.github.io/posts/2026-07-04-harness/
核心概念:Harness 是模型外面的“运行系统”
Harness 指包围在 base model 外面、决定模型如何运行的一整套系统。它控制模型如何观察环境、构造 context、规划、调用工具、执行 action、保存 state、调用 sub-agent,以及如何验证结果。因此今天讲 Harness Engineering,已经不太像传统 Prompt Engineering,而更接近 runtime / software system design。
传统 Agent 经常被概括为:
Agent = LLM + Memory + Tools + Planning + Action
但 Harness 还进一步加入了 workflow design、evaluation、permission control、persistent state management 等系统组件。原文用了一个很好的类比:Harness 和 Model 的关系有点像 Operating System 和 CPU。 OS 不负责制造 CPU 的核心算力,但它决定算力如何接触文件、进程、外设和其他程序;类似地,Harness 不直接增加模型参数,但决定模型如何利用 context、tools、memory 和 computation。
graph LR
M[Base Model<br/>Core Intelligence]
H[Harness<br/>Runtime System]
C[Context]
T[Tools]
F[File System / Memory]
S[Sub-agents]
E[Evaluator / Verifier]
W[Workflow / Control Flow]
H --> M
C --> H
T --> H
F --> H
S --> H
E --> H
W --> H
这也解释了为什么 Harness 会和 Recursive Self-Improvement(RSI)联系起来。RSI 不一定意味着“模型直接修改自己的 weights”。更现实的近期路径可能是:模型先学会改进包围自己的 Harness;更好的 Harness 又让模型能够进行更好的自动研究、实验和系统优化;这些研究最终又帮助产生更强的模型。作者因此认为,近阶段的 RSI 很可能首先发生在 deployment system,而不是直接发生在 weights 上。
Harness Design Patterns
文章开头先总结了三个目前非常通用的 Harness Design Pattern:Workflow Automation、File System as Persistent Memory,以及 Sub-agent + Backend Jobs。它们看起来很简单,但实际上构成了很多现代 Coding Agent 的基础。
1. Workflow Automation:从一次 Prompt 变成持续 Runtime
最重要的变化是 Agent 不再执行一次 Prompt → Answer,而是在环境里持续运行。一个典型循环是:
flowchart LR
G[Goal] --> P[Plan]
P --> X[Execute]
X --> O[Observe / Test]
O --> D{Goal reached?}
D -- No --> I[Analyze failure<br/>Improve]
I --> P
D -- Yes --> R[Result]
也就是说,Agent 的 intelligence 不只是体现在某一次 generation 上,还体现在它是否可以根据 tool response、test result、error log 和 execution trajectory 调整下一步行为。传统 Prompt Engineering 优化的是“第一次回答得好不好”,而 Agent Harness 优化的是“整个 trajectory 最后能不能成功”。
Coding Agent 特别适合这种结构。例如 Agent 修改代码以后,可以直接运行测试;测试失败以后读取 stack trace,再修改代码;而不是让模型凭语言推理一次性猜出最终 patch。这里环境反馈相当于给模型增加了一个外部 correction channel。
所以从系统角度看:
LLM reasoning + environment feedback + iteration
往往比:
LLM reasoning alone
强很多。
2. File System as Persistent Memory:Context Window 只是 Working Memory
Long-horizon Agent 一个非常实际的问题是:trajectory 会越来越长。experiment log、code diff、paper summary、error trace、过去尝试过的方案,很快会超过 context window。最直接的解决方法反而不是复杂的 vector DB,而是普通 File System。
graph TD
A[Agent Working Context<br/>small + relevant]
FS[(Persistent File System)]
LOG[Experiment logs] --> FS
CODE[Code / Diff] --> FS
TRACE[Past trajectories] --> FS
NOTE[Research notes] --> FS
FS -->|grep / glob / read| A
A -->|write / edit| FS
这里非常值得记一个原则:
Context ≠ Memory。
Context 是当前 inference step 需要看到的 working set;Memory 是长期存在、未来可以重新检索的 state。Harness 不应该把“Agent 曾经见过的所有东西”持续 append 到 prompt,而应该把大量状态外置,只在需要时通过 grep / glob / read / bash 拉回来。
这其实和操作系统里的 RAM / Disk 很像:
Context Window ≈ RAM
File System ≈ Disk / Persistent State
而且 File System 有一个很现实的优势:LLM 在 pretraining 里已经见过大量 shell、filesystem、code,因此 ls / grep / cat / edit 是一个模型天然比较熟悉的 interface,不需要为了 Memory 再发明一个复杂 abstraction。
3. Sub-agent + Backend Jobs:显式并行,而不是把所有推理塞进一个 Context
主 Agent 可以把彼此独立的任务拆出去,例如同时探索多个 hypothesis、运行多个 experiment、检索不同来源,之后再汇总。
flowchart TD
P[Parent Agent]
P --> A1[Sub-agent 1<br/>Hypothesis A]
P --> A2[Sub-agent 2<br/>Hypothesis B]
P --> A3[Sub-agent 3<br/>Hypothesis C]
A1 --> F[(Files / Logs)]
A2 --> F
A3 --> F
F --> P
P --> M[Merge / Compare / Decide]
这里作者强调的其实不只是 Multi-Agent,而是 parallelism must be explicit and inspectable。如果 sub-agent 的输出只存在于一次临时 chat response 中,parent 很难恢复状态;如果结果存在 file、log、status record 里,parent agent 就可以之后重新检查、比较甚至恢复 interrupted task。
所以一个成熟的 parent agent 实际上还需要一个很轻量的 process manager:spawn → inspect logs → wait → cancel failed jobs → merge outputs。
这也是为什么今天 Coding Agent 的 interface 正在逐渐标准化。主流系统基本都包含 File System、Shell、Git/LSP、Web/MCP、Artifact、Background Process 和 Agent Delegation。这种标准化很像早期操作系统逐渐形成统一的 filesystem/process/network abstractions。
Harness Optimization:到底在优化什么?
我觉得整篇文章最重要的一条主线是 optimization target 不断向外扩张:
flowchart LR
P[Instruction Prompt]
--> C[Structured Context]
--> W[Workflow]
--> H[Harness Code]
--> O[Optimizer Code]
早期我们问的是:“Prompt 怎么写得更好?”之后变成:“模型应该看到什么 context?”然后变成:“模型应该按照什么 workflow 工作?”进一步变成:“整个 Harness code 应该如何组织?”最后甚至可以问:“负责优化 Harness 的 optimizer 本身能不能继续优化?”
这个 progression 是理解后面所有 paper 的最好框架。
Context Engineering:不只是放什么 Context,而是怎么生产 Context
普通 Agent 很容易采用一个 naive strategy:把所有 tool response、所有过去 generation 一直 append 进去。但随着 task horizon 增长,这种方式会让 context 越来越长、噪声越来越多。
因此 Context Engineering 的核心问题其实是:
在当前这一步,哪些信息应该进入模型的 working context?
ACE:Context 是不断成长的 Playbook
Agentic Context Engineering(ACE)把 context 看成一个 evolving playbook,而不是一个越来越长的大 Prompt。它包含 Generator、Reflector 和 Curator 三个角色:
flowchart LR
C[(Context Playbook)]
--> G[Generator<br/>Run task]
G --> T[Trajectory]
T --> R[Reflector<br/>Extract lessons]
R --> U[Curator<br/>Update items]
U --> C
Generator 根据当前 playbook 执行任务;Reflector 从成功与失败 trajectory 中总结 insight;Curator 再把 insight 更新进 context。
ACE 一个很聪明的设计是:Curator 不反复 rewrite 整个 Prompt,而是维护类似 (identifier, description) 的 structured items。原因是反复让模型“重新总结整个 prompt”很容易产生 context collapse / brevity bias:每次 rewrite 都会丢掉一些细节,最后 context 越来越短但信息也越来越少。
所以 ACE 做的是 incremental update,而不是 full rewrite。这一点很像数据库:
append / update structured records
比:
每次重新生成整张 database
可靠得多。
不过 ACE 仍然有一个限制:如何更新 Context 的规则本身还是人工设计的。 Generator / Reflector / Curator 这些结构都是人为规定的。于是下一步自然变成:能不能连“Context Engineering 的方法”也自动学习?
Meta Context Engineering:优化“产生 Context 的函数”
Meta Context Engineering(MCE)把问题拆成两个层次。Base level 优化具体任务需要什么 Context;Meta level 优化“应该采用什么 Context Engineering strategy”。
一个 skill (s) 定义一个 context function:
$c = F_s(x; ρ_s)$
其中 $ρ_s$ 是 static components,例如 prompt、knowledge base、code library;$F_s$ 是 dynamic operators,例如 search、selection、filtering、formatting。
所以一个 Skill 可以理解成:
graph LR
X[Task Input x]
R[Static Resources ρ<br/>Prompt / KB / Code]
F[Dynamic Operators F<br/>Search / Select / Filter / Format]
C[Generated Context c]
X --> F
R --> F
F --> C
真正有意思的是它的 bi-level optimization:
flowchart TD
MA[Meta Agent]
-->|evolve skill| S[Skill / Context Strategy]
S --> BA[Base Context Engineer]
BA -->|construct context| C[Task Context]
C --> E[Run + Evaluate]
E --> H[(History:<br/>skill, context, train score, val score)]
H --> MA
Inner loop 问:“给定一个 skill,当前任务的 context 应该怎么优化?”
Outer loop 问:“什么 skill 才是一种更好的 Context Engineering 方法?”
也就是说优化对象已经从 context artifact 提升到了 context-generation mechanism。
这是一个非常关键的 abstraction shift:
What context should I use?
→
What function should generate my context?
而且 MCE 的 context function 实际上也被实现成 files,包括静态 skill.md 和动态 rollout/context data。这样 Agent 就可以直接通过 Read/Write/Edit/Bash/Glob/Grep 修改自己的 context engineering machinery。
Meta-Harness:直接把 Harness Code 变成 Search Space
Meta-Harness 又往外走了一层:现在优化的不再只是 Context Function,而是 决定信息如何存储、检索和呈现的 Harness Code 本身。
这里最重要的思想其实非常工程化:
一旦 Harness 可以表示成 executable code,它就成为一个可以自动搜索的 program space。
流程大概是:
flowchart TD
H0[Existing Harnesses]
--> P[Coding Agent Proposer]
P --> H1[New Harness Code]
H1 --> R[Run Benchmark]
R --> S[Score + Trajectory + State]
S --> Q{Qualified?}
Q -- Yes --> A[(Harness Archive)]
Q -- No --> X[Reject]
A --> P
每个 candidate harness 自己就是一个 directory,里面包含 source code、scores、rollout trajectories 和 state updates。整个 execution history 也在 filesystem 中,因此 coding agent 不需要把所有历史塞进 prompt,而可以通过 grep/cat 自己浏览过去实验。
最终 Meta-Harness 不一定只留下“一个最好的 Harness”,而是可能得到 Pareto frontier 上的一组 candidates,因为 Harness 可能存在不同 trade-off,例如 accuracy、latency、token cost、complexity。
这其实已经非常像 AutoML,只不过 AutoML 搜的是 model architecture / hyperparameters,而 Meta-Harness 搜的是 agent runtime programs。
Workflow Design:把 Agent Architecture 也当成可搜索对象
Workflow 本身也是 Harness 的一部分。最初 workflow 可以人工设计,例如 AI Scientist 会把研究拆成 idea generation、coding、experiments、analysis、paper writing、review 等步骤。但 workflow design space 非常巨大,于是自然会产生一个问题:
为什么一定要由 human engineer 手工设计 workflow?
Autodata:自动寻找“恰好有学习价值”的数据
Autodata 的目标是生成 synthetic training/evaluation data。它包含 Challenger、Weak Solver、Strong Solver 和 Verifier。
flowchart LR
C[Challenger<br/>Generate Problem]
--> W[Weak Solver]
C --> S[Strong Solver]
W --> V[Verifier]
S --> V
V --> D{Difficulty}
D -->|Weak ✅ Strong ✅| EASY[Too Easy]
D -->|Weak ❌ Strong ❌| HARD[Too Hard]
D -->|Weak ❌ Strong ✅| GOOD[Useful Training Data]
GOOD --> C
最有价值的是 Strong Solver 能解、Weak Solver 解不了 的题,因为它刚好落在 weak model 的 learning frontier 上。太容易的数据没有 learning signal;太难的数据又没有可靠 teacher signal。
Challenger 会根据 Solver + Verifier 的反馈继续更新自己的 prompt,从而逐渐生成更合适的数据分布。
不过作者也提醒:Autodata 生成的数据最终用于 fine-tune weak solver,但 strong solver 没有在这个 loop 里持续增强,所以它更像一种自动化 distillation,而不是最纯粹的 recursive self-improvement。
ADAS:让 Meta-Agent 直接写新的 Agent Workflow
Automated Design of Agentic Systems(ADAS)进一步把 agent design 本身定义成 optimization problem。
flowchart TD
A[(Archive<br/>Existing Agents)]
--> M[Meta-Agent]
M --> D[Describe New Workflow]
D --> C[Implement Workflow in Code]
C --> R1[Self-Refine]
R1 --> R2[Self-Refine Again]
R2 --> E[Evaluate]
E --> Q{Good Candidate?}
Q -- Yes --> A
Q -- No --> X[Discard]
开始时 archive 里面只有一些简单 agent,例如 CoT、Self-Refine。Meta-agent 会读取已有方案,先写一个新的 high-level workflow description,再实现为 code,然后执行两轮 self-refine,检查并修改设计,最后进行 benchmark。
这里最值得注意的是 Archive。系统不是 hill climbing:只维护“当前最优 agent”。它保留了一组过去成功的 agent design,新的设计可以从不同 parent 获取 inspiration。因此它更像 evolutionary search,而不是单一路径优化。
AFlow:把 Workflow Optimization 显式变成 MCTS
AFlow 又更明确一步:它把 agentic workflow 表示成 Graph,其中 node 是调用 LLM 的 action,edge 是 code 实现的 logic/control flow。然后直接使用 Monte Carlo Tree Search 搜索 workflow。
graph TD
W0[Workflow W0]
W0 --> W1[Variant W1]
W0 --> W2[Variant W2]
W1 --> W3[Variant W3]
W1 --> W4[Variant W4]
W2 --> W5[Variant W5]
W3:::best
classDef best stroke-width:4px
每次 iteration 做的事情本质上是:
flowchart LR
S[Select Workflow]
--> E[Expand<br/>LLM proposes modification]
--> R[Run]
--> V[Evaluate]
--> K{Improved?}
K -- Yes --> T[Add to Search Tree]
K -- No --> X[Discard]
T --> S
Selection 不单纯选 score 最高的 node,而是在 exploitation 和 exploration 之间做 soft mixture。否则很容易一直围绕当前 best workflow 做局部修改,错过完全不同的 architecture。
停止条件通常是 top-k average score plateau,或者 search budget 用完。
这让我觉得很有意思的一点是:过去 MCTS 搜的是 Chess/Go action,现在搜索对象直接变成了 Programs that control LLMs。
Self-Improving Harness:从优化一部分变成优化整个 Runtime
Context Engineering 只是 Harness 的一部分,Workflow Design 也只是其中一部分。完整 Harness 还包括 tool interfaces、permissions、memory、middleware、sub-agent config 等。既然这些最后都可以表示成 code,那么理论上 Coding Agent 就可以修改整个 Harness。
所以这里发生了一个重要变化:
LLM solves task
变成:
LLM modifies the program that determines how LLM solves tasks
这就是为什么 Harness Engineering 开始接近 RSI。
STOP:不是 Improve Solution,而是 Improve the Improver
Self-Taught Optimizer(STOP)是一个很早的 recursive scaffolding improvement 例子。
普通 optimizer:
flowchart LR
I[Improver I]
--> S[Solution]
S --> U[Utility]
STOP 做的是:
flowchart TD
I0[Improver I₀]
--> S0[Improve Solutions]
S0 --> U0[Measure Meta-Utility]
U0 --> I1[Improve Improver → I₁]
I1 --> S1[Improve Solutions Better]
S1 --> U1[Measure Again]
U1 --> I2[Improve Improver → I₂]
定义一个 improver:
I(u, s; M) → s'
输入 utility function u、initial solution s 和 model M,得到新的 solution。STOP 不直接优化 s,而是定义一个 meta-utility,衡量“这个 improver 在一组 downstream tasks 上平均能把 solution 改好多少”,然后再让 improver 去修改自己。
实验里比较有趣的一点是,它自己发现了一些经典 optimization strategies:genetic algorithm、beam/tree search、simulated annealing、multi-armed bandit、temperature variation、decompose-and-improve。这说明 LLM 不一定需要人显式告诉它“使用某某搜索算法”;当 optimization objective 足够明确时,它有可能重新发现这些 structure。
但这里有一个非常关键的 negative result:GPT-4 可以随着 iteration 改进 improver,而 GPT-3.5、Mixtral 等更弱模型反而可能退化。
所以:
Recursion ≠ Intelligence。
Self-improvement loop 本身不会凭空产生 intelligence。Base model 必须已经足够聪明,才能可靠地修改“让自己变聪明的方法”。
Harness Updating 和 Harness Benefit 是两个不同能力
后续研究进一步把这个问题拆成两个 axis:
Harness Updating Capability:模型能不能提出好的 Harness 修改。
Harness Benefit Capability:模型能不能正确利用这个修改后的 Harness。
它们并不是同一个能力。
quadrantChart
title Harness Capability
x-axis Weak Updating --> Strong Updating
y-axis Weak Utilization --> Strong Utilization
quadrant-1 Ideal Harness User + Builder
quadrant-2 Good User / Poor Builder
quadrant-3 Weak on Both
quadrant-4 Good Builder / Poor User
一个模型可能能写出很好的 skill/tool instructions,但自己不擅长在正确时机调用这些 skill;反过来,也可能自己非常擅长按照复杂 Harness 执行,却不善于设计 Harness。
实验甚至发现 Harness Benefit 并不是随着模型 intelligence 单调增加:中间档模型有时获得最大收益。一个合理解释是:弱模型连 Harness 都不会正确执行;最强模型本身已经能解决大量问题,Harness 的 marginal gain 反而比较小;中间模型正好处于“能力足够使用 Harness,但又仍有大量 weakness 可以被 Harness 补偿”的区域。
Self-Harness:Weakness Mining → Proposal → Validation
Self-Harness 的设计非常像自动化 Software Engineering。它不是让 Agent 泛泛地问“我怎么才能更好”,而是严格执行:
flowchart LR
H[Current Harness h_t]
--> R[Run Tasks]
R --> T[Collect Traces]
T --> W[Weakness Mining]
W --> P[Harness Proposals]
P --> V[Regression Validation]
V --> A{Accept?}
A -- Yes --> H2[New Harness h_t+1]
A -- No --> L[Log Rejected Edit]
H2 --> R
Weakness Mining
这是我觉得非常值得记住的一点:Verifier Outcome 不等于 Root Cause。
两个 task 可能都显示:
timeout
但一个可能是 Agent 陷入无限 debug loop;另一个可能是某个 backend job 没有被正确 monitor。
也可能都显示:
missing artifact
但一个是 Agent 忘了 save;另一个是 tool output path 错了。
因此 failure record 必须包含多层信息:
flowchart LR
E[Verifier Error]
--> B[Relevant Agent Behavior]
--> M[Underlying Mechanism]
--> R[Root Cause]
这跟普通软件 debugging 非常像:exception type 只是 symptom,不是 root cause。
Harness Proposal
Proposer 看到的也不是无限 context,而是一个 bounded proposal context,包括:当前允许修改的 Harness surfaces、已经归纳的 failure patterns、必须保留的 passing behaviors,以及以前尝试过但失败的 edits。
这样可以防止 proposal 变成“大改整个系统”。好的 candidate 应该优先处理:
recurrent + addressable + narrow
的问题,而不是偶发 error 或纯粹因为 task 太难导致的 failure。
Proposal Validation
候选修改必须同时跑两类测试:
Held-in:原来发现的 weakness 是否真的修好了?
Held-out:有没有引入新的 regression?
flowchart TD
P[Candidate Harness Edit]
--> IN[Held-in Eval]
--> OUT[Held-out Eval]
OUT --> Q{Fixes weakness<br/>AND no regression?}
Q -- Yes --> M[Merge]
Q -- No --> R[Reject + Record]
这实际上已经完全变成:
Bug → Root Cause → Patch → Regression Test → Merge
只不过“Bug”来自 Agent trajectory,“Patch”修改的是 Harness。
还有一个非常重要的 safety boundary:作者提醒,允许 Agent 修改自己的 Harness 有点像“程序可以修改 OS”。因此 editable surface 必须严格限制,permission/security layer 不能放在 self-edit loop 里面,否则 Agent 很容易通过关闭 verifier、修改 model、增加 reasoning budget 等方式 reward hack。
Agentic Harness Engineering:真正的瓶颈可能是 Observability
AHE 的观点我觉得是目前这部分最成熟的:Harness evolution 最大的问题也许不是 Agent 不会改 Harness,而是我们不知道应该改哪里。
它把 Observability 拆成三个层级:
graph TD
O[Harness Observability]
--> C[Component Observability<br/>哪里出了问题?]
--> E[Experience Observability<br/>什么 evidence 支持?]
--> D[Decision Observability<br/>为什么改?预测什么?]
1. Component Observability
AHE 把 Harness 明确拆成 7 个 editable components:
mindmap
root((Harness))
System Prompt
Tool Description
Tool Implementation
Middleware
Skill
Sub-agent Configuration
Long-term Memory
每一个 failure pattern 都应该 map 到一个具体 component。这样 edit 才能 targeted,而不是“模型失败了,所以重写整个 system prompt”。
举个简单例子:如果 Agent 总是选择错误工具,问题可能是 Tool Description;如果选择正确工具但调用结果不正确,可能是 Tool Implementation;如果它知道什么时候调用工具但长期任务忘记过去 state,可能是 Long-Term Memory;如果 task decomposition 一直不好,可能是 Sub-agent Configuration 或 System Prompt。
这种 decomposition 的价值就是把一个模糊的:
Agent 不够好
变成:
哪个 runtime component 导致什么 observable failure?
2. Experience Observability
真正的 Agent benchmark 可能产生几百甚至几千条 trajectory,不可能全部塞进 context。因此 AHE 把 evidence 做成 hierarchy:
flowchart TD
T1[Raw Trace 1]
T2[Raw Trace 2]
T3[Raw Trace ...]
T1 --> D1[Per-task Debug Report]
T2 --> D2[Per-task Debug Report]
T3 --> D3[Per-task Debug Report]
D1 --> B[Benchmark-level Overview]
D2 --> B
D3 --> B
B --> E[Evolve Agent]
E -. drill down if needed .-> T1
Agent Debugger 先对每个 task trajectory 做 root-cause analysis,产生 per-task report;然后再把所有 report 聚合成 benchmark overview。Evolve Agent 默认只看 overview,需要证据时才 drill down 到 raw trace。
这个结构同时解决两个问题:Observability 和 Token Efficiency。
本质上非常像 production debugging:
logs → traces → incident summaries → aggregate dashboard
而不是让 engineer 直接从几十 GB logs 开始读。
3. Decision Observability
最后一个层次我觉得最好:每次 Harness Edit 必须是一个 falsifiable hypothesis。
每个 edit 都要附带类似 manifesto:
Evidence → Root Cause → Targeted Fix → Predicted Impact → Regression Risk
flowchart LR
E[Observed Evidence]
--> R[Root Cause Hypothesis]
--> F[Targeted Harness Fix]
--> P[Predicted Impact]
--> X[Next-round Evaluation]
--> C{Prediction confirmed?}
这样下一轮 evaluation 的意义就不是单纯看 score 有没有涨,而是在检验:
我们对 failure mechanism 的理解到底对不对?
这使 Harness Engineering 很接近 Scientific Method:
Observation → Hypothesis → Intervention → Experiment → Evidence
而不是:
Try random prompt → score up/down → try another prompt
而且 AHE 把一些关键部分设置成 read-only,例如 verifier、runs directory、tracer、LLM config。这样如果 performance 变好了,我们才能归因于 Harness edit,而不是 Agent 偷偷把 evaluator 关掉、换更强 model 或增加 inference budget。
到目前为止,我对整篇文章的核心理解
真正值得记的其实不是十几个 paper 名字,而是一条连续的 abstraction ladder:
flowchart TD
A[Prompt Engineering<br/>改 instruction]
--> B[Context Engineering<br/>改模型看到的信息]
--> C[Workflow Engineering<br/>改模型工作的流程]
--> D[Harness Engineering<br/>改完整 runtime]
--> E[Meta-Harness<br/>搜索 Harness programs]
--> F[Self-Improving Harness<br/>Harness 改自己]
--> G[Optimizer Evolution<br/>改“如何改自己”的方法]
这背后的共同趋势是:随着 Base Model 变强,人类手写 heuristic 的比例越来越低,而更多系统结构本身开始成为 optimization target。
所以 Agent Engineering 的重点正在从:
“我要写什么 Prompt 才能让模型聪明一点?”
转向:
“我要构造一个什么 runtime,让模型能够观察、实验、记忆、并行、验证和修改自己?”
再进一步:
“这个 runtime 本身能不能通过 evaluation 自动搜索和进化?”
这也是 Harness 和传统 Prompt Engineering 最大的区别。Prompt Engineering 把模型看成一个 function:
output = LLM(prompt)
Harness Engineering 更像是在设计一个 dynamical system:
flowchart LR
S[State_t]
--> C[Construct Context]
--> M[Model Decision]
--> A[Action]
--> ENV[Environment]
--> O[Observation]
--> V[Evaluation]
--> S2[State_t+1]
--> C
最后真正决定 Agent performance 的,不只是一次 generation 的 intelligence,而是这个长期 closed loop 有没有把模型已有的 intelligence 有效地转化成可靠行为。
我现在最想记住的一句话是:
Harness Engineering 的目标不是让模型“一次想得更聪明”,而是设计一个系统,让模型能够在长期执行中不断获得正确的信息、执行正确的动作、保存有价值的状态、发现错误,并根据反馈改变自己的行为。
而 Self-Improving Harness 又进一步把这个闭环往外套了一层:Agent 不仅优化 task state,还开始优化产生这些行为的 runtime 本身。