去年十月,我给 Claude 分配了一个相当无聊的任务:"搭建一个 WordPress REST API 包装器(PHP),为其编写 PHPUnit 测试,运行它们,修复任何失败的部分。"我通过本地 Claude 工具使用设置给了它访问我的终端的权限,然后走开泡茶去了。十二分钟后回来。测试全部通过。我得到了一个工作的包装器,覆盖率达到 94%,还有一个小的内联注释,其中 Claude 捕捉到了我在简介中没有提到的边界情况。我站在 Bermondsey 的厨房里,真的感到不安。
这就是代理开发。不是自动补全,不是更聪明的 Stack Overflow。一个能够推理目标、选择下一个行动、执行它、观察结果并循环直到完成的模型。它正在改变我在 Seahawk Media 运行项目的方式,速度几乎比过去九年中的任何事都快。
"代理"实际上是什么意思(以及不是什么)
让我们精确一点,因为这个词经常被随意使用。代理 AI 循环有三样东西:一个目标、一组工具,以及基于刚刚发生的事情决定接下来要做什么的能力。模型不仅仅是在生成文本。它在行动、观察和重新规划。
它不是魔法。模型仍然可能产生幻觉,生成错误的函数签名。它可能把自己陷入循环,七次都做同样的错误修复。它可能在第一步误解你的目标,然后自信地朝错误方向构建十步。我看过所有这些。有一次,在一个 React 仪表板项目中,Claude 花了大约二十分钟添加越来越复杂的空值检查,去解决一个实际上是缺少 await 的问题。那是我的错,我给了它一个模糊的初始规范。
对实践者来说重要的区分:狭义的代理任务优于开放式的任务。"编写并测试一个能处理阿拉伯文、日文和emoji的slug清理函数"是一个很好的代理任务。"给我构建一个SaaS"不是。把范围控制紧凑,否则你花在审查错误方向上的时间会比直接写代码还多。
我正在使用的实际技术栈
工具在这里至关重要。没有正确的脚手架,"代理Claude"就只是一个聊天窗口。
我在Seahawk当前的设置:
- [Claude API](https://www.anthropic.com/api)配合工具使用,特别是computer_use测试版和自定义bash/文件系统工具
- Cursor作为IDE层,将Claude 3.5 Sonnet设置为后端模型
- pytest / PHPUnit / Jest取决于项目,因为Claude需要一个确定性的信号来循环。没有测试输出,它就是瞎蒙。
- 一个简短的系统提示词,告诉Claude项目结构是什么、编码规范是什么,重要的是,如果它即将在指定目录外创建新文件,要停下来问一下。
最后这个约束听起来很小。但它不是。代理模型如果认为能达成目标,会欣然搭建整个新模块。文件系统的护栏帮我避免了好几次"这是从哪来的?"的时刻。
有一样东西我不使用:大多数工作中的多代理编排框架。LangChain、AutoGen、CrewAI,它们确实很有趣,但对于个人开发者或小型代理公司来说,配置代理之间通信的开销通常不值得。一个范围良好的Claude循环胜过三个范围不清的代理互相嚷嚷。
我是如何安排一个值得循环执行的任务
这是我在今年进行了200多次智能体会话后确定的方法。给模型一个包含四个要素的任务概述:
- 目标,具体、可测试、足够小,能在30步以内完成
- 起始状态,哪些文件存在,哪些测试已经通过
- 成功条件,通常是"所有测试都绿色"或必须生成的特定函数签名
- 停止条件,"如果你尝试了相同的修复超过三次,停止并解释你为什么卡住了"
第四个要素被严重低估了。没有它,Claude有时会永远循环下去。不是真的永远,但我见过它在一个复杂的正则表达式问题上进行18次尝试,每次都略有不同,都不正确,从不停下来说"我不确定"。明确告诉它表达困惑实际上是Anthropic的模型规范在讨论该模型处理不确定性的方式时提到的,但在实践中,你仍然需要为此进行提示。
回到2022年,一个客户让我们完成一项工作,即从一个遗留的Magento安装迁移14,000个产品列表到WooCommerce。那时Claude还没有做智能体循环,所以我们在两周内手工编写了迁移脚本。今天同样的工作?我会写一个严格的规范,交给Claude,让它能读取Magento数据库模式和写入到一个WooCommerce测试实例,然后让它运行。我真的认为我们会在两天内完成。这就是差异。
Claude令人惊讶的优势之处
重构现有代码
这是我印象最深刻的地方。给它一个混乱的400行类,让它重构以遵循单一职责原则,然后让它作为检查点运行自己的单元测试。它在整个文件中保持上下文的能力超出了我的预期,对于不破坏已通过的测试也表现得格外谨慎。输出的架构不一定是我会选择的,但通常都是有理可据的。
为你未曾编写过的代码编写测试
Seahawk 做了很多网站审计和救援工作。我们一直在继承代码库,通常没有任何测试,原始开发者也早已不见踪影。我开始专门使用 agentic Claude 为继承的代码编写测试套件,然后再触碰任何东西。它读取源代码,从函数名称和注释推断意图,编写测试,运行测试,并在出现意外失败时进行调整。上个月它在一个自定义 WooCommerce 订单处理器中发现了一个静默数据损坏漏洞,那个漏洞可能已经存在两年了。没人知道。
磨刀霍霍处理样板代码
REST 端点框架,CRUD 迁移,管理面板表单。那些乏味的东西,一个称职的开发者需要花一个下午,但没人喜欢做。Claude 在这方面很快也很一致,一致性实际上正是样板代码所需要的。它不会发挥创意,不会疲劳,它只是模式匹配你现有的代码并扩展它。
哪里出了问题
说实话,失败之处很有启发意义。以下是我最常遇到的:
- 大型代码库上的上下文窗口溢出。Claude 3.5 Sonnet 有 200k 令牌的上下文窗口,听起来巨大,但当你给它输入一个包含 40 个文件的完整 WP 插件时就不那么大了。它开始忘记会话早期看到的东西。解决方案:用明确的检查点把任务分解成更小的循环。
- 对不该有信心的事情充满信心。Claude 会修复一个数据库查询,运行测试,测试通过,然后报告成功,但该查询现在变得微妙地效率更低,因为它用子查询替换了一个索引友好的 WHERE 子句。它解决了明确的问题,却制造了一个隐含的问题。代码审查仍然很重要。
- 工具权限蔓延。如果你给它 bash 访问权限而不加以限制,它会为你没有要求的包运行 npm install,或者更糟的是,发起一个你没有批准的网络请求。这不是恶意的,而是模型在做看起来很有帮助的事情。在开始前设置好你的工具权限,而不是在奇怪的事情发生后才设置。
安全提示:如果你要针对与生产数据相连的任何东西运行代理循环,请先阅读 Anthropic 自己的工具使用安全指南。篇幅不长,能救你一个坏日子。
代理行为提示 vs. 聊天行为提示
提示模型是不同的,这会让人困惑。在聊天环境中你是对话式的、迭代的、来回互动的。在代理环境中初始提示是一份规范文档。你不会在任务进行中澄清问题。
使代理提示有效的方法:
- 先说约束条件,不是最后说。大多数人会把约束埋在最后。
- 告诉它不要做什么。"不要修改 /src/utils 之外的任何文件"比十行正面指示更有用。
- 给它一个逃脱通道。"如果你到达了一个决策点,继续进行需要改变数据库架构,停下来并写一份摘要说明原因。"
- 明确引用测试运行器命令。"每次更改后运行 ./vendor/bin/phpunit tests/,并使用输出来指导你的下一步。"
框架转变是:你在为一个非常有能力但无法提问的承包商写简报。所以要像这样写。
自主权刻度盘:让它运行多少
这是我从其他代理公司老板那里最常听到的问题。你要全程盯着它,还是放任不管?
我一年的实践经验是这样的:完全取决于这些操作的可逆性。只读研究、测试编写、搭建到新目录里,就让它跑。任何涉及活跃数据库、修改包清单或与外部API交互的东西,要每隔几步就检查一下,或至少在它执行前读一遍计划。
ReAct提示模式(来自2022年Yao等人论文的Reason + Act)值得理解。它本质上就是你给Claude工具时它在内部做的事:大声思考要做什么,去做,读结果,再想一遍。让这个推理过程可见化,让Claude在每个操作前打印出计划,这样就给你一个自然的审查点,而不会打断流程。
我开始像对待初级开发者的PR那样对待Claude的逐步推理输出。我快速扫一眼。如果有什么看起来不对劲,我就介入。如果看起来合理,我就让它继续。这个思维模型对我很有效。
常见问题
Agentic Claude真的为客户工作做好了生产环境的准备吗?
对于非生产环境中的具体、明确的任务:是的,绝对可以。我定期使用它来处理项目的搭建、重构和测试编写阶段。对于任何涉及实时客户数据库或外部支付API的东西,我在每个执行步骤都保持人工参与。模型是有能力的;风险在于一个错误的影响范围,而不是模型本身。
Agentic Claude和直接用Cursor或GitHub Copilot有什么区别?
Cursor和Copilot是内联代码建议和聊天界面。它们对你的输入做出反应。Agentic Claude接收一个目标,自己执行多步计划,使用终端、文件系统或网络浏览器等工具。这是自动完成引擎和能够独立运行十分钟后完成任务的流程之间的区别。
我需要懂代码才能使用这个吗?
你需要足够的上下文来编写一份连贯的规范,并批判性地审查输出。如果你看不懂差异并判断出这个改动是否有意义,你会陷入困境。代理型AI放大能力。它不会替代基础能力。
我应该用哪个Claude模型来做代理循环?
Claude 3.5 Sonnet是我目前的默认选择。它在推理质量和速度之间找到了很好的平衡,这在你按令牌付费且跨越30步循环的情况下很重要。Claude 3 Opus在非常复杂的推理任务上表现更好,但速度更慢、成本更高,我用它来做大型任务的初始规划步骤,然后把执行工作交给Sonnet。
---
我一直回到的一点是,代理型开发其实不是AI替代开发者。而是改变了开发者时间的价值。去年十月我没有花在编写PHP包装器上的那十二分钟,我花在思考架构上了。这笔交易我每次都愿意做。
