<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="/feed.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>韩锐</title>
    <link>https://ray-han.com/zh/</link>
    <description>韩锐（Ray Han）的个人网站与博客。韩锐是字节跳动工程师，分享互联网基础设施、研发管理与 AI 的实践与思考。</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Thu, 09 Apr 2026 00:33:09 +0800</lastBuildDate>
    <atom:link href="https://ray-han.com/zh/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>搭建个性化的 Agent Team 与 Harness</title>
      <link>https://ray-han.com/zh/articles/personalized-agent-team-harness/</link>
      <pubDate>Thu, 09 Apr 2026 00:33:09 +0800</pubDate>
      <guid>https://ray-han.com/zh/articles/personalized-agent-team-harness/</guid>
      <description>分享如何搭建多Agent团队与管控框架，通过Builder、Coder等角色分工、最小权限管理和两阶段Plan工作流，实现断点恢复与并行任务，结合Ralph Loop迭代处理，提升复杂项目稳定性与持续交付质量。</description>
      <content:encoded><![CDATA[<h2 id="为什么">为什么？</h2>
<p>用 Vibe Coding 推进复杂项目时，单 Agent 很快就会遇到能力瓶颈：首先是上下文窗口会被低价值信息塞满，导致任务被迫中断。其次是不同角色，包括搜索、规划、编码混在一个流程里，效率低且容易出错。最后是安全问题：缺乏全局规划容易返工，没有权限隔离还可能引发危险操作。</p>
<p>Agent Team 把角色拆开——规划归规划，执行归执行，读与写分离——前两个问题就缓解了大半。Harness 在更上一层做管控：分配权限、匹配模型、管理上下文、约束行为。然而，市面上的通用方案很难直接套用，每个项目的技术栈、开发约定、任务类型、研发流程各不相同，一刀切的方案很难匹配需求。</p>
<p>好在个性化定制一套并不复杂。打开支持多 Agent 的 IDE 或 CLI（如 <code>Claude Code</code> 或 <code>OpenCode</code>），依次完成三件事：<strong>设计架构与角色</strong>、<strong>管理权限、模型与上下文</strong>、<strong>增加 <code>Plan</code> 工作流</strong>。此外还有更快的方式：直接导入一套现成的 Team + Harness 框架，在其基础上按自己项目的需求裁剪调整。</p>
<h2 id="第一步设计架构与角色">第一步：设计架构与角色</h2>
<h3 id="从简单开始">从简单开始</h3>
<p>不必一开始就把多角色团队搭建完整。可以先从一个 Agent 起步，下文称为 <code>Builder</code>，它大致相当于大多数 AI Coding 工具里的默认 Build Agent。然后随着任务复杂度上升，按需逐步拆分角色（Role）。每个角色在实现层面就是一个 Sub-agent，接收 <code>Builder</code> 委派的专项任务：</p>
<ul>
<li><code>Builder</code> 负责所有工作；当发现上下文不足或效率下降时，考虑拆分职责。</li>
<li>增加只读角色 <code>Explorer</code> / <code>Researcher</code>：负责搜索与信息收集，把检索工作从主 Agent 卸载出去。</li>
<li>增加 <code>Coder</code>：专注代码实现与修改，提高编码质量与连贯性。</li>
<li>增加 <code>Planner</code>：在多文件或跨步骤的复杂任务中负责规划与任务分解。</li>
<li>按需再扩展 <code>Reviewer</code>、<code>General</code> 等角色，用于审查、通用协助或权限隔离。</li>
</ul>
<blockquote>
<p>&ldquo;The best agent architecture is the one you don&rsquo;t need to build. Start simple. Add complexity only when metrics prove it helps.&rdquo;
<em>——Reliable Data Engineering</em></p>
</blockquote>
<h3 id="核心设计原则">核心设计原则</h3>
<ul>
<li><strong>规划与执行分离</strong>：规划（决定做什么、如何拆分任务）和执行（实际实现与修改代码）是两种不同的认知活动，应由不同角色承担，避免频繁上下文切换和误操作。</li>
<li><strong>读与写分离</strong>：搜索/读取信息与写入代码的风险和成本截然不同。读取出错最多是浪费时间，写入出错则可能损坏项目。因此应把检索类工作交给只读角色，把修改类工作交由有权限和审查流程的写入角色。</li>
<li><strong>内部与外部分离</strong>：内部的项目代码库搜索，与外部互联网检索需要不同的工具与策略。代码库搜索依赖对项目结构的理解（如 <code>Glob</code>/<code>Grep</code>/<code>Read</code>），而互联网检索更侧重关键词、来源判断和信息整合。把两类检索混在同一角色里，会导致工具臃肿或策略互相干扰，应分别设计并独立治理。</li>
</ul>
<h3 id="builder-的路由决策">Builder 的路由决策</h3>
<p><code>Builder</code> 是整个团队的决策者，应使用综合能力最强的通用模型（例如 <code>Claude Opus</code>），但它几乎不直接写代码，核心职责是做路由决策，把每项工作委派到最合适的角色上。</p>
<p>下面是一个常见的路由表示例：</p>
<table>
	<thead>
			<tr>
					<th>路由目标 Agent</th>
					<th>主要功能</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>Coder</code></td>
					<td>代码实现与变更</td>
			</tr>
			<tr>
					<td><code>Explorer</code></td>
					<td>项目代码库搜索（只读）</td>
			</tr>
			<tr>
					<td><code>Researcher</code></td>
					<td>网络与外部资料调研</td>
			</tr>
			<tr>
					<td><code>Reviewer</code></td>
					<td>代码审查与质量把关</td>
			</tr>
			<tr>
					<td><code>General</code></td>
					<td>处理可拆分的通用子任务</td>
			</tr>
			<tr>
					<td><code>Builder</code></td>
					<td>仅处理微小编辑或紧急回退</td>
			</tr>
	</tbody>
</table>
<p>人类要做的是把每个 Agent 的职责描述清楚，交给 <code>Builder</code> 背后的模型判断该派谁执行。使用过程中，根据实际效果调整路由规则与阈值。积累到一定程度后，还可以引入量化指标，如委派成功率、回退次数、任务完成时长，来推动分工持续迭代。</p>
<h4 id="额外的行为准则">额外的行为准则</h4>
<p>可以先在 <code>Builder</code> Prompt 中加入以下准则，具体数字可以交由模型决策，再逐步完善：</p>
<ul>
<li><code>Prefer Delegation</code>：遇到不确定时，优先委派，避免 <code>Builder</code> 退化成全能 Agent，让上下文被细节淹没。</li>
<li><code>3-Failure-Stop</code>：同一子任务连续失败 3 次，停下来问用户，不要无限重试。</li>
<li><code>Plan Before Action</code>：涉及 5 个以上文件或跨多步骤的任务，先交给 <code>Planner</code> 制定计划，不要试图一口气做完。</li>
<li><code>Confirm Before Declaring Done</code>：在宣布完成前，确认所有部分都已处理、代码已 review、测试已通过。</li>
</ul>
<h3 id="角色一览">角色一览</h3>
<p>角色（Role）在实现层面就是一个 Sub-agent，用于接收 <code>Builder</code> 委派的任务。角色数量没有固定答案；当某类任务高频出现，且对能力或权限有独立要求时，就值得单独拆出一个角色：</p>
<p><strong><code>Coder</code>（编码执行）</strong>：选用编程能力强、成本可接受的模型，负责执行已分析清楚的任务。不能调用 <code>Task</code>（禁止递归委派），不能使用 <code>Skill</code>。硬约束包括：不能通过删除已有测试来&quot;通过测试&quot;，不能留 <code>TODO</code> 或空函数体作为最终交付，必须运行测试并汇报具体结果。</p>
<p><strong><code>Explorer</code>（内部分析）</strong>：面向代码库的只读搜索。工具集：<code>Glob</code> / <code>Grep</code> / <code>Read</code>。输出必须包含 <code>Not found</code> 部分——搜索过但未命中的内容也要明确列出。</p>
<p><strong><code>Researcher</code>（外部调研）</strong>：面向互联网的只读信息搜集。工具集：Web search / URL 读取 / GitHub 浏览。所有 URL 和引用必须出现在最终消息中。搜索语言会影响结果质量，建议优先使用英文，英文技术资料通常更全面可靠。同时应多方查证，避免幻觉和信息污染。</p>
<p><strong><code>Reviewer</code>（审查质检）</strong>：选用带 thinking 的代码专用模型。审查优先级为 Completeness &gt; Correctness &gt; Quality。输出必须是 PASS / WARN / FAIL 三选一。也可用于审查 <code>Plan</code>。</p>
<p><strong>只读角色的共同设计</strong>：<code>Explorer</code>、<code>Researcher</code>、<code>Reviewer</code> 均禁止 <code>edit</code> 和 <code>bash</code> 权限，目的是隔离副作用——避免只读操作误修改文件。</p>
<p><strong><code>General</code>（通用角色）</strong>：允许的独立运行步数最多，拥有全部工具和 Sub-agent 调度能力。用于可拆分但不易归类的任务，以及跨领域的复杂任务。</p>
<p><strong><code>Compaction</code>（上下文压缩）</strong>：选用长上下文模型，并开启 thinking 来判断哪些消息需要保留。</p>
<h2 id="第二步管理权限模型上下文">第二步：管理权限、模型、上下文</h2>
<h3 id="权限最小权限">权限：最小权限</h3>
<p>每个角色只保留完成其任务所需的最小权限集：</p>
<table>
	<thead>
			<tr>
					<th>角色</th>
					<th>edit</th>
					<th>bash</th>
					<th>task</th>
					<th>skill</th>
					<th>web</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>Builder</code></td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
			</tr>
			<tr>
					<td><code>Planner</code></td>
					<td>仅编辑隔离后的 .plan 目录</td>
					<td>✓</td>
					<td>✗</td>
					<td>✓</td>
					<td>✓</td>
			</tr>
			<tr>
					<td><code>Coder</code></td>
					<td>✓</td>
					<td>✓</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
			</tr>
			<tr>
					<td><code>Explorer</code></td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
			</tr>
			<tr>
					<td><code>Researcher</code></td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✓</td>
			</tr>
			<tr>
					<td><code>Reviewer</code></td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
					<td>✗</td>
			</tr>
			<tr>
					<td><code>General</code></td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
					<td>✓</td>
			</tr>
	</tbody>
</table>
<p>不少 AI Agent 存在“尽可能多做”的倾向。如果给它 <code>edit</code> 权限，它可能在调研时顺手改文件；如果给它 <code>task</code> 权限，它可能把简单问题也继续委派出去。所以需要显式限制权限，让每个角色只做它该做的事。</p>
<p>典型例子是：如果 <code>Coder</code> 有 <code>task</code> 权限，遇到难题时它可能不先自己处理，而是转去调 <code>Researcher</code> 搜索、调 <code>Explorer</code> 查代码。这样一来，<code>Builder</code> 的路由决策就被打乱了，白白消耗 Token，而且整个过程 <code>Builder</code> 还不知情。正确做法是：<code>Coder</code> 只做它能通过编码直接解决的事；一旦无法靠编码继续，就把问题交回 <code>Builder</code> 处理。</p>
<h3 id="模型的匹配">模型的匹配</h3>
<p>不同任务需要不同层级的智能。最贵的模型，应该留给最需要判断力的任务。</p>
<table>
	<thead>
			<tr>
					<th>层级</th>
					<th>模型类型</th>
					<th>适用角色</th>
					<th>thinking</th>
					<th>理由</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>旗舰层</td>
					<td>最强推理模型</td>
					<td><code>Builder</code>, <code>Planner</code></td>
					<td>开启，大 budget</td>
					<td>路由和规划决策质量，直接决定整个链路的效率</td>
			</tr>
			<tr>
					<td>执行层</td>
					<td>性价比模型</td>
					<td><code>Coder</code></td>
					<td>开启，小 budget</td>
					<td>任务已经分析清楚，核心是指令遵循</td>
			</tr>
			<tr>
					<td>通用层</td>
					<td>视任务复杂度而定</td>
					<td><code>General</code></td>
					<td>视情况开启</td>
					<td>任务边界模糊、跨域协调，没有固定的智能需求；可从执行层起步，随任务复杂度上调</td>
			</tr>
			<tr>
					<td>搜索层</td>
					<td>轻量模型</td>
					<td><code>Explorer</code>, <code>Researcher</code></td>
					<td>可关闭</td>
					<td>搜索本身更偏确定性，追求速度、成本和工具调用成功率；<code>Researcher</code> 后续也可再拆分成简单研究和深入研究</td>
			</tr>
			<tr>
					<td>长上下文层</td>
					<td>长窗口模型</td>
					<td><code>Compaction</code></td>
					<td>—</td>
					<td>需要先理解大量上下文，再做压缩</td>
			</tr>
	</tbody>
</table>
<p>在配置时，还应该考虑多 Provider 混用，以及故障 Fallback 方案，这两项工作用于调优中的效果对比、成本优化，以及单点故障风险降低。</p>
<h3 id="上下文管理与信息隔离">上下文管理与信息隔离</h3>
<p>上下文是最稀缺的资源，紧张的上下文窗口也会让模型效果快速下降。因此，每一分上下文窗口都应该用在刀刃上：</p>
<ol>
<li>
<p>Sub-agent 只通过最终消息与 <code>Builder</code> 通信，中间过程对 <code>Builder</code> 不可见。<code>Builder</code> 只需要知道“任务完成了，结果是 XXX”；只有在出现意外时，才补充更详细的过程信息。</p>
</li>
<li>
<p><code>Compaction</code> 可同时采用三种策略：<code>auto</code>（自动触发）、<code>prune</code>（主动修剪）、<code>reserved</code>（保留空间）。</p>
</li>
</ol>
<h2 id="第三步增加-plan-工作流解决更复杂的任务">第三步：增加 <code>Plan</code> 工作流，解决更复杂的任务</h2>
<h3 id="为什么先规划后执行">为什么先规划后执行</h3>
<p>对于复杂任务，不加规划就直接调用 <code>Builder</code> 执行，会有四个常见问题：</p>
<ol>
<li>上下文窗口不够。前面已经讨论过，不再展开。</li>
<li>缺乏全局视野。Agent 看到第一个文件就开始改，改到第三个文件才发现和前面冲突，又要回头返工。</li>
<li>不可恢复。执行到一半上下文满了，或者中断了（断网、关机、Token 用完），进度丢失，只能从头再来。</li>
<li>不可审查。人不知道 Agent 打算做什么，只能等它做完再看结果。方向错了，代价已经产生。</li>
</ol>
<p><code>Plan-Execute</code> 两阶段工作流能直接解决这些问题。因此我们在 <code>Builder</code> 之外，再增加一个专门负责制定计划的 <code>Planner</code>。</p>
<h3 id="planner-agent">Planner Agent</h3>
<p><code>Planner</code> 负责接收复杂任务，输出结构化的 <code>Plan</code> 文件。<code>Plan</code> 以文件形式持久化，带来四个好处：</p>
<ul>
<li>全局视野不会因上下文耗尽而丢失。</li>
<li>中断后能从文件恢复进度。</li>
<li>可以接受机器和人的 Review，可以在执行前审查和修改（human-in-the-loop）。</li>
</ul>
<p><code>Planner</code> 只能读写一个固定目录（如 <code>./plans/&lt;name&gt;.md</code>），以物理方式保证规划与执行隔离。</p>
<h3 id="plan-文件的结构设计"><code>Plan</code> 文件的结构设计</h3>
<p><code>Plan</code> 文件是一个结构化的执行清单，有三个核心设计点：</p>
<p><strong><code>Batch</code> 思维</strong>：同一批次内的任务彼此独立，可以并行；不同批次之间有依赖，必须按顺序执行。并行能显著加速，但前提是判断清楚哪些任务真正独立——这个判断应放在规划阶段，由 <code>Planner</code> 负责。</p>
<p><strong>Task 的五要素：</strong></p>
<ol>
<li>指定角色：由哪个 Sub-agent 执行。</li>
<li>描述：可执行的任务说明，包含具体文件和期望行为。</li>
<li>涉及文件：要创建、修改或读取的文件列表。</li>
<li>验证条件：明确的检查方式。</li>
<li>状态标记：<code>pending</code> / <code>in-progress</code> / <code>completed</code> / <code>blocked</code></li>
</ol>
<p><strong>强制的最终验证 <code>Batch</code></strong>：每个 <code>Plan</code> 的最后一个 <code>Batch</code> 必须包含集成测试和最终审查。单个任务通过不代表整体正确——Task A 改了接口，Task B 还在用旧接口，各自测试都能过，合在一起就出错。</p>
<h3 id="计划的执行-execution">计划的执行 (Execution)</h3>
<p>计划的执行本质上是在管理一个状态机，驱动 <code>Plan</code> 文件中的任务从 <code>Pending</code> 走到 <code>Completed</code>。可以通过一个简单的 <code>Skill</code> 描述来实现。</p>
<p><strong>核心执行流程：</strong></p>
<ol>
<li>加载 <code>Plan</code> 文件，扫描所有任务状态。</li>
<li>找到第一个未完成的 <code>Batch</code>，开始执行。</li>
<li>对每个任务：先标记为 <code>in-progress</code> 并写入文件 → 委派 <code>Agent</code> → 收到返回后更新状态 → 立即写入文件。</li>
<li><code>Batch Gate</code>：当前 <code>Batch</code> 全部完成后，才进入下一个。</li>
<li>最后执行验证 <code>Batch</code></li>
</ol>
<p><strong>断点恢复</strong>：当发现 <code>Plan</code> 文件中有 <code>in-progress</code> 状态的任务时，说明上次执行被中断。此时恢复步骤如下：</p>
<ol>
<li>找到所有中断的任务。</li>
<li>派 <code>Explorer</code> 评估损坏程度：文件是否完整？有无 <code>TODO</code> 占位？项目能否编译？</li>
<li>根据评估结果处理：已完成 → <code>Reviewer</code> 验证；部分完成 → <code>Coder</code> 继续；已损坏 → <code>Coder</code> 修复。</li>
</ol>
<p><strong>核心原则</strong>：永远不要假设中断的工作已经完成。</p>
<h3 id="额外的行为准则-1">额外的行为准则</h3>
<ul>
<li><code>Scope Per Delegation</code>：单次委派给 <code>Coder</code> 的任务不超过 5 个文件，超过就拆分。</li>
<li><code>Done Means Verified</code>：完成的标准是验证条件通过，不是&quot;代码写了&quot;或&quot;任务都派完了&quot;。</li>
<li><code>Persist Progress Eagerly</code>：每次状态变更立即写入文件。</li>
<li><code>Specification Drift Check</code>：执行完所有 <code>Batch</code> 后，逐字重读 Goal 和 Verification Criteria，对比实际产出，检查是否悄悄增加了功能、丢掉了需求，或行为偏离了原始要求。</li>
</ul>
<h2 id="进阶思路ralph-loop">进阶思路：Ralph Loop</h2>
<p>如果项目更加复杂，需要 AI 长时间独立完成，但目标明确，可以在上面基础上引入 Ralph Loop 方法。</p>
<p>2026 年 3 月，Anthropic 意外泄露了 <code>Claude Code</code> 的全部 51.2 万行 TypeScript 源码。韩国开发者 Sigrid Jin 在两小时内用 Ralph Loop 方法，把整个代码库从 TypeScript 重写为 Python，全程没有手写一行代码，完全靠 Agent 自主迭代直到跑通。</p>
<p>Ralph Loop 的核心思路是：把需求拆成一组独立的需求项，每次循环只处理一条，验证通过才继续下一条；每次循环都启动全新的 Agent 上下文，迭代之间的记忆靠文件传递（git 历史、进度文件、需求状态），不依赖上下文积累，从而避免长时间执行中的上下文退化。具体流程：</p>
<ol>
<li>列出所有需求项，每条标记通过或失败。</li>
<li>启动全新 Agent 上下文，选取优先级最高的未通过项。</li>
<li>实现它，运行验证，通过则标记完成。</li>
<li>把本次经验追加到进度文件，供下次迭代参考。</li>
<li>重复，直到所有需求项通过，或达到最大迭代次数。</li>
</ol>
<p>在实现形式上，Ralph Loop 可以是一个 <code>Skill</code>，被调用后由 <code>Builder</code> 驱动既有的 Agent Team 反复执行。</p>
<h2 id="总结">总结</h2>
<p>搭建 Agent Team 本质上不是在写 Prompt，而是在做架构设计。和设计微服务、设计团队分工没有区别。有意思的是，当你真正开始拆分角色、划定权限、设计状态流转时，你会发现这套经验可以反过来帮你理解人类团队协作中的很多问题：为什么要有明确的职责边界，为什么流程要持久化，为什么 review 和测试不能省略。Agent 是一面镜子，照出来的是你对“如何组织工作”这件事理解到什么程度。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI 选型：区分场景的组合策略</title>
      <link>https://ray-han.com/zh/articles/ai-selection-combination-strategy/</link>
      <pubDate>Sun, 22 Mar 2026 02:01:29 +0800</pubDate>
      <guid>https://ray-han.com/zh/articles/ai-selection-combination-strategy/</guid>
      <description>基于场景拆解与组合匹配的AI选型方法：将工作流拆分为问答、研究、代码、评审等场景，匹配Gemini、Claude Opus等工具模型，通过三步法实现团队研发AI体系的高效稳定与成本可控。</description>
      <content:encoded><![CDATA[<p>很多工程师和团队已经把 AI 融入日常工作，但在选工具时仍依赖直觉或口碑，这会导致效率波动和成本不可控。面对快速迭代的产品市场，追求「最强工具」或盲从评测，往往把注意力放在工具本身，而忽略了真正要解决的核心问题：我们要完成的具体工作场景是什么。</p>
<p>更稳妥的做法是把选型当作流程设计：<strong>先将工作流拆解为若干明确场景（如日常问答、深度研究、代码执行、评审与合并等），再为每个场景匹配最合适的工具与模型，而不是寻找万能解。能让决策具备可解释性、可替换性与长期稳定性</strong>————即便具体产品更迭频繁，框架仍然有效。</p>
<p>因此在选型中，我建议三步走：明确工具职责边界 → 按任务匹配模型能力 → 设计分层采购与冗余。下面的组合基于 2025 年末至 2026 年初的个人经验。</p>
<h2 id="通用-ai-助手问答与研究">通用 AI 助手：问答与研究</h2>
<p>这类工具不直接进代码仓库，负责的是日常问答、资料查找、以及需要较长链条的深度研究。把它们和研发执行工具分开看，后面的选型判断会清楚很多。</p>
<table>
	<thead>
			<tr>
					<th>工具</th>
					<th>主要用途</th>
					<th>备注</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Gemini</td>
					<td>日常技术回答</td>
					<td>全球访问稳定，搜索能力顶尖，幻觉控制优，月费 $15 的性价比好</td>
			</tr>
			<tr>
					<td>Manus</td>
					<td>深度研究（技术报告、投资分析）</td>
					<td>Max 模型昂贵，但产出质量对得起价格，1 美元能买到一份逻辑清晰、数据引用得当的深度分析</td>
			</tr>
			<tr>
					<td>Google NotebookLM</td>
					<td>深度研究（知识整理和内容提炼）</td>
					<td>将文档库作为知识源，做多轮、有上下文的深度问答与内容提炼</td>
			</tr>
	</tbody>
</table>
<h2 id="研发工具idecli执行与交付">研发工具（IDE/CLI）：执行与交付</h2>
<p>进入研发主流程后，需要的是能直接接触代码、仓库和评审流程的执行工具。这一层决定的是交付效率。</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">工具</th>
					<th style="text-align: left">核心定位与备注</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">OpenCode (CLI/Web UI)</td>
					<td style="text-align: left">作为 Claude Code 的开源替代，迭代快，定制能力强，访问稳定。价值不在于单点能力，而是作为访问便捷、交互简单的多 Agent 协作平台</td>
			</tr>
			<tr>
					<td style="text-align: left">GitHub Copilot（Web版）</td>
					<td style="text-align: left">典型工作流：选定仓库、描述需求、启动虚拟机、自动解决问题、发起 Pull Request Review、交流修改、合并。适合中等复杂度、希望全自动处理的任务</td>
			</tr>
			<tr>
					<td style="text-align: left">Zed（编辑器）</td>
					<td style="text-align: left">轻量级集成开发环境，侧栏可集成 OpenCode</td>
			</tr>
			<tr>
					<td style="text-align: left"><del>Trae, VS Code + Extensions</del></td>
					<td style="text-align: left">已弃用</td>
			</tr>
	</tbody>
</table>
<p>OpenCode 的要点在于配置 <a href="https://github.com/code-yeongyu/oh-my-openagent">oh-my-opencode</a> 插件。这是一个基于多 Agent 协作的系统。设计理念采用精细角色分工，虽然导致 Agent 间交互频繁、任务链条较长，Token 消耗大，但带来了复杂技术场景下的交付质量保障。熟悉交互模式并为不同角色匹配合适的模型后，能够实现数小时持续自主的深度技术讨论。</p>
<p>GitHub Copilot 的 Web 版代表另一种路径：高度集成、场景封闭，追求端到端自动化。它刻意减少多轮深度交互，更关注从问题描述到代码合并的一站式解决。对于边界清晰的中等复杂度任务，其效率极高，并与 GitHub 研发评审流程无缝集成，使用体验接近为开源项目做全流程代码贡献。</p>
<p>两者各有侧重：OpenCode 重视可控性和深度，GitHub Copilot 追求自动化闭环。实际中经常配合使用，比如复杂架构讨论选 OpenCode，具体 bug 修复用 Copilot。</p>
<h2 id="模型选择按场景匹配能力">模型选择：按场景匹配能力</h2>
<p>工具确定后，下一步是为不同任务场景匹配模型。</p>
<p>其中 <strong>领域/业务理解</strong> 比较特殊：这类任务完全依赖用户提供的上下文（业务文档、历史代码、决策记录等），模型预训练知识反而容易引入幻觉。因此对模型选择不敏感，上下文窗口够长即可。</p>
<p>除领域理解外，按典型场景可分配不同模型与策略：</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left">场景</th>
					<th style="text-align: left">首选模型</th>
					<th style="text-align: left">次选/备选</th>
					<th style="text-align: left">核心考量与备注</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><strong>任务拆解与流程规划</strong></td>
					<td style="text-align: left">Claude Opus 4.6</td>
					<td style="text-align: left">Kimi K2.5</td>
					<td style="text-align: left">需要极强的逻辑拆解和步骤规划能力，理解复杂约束。Opus 在此近乎完美。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>方案及代码评审</strong></td>
					<td style="text-align: left">GPT 5.3-Codex</td>
					<td style="text-align: left">Claude Opus 4.6</td>
					<td style="text-align: left">需要苛刻的代码质量眼光、安全漏洞识别和架构合理性判断。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>综合开发（架构讨论与代码落地）</strong></td>
					<td style="text-align: left">Claude Opus 4.6</td>
					<td style="text-align: left">GLM-5-Turbo</td>
					<td style="text-align: left">需要模型能遵循指令，给出可落地的代码。GLM-5-Turbo 大部分时间可靠，但稳定性有波动。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>独立解决封闭问题</strong></td>
					<td style="text-align: left">GPT 5.4 Pro</td>
					<td style="text-align: left">-</td>
					<td style="text-align: left">单模型单 Agent，适合一次性答案型的明确问题，如实现一个算法，无需过多外部干预。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>简单代码实现</strong></td>
					<td style="text-align: left">Kimi K2.5</td>
					<td style="text-align: left">MiniMax M2.5</td>
					<td style="text-align: left">性价比极高，适用于函数填充、简单脚本、数据转换等确定性任务。需求必须明确，范围必须小。MiniMax 更快但更粗糙。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>搜索与项目理解</strong></td>
					<td style="text-align: left">任意廉价模型</td>
					<td style="text-align: left">-</td>
					<td style="text-align: left">重点在于结合搜索 MCP 和语言服务器调用，获取实时信息和代码语义，模型本身能力次要。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>全语种技术写作</strong></td>
					<td style="text-align: left">Gemini / GPT / Claude</td>
					<td style="text-align: left">-</td>
					<td style="text-align: left">三者风格各异：Gemini 严谨，GPT 流畅，Claude 结构清晰，按需选取。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>中文科技写作</strong></td>
					<td style="text-align: left">Claude Opus 4.6</td>
					<td style="text-align: left">GLM-5</td>
					<td style="text-align: left">逻辑和表达准确性更重要。</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>研发文档写作</strong></td>
					<td style="text-align: left">Claude Opus 4.6</td>
					<td style="text-align: left">-</td>
					<td style="text-align: left">需将复杂技术决策清晰、结构化地表达，Opus 逻辑能力最强。</td>
			</tr>
	</tbody>
</table>
<p>补充一点使用体感供快速建立预期：Opus 是经验丰富的高水平工程师，输出仍需端到端验证；GLM-5 是水平和稳定性都次一档的工程师；Kimi K2.5 和 MiniMax M2.5 更像极便宜的实习生，只能在确定性任务中可靠工作；Claude Sonnet / Haiku 的能力与性价比在国内市场有大量更优平替，通常没有使用必要。</p>
<h2 id="云服务采购">云服务采购</h2>
<p>模型和工具选定后，最后要解决的是怎么买。核心判断：不要把预算押在单一供应商上，按任务风险等级分散采购，关键路径留冗余。</p>
<table>
	<thead>
			<tr>
					<th>服务</th>
					<th>月费</th>
					<th>备注</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>智谱 Coding Plan Pro</td>
					<td>499¥</td>
					<td>提供 GLM-5 等模型，但 SLA 不稳定，偶发故障</td>
			</tr>
			<tr>
					<td>火山方舟 Coding Plan</td>
					<td>200¥</td>
					<td>模型一般、更新滞后，优势在配额充足、延迟低，适合低成本批量任务</td>
			</tr>
			<tr>
					<td>GitHub Copilot Pro+</td>
					<td>39$</td>
					<td>配额高，但配合 Claude Opus 4.6 时 token 消耗为 3 倍，成本需严格核算</td>
			</tr>
			<tr>
					<td>OpenCode Zen</td>
					<td>按量计费</td>
					<td>多模型聚合服务，深度整合 OpenCode 生态，统一管理调度</td>
			</tr>
			<tr>
					<td>PPIO</td>
					<td>按量计费</td>
					<td>提供 GLM-5 服务，延迟稳定性佳，智谱不稳时的备选方案</td>
			</tr>
	</tbody>
</table>
<h2 id="结语">结语</h2>
<p>效率提升不在于追求最强模型，而是持续拆解工作流、按场景匹配工具与模型。起步不需要一步到位——先把通用 AI 助手和研发执行工具分开，区分使用场景，就已经比凭直觉选型好很多。后续再根据实际痛点和预算细化模型分工与采购策略即可。值得注意的是，多工具、多模型的组合本身有切换成本和学习曲线，需要预留时间适应。</p>
]]></content:encoded>
    </item>
    <item>
      <title>从研发执行“做不完”中跳出来</title>
      <link>https://ray-han.com/zh/articles/escape-dev-execution-overload/</link>
      <pubDate>Sun, 15 Mar 2026 21:40:39 +0800</pubDate>
      <guid>https://ray-han.com/zh/articles/escape-dev-execution-overload/</guid>
      <description>需求做不完的根因不是效率不够，而是缺少取舍原则。我用四节工作准则文档解决：定义职责、按价值排序需求、留出长期工作时间、设定顺手事阈值。文档公开后论证责任转移到需求方，配合三层指标持续检验效果。</description>
      <content:encoded><![CDATA[<p>在互联网的研发工作中，总有这样一类人：要支撑的需求太多，白天会议连轴转，消息软件里未读几百条，需求池里的工作只增不减。一天忙下来好像什么都做了，又好像什么都没做成。心里其实有几件早就知道值得做的长期高价值工作，如价值分析、技术攻关、系统重构，但偏偏一直没时间启动和推进。</p>
<p>这种情况，如果只是持续一周，那还可以看作一时忙碌。如果连着几个月都这样，就需要跳出来换个方式解决问题了。</p>
<h2 id="为什么">为什么？</h2>
<p>互联网行业节奏太快，所以事情做不完不会单独一周的问题：组织在不断调整和发现新的增长点，试错和调整节奏快，业务结构和依赖复杂。因此，需求产生的速度天然高于个人消化的速度，越追只会越慢。最终陷在事务中，无法发掘新的价值和增量。</p>
<p>既然做不完，关键就不是怎么做完，而是判断做哪些、不做哪些，让自己能抽身去并行考虑长期高价值工作。</p>
<p>那么具体怎么跳出？我的建议，是围绕一份工作准则文档解决问题。下面讲的，就是这篇文档应该写什么、为什么写、以及怎么用。</p>
<h2 id="怎么做">怎么做？</h2>
<p>要写的文档并不复杂，可以叫做《工作准则》，或者柔和一些的《XXX使用手册》。链接可以放在团队Wiki里，也可以放在聊天软件签名中，让需求方人人能看到。</p>
<p><strong>第一节：定义职责范围</strong>。讲清自己负责什么、不负责什么。确保需求方能快速判断，是否找到了正确的人。</p>
<p><strong>第二节：顺序排列短期需求</strong>。这是需求方最关心的一部分。</p>
<p>首先要根据自己的情况，按类型说明优先级原则，比如，线上故障 &gt; 已承诺的业务交付 &gt; 阻塞他人的协作项 &gt; 新业务需求 &gt; 内部优化和探索性工作。这样就做好了总排序。</p>
<p>然后是同类需求内，按价值和紧急程度排序，并放入下表之中：</p>
<table>
	<thead>
			<tr>
					<th>类型</th>
					<th>事项</th>
					<th>价值估计</th>
					<th>投入估计</th>
					<th>紧急程度</th>
					<th>需求人</th>
					<th>预期交付时间</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>…</td>
					<td>…</td>
					<td>…</td>
					<td>…</td>
					<td>…</td>
					<td>…</td>
					<td>…</td>
			</tr>
	</tbody>
</table>
<p>注意以下四点：</p>
<ol>
<li>排序的最关键因素是“价值估计”一列。如果一件事没有价值，光是紧急，并没有解决的意义；</li>
<li>排序承诺的是交付顺序，也就是承诺前面的事情一定会在后面事情前完成，但并不是说所有事情最终都能做完；</li>
<li>预期交付时间一定要有一个估计，要留有一点余地，原因是你可能还会临时接到更高优先级的需求；</li>
<li>当新需求进来时，按原则重新调整顺序和交付时间，并通知被影响的人。</li>
</ol>
<p><strong>第三节：留出高价值工作专有时间</strong>。短期需求自带紧迫感，一旦做不完短期需求，就永远没有时间做长期高价值工作。因此文档里要明确写出长期事在什么时间做。常见有两种方法：</p>
<ol>
<li>每天留出固定两小时；</li>
<li>每周留出固定一两天。</li>
</ol>
<p>一定要按比例守住高价值工作的投入时间下限。如果高价值工作投入不够，在下一天/下一周开始时，必须优先补上。</p>
<p><strong>第四节：顺手做超短期事</strong>。对于十分钟内能解决、不需要切换上下文的事，可以当场做掉。这个十分钟是参考值，可以按自己的情况调整，但必须有一个明确数字，否则所有事都会被归入顺手。对于必须当天处理的顺手事，可以承诺集中在下班前一个固定时段开始处理。</p>
<p>写完以上四节，工作准则文档就完成了。</p>
<h2 id="公开">公开</h2>
<p>原则如果无法取得共识，矛盾则会继续。但原则公开之后，局面就反过来。只要原则有合理性，提需求的人会先看第一节，做一轮自我筛选，再结合第二节理解你给出排期原因和预期交付时间。</p>
<p>对方如果坚持自己的需求更重要，就需要解释为什么应该插队，这就必须和排在前面的所有需求逐一PK，而不再由你解释为什么交付慢。让论证的责任倒置。这种做法，还能更有理有据地避免老板给你临时加上不重要的事。</p>
<h2 id="应用">应用</h2>
<p>陷在执行里的人常有一个共同的毛病：来事就接，不分轻重。碰到事的第一反应永远是&quot;这件事是怎么回事，我应该怎么解决&quot;；却回避了思考”这件事该不该做，有多重要，什么时候做“。</p>
<p>所以凡遇事要做到：</p>
<ol>
<li>花精力彻底弄清，这件事在文档里属于哪一节和哪一类，应该如何确定顺序。这需要围绕文档确立的原则，进行沟通、深入了解事情、并对需求方做必要的解释；</li>
<li>分析文档中，不够适合现状的地方，持续优化文档和原则，逐步把例外变成常例，让常例更有效。</li>
</ol>
<h2 id="衡量">衡量</h2>
<p>还需要一组指标来检查它是否真在生效。我建议分三层看，从低到高：</p>
<table>
	<thead>
			<tr>
					<th>层次</th>
					<th>看什么</th>
					<th>典型指标</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>执行层</td>
					<td>需求流转</td>
					<td>周新增需求数、周解决需求数、积压数、平均交付时长</td>
			</tr>
			<tr>
					<td>结构层</td>
					<td>时间分配</td>
					<td>长期事和短期事的实际时间占比、顺手事占比、被插队次数</td>
			</tr>
			<tr>
					<td>价值层</td>
					<td>价值产出</td>
					<td>每期复盘最高价值的产出是什么，来自长期事还是短期事</td>
			</tr>
	</tbody>
</table>
<p>三层是递进的。但真正要看的是价值层，上面两层是出问题时用来定位是哪一环失效的：只看执行层会误判，因为高吞吐可能只是在快速处理低价值需求；只看结构层也不够，长期事的时间花到了，不等于做出了新东西。</p>
<h2 id="结尾">结尾</h2>
<p>写这页文档之前，你和需求方之间没有共同的依据，每次新需求来都要从头谈一次优先级。文档挂出去之后，争议有了可以对照的规则，沟通从一对一的反复解释变成了围绕同一份原则的取舍。事情依然做不完，但被推着跑的状态会停下来，人能跳出来看价值。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
