<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Harness on KnightLi的博客</title>
        <link>https://knightli.com/tags/harness/</link>
        <description>Recent content in Harness on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 27 Apr 2026 08:19:02 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/harness/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Ralph 和多智能体协同：怎么让 AI 长时间稳定工作</title>
        <link>https://knightli.com/2026/04/27/ralph-multi-agent-long-running-ai-workflows/</link>
        <pubDate>Mon, 27 Apr 2026 08:19:02 +0800</pubDate>
        
        <guid>https://knightli.com/2026/04/27/ralph-multi-agent-long-running-ai-workflows/</guid>
        <description>&lt;p&gt;如果你最近在折腾 coding agent，很快就会遇到一个现实问题：&lt;strong&gt;AI 当然能干活，但怎么让它连续干几个小时，还不在中途跑偏、忘要求、返工一堆？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;围绕 &lt;code&gt;Ralph&lt;/code&gt; 和多智能体协同的这类讨论，真正值得看的也正是这个问题。它不是单纯比较某个模型有多强，而是把重点放在一层更实际的东西上：&lt;strong&gt;怎么设计工作流，才能让 AI 在长任务里保持稳定输出。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把这个问题拆开看，常见的路线主要有两条：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ralph&lt;/code&gt; 方案：不断启动新会话，通过文件系统衔接上下文&lt;/li&gt;
&lt;li&gt;多智能体方案：主 Agent 做协调，子 Agent 分工执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果把它压成一句更好理解的话，这期内容讲的其实不是“哪个模型更厉害”，而是“怎么把 AI 组织起来，让它更像一个能持续交付的小团队”。&lt;/p&gt;
&lt;h2 id=&#34;01-为什么长时任务容易失控&#34;&gt;01 为什么长时任务容易失控
&lt;/h2&gt;&lt;p&gt;短任务里，很多问题不明显。你给一句指令，模型读几份文件，改几行代码，事情也就结束了。&lt;/p&gt;
&lt;p&gt;但任务一旦拉长，问题会集中冒出来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会话越来越长，上下文开始膨胀&lt;/li&gt;
&lt;li&gt;早先的要求被新信息挤掉&lt;/li&gt;
&lt;li&gt;一个 Agent 既要想方案，又要写代码，还要自己测，容易顾不过来&lt;/li&gt;
&lt;li&gt;没有明确验收环节时，看起来“做完了”，其实只是“说自己做完了”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以长时间运行 AI，真正考验的往往不是模型单次输出能力，而是 &lt;strong&gt;任务拆分、状态衔接、角色分工和反馈回路&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;02-ralph-方案把长任务拆成很多短回合&#34;&gt;02 Ralph 方案：把长任务拆成很多短回合
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ralph&lt;/code&gt; 的思路很适合先解决“上下文越跑越脏”这个问题。&lt;/p&gt;
&lt;p&gt;它的核心做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用循环不断启动新的 agent 会话&lt;/li&gt;
&lt;li&gt;每轮只处理一个足够小的任务&lt;/li&gt;
&lt;li&gt;把跨轮状态放到文件里，而不是全压在同一个对话上下文里&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做的好处很直接：每次都是 fresh context，单轮会更聚焦，也更不容易被历史消息拖慢。&lt;/p&gt;
&lt;p&gt;如果你已经看过 &lt;code&gt;Ralph&lt;/code&gt; 相关项目，会发现这套方法背后的逻辑很一致：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前任务写在结构化文件里&lt;/li&gt;
&lt;li&gt;中间经验写到进度文件里&lt;/li&gt;
&lt;li&gt;代码变化留在 git 历史里&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;换句话说，&lt;code&gt;Ralph&lt;/code&gt; 不是试图让一个 Agent “永远记住所有事”，而是主动把记忆外置，让会话本身保持轻一点。&lt;/p&gt;
&lt;p&gt;这类方案特别适合下面几种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任务已经能拆成一组小 story&lt;/li&gt;
&lt;li&gt;每个 story 都能在单个上下文窗口里完成&lt;/li&gt;
&lt;li&gt;项目里已经有测试、typecheck 或其他检查机制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它解决的是“如何让 AI 一轮一轮稳定推进”。&lt;/p&gt;
&lt;h2 id=&#34;03-多智能体方案把一个人做不完的事分出去&#34;&gt;03 多智能体方案：把一个人做不完的事分出去
&lt;/h2&gt;&lt;p&gt;另一条路线是多智能体协同。&lt;/p&gt;
&lt;p&gt;从这类工作流设计思路来看，更值得推荐的通常是这种方式：主 Agent 不直接埋头干活，而是负责协调；子 Agent 各自处理开发、测试、检查、验收等不同任务。&lt;/p&gt;
&lt;p&gt;这和 &lt;code&gt;Ralph&lt;/code&gt; 的区别在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ralph&lt;/code&gt; 更像串行迭代&lt;/li&gt;
&lt;li&gt;多智能体更像并行分工&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果任务里天然有不同角色，多智能体会更顺手。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 Agent 负责拆任务和写执行计划&lt;/li&gt;
&lt;li&gt;一个 Agent 负责具体实现&lt;/li&gt;
&lt;li&gt;一个 Agent 负责测试和验证&lt;/li&gt;
&lt;li&gt;一个 Agent 负责回看结果是不是符合最初需求&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做的价值不是“多开几个窗口显得很高级”，而是让不同工作职责分离开。原来塞在一个 Agent 身上的几件事，现在可以拆成几个更明确的环节。&lt;/p&gt;
&lt;p&gt;一旦角色边界清楚，很多问题都会变轻：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写的人不必同时当审的人&lt;/li&gt;
&lt;li&gt;跑测试的人不必重新推导整套需求&lt;/li&gt;
&lt;li&gt;主 Agent 不会被实现细节淹没&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它解决的是“如何让 AI 像一个小团队那样配合”。&lt;/p&gt;
&lt;h2 id=&#34;04-真正关键的不是多开而是怎么拆&#34;&gt;04 真正关键的，不是多开，而是怎么拆
&lt;/h2&gt;&lt;p&gt;无论是 &lt;code&gt;Ralph&lt;/code&gt; 还是多智能体，最容易被忽略的一点都是：&lt;strong&gt;流程设计比多开几个 Agent 更重要。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果任务拆分不对，就算开再多 Agent，也只是把混乱并行化。&lt;/p&gt;
&lt;p&gt;比较稳的拆法通常有几个特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个任务只对应一个明确目标&lt;/li&gt;
&lt;li&gt;一个角色只负责一类输出&lt;/li&gt;
&lt;li&gt;每轮都有清楚的完成标准&lt;/li&gt;
&lt;li&gt;上一轮的结果能被下一轮直接消费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如比起给 AI 一个“把整个功能做完”的大指令，更稳的方式往往是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先拆出需求和边界&lt;/li&gt;
&lt;li&gt;再拆实现&lt;/li&gt;
&lt;li&gt;再拆测试&lt;/li&gt;
&lt;li&gt;最后单独做验收&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类拆法的好处是，问题一旦出现，更容易知道是出在理解、实现、测试，还是交付标准上。&lt;/p&gt;
&lt;h2 id=&#34;05-为什么验收环节特别重要&#34;&gt;05 为什么验收环节特别重要
&lt;/h2&gt;&lt;p&gt;很多 AI 工作流失败，不是因为前面完全没做事，而是因为最后缺了一个真正独立的确认动作。&lt;/p&gt;
&lt;p&gt;在长任务里，“已经生成结果”和“结果真的可用”之间，经常隔着一整层差距。&lt;/p&gt;
&lt;p&gt;这里有个很值得重视的方向，就是把开发和验收拆开看。哪怕不做到特别复杂，至少也应该把这些问题单独问一遍：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它真的完成了最初那条任务吗&lt;/li&gt;
&lt;li&gt;有没有只改表面、没解决根因&lt;/li&gt;
&lt;li&gt;测试是不是只验证了最顺利的路径&lt;/li&gt;
&lt;li&gt;有没有把上游要求悄悄改掉&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要这层检查缺位，AI 很容易在长流程里不断“自我宣布成功”。&lt;/p&gt;
&lt;h2 id=&#34;06-两条路线怎么选&#34;&gt;06 两条路线怎么选
&lt;/h2&gt;&lt;p&gt;如果只是想快速判断，可以先这么理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你最痛的是上下文膨胀和长会话失焦，先看 &lt;code&gt;Ralph&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;你最痛的是一个 Agent 身兼多职、任务之间互相打架，先看多智能体&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再具体一点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ralph&lt;/code&gt; 更适合流程清楚、任务细碎、可以按回合推进的工作&lt;/li&gt;
&lt;li&gt;多智能体更适合角色明显、需要并行和交叉验证的工作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多时候，这两条路也不是非此即彼。比较成熟的做法，反而可能是把它们组合起来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;外层用 &lt;code&gt;Ralph&lt;/code&gt; 这种迭代循环推进大任务&lt;/li&gt;
&lt;li&gt;内层在单轮里再用多智能体处理研究、实现、测试和验收&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样既能控制长上下文，又能提高单轮内部的协作效率。&lt;/p&gt;
&lt;h2 id=&#34;07-一句话总结&#34;&gt;07 一句话总结
&lt;/h2&gt;&lt;p&gt;这类方法最值得看的地方，不是单独推荐了 &lt;code&gt;Ralph&lt;/code&gt; 或多智能体，而是把一个很现实的问题讲清楚了：&lt;strong&gt;让 AI 长时间稳定工作，关键从来不只是模型本身，而是你有没有把上下文、任务、角色和验收设计好。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你已经开始让 &lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Codex&lt;/code&gt; 或其他 coding agent 处理更长的真实任务，这类工作流思路会比“再换一个更强模型”更值得优先补课。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Anthropic 的 Harness 思路：Agent 基础设施正在走向 Agent OS</title>
        <link>https://knightli.com/2026/04/10/anthropic-harness-agent-os/</link>
        <pubDate>Fri, 10 Apr 2026 09:22:56 +0800</pubDate>
        
        <guid>https://knightli.com/2026/04/10/anthropic-harness-agent-os/</guid>
        <description>&lt;p&gt;Anthropic 最近发布了一篇关于 Harness 的工程实践。表面看是在讲产品实现，实质上回答的是一个更长期的问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;当模型能力持续变化时，Agent 系统哪些层要稳定，哪些层应该允许快速替换？&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;核心判断&#34;&gt;核心判断
&lt;/h2&gt;&lt;p&gt;我对这篇文章的核心理解是：Agent 基础设施会越来越像一个轻量的 &lt;strong&gt;Agent OS&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;重点不在“把今天的最佳流程写死”，而在“定义长期稳定的系统抽象”。&lt;/p&gt;
&lt;h2 id=&#34;为什么这点重要&#34;&gt;为什么这点重要
&lt;/h2&gt;&lt;p&gt;很多 Agent 框架常见的问题是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把模型的临时短板固化为永久架构&lt;/li&gt;
&lt;li&gt;把 prompt 工程误当成系统边界&lt;/li&gt;
&lt;li&gt;把一次有效的补丁写成长期依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模型会变强，今天合理的补丁，明天可能就是技术债。&lt;/p&gt;
&lt;h2 id=&#34;anthropic-的解法从具体-harness-到-meta-harness&#34;&gt;Anthropic 的解法：从具体 Harness 到 Meta-Harness
&lt;/h2&gt;&lt;p&gt;这套思路不是承诺某一种固定编排方式，而是抽象出三层稳定接口：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;session&lt;/code&gt;：可恢复的事件与状态历史&lt;/li&gt;
&lt;li&gt;&lt;code&gt;harness&lt;/code&gt;：推理与调度循环（brain）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sandbox&lt;/code&gt;：执行环境与工具能力（hands）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;它们分离后，系统更容易替换、恢复和扩展。&lt;/p&gt;
&lt;h2 id=&#34;1-session-不是上下文窗口&#34;&gt;1) Session 不是上下文窗口
&lt;/h2&gt;&lt;p&gt;一个关键观点是：&lt;strong&gt;Session 不等于模型上下文。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Session 应该是可查询、可回放、可恢复的事件日志，而不是直接塞给模型的历史拼接。&lt;/p&gt;
&lt;p&gt;这样做的价值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;trimming 不等于历史消失&lt;/li&gt;
&lt;li&gt;compaction 不等于事实丢失&lt;/li&gt;
&lt;li&gt;崩溃恢复可以回到事件层，而不是依赖摘要记忆&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-harness-是可替换的编排层&#34;&gt;2) Harness 是可替换的编排层
&lt;/h2&gt;&lt;p&gt;Harness 应专注于调度，而不是持有业务状态。&lt;/p&gt;
&lt;p&gt;理想接口更接近：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;execute(name, input) -&amp;gt; string&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这意味着模型只关心“我能调用什么能力”，而不强绑定具体设备、容器或操作系统。&lt;/p&gt;
&lt;h2 id=&#34;3-sandbox-是手不是脑&#34;&gt;3) Sandbox 是“手”，不是“脑”
&lt;/h2&gt;&lt;p&gt;当 brain 和 hands 解耦：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具环境可以独立演进&lt;/li&gt;
&lt;li&gt;不同基础设施可以并行接入&lt;/li&gt;
&lt;li&gt;不必每个会话都预热完整执行环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这直接带来更好的启动与扩展表现。&lt;/p&gt;
&lt;h2 id=&#34;性能与安全启发&#34;&gt;性能与安全启发
&lt;/h2&gt;&lt;p&gt;这种拆分通常会同时改善性能和安全。&lt;/p&gt;
&lt;p&gt;性能上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以先启动 brain，再按需拉起 hands&lt;/li&gt;
&lt;li&gt;降低首 token 延迟（TTFT）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安全上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不把高敏凭证直接暴露给模型&lt;/li&gt;
&lt;li&gt;用受控 proxy / vault 做间接凭证访问&lt;/li&gt;
&lt;li&gt;安全边界建立在系统约束上，而不是“模型应该做不到”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;相关链接&#34;&gt;相关链接
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://claude.com/blog/claude-managed-agents&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Usage patterns and customer examples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.anthropic.com/engineering/managed-agents&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The design of Claude Managed Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://platform.claude.com/docs/en/managed-agents/quickstart&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Onboarding, quickstart, overview of the CLI and SKDs &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
