5.6 AI Agent智能体架构:ReAct框架与工具调用实现
一、AI Agent概述
AI Agent(智能体)是能够自主规划、调用工具、完成复杂任务的系统。与单纯调用LLM不同,Agent具备"感知-规划-行动-观察"的闭环能力,可结合搜索引擎、数据库、API等工具完成多步任务。
二、ReAct框架
ReAct(Reasoning + Acting)是主流的Agent实现范式:模型交替进行推理(Thought) 与 行动(Action),根据观察(Observation) 决定下一步,直至完成任务。
flowchart TB
A[用户问题] --> B[Thought: 分析问题]
B --> C[Action: 选择工具并调用]
C --> D[Observation: 获取结果]
D --> E{任务完成?}
E -->|否| B
E -->|是| F[最终回答]
三、基于LangChain的ReAct Agent实现
"""
LangChain ReAct Agent + 工具调用
前置: pip install langchain langchain-openai langchain-community python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import Tool
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=os.getenv("OPENAI_API_KEY"))
# 定义工具
def get_weather(city: str) -> str:
data = {"北京": "晴,20-28℃", "上海": "多云,22-30℃"}
return data.get(city, "暂无数据")
tools = [
Tool(name="Weather", func=get_weather, description="查询城市天气,输入为城市名")
]
# ReAct Prompt
prompt = PromptTemplate.from_template("""
你是一个智能助手。可用工具:{tools}
工具说明:{tool_names}
用户问题:{input}
思考:{agent_scratchpad}
""")
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
if __name__ == "__main__":
result = executor.invoke({"input": "北京今天天气怎么样?"})
print(result["output"])
四、ReAct的Prompt结构
4.1 标准格式
ReAct要求模型按固定格式输出:
Thought: [分析当前问题,决定下一步]
Action: [工具名]
Action Input: [工具输入]
Observation: [工具返回结果,由系统填充]
...(重复直至完成)
Thought: 我已得到最终答案
Final Answer: [最终回答]
4.2 工具描述的重要性
描述需清晰说明工具的用途与输入格式。模糊描述会导致模型选错工具或传错参数。示例:
- 差:
"查询天气"→ 模型可能不知道输入是城市名 - 好:
"查询指定城市的天气信息,输入为城市名称,如北京、上海"
4.3 错误处理
工具执行失败时,将错误信息作为Observation返回,模型可据此决定重试、换工具或向用户说明。避免在工具内部吞掉异常。
五、Agent的局限与应对
5.1 无限循环
模型可能反复调用同一工具而不推进。可设置最大步数(如10步),超限则终止并返回当前结果。
5.2 工具选择错误
模型可能选错工具或传错参数。可通过少样本示例、细化description、或在Prompt中增加"若不确定,先询问用户"来改善。
5.3 成本控制
Agent每步都会调用LLM,多步任务成本较高。可对简单问题直接回答,仅复杂问题才启用Agent;或使用更小、更便宜的模型。
六、多工具Agent完整示例
"""
多工具ReAct Agent(天气+时间+计算)
前置: pip install langchain langchain-openai langchain-core python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.prompts import PromptTemplate
from langchain_core.tools import Tool
from datetime import datetime
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.1, api_key=os.getenv("OPENAI_API_KEY"))
def get_weather(city: str) -> str:
data = {"北京": "晴,20-28℃", "上海": "多云,22-30℃"}
return data.get(city, "暂无数据")
def get_time() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def calc(expr: str) -> str:
try:
return str(eval(expr))
except:
return "计算错误"
tools = [
Tool(name="Weather", func=get_weather, description="查询城市天气,输入为城市名"),
Tool(name="Time", func=get_time, description="获取当前日期时间,无需输入"),
Tool(name="Calculator", func=calc, description="计算数学表达式,输入如 1+2*3")
]
prompt = PromptTemplate.from_template("""
你是智能助手。可用工具:{tools}
工具说明:{tool_names}
用户问题:{input}
思考:{agent_scratchpad}
""")
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True, max_iterations=5)
if __name__ == "__main__":
result = executor.invoke({"input": "北京天气怎么样?现在几点了?"})
print(result["output"])
八、与书中 5.4 节「开发 AI Agent」的对应
书中 5.4 节明确:Agent 架构为感知-规划-行动-记忆-反思;ReAct 框架为推理-行动-观察循环;函数调用与工具集成通过 OpenAI Function Calling + LangChain Tools 实现;实战包括自动化办公、数据分析、任务调度 Agent。本节与之一一对应:ReAct 的 Thought/Action/Observation 即「推理-行动-观察」;工具定义与 AgentExecutor 即「工具集成」;多工具示例与局限应对即实战前的必备知识。5.7 节将展开自动化办公与数据分析两类 Agent 的工具设计与提示,本节是其实施基础。开发时若遇到 Agent 频繁选错工具或陷入循环,可先检查各 Tool 的 description 是否清晰、是否包含输入输出说明,再在 Prompt 中增加 1~2 个「用户问题→应选工具→输入」的少样本示例,通常能明显改善。书中 ReAct 与工具调用的完整示例在本节多工具 Agent 代码中已体现,可直接作为业务 Agent 的起点。
九、小结
ReAct + 工具调用是构建实用Agent的核心模式。掌握工具定义、Prompt设计、错误处理与AgentExecutor的配置,即可开发自动化办公、数据分析等复杂应用。下一节将深入自动化办公与数据分析Agent的实战案例。
十、与 2.9 Function Calling、5.3 Memory/Tools 的衔接
2.9 节 Function Calling:OpenAI 原生支持在 ChatCompletion 中传入 functions,模型返回 function_call;LangChain 的 Tool 可对接该机制,由 Agent 将「工具选择与参数」转为 OpenAI 的 function 调用。5.3 节记忆与工具:Agent 常需多轮对话,可给 AgentExecutor 绑定 ConversationBufferMemory,使 Agent 在决策时能看到历史;工具定义方式与 5.3 节一致。与 5.4 RAG 的配合:Agent 可先判断「是否需要查知识库」,需要时调用 RAG 检索工具,再将结果作为 observation 继续推理,形成「Agent + RAG + 工具」的融合方案(见 6.1 节)。开发时若遇到 Agent 频繁选错工具或陷入循环,可先检查各 Tool 的 description 是否清晰、是否包含输入输出说明,再在 Prompt 中增加 1~2 个「用户问题→应选工具→输入」的少样本示例,通常能明显改善。书中 5.4 节「开发 AI Agent」的 ReAct 与工具调用要点在本节已全部可执行化,可直接作为业务 Agent 的起点。
下一节预告:5.7 自动化办公Agent与数据分析Agent开发实战