28. LangChain——Agent的ReAct框架
本帖最后由 糖逗 于 2026-3-9 12:23 编辑1. 什么是ReAct?
Agent ReAct是大模型智能体的核心思考与行动框架,全称Reasoning+Acting(推理+行动),是让Agent像人类一样「思考问题→制定策略→执行行动→验证结果」的关键逻辑。
ReAct是一种工作范式,定义了大模型的工作流程。
2. 代码实战
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# ================= 2. 定义工具 =================
@tool(description="获取体重,返回值是整数,单位千克")
def get_weight() -> int:
return 90
@tool(description="获取身高,返回值是整数,单位厘米")
def get_height() -> int:
return 172
# ================= 3. 初始化模型 =================
llm = ChatOpenAI(
model="qwen-max",
temperature=0,
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# ================= 4. 定义 Prompt (保留你的 ReAct 要求) =================
prompt = ChatPromptTemplate.from_messages([
("system", """你是严格遵循ReAct框架的智能体,必须按「思考→行动→观察→再思考」的流程解决问题,
且**每轮仅能思考并调用1个工具**,禁止单次调用多个工具。
并告知我你的思考过程,工具的调用原因,按思考、行动、观察三个结构告知我"""),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# ================= 5. 创建 Agent 和执行器 =================
agent = create_tool_calling_agent(llm=llm, tools=, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=, verbose=False)
# ================= 6. 流式输出 (适配 ReAct 格式打印) =================
print("--- 开始 ReAct 流式推理 ---\n")
for chunk in agent_executor.stream({"input": "计算我的BMI"}):
# 1. 思考与行动阶段:Agent 决定调用工具
if "actions" in chunk:
for action in chunk["actions"]:
# 这里的 action.log 通常包含了模型的思考过程
print(f"💡 **思考**:我需要先获取用户的身体数据才能计算BMI。")
print(f"⚙️ **行动**:决定调用工具 `{action.tool}`")
print(f" 📥 参数:{action.tool_input}\n")
# 2. 观察阶段:工具返回结果
elif "steps" in chunk:
for step in chunk["steps"]:
print(f"👁️ **观察**:工具返回结果 -> {step.observation}\n")
# 3. 最终总结阶段
elif "output" in chunk:
print(f"🧠 **最终思考/答案**:{chunk['output']}")
首先,让我们了解一下ReAct框架。ReAct(Reasoning + Acting)是LangChain中智能体(Agent)的核心框架,它模拟人类解决问题的过程:先思考(推理),再行动(调用工具),最后观察结果并总结。这使得Agent能够动态地使用工具来完成复杂任务。
接下来,我将修正您提供的代码,并解释关键步骤。原始代码中存在几个问题,例如Prompt定义不完整、工具未正确传递等。以下是修正后的版本:
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
# 设置API密钥(请替换为您的实际密钥)
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 定义工具
@tool(description="获取体重,返回值是整数,单位千克")
def get_weight() -> int:
return 90
@tool(description="获取身高,返回值是整数,单位厘米")
def get_height() -> int:
return 172
tools = # 将工具放入列表
# 初始化模型
llm = ChatOpenAI(
model="qwen-max",
temperature=0,
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 定义Prompt,包含ReAct框架的指导
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手,使用ReAct框架来解决问题。先思考再行动,最后总结。"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")# 用于放置Agent的中间步骤
])
# 创建Agent和执行器
agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)
# 流式输出,模拟ReAct过程
print("--- 开始 ReAct 流式推理 ---\n")
for chunk in agent_executor.stream({"input": "计算我的BMI"}):
# chunk是一个字典,根据LangChain的流式输出结构处理
if "actions" in chunk:
action = chunk["actions"]# 假设只有一个动作
print(f"思考:我需要先获取用户的身体数据才能计算BMI。")
print(f"行动:决定调用工具 {action.tool}")
print(f" 参数:{action.tool_input}\n")
elif "steps" in chunk:
step = chunk["steps"]
print(f"观察:工具返回结果 -> {step.observation}\n")
elif "output" in chunk:
print(f"最终答案:{chunk['output']}")
关键解释:
1. ReAct流程:Agent接收到用户输入后,会先推理(如确定需要调用哪些工具),然后行动(执行工具调用),最后观察结果并生成最终输出。
2. 工具定义:使用 @tool 装饰器定义了两个工具 get_weight 和 get_height,它们返回固定值用于演示。
3. Prompt设计:Prompt中包含了系统消息(指导Agent使用ReAct框架)和用户输入占位符。 MessagesPlaceholder 用于在对话中插入Agent的中间思考步骤。
4. 流式输出: agent_executor.stream 方法返回一个迭代器,每个chunk代表ReAct的一个阶段。我们根据chunk的键来打印对应的思考、行动、观察和最终答案。
5. 注意:在实际使用中,请替换API密钥和模型参数,并确保工具逻辑符合您的需求。此代码是一个简化示例,实际流式输出结构可能因LangChain版本而异,建议查阅官方文档。
通过这个框架,Agent可以更智能地处理任务,例如计算BMI时自动调用工具获取数据。如果您有更多问题,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]