跳到主要内容
SecondHome

主循环之争:从 localize–edit–verify 到 Agentless 反路线

15 分钟入门3bL6 p.31-45 ↗录像 ↗支撑材料 4 篇

伴读笔记把编码 Agent 压成五行 while 循环,L6 p.31-45 摆的却是一整场路线之争:正路线 SWE-agent 把 localize–edit–verify 主循环配上 ACI 接口拿下双 SOTA,反路线 Agentless 干脆取消自主循环、换成定位-修复-验证三段固定流水线,以 SWE-bench Lite 32.00%(96 个修复)、单题 $0.70 优于所有开源 agent;而循环转得顺不顺,最后落在编辑格式上——Aider 重构基准里 SEARCH/REPLACE 20% 对简化统一 diff 61%。

用户把重试次数设成 0,客户端却重试了三次。要修这样的 bug,模型得自己进仓库:定位、编辑、跑测试,一圈不过再转一圈。这就是编码 Agent 的主循环。

L6 p.31-45 拿它当主角,摆开一场路线之争:给循环配上专为 agent 设计的接口,这是 SWE-agent;取消循环、把修 bug 写死成三段流水线,那是 Agentless。争到细处,连编辑格式的毫厘之差都足以决定一个 agent 在基准上的成败。

一、两个物种:单步生成与主循环

L6 p.32 把让 LLM 修 bug 这件事分成两个物种。

单步(single-step,self-contained prompt):问题描述里带齐所有相关代码,推理加代码一次生成,末尾评估答案。模型看不见仓库,世界全凭题目转述。

agentic 拿 issue 加既有文件当输入,自己在仓库里搜索、编辑、跑测试。测试不过,就带着失败信息回到搜索,转下一圈,最终交付补丁加证据,像一个拿着 shell 的修理工。

两个物种的差别在反馈回路。单步的评估只在收尾发生一次;主循环(agentic loop)的评估每圈发生一次,且失败本身变成下一圈的输入。

SWE-agent 在 L6 p.33 的教学图用迷你仓库 cli.py/config.py/test_config.py 把一圈拆成三拍:

  • 定位(localize):零是在哪一步变成默认值的?
  • 编辑:仅当值为 None 才用默认。
  • 验证:零值、默认值、调用方回归一起测。

三拍走完若验证不过,不改测试、不硬闯,修正假设再转一圈。

二、循环实录:一个把 0 吞掉的默认值

把那圈循环完整走一遍(L6 p.34-36)。症状:用户把重试次数设成 0,客户端却重试了三次。

Thought: 0 是合法配置却被当成「没配置」。零是在哪一步变成默认值的?先定位。Action: rg ‘retries’ buggy_config.pyObservation: 命中 return config.get (“retries”) or 3Thought: 零是 falsy——0 or 3 求值为 3,默认值规则写错了。先复现,改条件,不改测试。Action: RETRY_MODULE=buggy_config python3 -m unittestObservation: AssertionError: 3 != 0、FAILED (failures=1)—— 复现成立Action: Edit——value = config.get(“retries”); return 3 if value is None else valueObservation: python3 -m unittest -v test_config:missing→3 PASS、None→3 PASS、zero→0 PASS、positive→2 PASS,Ran 4 tests: OK

修复本身只有两行,但值得看清它换掉的语义:

# 修前:0 与 None 同罪,都被 or 一口吞掉
return config.get("retries") or 3

# 修后:只有真正的缺省(None)才落到默认值
value = config.get("retries")
return 3 if value is None else value

这一圈值得学的是两处纪律。

其一,先复现再动手。那条 AssertionError 是循环的燃料,没看到 FAILED 之前,任何修改都是猜。

其二,修条件,不改测试。missing / None /zero/positive 四例定义了正确行为,agent 能改的只有实现。让测试变绿最省事的捷径是改测试,循环设计必须把它堵死。

SWE-agent 把改完即验证做进接口,让验证给循环把关。

三、反路线:Agentless 说,循环可以不要

p.37 抛出的辩论很直接。UIUC 的 Agentless(Xia et al.)拒绝给 LLM 决策权:整个修 bug 过程是分层定位→修复→验证的三段固定流水线,每段内部用结构化提示调用模型,段与段的衔接写死在代码里,没有自主循环。

按 Agentless 论文的数字:SWE-bench Lite 32.00%,96 个修复;单题成本 $0.70,同时优于所有开源 agent。资料卡把这笔账概括成一句:最简单的架构赢。

正路线的旗手,是前文教学图的出处 SWE-agent(Yang et al., NeurIPS 2024)。它主张人类接口不适合 agent,要为 agent 另造一套智能体 - 计算机接口(Agent-Computer Interface, ACI):编辑反馈简洁、护栏防呆、改完即 lint。

成绩单是 2024 年时点的双 SOTA:SWE-bench pass@1 12.5%、HumanEvalFix 87.7%。

issue 进循环,搜什么、改哪里、何时停,由 agent 看着报错当场决定;人的工作外围化,把 ACI 打磨到 agent 不容易失手。

LLM 不掌舵,只在分层定位、修复、验证三个固定阶段被调用;路线写死在代码里,可预测、可复现,成本压到单题 $0.70。

两条路线其实共享同一套三拍:定位、修复、验证;分歧只有一个,下一拍由谁决定。Agentless 用写死的顺序换走不确定性,SWE-agent 用打磨过的接口换走犯错空间。

验证信号越客观,方向盘就越敢交出去。

四、循环的燃料:工具集与编辑格式

循环要转得动,靠每圈喂给模型的工具与反馈,L6 p.39-45 给出一条谱系。

极简端是 mini-SWE-agent,只有单一 bash:读与搜用 rg /cat/find,改用 sed / Python /patch,执行检查用 pytest /build。每步回传给模型的就是输出、exit status 与 timeout,别无其他。

# p.40:用 sed 改一个常量——最小可行编辑
sed 's/^RETRIES = 3$/RETRIES = 5/' settings.py > settings.new && mv settings.new settings.py

往复杂走,编辑动作分化出两条路线(p.41):整文件写,如 Pi 的 write、OpenCode 的 write、OpenHands 的 create;以及 SEARCH/REPLACE 块,即 OpenHands、Pi、OpenCode 的 edit。

p.42 再往上还有统一 diff,即 unified diff,标准格式带行号与上下文,Aider 变体省略 hunk 行号;另有 Codex 的 patch 语法,用 *** Begin Patch、*** Update File: settings.py 这类行式标记组织改动。SEARCH/REPLACE 块长这样:

<<<<<<< SEARCH
RETRIES = 3
=======
RETRIES = 5
>>>>>>> REPLACE

模型一次性重写整个文件,语法最简单,不存在旧片段找不到的匹配问题;代价是长文件的 token 开销与无谓改动的风险。

给出旧片段与新片段,工具负责定位替换,改动面最小、意图最明确;风险是旧片段与实际代码对不上时,整块编辑失效。

格式的选择直接改变基准成绩(p.43)。Aider 的重构基准把大类里的方法挪成顶层函数,共 89 个 Python 任务,查语法正确与代码保留。

GPT-4 Turbo(gpt-4-1106-preview)用 SEARCH/REPLACE 只完成 20%,简化统一 diff 完成 61%。同一个模型,只换编辑语法,结果天差地别。

这组数字该怎么读

20% 对 61% 出自 Aider 自家基准与 GPT-4 Turbo 的时点结果。它证明接口细节能放大或埋没同一个模型,并非给格式排座次的终审;选格式仍要回到任务形态与工具链。

循环的起点是找相关代码(p.44-45):从症状 rg 'retries' . 入手,沿值追踪,问配置输入在哪首次被读、默认逻辑在哪、零在哪变成了三。

LocAgent(Chen et al., 2025)把这套追踪显式化为依赖图导航:cli.py 的 configure_client —calls—> client.py 的 Retry loop、config.py 的 retry_count —tests—> test_config.py,先取相关邻域,再用执行检验。

OpenHands(前 OpenDevin,ICLR 2025)代表平台侧:为编码 agent 提供沙盒、浏览与执行环境的开放平台,已是 SWE-bench 榜单头部系统的常用底座。

产业对照面是 Claude Code 官方最佳实践:把开发者工作流总结为探索 - 计划 - 编码 - 提交,配权限模式约束。

与本讲的连接

本篇下钻的是伴读笔记第四节「编码智能体」里那段 while 循环。笔记给骨架,本篇补三样东西:

  • 一圈的内部结构:localize–edit–verify
  • 循环的对手:Agentless 的固定流水线
  • 循环的燃料:工具集与编辑格式

quiz 若考 Agentless 为什么不要循环、ACI 的三件事,答案分别在 p.37 与 SWE-agent 论文,资料卡 m3-swe-agent 有摘录。

上半场那句「计划是假说不是承诺」,在编码领域落地成「测试是假说的证伪器」。同一个 GPT-4 Turbo,SEARCH/REPLACE 完成 20%,简化统一 diff 完成 61%,中间只隔一个编辑格式的选择。

本节论文与规范

本节资料

  • 经典·高引(2024)、L6 p.37 主线论文。不给 LLM 决策权:分层定位-修复-验证三阶段固定流水线,SWE-bench Lite 32.00%(96 个修复)、单题 $0.70,同时优于所有开源 agent。「最简单的架构赢」对 agent 热的又一次校准。

  • Best practices for Claude Code 文章入门官方引用

    官方最佳实践文档(2025)。Claude Code 的探索-计划-编码-提交工作流、权限模式与 Plan Mode 实践——L5 p.4 所引 Claude Code permission modes 的展开,编码 agent 工具集讨论的产业对照。

  • 经典·高引(ICLR 2025)。前 OpenDevin,为编码 agent 提供沙盒、浏览与执行环境的开放平台,已成为 SWE-bench 榜单头部系统的常用底座。「环境与平台也是编码 agent 竞争力」的证据。

  • 经典·高引(NeurIPS 2024)、L6 p.33 教学图出处。提出 agent-computer interface(ACI):简洁编辑反馈、防呆护栏、改完即 lint;SWE-bench pass@1 12.5%、HumanEvalFix 87.7% 双 SOTA(2024 时点)。「把工具可用性当一等研究对象」的起点。

AI 生成 · 仅供参考,与课程方无关。选中正文里的任何一段也能直接问我(解释一下 / 举个例子)。

本详解以 CMU 11-768 AI Agents (Fall 2026) 课程大纲为参考框架独立撰写,AI 辅助起草、人工抽审。 涉及的官方课件、论文与课程材料版权归原所有方,讲义为站内镜像、其余外链原文出处; 观点与文字(除标注引用外)为作者原创。