agent的核心模式
核心模式

所有 AI 编程 Agent 共享同一个循环:调用模型、执行工具、回传结果。生产级系统会在其上叠加策略、权限和生命周期层.。
while True:
response = client.messages.create(messages=messages, tools=tools)
if response.stop_reason != “tool_use”:
break
for tool_call in response.content:
result = execute_tool(tool_call.name, tool_call.input)
messages.append(result)
这段代码非常经典,它展示了现代 AI Agent(智能体) 的核心工作原理,通常被称为 “ReAct”模式(Reasoning + Acting,推理与行动) 或 “Agentic Loop”(代理循环)。
简单来说,这段代码实现了一个**“思考 -> 行动 -> 观察 -> 再思考”的闭环。
通过三个部分来帮助你理解:逐行代码解释、工作流程图解、以及一个具体的通俗例子**。
1. 逐行代码解释
while True:
# 【步骤 1:思考与决策】
# 将当前所有的对话历史和可用的工具列表发给大模型 (LLM)
# 模型会根据指令决定是直接回答用户,还是需要调用工具
response = client.messages.create(messages=messages, tools=tools)
# 【步骤 2:判断是否结束】
# 检查模型停止的原因。如果不是因为"使用工具"而停止,
# 说明模型已经生成了最终答案(比如直接回答了问题),任务完成,跳出循环。
if response.stop_reason != "tool_use":
break
# 【步骤 3:执行行动】
# 如果代码走到这里,说明模型决定使用工具。
# 遍历模型请求调用的所有工具(可能一次调用多个)
for tool_call in response.content:
# 真正执行工具函数,传入模型生成的参数
result = execute_tool(tool_call.name, tool_call.input)
# 【步骤 4:记忆更新】
# 将工具执行的结果追加到对话历史中。
# 这就像告诉模型:“你刚才用的那个工具,运行结果是这个。”
messages.append(result)
2. 核心工作原理图解
Agent 的工作原理可以看作是一个无限循环,直到问题被解决:
- 感知: Agent 看到
messages(用户的问题 + 历史记录)。 - 决策: 大模型“思考”。它有两个选择:
- 直接回答(如果知道答案) -> 循环结束。
- 使用工具(如果需要查天气、搜网页、读文件) -> 进入下一步。
- 行动: 你的代码执行具体的函数(如
get_weather('Beijing'))。 - 观察: 拿到函数返回的结果(如 “北京今天晴,25度”)。
- 反馈: 把结果塞回
messages里。 - 循环: 再次回到第1步。此时模型“看”到了工具的结果,它有了更多信息,可以做出更好的决策(比如生成最终答案,或者觉得信息不够,再调用另一个工具)。
3. 通俗例子:查天气
假设你问 Agent:“北京今天天气怎么样?”
第一轮循环:
- 模型思考: 用户问北京天气。我的知识库是旧的,但我有一个
get_weather工具。我应该调用它。 - 模型输出:
tool_use: get_weather(city='Beijing') - 代码判断:
stop_reason是tool_use,不跳出循环。 - 执行工具: 代码运行
get_weather,假设返回结果是"气温25度,晴"。 - 更新记忆: 把
"气温25度,晴"这个结果放入messages。
第二轮循环: - 模型思考: (此时模型看到了历史记录:用户问天气 -> 我调用了工具 -> 工具返回“气温25度,晴”)。现在我有答案了。
- 模型输出:
stop_reason是end_turn(正常结束),内容是“北京今天天气不错,气温25度,晴天。” - 代码判断:
stop_reason不是tool_use,跳出循环。
最终结果: 你得到了北京天气的答案。
总结
这段代码的核心在于让大模型不仅仅是“说话”,而是能“动手”。
messages是 Agent 的短期记忆。tools是 Agent 的双手。while True循环是 Agent 的执行引擎。
通过这个循环,Agent 就像人类一样,遇到不懂的问题会去查资料(调用工具),查到资料后会回来继续思考(再次调用模型),直到解决问题。
好的,为了让你更深入理解 Agent 如何处理复杂逻辑,我们来看一个包含**“条件判断”和“多步依赖”**的例子。
场景设定:智能投资助手
假设你给 Agent 的指令是:
“帮我查一下英伟达现在的股价。如果超过 800 美元,就给我发一封邮件提示风险;如果低于 800 美元,就直接告诉我价格,不用发邮件。”
在这个场景中,Agent 不能一次性完成任务,它必须先获取信息,根据结果做判断,然后执行不同的后续动作。
可用工具:
get_stock_price(symbol): 查询股价。send_email(to, subject, body): 发送邮件。
循环执行过程演示
🔄 第一轮循环:获取信息
- 模型思考:
用户要查英伟达股价,首先我需要调用查询工具。我还不知道价格,所以现在还不能决定是否发邮件。 - 模型决策:
调用工具get_stock_price,参数symbol="NVDA"。 - 代码执行:
response.stop_reason是"tool_use"-> 不跳出循环。execute_tool运行查询,得到结果:{"price": 850, "currency": "USD"}。messages.append(result):把“股价是850美元”这个事实加入对话历史。
🔄 第二轮循环:逻辑判断与行动
- 模型思考:
(此时模型看到了最新的历史记录:股价是 850 美元)。
用户指令是:“如果超过 800 美元,发邮件”。
850 > 800,条件满足。我需要调用邮件工具。 - 模型决策:
调用工具send_email,参数to="user@example.com",subject="股价预警",body="英伟达股价已涨至850美元,注意风险"。 - 代码执行:
response.stop_reason是"tool_use"-> 不跳出循环。execute_tool发送邮件,返回结果:"Email sent successfully"。messages.append(result):把“邮件发送成功”加入对话历史。
🔄 第三轮循环:生成最终答案
- 模型思考:
(此时模型看到了:股价查到了 -> 邮件也发了)。
所有任务链条都完成了。我现在应该给用户一个最终的回复,告诉他我已经搞定了一切。 - 模型决策:
生成普通文本回复:“我已经查到英伟达目前的股价为 850 美元。由于价格超过了 800 美元,我已经给您发送了风险提示邮件。” - 代码执行:
response.stop_reason是"end_turn"(即不是tool_use)。- 满足跳出条件
break,循环结束。
这个例子为什么“复杂”?
对比之前的天气例子,这个例子展示了 Agent 的两个核心高级能力:
- 动态决策能力:
代码里并没有写死if price > 800的逻辑。这个逻辑完全是大模型理解了自然语言指令后,在运行过程中自己推导出来的。- 如果第一轮查出来的价格是 700 美元,模型在第二轮循环就会直接回答用户,而不会调用
send_email工具。这就是 Agent 的“智能”所在。
- 如果第一轮查出来的价格是 700 美元,模型在第二轮循环就会直接回答用户,而不会调用
- 上下文记忆:
第二轮循环之所以能发生,是因为第一轮循环把结果放进了messages。模型在第二轮时,必须依赖第一轮的产出才能做决定。这展示了messages.append(result)这行代码的关键作用——它在循环中传递了“记忆”。
总结:这段代码为什么强大?
这段代码虽然短,但它把大模型变成了一个状态机:
- State (状态):
messages列表(记录了发生过的一切)。 - Transition (状态转移): 每一次
while循环。 - Logic (逻辑): 隐藏在大模型的神经网络参数里,而不是写死在你的 Python 代码里。
这解释了为什么 Agent 能够处理非常复杂的任务——只要工具箱足够丰富,这个循环就能让 AI 像人一样,一步步完成长链条的任务。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)