Agent Loop

智能体循环

思考 → 行动 → 观察 → 判断是否结束——所有 Agent 的核心循环。

详解

Agent Loop 是所有 Agent 系统的底层执行引擎,逻辑极为简单:模型思考当前状态 → 决定采取一个行动(通常是调用工具)→ 观察行动结果 → 再次思考,直到模型判断任务已完成或达到最大步数。循环的每一轮都至少有一次模型调用,工具调用结果作为新的观察值被追加到对话历史,让模型在下一轮基于真实反馈调整决策。这和纯粹的单次问答有本质区别:单次问答模型只能靠训练时的知识生成答案;Agent Loop 让模型每一步都能获得来自真实世界的反馈,从而自我纠错。循环的终止条件通常有两种:模型输出终止信号(stop_reason == "end_turn" 且无工具调用),或超出最大步数限制(防止死循环)。步数上限是工程上必须设置的安全阀——没有它,出错的 Agent 可能无限循环消耗 token。

一个类比
像厨师做菜:看菜谱(思考)→ 切菜下锅(行动)→ 尝一口看味道(观察)→ 再决定要不要加盐(下一步思考)。不是一口气把所有步骤想清楚再动手,而是每做一步都根据实际情况调整,直到觉得味道对了为止。
举个例子
# 最小 Agent Loop:while 循环 + 工具调用 + 终止判断
import anthropic

client = anthropic.Anthropic()

tools = [{
    "name": "calculator",
    "description": "执行数学计算,如加减乘除",
    "input_schema": {
        "type": "object",
        "properties": {"expression": {"type": "string", "description": "数学表达式"}},
        "required": ["expression"]
    }
}]

def run_calculator(expression: str) -> str:
    """真实工具执行"""
    try:
        return str(eval(expression))  # 生产环境应用沙箱
    except Exception as e:
        return f"计算错误: {e}"

def agent_loop(user_question: str, max_steps: int = 10) -> str:
    messages = [{"role": "user", "content": user_question}]

    for step in range(max_steps):           # 安全阀:最多 10 步
        resp = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            tools=tools,
            messages=messages
        )

        if resp.stop_reason == "end_turn":  # 模型决定任务完成,退出循环
            return resp.content[0].text

        # 模型选择调工具 → 执行 → 追加观察值
        tool_call = next(b for b in resp.content if b.type == "tool_use")
        result = run_calculator(tool_call.input["expression"])
        print(f"步骤 {step+1}: 计算 {tool_call.input['expression']} = {result}")

        messages += [
            {"role": "assistant", "content": resp.content},
            {"role": "user", "content": [{
                "type": "tool_result",
                "tool_use_id": tool_call.id,
                "content": result
            }]}
        ]

    return "超出最大步数,任务未完成"

print(agent_loop("123 乘以 456 等于多少?结果再加上 789?"))
PYTHON 示例
相关概念