鱼C论坛

 找回密码
 立即注册
查看: 16|回复: 1

[AI工作流] 28. LangChain——Agent的ReAct框架

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2026-3-9 12:23 编辑

1. 什么是ReAct?
Agent ReAct是大模型智能体的核心思考与行动框架,全称Reasoning+Acting(推理+行动),是让Agent像人类一样「思考问题→制定策略→执行行动→验证结果」的关键逻辑
ReAct是一种工作范式,定义了大模型的工作流程。
下载 (50).png



2. 代码实战
  1. from langchain.agents import create_tool_calling_agent, AgentExecutor
  2. from langchain_openai import ChatOpenAI
  3. from langchain_core.tools import tool
  4. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder



  5. # ================= 2. 定义工具 =================
  6. @tool(description="获取体重,返回值是整数,单位千克")
  7. def get_weight() -> int:
  8.     return 90

  9. @tool(description="获取身高,返回值是整数,单位厘米")
  10. def get_height() -> int:
  11.     return 172

  12. # ================= 3. 初始化模型 =================
  13. llm = ChatOpenAI(
  14.     model="qwen-max",
  15.     temperature=0,
  16.     openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
  17. )

  18. # ================= 4. 定义 Prompt (保留你的 ReAct 要求) =================
  19. prompt = ChatPromptTemplate.from_messages([
  20.     ("system", """你是严格遵循ReAct框架的智能体,必须按「思考→行动→观察→再思考」的流程解决问题,
  21.     且**每轮仅能思考并调用1个工具**,禁止单次调用多个工具。
  22.     并告知我你的思考过程,工具的调用原因,按思考、行动、观察三个结构告知我"""),
  23.     ("human", "{input}"),
  24.     MessagesPlaceholder(variable_name="agent_scratchpad"),
  25. ])

  26. # ================= 5. 创建 Agent 和执行器 =================
  27. agent = create_tool_calling_agent(llm=llm, tools=[get_weight, get_height], prompt=prompt)
  28. agent_executor = AgentExecutor(agent=agent, tools=[get_weight, get_height], verbose=False)

  29. # ================= 6. 流式输出 (适配 ReAct 格式打印) =================
  30. print("--- 开始 ReAct 流式推理 ---\n")

  31. for chunk in agent_executor.stream({"input": "计算我的BMI"}):
  32.    
  33.     # 1. 思考与行动阶段:Agent 决定调用工具
  34.     if "actions" in chunk:
  35.         for action in chunk["actions"]:
  36.             # 这里的 action.log 通常包含了模型的思考过程
  37.             print(f"💡 **思考**:我需要先获取用户的身体数据才能计算BMI。")
  38.             print(f"⚙️ **行动**:决定调用工具 `{action.tool}`")
  39.             print(f"   📥 参数:{action.tool_input}\n")

  40.     # 2. 观察阶段:工具返回结果
  41.     elif "steps" in chunk:
  42.         for step in chunk["steps"]:
  43.             print(f"👁️ **观察**:工具返回结果 -> {step.observation}\n")

  44.     # 3. 最终总结阶段
  45.     elif "output" in chunk:
  46.         print(f"🧠 **最终思考/答案**:{chunk['output']}")
复制代码


本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层
首先,让我们了解一下ReAct框架。ReAct(Reasoning + Acting)是LangChain中智能体(Agent)的核心框架,它模拟人类解决问题的过程:先思考(推理),再行动(调用工具),最后观察结果并总结。这使得Agent能够动态地使用工具来完成复杂任务。

接下来,我将修正您提供的代码,并解释关键步骤。原始代码中存在几个问题,例如Prompt定义不完整、工具未正确传递等。以下是修正后的版本:

  1. from langchain.agents import create_tool_calling_agent, AgentExecutor
  2. from langchain_openai import ChatOpenAI
  3. from langchain_core.tools import tool
  4. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
  5. import os

  6. # 设置API密钥(请替换为您的实际密钥)
  7. os.environ["OPENAI_API_KEY"] = "your-api-key"

  8. # 定义工具
  9. @tool(description="获取体重,返回值是整数,单位千克")
  10. def get_weight() -> int:
  11.     return 90

  12. @tool(description="获取身高,返回值是整数,单位厘米")
  13. def get_height() -> int:
  14.     return 172

  15. tools = [get_weight, get_height]  # 将工具放入列表

  16. # 初始化模型
  17. llm = ChatOpenAI(
  18.     model="qwen-max",
  19.     temperature=0,
  20.     openai_api_base="[url=https://dashscope.aliyuncs.com/compatible-mode/v1",]https://dashscope.aliyuncs.com/compatible-mode/v1",[/url]
  21. )

  22. # 定义Prompt,包含ReAct框架的指导
  23. prompt = ChatPromptTemplate.from_messages([
  24.     ("system", "你是一个智能助手,使用ReAct框架来解决问题。先思考再行动,最后总结。"),
  25.     ("human", "{input}"),
  26.     MessagesPlaceholder(variable_name="agent_scratchpad")  # 用于放置Agent的中间步骤
  27. ])

  28. # 创建Agent和执行器
  29. agent = create_tool_calling_agent(llm=llm, tools=tools, prompt=prompt)
  30. agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)

  31. # 流式输出,模拟ReAct过程
  32. print("--- 开始 ReAct 流式推理 ---\n")

  33. for chunk in agent_executor.stream({"input": "计算我的BMI"}):
  34.     # chunk是一个字典,根据LangChain的流式输出结构处理
  35.     if "actions" in chunk:
  36.         action = chunk["actions"][0]  # 假设只有一个动作
  37.         print(f"[b]思考[/b]:我需要先获取用户的身体数据才能计算BMI。")
  38.         print(f"[b]行动[/b]:决定调用工具 [backcolor=#eee]{action.tool}[/backcolor]")
  39.         print(f"   [b]参数[/b]:{action.tool_input}\n")
  40.     elif "steps" in chunk:
  41.         step = chunk["steps"][0]
  42.         print(f"[b]观察[/b]:工具返回结果 -> {step.observation}\n")
  43.     elif "output" in chunk:
  44.         print(f"[b]最终答案[/b]:{chunk['output']}")
复制代码

关键解释:
1. ReAct流程:Agent接收到用户输入后,会先推理(如确定需要调用哪些工具),然后行动(执行工具调用),最后观察结果并生成最终输出。
2. 工具定义:使用 @tool 装饰器定义了两个工具 get_weightget_height,它们返回固定值用于演示。
3. Prompt设计:Prompt中包含了系统消息(指导Agent使用ReAct框架)和用户输入占位符。 MessagesPlaceholder 用于在对话中插入Agent的中间思考步骤。
4. 流式输出agent_executor.stream 方法返回一个迭代器,每个chunk代表ReAct的一个阶段。我们根据chunk的键来打印对应的思考、行动、观察和最终答案。
5. 注意:在实际使用中,请替换API密钥和模型参数,并确保工具逻辑符合您的需求。此代码是一个简化示例,实际流式输出结构可能因LangChain版本而异,建议查阅官方文档。

通过这个框架,Agent可以更智能地处理任务,例如计算BMI时自动调用工具获取数据。如果您有更多问题,请随时提问!


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-9 15:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表