8.0
热点
AI SCORE
编程提效2026-08-15 18:24
Agent本质:一个有品味的有界循环
dev.to · AI#Agent#架构#LLM
Editor brief · 编辑速览
作者提出Agent核心设计原则:模型决定做什么,代码控制执行边界;工具结果必须裁剪以防context被耗尽;正交工具数量少比功能重叠好。
我们日常工作中相当大的一部分已经由 AI Agent 执行:研究、代码修改、QA 检查、报告撰写。人们以为这需要一套编排框架,其实它只需要一个循环:
let messages = [system, task];
for (let step = 0; step < MAX_STEPS; step++) {
const res = await llm(messages, TOOLS);
if (res.type === 'text') return res.text; // 模型判定自己已完工
const tool = TOOLS[res.name]; // 不做动态分发
const result = await tool.run(res.args); // 沙箱隔离、权限受控
messages.push(res, clip(result, TOOL_BUDGET)); // 必须截断
}
return escalate(messages); // 永不让循环无限执行
模型决定下一步做什么。代码决定是否做以及做多久。这个分工就是整个设计的全部。
每次都要截断工具结果。 我们的限制大约是 2000 token;完整输出写入磁盘,模型拿到开头、结尾和路径。在限制之前,一条冗长的构建日志就能吃掉整个上下文窗口,让后续会话彻底瘫痪。
几个正交的工具胜过很多精巧的工具。 我们的 Agent 携带六到九个工具,且 schema 严格。每次我们新增一个与现有工具重叠的"便利工具",工具选择准确率就会下降。模型犹豫的地方,恰恰也是人类会犹豫的地方。
MAX_STEPS 是安全属性,不是调参旋钮。 当预算耗尽时,转写记录会被完整地升级给人类。能够无限循环的 Agent 迟早会循环——凌晨 4 点,面对一个限速 API。
转写记录是 JSONL,而 JSONL 是可重放的。 每一步都追加到一份日志中,我们可以针对新模型或修复后的工具重新运行。我们一半的调试工作就是在用今天的代码重放昨天的转写记录。
读取免费,写入要过门禁。 循环可以读取沙箱中的任何内容。部署、删除、支付和出站消息会离开循环,进入与我们的 cron 任务相同的机械门禁。我们不要求模型记住要小心。
换了四个模型之后,这个循环的字节完全相同。周围的一切都在变好。这就是好的抽象边界应有的感觉:变化快的东西被隔离于不能变的东西。