糖逗 发表于 9 小时前

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']}")


FishC 发表于 9 小时前

首先,让我们了解一下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]
查看完整版本: 28. LangChain——Agent的ReAct框架