跟着一个 agent 任务跑完整轮,看清楚每一步谁在动。
① 打开冰箱
② 放大象
③ 关冰箱
请问,把长颈鹿放进冰箱里——需要几步?
刚才你脱口而出"4 步"的时候——已经在依赖上下文了。LLM 也是同样的工作方式。换个真实点的问题再看一遍——
Agent = LLM + Tools + Memory + Planning + Action + ...
看着很全 —— 但写代码时 不知道谁负责跑循环
Agent = LLM + Harness
原本散落在 4 大分支 + 一堆子组件里的事,
全部收拢到 Harness 这一层
→ 公式 Agent = Model + Harness 由 LangChain 团队 @Vtrivedy10 推动定型
2024 觉得模型笨;2025 觉得自己笨;
2026 模型智力都 OK。
差距不在脑子,在手脚。
固定模型不动,只换 Harness——
性能产生巨大差异。
证明 Harness 是战略级资产。
某创业者花 3 个月调 Prompt,任务完成率提了 20%;后来花 2 周搭 Harness,完成率从 35% → 82%。评论区:"方向错了"。
模型本身不能动文件、网络、数据库。模型只会输出"我想调 read_file"——真正动手的是 harness。
def run(user_message): messages = [{"role": "user", "content": user_message}] while True: response = client.messages.create( model="claude-sonnet-4-6", tools=tools, messages=messages, ) messages.append({"role": "assistant", "content": response.content}) if response.stop_reason != "tool_use": return response.content[0].text # 模型说完了 # 模型要调工具,依次执行 tool_results = [] for block in response.content: if block.type == "tool_use": result = execute_tool(block.name, block.input) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": result, }) messages.append({"role": "user", "content": tool_results})
messages[]
全部对话历史都装在这个数组里。
[{role:user, content:问题}]while True
模型 → 工具 → 模型,转到模型说"够了"。
client.messages.create()stop_reason
模型告诉 harness:我要调工具 / 我说完了。
≠ tool_use → return 文本,循环结束= tool_use → 遍历 content:execute_tool() 真的执行读 a.txt,写摘要到 b.txt
# response.content [ {"type": "text", "text": "好的,我先读 a.txt"}, {"type": "tool_use", "name": "read_file", "input": {"path": "a.txt"}} ] stop_reason = "tool_use"
把模型这段话 append 进 messages(保住模型的"记忆")
真的执行 open("a.txt").read(),
结果再 append 进 messages
a.txt 内容
# response.content [ {"type": "text", "text": "好,我来写摘要"}, {"type": "tool_use", "name": "write_file", "input": { "path": "b.txt", "content": "今天天气..." }} ] stop_reason = "tool_use"
把模型这段话 append 进 messages
真的执行 open("b.txt","w").write(...),
结果("ok")再 append 进 messages
b.txt 已经写好
# response.content [ {"type": "text", "text": "已完成。摘要内容是..."} ] stop_reason = "end_turn"
没有 tool_use 块——模型不再调工具
append 模型最后一条话进 messages
stop_reason ≠ tool_use →
return text,循环退出
只有 tool_use 让循环继续,其他都让它退出。
把 4 件事放到生产环境里,每一步都会再"长出"一层周边能力——这就是真实的 Harness 全貌。
这就是"7 层 Harness"——把这些细节系统化的产物。Anthropic 官方 Claude Agent SDK 把这 7 层全部实现了,所以你写 agent 不用从头造。
工具是 Harness 和真实世界的接口。3 个产品里马上要面对的问题:怎么定义、太多怎么办、失败怎么办。
本质就是 JSON Schema——告诉模型工具叫什么、要什么参数。
3 种来源:
超过 30 个,模型选错率明显上升。
4 个策略:
优先合并,不是堆砌。
不要抛异常——把错误包成 is_error: true,让模型自己决定。
3 道防线:
让模型看得懂,不回传 stack trace。
产品落地三条铁律:工具数 ≤ 30 · JSON Schema 写清楚 · 失败包成 is_error 让模型自决
# 给长前缀加一行: { "type": "text", "text": "...一段长背景...", "cache_control": {"type": "ephemeral"} }
命中后降到原来的
大约降到
是常态
20 轮任务实测:节省约 77%
改动量:每个长前缀 block 加一行 | 风险:几乎为零
这是 agent 工程里 ROI 最高的单点优化。
Claude Code、OpenClaw、Hermes Agent 三大框架的"记忆体系"做法各有取舍——选型时要先看记忆怎么管。
Anthropic 官方 · 长会话 + 深度开发
分层文件记忆
CLAUDE.md项目级USER.md用户级MEMORY.md跨会话特点:启动自动加载,前缀稳定 → Caching 命中率最高
开源 · 可换存储后端
插件式记忆源
特点:记忆 provider 可换,能接入企业现有数据栈
NousResearch · 任务级 / 短会话
任务内 context
特点:记忆极轻,跨会话靠业务方自己持久化
选型口诀 · 长会话深开发 → Claude Code · 企业自托管 → OpenClaw · 横向并发短任务 → Hermes
—— 先从团队约定的一份 CLAUDE 标准开始
打开 Claude Code 写一句话它就懂——背后是 harness 启动时偷偷做的三件事。CLAUDE.md 是项目的"长期记忆"。
| 维度 | 不写 | 写了 |
|---|---|---|
| 新会话 | 重新交代结构 | 开局即"懂" |
| 输出 | 临时文件乱丢 | 按约定路径输出 |
| 长会话成本 | 反复塞背景 | 命中 Caching 10% |
| 团队协作 | 各自上下文 | git 共享一份 |
为什么这套设计成立:CLAUDE.md = harness 的 file-system memory,是 messages 的稳定前缀 → 命中缓存 → 写得长也几乎不要钱。
研发同学的最小行动 → 自己代码仓库写一份 CLAUDE.md,5 行也行,提交到 git。
—— 软件工程是 Harness 的 Harness
讲完 Harness,最容易冒出一个念头:"我会不会被取代?" 回头看 30 年——每一次新工具出现,没让工程师消失,反而让工程师更值钱。
方法论在变(设计模式 → 微服务 → Harness),但抽象 + 结构化的能力一脉相承。
学会驾驭新工具的工程师,永远值钱。
工程师永远不会失业,但码农可能会失业。
码农是写代码的;工程师是设计并驾驭复杂系统的。Harness 让工程师变得更稀缺,不是更便宜。
—— 互相蒸馏,让团队更 NB
Harness 公开、模型公开、Skill 公开——真正不可复制的是团队领域知识。 业内多家公司已经把这件事工程化,我们也该跟上。
原则:不只是"写出来归档"——更要能被 Agent 检索到。
过去散落在飞书 / Confluence / 钉盘里的文档,对 LLM 是"看不见的"。沉淀的目的,是让它们成为团队 Agent 的"工作记忆"。
全队共用的知识 MCP,所有人写 agent 时都能直接调用——沉淀 = 复用。
全队共用的知识库 = 互相蒸馏,每个人的经验复利到全队
① 集中存储
独立 git 仓库,不寄生业务项目
② 模板规范
PRD / 接口 / 概要设计统一模板
③ 定期沉淀
每个项目交付时强制归档(CR 卡点)
④ 自动衰减
季度 lint,过期 / 矛盾自动降级或归档
抄一遍那 50 行最小骨架,跑通,亲手观察 stop_reason 怎么变
自己代码仓库写一份 CLAUDE.md,5 行也行,提交到 git
需要正经写 agent,选 Claude Agent SDK
每个项目根目录都有 CLAUDE.md
建一个独立的团队知识仓库(git 管理)
每周输出 ≥1 条 pitfall,每月跑一次 lint
凡此过往,皆为序章
谢谢大家 · Q&A