<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Code Agent | Xwell's Blog</title><link>https://imxwell.com/tag/code-agent/</link><atom:link href="https://imxwell.com/tag/code-agent/index.xml" rel="self" type="application/rss+xml"/><description>Code Agent</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 02 Jan 2026 00:00:00 +0000</lastBuildDate><image><url>https://imxwell.com/media/icon_hu69ee3ffdb4f867e32a76265cfde5ef48_25430_512x512_fill_lanczos_center_3.png</url><title>Code Agent</title><link>https://imxwell.com/tag/code-agent/</link></image><item><title>Code Agent 的中控系统：搜索、验证与长期运行</title><link>https://imxwell.com/blog/codeagent_brain/</link><pubDate>Fri, 02 Jan 2026 00:00:00 +0000</pubDate><guid>https://imxwell.com/blog/codeagent_brain/</guid><description>&lt;p>聊 Code Agent 时，我们很容易把注意力都放在模型上：换一个更强的模型，代码能力是不是就会明显提升？&lt;/p>
&lt;p>在 2024 年写 &lt;a href="https://imxwell.com/blog/code_llm_agent/">A few things about Code Agent&lt;/a> 时，我把 Code Agent 拆成了中控、推理生成、验证、知识库和工具集，也花了不少篇幅观察 Multi-Agent 工作流。两年后再回看，这些组件仍然存在，但我关注的重点变了：角色数量不是最关键的，真正决定 Agent 能否进入真实工程的，是搜索、验证、上下文和权限能不能形成稳定闭环。&lt;/p>
&lt;p>真实工程里，答案通常没有这么简单。模型只是系统的一部分。它还需要知道去哪里找代码、什么时候运行测试、失败后重试还是回滚、哪些文件不能改，以及什么时候应该停下来把问题交还给人。&lt;/p>
&lt;p>我把这一层称为 Code Agent 的“中控系统”。它不是一个神秘的大脑，也不是一段超长 Prompt，而是一条反复运行的控制闭环：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">flowchart LR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> task[&amp;#34;用户目标&amp;#34;] --&amp;gt; plan[&amp;#34;计划与&amp;lt;br/&amp;gt;子目标&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> plan --&amp;gt; act[&amp;#34;搜索、&amp;lt;br/&amp;gt;编辑、执行&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> act --&amp;gt; env[&amp;#34;代码库、&amp;lt;br/&amp;gt;终端与 CI&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> env --&amp;gt; verify[&amp;#34;验证结果&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> verify --&amp;gt;|&amp;#34;通过&amp;#34;| finish[&amp;#34;交付&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> verify --&amp;gt;|&amp;#34;可恢复&amp;#34;| plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> verify --&amp;gt;|&amp;#34;高风险&amp;lt;br/&amp;gt;或不确定&amp;#34;| human[&amp;#34;请求&amp;lt;br/&amp;gt;人工判断&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> memory[&amp;#34;项目规则&amp;lt;br/&amp;gt;与任务状态&amp;#34;] --&amp;gt; plan
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这篇文章关注的不是某一个产品，而是这条闭环为什么有效、会在哪里失效，以及搜索、奖励模型和长期记忆应该放在什么位置。&lt;/p>
&lt;hr>
&lt;h2 id="从一次生成到闭环执行">从一次生成到闭环执行&lt;/h2>
&lt;p>早期代码模型更像“根据描述写一段代码”。Code Agent 则要不断观察环境：读取文件、执行测试、看到报错，再决定下一步。&lt;/p>
&lt;p>ReAct 把推理与行动交替起来；Reflexion 进一步让模型把失败总结成语言反馈，供下一次尝试参考。&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> 两者带来的关键变化不是模型突然学会了反思，而是系统终于建立了一个可观察的反馈回路。&lt;/p>
&lt;p>在代码场景里，环境反馈比模型自评可靠得多：&lt;/p>
&lt;ul>
&lt;li>编译器可以确认语法和类型是否正确；&lt;/li>
&lt;li>单元测试可以验证已有行为有没有被破坏；&lt;/li>
&lt;li>lint 和静态分析可以检查一部分工程约束；&lt;/li>
&lt;li>&lt;code>git diff&lt;/code> 可以告诉我们 Agent 到底改了什么。&lt;/li>
&lt;/ul>
&lt;p>真正可靠的中控会优先使用这些确定性信号，而不是让模型凭感觉判断“修复应该已经完成”。&lt;/p>
&lt;hr>
&lt;h2 id="搜索什么时候值得多试几条路">搜索：什么时候值得多试几条路&lt;/h2>
&lt;p>线性重试的做法很简单：尝试一次，失败后阅读报错，再尝试一次。多数日常任务用这种方式就够了。但当根因不明确、修复方案很多时，Agent 可能过早押注在错误方向上。&lt;/p>
&lt;p>LATS 把树搜索引入语言 Agent，让系统同时保留多个候选轨迹；RethinkMCTS 则尝试在发现错误后重写有问题的中间推理，而不是只在错误轨迹末尾继续补救。&lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>&lt;sup id="fnref:4">&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref">4&lt;/a>&lt;/sup>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">flowchart LR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> issue[&amp;#34;问题&amp;#34;] --&amp;gt; a[&amp;#34;假设 A&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> issue --&amp;gt; b[&amp;#34;假设 B&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> issue --&amp;gt; c[&amp;#34;假设 C&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> a --&amp;gt; ta[&amp;#34;运行验证&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> b --&amp;gt; tb[&amp;#34;运行验证&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> c --&amp;gt; tc[&amp;#34;运行验证&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ta --&amp;gt; rank[&amp;#34;比较证据与成本&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tb --&amp;gt; rank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tc --&amp;gt; rank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rank --&amp;gt; patch[&amp;#34;继续最有希望的路径&amp;#34;]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不过，树搜索并不天然优于线性尝试。它用更多 Rollout 换取更高成功率，也会带来更高 token 成本、更多环境执行和更长等待时间。实际系统需要一个搜索预算：&lt;/p>
&lt;ul>
&lt;li>小范围、可快速验证的修改，优先单线执行；&lt;/li>
&lt;li>根因不明确但验证便宜时，可以并行探索多个假设；&lt;/li>
&lt;li>构建和测试很慢时，应该先做静态分析，避免每个分支都跑完整 CI；&lt;/li>
&lt;li>涉及架构取舍时，候选方案应交给人评估，而不是只按模型分数排序。&lt;/li>
&lt;/ul>
&lt;p>因此，搜索的重点不是“分支越多越聪明”，而是&lt;strong>把额外算力花在真正不确定的决策点上&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h2 id="验证最终结果和中间过程要分开看">验证：最终结果和中间过程要分开看&lt;/h2>
&lt;p>代码任务有天然的可验证信号，这也是 RLVR（Reinforcement Learning with Verifiable Rewards）适合代码领域的原因。测试通过可以作为结果奖励，模型不需要依赖人工给每条推理链打分。&lt;/p>
&lt;p>但只看最终结果也有问题：一个任务经过几十步才失败，我们不知道是最初定位错了文件，还是最后漏改了调用方。过程奖励模型（PRM）试图为中间步骤提供更密集的反馈，SWE-Shepherd 就是面向软件工程轨迹的一个例子。&lt;sup id="fnref:5">&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref">5&lt;/a>&lt;/sup>&lt;/p>
&lt;p>我更倾向于把验证拆成三层：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">层级&lt;/th>
&lt;th style="text-align:left">回答的问题&lt;/th>
&lt;th style="text-align:left">适合的验证方式&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>动作验证&lt;/strong>&lt;/td>
&lt;td style="text-align:left">这一步是否合法、是否执行成功&lt;/td>
&lt;td style="text-align:left">schema、权限、命令退出码&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>过程验证&lt;/strong>&lt;/td>
&lt;td style="text-align:left">当前方向是否更接近目标&lt;/td>
&lt;td style="text-align:left">测试增量、静态分析、PRM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>结果验证&lt;/strong>&lt;/td>
&lt;td style="text-align:left">任务是否真的完成&lt;/td>
&lt;td style="text-align:left">完整测试、验收条件、人工 review&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>PRM 可以帮助搜索，却不能替代最终测试。模型很容易学会迎合一个近似的评分器，生成“看起来有道理”的过程。把过程奖励限制在最终验证通过的轨迹上，是减少奖励黑客的一种思路；更根本的办法还是提高测试与环境本身的质量。&lt;/p>
&lt;hr>
&lt;h2 id="rlvr把闭环能力训练进模型">RLVR：把闭环能力训练进模型&lt;/h2>
&lt;p>搜索和反思可以在推理时外挂，RLVR 则试图把这些行为内化进模型。DeepSeek-R1 展示了可验证奖励如何推动模型形成更长的推理行为；在软件工程场景中，Agent-RLVR 使用单元测试等环境奖励，并通过计划、错误提示等 guidance 帮助模型跨过过于稀疏的奖励区。&lt;sup id="fnref:6">&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref">6&lt;/a>&lt;/sup>&lt;sup id="fnref:7">&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref">7&lt;/a>&lt;/sup>&lt;/p>
&lt;p>一个简化的训练闭环是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">flowchart LR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tasks[&amp;#34;任务&amp;#34;] --&amp;gt; policy[&amp;#34;Agent 策略&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> policy --&amp;gt; rollout[&amp;#34;环境 Rollout&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> rollout --&amp;gt; tests[&amp;#34;测试与约束&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tests --&amp;gt; reward[&amp;#34;可验证奖励&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> reward --&amp;gt; update[&amp;#34;策略更新&amp;#34;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> update --&amp;gt; policy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>RLVR 在代码领域有效，是因为这里存在编译器和测试。但这也是它的边界：&lt;/p>
&lt;ul>
&lt;li>测试覆盖不足时，“通过”可能只是钻了验证器的空子；&lt;/li>
&lt;li>flaky test 会把环境噪声当成学习信号；&lt;/li>
&lt;li>隐式依赖和错误的容器配置会奖励错误行为；&lt;/li>
&lt;li>只优化 benchmark，容易让模型学会数据集特有的捷径。&lt;/li>
&lt;/ul>
&lt;p>所以 RLVR 的上限不只取决于算法，也取决于环境能否给出稳定、难以投机的反馈。某种意义上，验证环境本身就是训练数据的一部分。&lt;/p>
&lt;hr>
&lt;h2 id="上下文项目说明不是越长越好">上下文：项目说明不是越长越好&lt;/h2>
&lt;p>&lt;code>AGENTS.md&lt;/code>、&lt;code>CLAUDE.md&lt;/code> 和类似规则文件已经成为代码仓库的新配置层。它们最适合存放代码里无法直接推断的信息，例如特殊构建命令、发布限制、历史兼容要求和禁止触碰的目录。&lt;/p>
&lt;p>但关于这类文件的效果，目前的实证结果并不完全一致。一项覆盖多种 Agent 和 SWE-bench 任务的研究发现，额外上下文往往降低成功率并增加超过 20% 的推理成本；另一项针对 10 个仓库、124 个 PR 的研究则观察到运行时间和输出 token 下降，同时完成表现接近。&lt;sup id="fnref:8">&lt;a href="#fn:8" class="footnote-ref" role="doc-noteref">8&lt;/a>&lt;/sup>&lt;sup id="fnref:9">&lt;a href="#fn:9" class="footnote-ref" role="doc-noteref">9&lt;/a>&lt;/sup>&lt;/p>
&lt;p>这不是简单的“AGENTS.md 有用或没用”，而是说明内容质量和任务分布很重要。我认为比较稳妥的写法是：&lt;/p>
&lt;ul>
&lt;li>只写 Agent 无法从仓库直接发现的约束；&lt;/li>
&lt;li>命令尽量可复制执行，不写空泛的“保持高质量”；&lt;/li>
&lt;li>高风险规则配合权限或脚本硬校验，不只依赖文字；&lt;/li>
&lt;li>定期删除过期信息，把它当配置代码维护；&lt;/li>
&lt;li>不要让模型自动生成一篇仓库百科后永久注入上下文。&lt;/li>
&lt;/ul>
&lt;p>上下文工程的目标不是让 Agent “知道一切”，而是让它在当前步骤拿到刚好够用的信息。&lt;/p>
&lt;hr>
&lt;h2 id="长期运行中控系统最终是权限系统">长期运行：中控系统最终是权限系统&lt;/h2>
&lt;p>Code Agent 正从一次性对话走向后台任务：它可以持续检查 CI、处理 issue，甚至跨多个小时维护一个实现计划。运行时间越长，中控系统就越不能只关注“下一步做什么”。&lt;/p>
&lt;p>它还需要维护：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>任务状态&lt;/strong>：哪些子目标已完成，当前阻塞在哪里；&lt;/li>
&lt;li>&lt;strong>工作记忆&lt;/strong>：关键证据、已修改文件和验证结果；&lt;/li>
&lt;li>&lt;strong>恢复点&lt;/strong>：失败后回到哪个 commit 或工作区快照；&lt;/li>
&lt;li>&lt;strong>权限边界&lt;/strong>：哪些命令可以自动执行，哪些动作必须确认；&lt;/li>
&lt;li>&lt;strong>审计记录&lt;/strong>：为什么做出某个修改，使用了哪些外部信息。&lt;/li>
&lt;/ul>
&lt;p>长期记忆和 Skills 可以减少重复探索，但也会把错误经验固化下来。一个过期的构建步骤如果被包装成“技能”，会比一次普通幻觉更难发现，因为系统会反复、稳定地执行它。&lt;/p>
&lt;p>因此，长期运行 Agent 的核心不是让它永远不停，而是让它能够在正确的位置停下来：验证不足时停、权限不够时停、目标发生冲突时停。&lt;/p>
&lt;hr>
&lt;h2 id="两年后我更看重什么">两年后，我更看重什么&lt;/h2>
&lt;p>Code Agent 的中控系统正在从 Prompt 工程变成真正的软件基础设施，但复杂度不应该成为目标本身。&lt;/p>
&lt;p>我会用四个问题判断一套中控是否可靠：&lt;/p>
&lt;ol>
&lt;li>它是否优先使用编译器、测试和 diff 等真实环境证据？&lt;/li>
&lt;li>它是否只在关键的不确定节点增加搜索，而不是无差别消耗 Rollout？&lt;/li>
&lt;li>它能否把任务状态、项目知识和长期经验分开管理？&lt;/li>
&lt;li>它是否有清晰的权限、回滚和人工接管机制？&lt;/li>
&lt;/ol>
&lt;p>更强的模型会提高每一步的质量，但把几十步串成一次可靠的软件变更，依然是系统工程。真正成熟的 Code Agent，不只是更会写代码，而是更清楚什么时候该搜索、什么时候该验证，以及什么时候不该继续执行。&lt;/p>
&lt;hr>
&lt;h2 id="参考资料">参考资料&lt;/h2>
&lt;p>关于 Code Agent 的整体组件，可继续阅读我的上一篇文章：&lt;a href="https://imxwell.com/blog/code_llm_agent/">A few things about Code Agent&lt;/a>。&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Shunyu Yao et al., &lt;a href="https://arxiv.org/abs/2210.03629">ReAct: Synergizing Reasoning and Acting in Language Models&lt;/a>, 2022。&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Noah Shinn et al., &lt;a href="https://arxiv.org/abs/2303.11366">Reflexion: Language Agents with Verbal Reinforcement Learning&lt;/a>, 2023。&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>Andy Zhou et al., &lt;a href="https://arxiv.org/abs/2310.04406">Language Agent Tree Search Unifies Reasoning, Acting, and Planning in Language Models&lt;/a>, 2023。&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:4">
&lt;p>&lt;a href="https://arxiv.org/search/?query=RethinkMCTS&amp;amp;searchtype=all">RethinkMCTS: Refining Erroneous Thoughts in Monte Carlo Tree Search for Code Generation&lt;/a>。&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:5">
&lt;p>&lt;a href="https://arxiv.org/search/?query=SWE-Shepherd&amp;amp;searchtype=all">SWE-Shepherd: Advancing PRMs for Reinforcing Code Agents&lt;/a>。&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:6">
&lt;p>DeepSeek-AI, &lt;a href="https://arxiv.org/abs/2501.12948">DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning&lt;/a>, 2025。&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:7">
&lt;p>Jeff Da et al., &lt;a href="https://arxiv.org/abs/2506.11425">Agent-RLVR: Training Software Engineering Agents via Guidance and Environment Rewards&lt;/a>, 2025。&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:8">
&lt;p>Thibaud Gloaguen et al., &lt;a href="https://arxiv.org/abs/2602.11988">Evaluating AGENTS.md: Are Repository-Level Context Files Helpful for Coding Agents?&lt;/a>, 2026。&amp;#160;&lt;a href="#fnref:8" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:9">
&lt;p>Jai Lal Lulla et al., &lt;a href="https://arxiv.org/abs/2601.20404">On the Impact of AGENTS.md Files on the Efficiency of AI Coding Agents&lt;/a>, 2026。&amp;#160;&lt;a href="#fnref:9" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item></channel></rss>