背景:失控的"永动机"
还记得上次小刘那个因为死循环而刷爆信用卡的智能体吗?虽然加了紧急熔断,但杨工知道,那只是"急救",不是"治疗"。
杨工 :"小刘,上次你的Agent之所以失控,是因为你把'思考'和'行动'混成了一锅粥。它想一步登天,结果陷入了无限递归。今天,我们要给它装一个真正的心脏------Agent Loop 四相循环。"
小刘拿出笔记本,准备记录这个来自 Claude Agent SDK (2025-09-29) 的核心秘籍。
第一幕:拆解循环------从"混沌"到"秩序"
杨工在白板上画了一个巨大的闭环箭头,把它切成了四块蛋糕。
杨工 :"听着,一个健康的Agent循环,必须严格拆分为四个阶段:Gather → Action → Verify → Iterate。缺一不可,顺序不能乱。"
1. Gather Context (收集上下文) ------ "观察路况"
小刘 :"这一步是不是就是把Prompt塞给模型?"
杨工 :"不全是。这是信息聚合的时刻。不仅仅是用户的提问,还包括:
- 上一步Action的执行结果(成功还是报错?)。
- 外部工具返回的数据(数据库查到了什么?)。
- 当前的系统状态(内存够吗?文件存在吗?)。
Gather 就是把所有散落在地上的拼图捡起来,拼成一张完整的'当前局势图',再喂给模型。"
2. Take Action (执行动作) ------ "转动方向盘"
小刘 :"然后模型就开始输出了?"
杨工 :"对,模型基于Gather到的信息,决定下一步做什么。是调用搜索工具?是写一段代码?还是直接回答用户?
关键点 :这一步必须是原子化的。一次只做一个明确的动作,不要让它试图在一次输出里完成'查询+分析+总结+写代码'所有事情。动作越单一,越不容易出错。"
3. Verify (验证结果) ------ "检查仪表盘"
小刘 :"模型输出了,不就完了吗?为什么要验证?"
杨工 (敲黑板):"这是最重要的一步!也是你上次失败的原因!模型是会撒谎的,也是会犯错的。
Verify 不是让模型自己问自己'我做得对吗'(那是自欺欺人),而是代码级的硬验证:
- 工具调用的返回码是200还是500?
- 生成的JSON格式合法吗?
- 输出的内容是否包含了敏感词?
如果Verify不通过,绝对不能进入下一步,必须直接打回重做!"
4. Iterate (迭代改进) ------ "修正路线"
小刘 :"如果验证失败了怎么办?"
杨工 :"这就是 Iterate 。把Verify发现的错误(比如'JSON解析失败')作为新的Context,放回第一步 Gather,开始下一轮循环。
这就叫'吃一堑长一智'。模型看到错误反馈,会尝试换一种方式执行。但注意,这个迭代不能无限进行!"
第二幕:带 max_iterations 的"硬刹车"
小刘看着白板上的四个圈,若有所思:"Gather, Action, Verify, Iterate......听起来很完美。但是杨工,万一它一直Iterate,永远验证不通过,岂不是又回到了死循环的老路?"
杨工笑了,他在循环旁边画了一个红色的计数器。
杨工 :"问得好。这就是图里那句最重要的话:带 max_iterations 硬刹车。"
杨工解释道:"无论你的逻辑多完美,都必须假设模型会发疯。
- 你需要设定一个全局变量
current_step = 0。 - 每次进入循环,
current_step + 1。 - 一旦
current_step > max_iterations(比如设为10),强制终止循环 。
不管任务有没有完成,不管模型还在说什么,直接切断电源,返回一个'任务超时'的错误给用户。
这就是驾驭工程 的底线思维:宁可任务失败,不可系统失控。"
尾声:从"玄学"到"工程学"
小刘合上笔记本,看着那个严谨的四相循环图,感慨道:
小刘:"以前我觉得写Agent像是在炼丹,全看模型心情。现在有了这个四相循环,感觉像是在造精密仪器。
- Gather 是传感器;
- Action 是执行器;
- Verify 是质检员;
- Iterate 是修正算法;
- 而 max_iterations 是保险丝。"
杨工 (点头):"没错。这就是 Claude Agent SDK 想要传达的理念。把不可控的AI能力,封装在确定性的工程框架里。只有这样,你的Agent才能从实验室的玩具,变成生产环境的利器。"
这个循环怎么落地,我把这四个阶段整理成了一个伪代码模板,你可以直接参考:
python
# Agent Loop 四相循环伪代码模板
MAX_ITERATIONS = 10 # 硬刹车阈值
def run_agent_loop(user_request):
context = initialize_context(user_request)
step = 0
while step < MAX_ITERATIONS:
step += 1
# 1. Gather Context (收集上下文)
current_state = gather_state(context)
# 2. Take Action (执行动作)
llm_response = call_llm(current_state)
action_result = execute_tool(llm_response.tool_call)
# 3. Verify (验证结果) - 关键!
is_valid = verify_result(action_result)
if is_valid:
return action_result # 成功,退出循环
# 4. Iterate (迭代改进)
# 将错误信息加入上下文,供下一轮使用
context.append({"role": "system", "content": f"Error: {action_result.error}"})
# 触发硬刹车
raise Exception(f"Agent loop exceeded max iterations ({MAX_ITERATIONS})")