L3a 你领教了 LangChain 在multi-agent + 编排场景的优势。这一节换另一种真实场景: 让 agent 看代码 → 跑测试 → 改代码 → 再跑测试。同样的 ReAct, 完全不同的复杂度策略——smolagents 的 CodeAgent + docker executor 是这场景天然主场。
建议先读《L3a / Research Agent / 用 真 LangChain 做文献调研》;如果你是跳读,至少先看本章索引与本页 TL;DR。
课程实操闭环,要求你把抽象真正写进代码与运行流程。
L3a 你领教了 LangChain 在 multi-agent + 编排 场景的优势。这一节换 另一种 真实场景: 让 agent 看代码 → 跑测试 → 改代码 → 再跑测试 。 同样的 ReAct, 完全不同的复杂度策略 ——smolagents 的 CodeAgent + docker executor 是这场景 天然主场 。
先判断任务类型,再决定手搓 harness 还是借框架。
课程实操:可运行案例 + 官方 SDK / 仓库。
fizzbuzz.py + 一份 pytest 测试, 让它自己读文件 → 跑测试 → 看错误 → 改代码 → 再跑——直到测试全过。rm -rf / 你都不慌。这是章 2-04 shell 执行讲的"能力 vs 安全"问题的工程解。① 表达力: "读 file, grep 一下, 然后 sed 替换" 用 ReAct 要 3 个 tool_calls + 中间序列化两次。用 CodeAct 一段 Python: data = read_file('x.py'); patches = [l.replace('a','b') for l in data]; write_file('x.py', '\n'.join(patches))——1 步搞定, 还能用 list comprehension 这种 LLM 已经熟悉的语法。CodeAct 论文给出的主结论是:在 API-Bank 和论文自建 benchmark 上,CodeAct 相比常见替代形式可达到 up to 20% higher success rate。至于"更少步骤"这类说法,更适合当作后续框架实践里的经验观察,而不该混记到同一篇论文名下。
② 天然 sandbox 友好: LLM 既然产 Python 代码, sandbox 直接跑 Python 代码就行——不用维护几十个 tool 的 schema。Docker / E2B / Modal 都是现成的 Python 执行环境。
③ 错误反馈天然结构化: code 抛 Exception, sandbox 把 traceback 字符串发回给 LLM——LLM 看 traceback 改代码就跟人类看错误改 bug 是同一个回路。这种"错误 → 改写 → 重试"是 LLM 训练数据里见过几亿次的模式。
我们准备一个有 bug 的 fizzbuzz + 一个 pytest 测试, 然后让 agent 自己修。
def fizzbuzz(n: int) -> str: # BUG: 顺序写反, 15 应当 "FizzBuzz" 但会先匹配 3 = "Fizz" if n % 3 == 0: return "Fizz" if n % 5 == 0: return "Buzz" if n % 15 == 0: return "FizzBuzz" return str(n)
from fizzbuzz import fizzbuzz def test_basic(): assert fizzbuzz(1) == "1" assert fizzbuzz(3) == "Fizz" assert fizzbuzz(5) == "Buzz" assert fizzbuzz(15) == "FizzBuzz" # ↑ 这里会失败 assert fizzbuzz(30) == "FizzBuzz" # ↑ 这里也会失败
$ mkdir buggy && cd buggy $ # 把上面两个文件保存进去 $ docker info # 确认 Docker Desktop 在跑 $ uv pip insta