[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post:5900":3},{"id":4,"product_id":5,"user_id":6,"title":7,"content":8,"images":671,"create_at":672,"update_at":672,"status":281,"stats":673,"user":676,"emoji_reacts":684,"video_info":5,"vote":5,"user_remark":675,"user_interesting":682,"user_favorite":682,"topic_ids":692,"_figures":695,"_previewImage":15,"_rawTitle":7},5900,null,10005829,"一文搞懂 Coding Agent 和 Harness",{"content":9,"type":670},[10,12,17,29,40,44,48,49,58,62,63,66,70,74,78,82,86,87,90,94,98,143,159,167,171,172,175,179,180,187,197,201,209,213,223,224,227,231,232,235,239,246,247,254,258,262,266,270,271,274,278,279,287,291,295,299,300,303,311,315,319,327,328,335,339,343,354,358,359,362,366,367,370,374,378,404,408,412,416,420,421,428,432,436,440,444,445,448,452,474,478,482,486,487,494,498,502,524,525,528,532,536,550,554,555,562,566,570,574,578,579,582,592,596,597,604,608,612,616,620,624,650,654],{"type":11},"paragraph",{"attrs":13,"type":16},{"alt":14,"src":15,"title":5},"image.png","https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775478003_eae96b17-847b-423c-981a-92931e29b0b3.png","figure",{"content":18,"type":28},[19,24],{"content":20,"type":11},[21],{"text":22,"type":23},"注：感谢特工宇宙战略顾问 @庄明浩 老师推荐。","text",{"content":25,"type":11},[26],{"text":27,"type":23},"原文：https:\u002F\u002Fsubstack.com\u002Finbox\u002Fpost\u002F193137515","blockquote",{"content":30,"type":11},[31,33,38],{"text":32,"type":23},"在这篇文章里，",{"marks":34,"text":37,"type":23},[35],{"type":36},"bold","我想介绍编码智能体（Coding agents）以及「Agent harnesses」的整体设计",{"text":39,"type":23},"：它们是什么、怎么运作，以及各个零件在实践中怎么拼到一起。",{"content":41,"type":11},[42],{"text":43,"type":23},"更广泛地说，Agent 之所以成了一个重要话题，是因为最近很多可落地 LLM 系统的进步，并不只是模型变强了，还在于我们怎么用模型。在很多真实应用里，工程化的系统（比如工具使用、上下文管理、记忆）和模型本身一样关键。这也解释了：为什么像 Claude Code 或 Codex 这样的系统，用起来会明显比把同一个模型塞进普通聊天框更能干。",{"content":45,"type":11},[46],{"text":47,"type":23},"在这篇文章中，我把编码 Agent 的六个主要构件拆开讲清楚。",{"type":11},{"attrs":50,"content":52,"type":57},{"level":51},2,[53],{"marks":54,"text":56,"type":23},[55],{"type":36},"LLM、推理模型与 Agent 之间的关系","heading",{"content":59,"type":11},[60],{"text":61,"type":23},"你大概已经熟悉 Claude Code 或 Codex CLI。铺垫一下：它们本质上是具备 Agent 特性（agentic）的编码工具 —— 在一个 LLM 外面包了一层应用层（也叫 agentic harness），让它在做编码任务时更顺手、表现更稳定。",{"type":11},{"attrs":64,"type":16},{"alt":14,"src":65,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775474653_04e80d93-71f3-46c6-bcf3-6eaa90fe364f.png",{"content":67,"type":11},[68],{"text":69,"type":23},"编码 Agent 是为软件工程场景专门设计的：关键不只是选了哪个模型，还有周边系统怎么做 —— 包括仓库上下文（repo context）、工具设计、提示词缓存（prompt-cache）的稳定性、记忆，以及长会话的连续性。",{"content":71,"type":11},[72],{"text":73,"type":23},"这个区分很重要，因为大家聊 LLM 的编码能力时，经常把模型本身、推理行为、以及具体 Agent 产品混成一回事。但在进入编码 Agent 的细节之前，我先简单补一点背景：LLM、推理模型（reasoning models）与 Agent 之间到底是什么关系。",{"content":75,"type":11},[76],{"text":77,"type":23},"LLM 是核心的下一个 token 预测模型。推理模型本质上还是 LLM，但通常会通过训练和 \u002F 或提示词，让它在推理时投入更多推理计算，用于中间推理、校验、或者在多个候选答案之间做搜索。",{"content":79,"type":11},[80],{"text":81,"type":23},"Agent 则是在模型之上的一层，你可以把它理解成围绕模型的一个控制循环（control loop）。通常给定一个目标，Agent 层（或 harness）会决定：下一步该看什么、调用什么工具、如何更新自身状态、何时停止等。",{"content":83,"type":11},[84],{"text":85,"type":23},"粗略类比一下：LLM 是发动机；推理模型是 “加大马力的发动机”（更强，但更贵）；而 Agent harness 是帮我们把这个发动机用得更好的整套车架 \u002F 传动系统。这个比喻当然不完美，因为我们也能把普通 LLM 或推理 LLM 单独拿来用（比如在聊天界面或 Python 里），但希望能传达核心意思。",{"type":11},{"attrs":88,"type":16},{"alt":14,"src":89,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775474686_55708b6f-4a88-465c-8f92-7086312deccd.png",{"content":91,"type":11},[92],{"text":93,"type":23},"换句话说：Agent 是一个在环境中反复调用模型的系统。",{"content":95,"type":11},[96],{"text":97,"type":23},"所以，简单总结如下：",{"content":99,"type":142},[100,110,118,126,134],{"content":101,"type":109},[102],{"content":103,"type":11},[104],{"marks":105,"text":108,"type":23},[106],{"type":107},"italic","LLM：原始模型","listItem",{"content":111,"type":109},[112],{"content":113,"type":11},[114],{"marks":115,"text":117,"type":23},[116],{"type":107},"推理模型：经过优化的 LLM，更倾向输出中间推理轨迹，并更会自我校验",{"content":119,"type":109},[120],{"content":121,"type":11},[122],{"marks":123,"text":125,"type":23},[124],{"type":107},"Agent：一个循环系统：模型 + 工具 + 记忆 + 环境反馈",{"content":127,"type":109},[128],{"content":129,"type":11},[130],{"marks":131,"text":133,"type":23},[132],{"type":107},"Agent harness：围绕 Agent 的软件脚手架，负责上下文、工具、提示词、状态与控制流管理",{"content":135,"type":109},[136],{"content":137,"type":11},[138],{"marks":139,"text":141,"type":23},[140],{"type":107},"Coding harness：Agent harness 的特例；针对软件工程的任务型 harness，管理代码上下文、工具执行与迭代反馈","bulletList",{"content":144,"type":11},[145,147,151,153,157],{"text":146,"type":23},"如上所列，在 Agent 与编码工具的语境里，经常会出现 A",{"marks":148,"text":150,"type":23},[149],{"type":107},"gent harness",{"text":152,"type":23}," 和 C",{"marks":154,"text":156,"type":23},[155],{"type":107},"oding harness",{"text":158,"type":23}," 这两个术语。Coding harness 是围绕模型的软件脚手架，帮助它高效地写 \u002F 改代码；而 Agent harness 概念更宽，不一定只做编码（比如 OpenClaw）。Codex 和 Claude Code 可以看作 Coding harness。",{"content":160,"type":11},[161,163],{"text":162,"type":23},"总之：",{"marks":164,"text":166,"type":23},[165],{"type":36},"更好的 LLM 是推理模型的更好地基（推理模型往往需要额外训练），而 harness 能把推理模型的能力榨出来更多。",{"content":168,"type":11},[169],{"text":170,"type":23},"当然，LLM 和推理模型即使不加 harness，也能单独解决编码任务。但编码工作不只是「下一个 token 生成」。很大一部分其实是：在仓库里导航、搜索、查函数定义、应用 diff、跑测试、看报错、以及把所有相关信息都维持在可用上下文里。（写代码的人都知道这很费脑子，所以我们编码时不喜欢被打断 :))）",{"type":11},{"attrs":173,"type":16},{"alt":14,"src":174,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775474721_a7c337f4-3ba9-4578-997f-5e8e9a9a6e53.png",{"content":176,"type":11},[177],{"text":178,"type":23},"这里的要点是：好的 Coding harness 能让推理模型和非推理模型在普通聊天框里看起来 “没那么强” 的能力，在实际体验上显著变强 —— 因为它更擅长上下文管理等周边工作。",{"type":11},{"attrs":181,"content":182,"type":57},{"level":51},[183],{"marks":184,"text":186,"type":23},[185],{"type":36},"Coding Harness（编码外壳 \u002F 框架）",{"content":188,"type":11},[189,191,195],{"text":190,"type":23},"上一节提到，当我们说 ",{"marks":192,"text":194,"type":23},[193],{"type":107},"harness",{"text":196,"type":23},"，通常指的是模型周边的软件层：它负责拼装提示词、暴露工具、跟踪文件状态、应用编辑、运行命令、管理权限、缓存稳定前缀、存储记忆…… 等等。",{"content":198,"type":11},[199],{"text":200,"type":23},"如今在用 LLM 时，相比直接提示模型或用网页聊天 UI（更像 “带文件上传的聊天”），这一层软件几乎决定了大部分用户体验。",{"content":202,"type":11},[203,205],{"text":204,"type":23},"在我看来，现阶段各家 LLM 的原始模型能力其实差不多（比如 GPT-5.4、Opus 4.6、GLM-5 之类），",{"marks":206,"text":208,"type":23},[207],{"type":36},"因此 harness 往往是让某个 LLM 在特定任务里更好用的关键差异点。",{"content":210,"type":11},[211],{"text":212,"type":23},"这是我的推测：如果把最新、最强的一批开源模型（例如 GLM-5）塞进类似的 harness 里，它很可能能在 Codex 里做到接近 GPT-5.4 的水平，或在 Claude Code 里做到接近 Claude Opus 4.6 的水平。当然，针对 harness 的后训练（post-training）通常也会有帮助。比如 OpenAI 过去就长期维护 GPT-5.3 和 GPT-5.3-Codex 这类不同变体。",{"content":214,"type":11},[215,217,221],{"text":216,"type":23},"下面我会更具体地讨论 Coding harness 的核心组件。我会以我的 ",{"marks":218,"text":220,"type":23},[219],{"type":107},"Mini Coding Agent",{"text":222,"type":23}," 为例：https:\u002F\u002Fgithub.com\u002Frasbt\u002Fmini-coding-agent",{"type":11},{"attrs":225,"type":16},{"alt":14,"src":226,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775474769_e7712064-2651-4c0e-a28e-6a81d0e74666.png",{"content":228,"type":11},[229],{"text":230,"type":23},"备注：本文为了简化表述，会把 Coding agent 和 Coding harness 有点混着用。（严格说：Agent 是模型驱动的决策循环；harness 是提供上下文、工具与执行支持的周边软件脚手架。）",{"type":11},{"attrs":233,"type":16},{"alt":14,"src":234,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477281_24a7925b-d1bd-462b-a548-f7b43a8be584.png",{"content":236,"type":11},[237],{"text":238,"type":23},"下面是编码 Agent 的六个主要组件。你也可以直接看我这个 “最小但完整可用” 的 Mini Coding Agent 源码（纯 Python 实现），里面用注释标了这六块：",{"attrs":240,"content":242,"type":245},{"language":241},"Shell",[243],{"text":244,"type":23},"##############################\n#### Six Agent Components ####\n##############################\n# 1) Live Repo Context -> WorkspaceContext\n# 2) Prompt Shape And Cache Reuse -> build_prefix, memory_text, prompt\n# 3) Structured Tools, Validation, And Permissions -> build_tools, run_tool, validate_tool, approve, parse, path, tool_*\n# 4) Context Reduction And Output Management -> clip, history_text\n# 5) Transcripts, Memory, And Resumption -> SessionStore, record, note_tool, ask, reset\n# 6) Delegation And Bounded Subagents -> tool_delegate","codeBlock",{"type":11},{"attrs":248,"content":249,"type":57},{"level":51},[250],{"marks":251,"text":253,"type":23},[252],{"type":36},"1. 实时仓库上下文（Live Repo Context）",{"content":255,"type":11},[256],{"text":257,"type":23},"这可能是最显而易见的组件，但也往往是最重要的之一。",{"content":259,"type":11},[260],{"text":261,"type":23},"当用户说 “修一下测试” 或 “实现 xyz” 时，模型应该知道：自己是否在一个 Git 仓库里、当前在哪个分支、有哪些项目文档可能包含指令等。",{"content":263,"type":11},[264],{"text":265,"type":23},"因为这些信息经常会影响正确行动。比如 “修一下测试” 并不是一个自洽的指令；如果 Agent 看到了 AGENTS.md 或项目 README，它可能会知道该跑哪条测试命令；如果它知道仓库根目录和目录结构，就能去正确的位置找信息，而不是瞎猜。",{"content":267,"type":11},[268],{"text":269,"type":23},"另外，git 分支、状态、提交记录也能提供更多上下文：现在有哪些改动正在进行、注意力应该放在哪一块等。",{"type":11},{"attrs":272,"type":16},{"alt":14,"src":273,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477352_bd0ee783-c9dc-43d9-b005-6fd3ba5b1030.png",{"content":275,"type":11},[276],{"text":277,"type":23},"这里的要点是：编码 Agent 会在真正开始干活前，先收集信息。这样它不会每次接到新提示时都从零开始、毫无上下文。",{"type":11},{"attrs":280,"content":282,"type":57},{"level":281},1,[283],{"marks":284,"text":286,"type":23},[285],{"type":36},"2. 提示词形状与缓存复用（Prompt Shape And Cache Reuse）",{"content":288,"type":11},[289],{"text":290,"type":23},"当 Agent 有了仓库视图之后，下一个问题是：如何把这些信息喂给模型。上一张图展示了一个简化版本（“合并提示词：prefix + request”），但在实践中，如果每次用户提问都把 workspace 摘要重新拼一次、重新处理一次，其实挺浪费的。",{"content":292,"type":11},[293],{"text":294,"type":23},"也就是说：编码会话是重复的；Agent 规则通常不变；工具描述通常也不变；甚至 workspace 摘要通常也大体不变。每一轮主要变化往往是：最新的用户请求、最近的对话记录（transcript），以及可能的短期记忆。",{"content":296,"type":11},[297],{"text":298,"type":23},"“聪明” 的运行时（runtime）不会每回合都把所有东西当成一大坨提示词从头构建，如下图所示。",{"type":11},{"attrs":301,"type":16},{"alt":14,"src":302,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477761_35dea5e8-79e0-4461-b582-50e6ee561cbd.png",{"content":304,"type":11},[305,307],{"text":306,"type":23},"与第 1 节的区别在于：",{"marks":308,"text":310,"type":23},[309],{"type":36},"第 1 节关心的是收集仓库事实；这里关心的是如何把这些事实打包并高效缓存，以便反复调用模型。",{"content":312,"type":11},[313],{"text":314,"type":23},"图里的 “稳定（Stable）提示词前缀” 意味着那部分信息变化不大：通常包含通用指令、工具描述、workspace 摘要等。如果没有重要变化，我们不想每次交互都浪费算力去重建它。",{"content":316,"type":11},[317],{"text":318,"type":23},"而其他部分更新更频繁（通常每回合都会变）：包括短期记忆、最近的对话记录，以及最新的用户请求。",{"content":320,"type":11},[321,323],{"text":322,"type":23},"简而言之：",{"marks":324,"text":326,"type":23},[325],{"type":36},"所谓缓存 “稳定提示词前缀”，就是一个聪明的 runtime 会尽量复用那部分内容。",{"type":11},{"attrs":329,"content":330,"type":57},{"level":281},[331],{"marks":332,"text":334,"type":23},[333],{"type":36},"3. 工具访问与使用（Tool Access and Use）",{"content":336,"type":11},[337],{"text":338,"type":23},"工具访问 \u002F 工具使用，是 “这不再只是聊天，而开始像一个 Agent” 的分水岭。",{"content":340,"type":11},[341],{"text":342,"type":23},"普通模型可以用文字建议你去跑什么命令；但把 LLM 放进 Coding harness 后，它应该做得更 “窄” 但更有用：能直接执行命令并把结果取回来（而不是我们手动执行再把结果贴回聊天框）。",{"content":344,"type":11},[345,347,352],{"text":346,"type":23},"不过，harness 通常不会让模型随意编造任意语法；它会提供一个预先定义好的、允许调用的 “命名工具列表”，这些工具的输入清晰、边界明确。（当然，也可以把 Python 的 ",{"marks":348,"text":351,"type":23},[349],{"type":350},"code","subprocess.call",{"text":353,"type":23}," 作为其中一个工具，让 Agent 能跑广泛的 shell 命令。）",{"content":355,"type":11},[356],{"text":357,"type":23},"工具使用的流程大致如下图：",{"type":11},{"attrs":360,"type":16},{"alt":14,"src":361,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477783_7374c992-814d-49ad-82a0-9a5cd13a32ef.png",{"content":363,"type":11},[364],{"text":365,"type":23},"为了更直观，下面是使用我的 Mini Coding Agent 时，用户通常能看到的交互样子。（它没 Claude Code 或 Codex 那么漂亮，因为它非常极简：纯 Python、无外部依赖。）",{"type":11},{"attrs":368,"type":16},{"alt":14,"src":369,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477810_13308ae0-c751-434e-a010-476d1c14836c.png",{"content":371,"type":11},[372],{"text":373,"type":23},"在这里，模型必须选择一个 harness 能识别的动作，比如：列目录、读文件、搜索、跑 shell 命令、写文件等；同时还要把参数按 harness 可校验的格式给出来。",{"content":375,"type":11},[376],{"text":377,"type":23},"所以当模型请求做某件事时，runtime 就可以停下来做一系列程序化检查，例如：",{"content":379,"type":142},[380,386,392,398],{"content":381,"type":109},[382],{"content":383,"type":11},[384],{"text":385,"type":23},"“这是已知工具吗？”",{"content":387,"type":109},[388],{"content":389,"type":11},[390],{"text":391,"type":23},"“参数合法吗？”",{"content":393,"type":109},[394],{"content":395,"type":11},[396],{"text":397,"type":23},"“这需要用户审批吗？”",{"content":399,"type":109},[400],{"content":401,"type":11},[402],{"text":403,"type":23},"“请求访问的路径是否在 workspace 内？”",{"content":405,"type":11},[406],{"text":407,"type":23},"只有这些检查通过，工具调用才会真正执行。",{"content":409,"type":11},[410],{"text":411,"type":23},"运行编码 Agent 当然有风险，但这些 harness 检查也会提高可靠性：避免模型执行完全任意的命令。",{"content":413,"type":11},[414],{"text":415,"type":23},"此外，除了拒绝格式错误的动作、做审批门禁（approval gating），还可以通过检查文件路径，把文件访问限制在仓库内部。",{"content":417,"type":11},[418],{"text":419,"type":23},"某种意义上，harness 给了模型更少的自由，但同时也让它更可用、更可靠。",{"type":11},{"attrs":422,"content":423,"type":57},{"level":281},[424],{"marks":425,"text":427,"type":23},[426],{"type":36},"4. 尽量减少上下文膨胀（Minimizing Context Bloat）",{"content":429,"type":11},[430],{"text":431,"type":23},"“上下文膨胀（context bloat）” 不是编码 Agent 独有的问题，是所有 LLM 系统都会遇到的。确实，现在 LLM 支持的上下文越来越长，但长上下文仍然昂贵，也会带来额外噪声（如果塞了很多不相关信息）。",{"content":433,"type":11},[434],{"text":435,"type":23},"在多轮对话里，编码 Agent 比普通 LLM 更容易遭遇上下文膨胀：反复读文件、工具输出很长、日志很多等等。",{"content":437,"type":11},[438],{"text":439,"type":23},"如果 runtime 把这些都原封不动保留，它很快就会把可用的上下文 token 用光。所以，一个好的 Coding harness 通常在处理上下文膨胀方面会更讲究，不只是像普通聊天 UI 那样简单截断或总结。",{"content":441,"type":11},[442],{"text":443,"type":23},"概念上，编码 Agent 的上下文压缩（compaction）可以像下图这样工作。",{"type":11},{"attrs":446,"type":16},{"alt":14,"src":447,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477829_ed19285a-f84c-4df5-ab3d-e69e0d3f588a.png",{"content":449,"type":11},[450],{"text":451,"type":23},"一个最小的 harness 至少会用两种压缩策略来管理这个问题：",{"content":453,"type":142},[454,464],{"content":455,"type":109},[456],{"content":457,"type":11},[458,462],{"marks":459,"text":461,"type":23},[460],{"type":36},"Clipping（裁剪）",{"text":463,"type":23},"：缩短长文档片段、大工具输出、记忆笔记、对话条目。也就是：避免某一段文本因为太啰嗦就霸占了整个提示词预算。",{"content":465,"type":109},[466],{"content":467,"type":11},[468,472],{"marks":469,"text":471,"type":23},[470],{"type":36},"Transcript reduction \u002F summarization（对话记录压缩\u002F总结）",{"text":473,"type":23},"：把完整会话历史（下一节会讲更多）变成更小、可塞进 Prompt 的摘要。",{"content":475,"type":11},[476],{"text":477,"type":23},"这里一个关键技巧是：让最近发生的事保留更丰富的细节，因为它们更可能影响当前步骤；而更早的事件则更激进地压缩，因为它们往往更不相关。",{"content":479,"type":11},[480],{"text":481,"type":23},"此外，还会对早期的文件读取做去重，避免模型因为之前多次读过同一个文件，就在后续每次都重复看到一模一样的内容。",{"content":483,"type":11},[484],{"text":485,"type":23},"总体上我觉得这是一块 “被低估但很重要、而且很无聊” 的编码 Agent 设计：很多你以为的 “模型质量”，其实是 “上下文质量”。",{"type":11},{"attrs":488,"content":489,"type":57},{"level":281},[490],{"marks":491,"text":493,"type":23},[492],{"type":36},"5. 结构化会话记忆（Structured Session Memory）",{"content":495,"type":11},[496],{"text":497,"type":23},"这一节 “结构化会话记忆”，关注的是历史在存储层面的结构：agent 会把什么长期保留下来，当作永久记录？所以这里强调的是：runtime 会保留更完整的 transcript 作为耐久状态，同时还有一层更轻量的 “记忆层（memory layer）”—— 它更小，而且会被修改 \u002F 压实，而不是只追加不整理。",{"content":499,"type":11},[500],{"text":501,"type":23},"总结一下：编码 Agent 至少会把状态分成两层：",{"content":503,"type":142},[504,514],{"content":505,"type":109},[506],{"content":507,"type":11},[508,512],{"marks":509,"text":511,"type":23},[510],{"type":36},"工作记忆（working memory）",{"text":513,"type":23},"：Agent 明确维护的一小段 “蒸馏态” 信息",{"content":515,"type":109},[516],{"content":517,"type":11},[518,522],{"marks":519,"text":521,"type":23},[520],{"type":36},"完整 transcript（全量对话记录）",{"text":523,"type":23},"：包含所有用户请求、工具输出、LLM 回复",{"type":11},{"attrs":526,"type":16},{"alt":14,"src":527,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477857_a1ac28fb-cfd4-4003-be0a-c15e39235287.png",{"content":529,"type":11},[530],{"text":531,"type":23},"上图展示了通常会存成磁盘 JSON 文件的两份会话文件：完整 transcript 与工作记忆。如前所述：完整 transcript 保存全历史，并且关闭 Agent 后能恢复继续；工作记忆是当前最重要信息的蒸馏版，和紧凑 transcript 有点关系。",{"content":533,"type":11},[534],{"text":535,"type":23},"但紧凑 transcript 和工作记忆的职责略有不同：",{"content":537,"type":142},[538,544],{"content":539,"type":109},[540],{"content":541,"type":11},[542],{"text":543,"type":23},"紧凑 transcript：用于重建 prompt。它的工作是给模型一份 “压缩过的最近历史视图”，这样模型能接着聊下去，而不必每回合都看全量 transcript。",{"content":545,"type":109},[546],{"content":547,"type":11},[548],{"text":549,"type":23},"工作记忆：更偏向任务连续性。它的工作是保持一段小而明确维护的摘要，记录跨回合真正重要的东西，比如当前任务、关键文件、近期笔记等。",{"content":551,"type":11},[552],{"text":553,"type":23},"按照上图的第 4 步，最新的用户请求、LLM 回复与工具输出，会在下一轮里被记录成一个 “新事件”，同时写入全量 transcript 和工作记忆中（图里为了不太乱没画出来）。",{"type":11},{"attrs":556,"content":557,"type":57},{"level":281},[558],{"marks":559,"text":561,"type":23},[560],{"type":36},"6. 通过（有边界的）子 Agent 做任务委派（Delegation With (Bounded) Subagents）",{"content":563,"type":11},[564],{"text":565,"type":23},"当一个 Agent 具备工具与状态后，下一个很有用的能力就是：委派（delegation）。",{"content":567,"type":11},[568],{"text":569,"type":23},"原因是：它允许我们把某些工作并行化，拆成子任务交给子 Agent（subagents），从而加速主任务。比如主 Agent 正在做一件事，但还需要一个旁支答案：某个符号在哪个文件定义、某个配置写了什么、为什么某个测试失败等。把这类工作拆出去给一个有边界的子任务，会比让一个循环同时扛所有工作线更好。",{"content":571,"type":11},[572],{"text":573,"type":23},"子 Agent 只有在继承了足够上下文时才真的有用。但如果不做约束，就可能出现多个 Agent 重复劳动、同时改同一批文件、或不断递归再起子 Agent …… 等问题。",{"content":575,"type":11},[576],{"text":577,"type":23},"所以真正棘手的设计点不只是 “怎么起一个子 Agent”，还包括 “怎么给它上边界（bind one）” :).",{"type":11},{"attrs":580,"type":16},{"alt":14,"src":581,"title":5},"https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1775477872_4d863866-7cde-4ef7-9608-d97677effe31.png",{"content":583,"type":11},[584,586,590],{"text":585,"type":23},"这里的诀窍是：",{"marks":587,"text":589,"type":23},[588],{"type":36},"子 Agent 继承足够上下文以便有效工作，同时又受到约束",{"text":591,"type":23},"（比如只读、以及限制递归深度）。",{"content":593,"type":11},[594],{"text":595,"type":23},"Claude Code 很早就支持 subagents，Codex 是后来才加的。Codex 通常不会强制 subagent 只读；相反，它们一般会继承主 Agent 的沙箱与审批设置。所以边界更多是任务范围、上下文与深度控制。",{"type":11},{"attrs":598,"content":599,"type":57},{"level":281},[600],{"marks":601,"text":603,"type":23},[602],{"type":36},"小结",{"content":605,"type":11},[606],{"text":607,"type":23},"上面的章节试图覆盖编码 Agent 的主要组件。它们在实现上彼此深度交织。",{"content":609,"type":11},[610],{"text":611,"type":23},"这和 OpenClaw 相比如何？",{"content":613,"type":11},[614],{"text":615,"type":23},"OpenClaw 可能是个有趣的对比，但它并不完全是同一种系统。",{"content":617,"type":11},[618],{"text":619,"type":23},"OpenClaw 更像是一个本地的、通用的 Agent 平台（也能写代码），而不是一个专门的（终端）编码助手。",{"content":621,"type":11},[622],{"text":623,"type":23},"不过它与 Coding harness 仍有不少重叠点：",{"content":625,"type":142},[626,632,638,644],{"content":627,"type":109},[628],{"content":629,"type":11},[630],{"text":631,"type":23},"它会使用 workspace 里的提示词 \u002F 指令文件，例如 AGENTS.md、SOUL.md、TOOLS.md",{"content":633,"type":109},[634],{"content":635,"type":11},[636],{"text":637,"type":23},"它会保存 JSONL 会话文件，并包含 transcript 压缩与会话管理",{"content":639,"type":109},[640],{"content":641,"type":11},[642],{"text":643,"type":23},"它可以启动辅助会话与子 Agent",{"content":645,"type":109},[646],{"content":647,"type":11},[648],{"text":649,"type":23},"等等",{"content":651,"type":11},[652],{"text":653,"type":23},"但如上所述，侧重点不同。编码 Agent 是为 “人在仓库里工作、让编码助手高效检查文件\u002F改代码\u002F跑本地工具” 而优化的；而 OpenClaw 更偏向在多个聊天、频道与 workspace 上运行许多长期存活的本地 Agent—— 编码只是其中一个重要工作负载。",{"content":655,"type":11},[656,663,665,669],{"attrs":657,"type":662},{"id":658,"label":659,"mentionSuggestionChar":660,"objectType":661,"slug":5},"39","水产养殖指南","#","topic","mention",{"text":664,"type":23}," ",{"attrs":666,"type":662},{"id":667,"label":668,"mentionSuggestionChar":660,"objectType":661,"slug":5},"28","最近的观察",{"text":664,"type":23},"doc","","2026-04-06T12:20:08.46Z",{"upvotes":674,"interests":675,"floors":675,"root_floors":675},10,0,{"id":6,"nickname":677,"username":678,"avatar_url":679,"cover_url":680,"bio":681,"is_gold_member":682,"is_official":683},"特工宇宙","AgentUniverse","https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fprofile\u002Favatar\u002F10005829_1769817539_user_10005829.png","https:\u002F\u002Fwatcha.tos-cn-beijing.volces.com\u002Fprod\u002Fuser\u002Fuploads\u002F10005829_1769817842_4f554597-b72a-4693-a664-506ade5613cd.png","Agent Universe，首个专注于智能体的科技媒体。",false,true,{"reacts":685},[686,689],{"emoji_code":687,"count":688,"reacted":682},"❤️",7,{"emoji_code":690,"count":691,"reacted":682},"🤩",5,[693,694],39,28,[696,697,698,699,700,701,702,703,704,705,706,707,708],{"alt":14,"src":15,"title":5,"figcaption":671},{"alt":14,"src":65,"title":5,"figcaption":671},{"alt":14,"src":89,"title":5,"figcaption":671},{"alt":14,"src":174,"title":5,"figcaption":671},{"alt":14,"src":226,"title":5,"figcaption":671},{"alt":14,"src":234,"title":5,"figcaption":671},{"alt":14,"src":273,"title":5,"figcaption":671},{"alt":14,"src":302,"title":5,"figcaption":671},{"alt":14,"src":361,"title":5,"figcaption":671},{"alt":14,"src":369,"title":5,"figcaption":671},{"alt":14,"src":447,"title":5,"figcaption":671},{"alt":14,"src":527,"title":5,"figcaption":671},{"alt":14,"src":581,"title":5,"figcaption":671}]