一、什么是langgraph的ReAct
LangGraph 中的 ReAct(Reasoning + Acting)代理是一种结合推理与行动能力的 AI 代理架构,通过动态决策链实现复杂任务处理。以下是其核心要点及实践指南。
1、ReAct 代理的核心原理
1.1 工作流程 :
ReAct 代理通过循环迭代完成任务:
推理(Reason) :模型分析输入和历史上下文,生成思考步骤。
行动(Act) :选择工具并调用,或直接响应用户。
观察(Observe) :工具返回结果作为新输入,循环直至输出最终响应
1.2 技术优势
动态决策 : 基于状态图(State Graph)管理节点和边,支持循环和条件分支。
透明可控: 开发者可干预执行流程(如中断节点),调试更便捷。
多轮对话支持: 通过检查点(Checkpointer)持久化状态,实现长上下文记忆
2、典型应用场景
2.1 RAG 增强检索
结合路由机制,动态选择向量库检索或网络搜索(如 Tavily API),并通过评分器过滤无关结果。
2.2 多工具协作
例如:用户查询 → 搜索工具 → 数学计算工具 → 生成综合响应。
2.3实时交互系统
客服机器人中处理多轮对话,保留历史上下文。
二、langgraph的ReAct应用示例
在本节中,我们将创建一个简单的 ReAct 代理应用程序,该应用程序可以检查天气。该应用程序由一个代理(LLM)和工具组成。当我们与应用程序交互时,我们将首先调用代理(LLM)来决定是否应该使用工具。然后我们将运行一个循环
1.如果代理说要采取行动(即调用工具),我们将运行工具并将结果传递回代理
2.如果代理没有要求运行工具,我们将结束(应用户)
预构建的代理 :
请注意,这里我们将使用预构建的代理。LangGraph 的一大优势是你可以轻松创建自己的代理架构。因此,虽然从这里开始快速构建代理是不错的选择,但我们强烈建议你学习如何构建自己的代理,这样你就可以充分利用LanqGraph。
下面是代码示例:
# 首先我们初始化我们想要使用的模型。
from langchain_openai import ChatOpenAI
import os
apiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(
api_key=apiKey, # 请替换成您的ModelScope SDK Token
base_url="https://api-inference.modelscope.cn/v1/",
model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool
# 定义一个工具函数 get_weather,它根据城市名称返回预定义的天气信息
@tool
def get_weather(city: Literal["武汉", "长沙"]):
"""Use this to get weather information."""
if city == "武汉":
return "很热"
elif city == "长沙":
return "不想告诉你"
else:
raise AssertionError("未知的城市名")
# 将工具放入一个列表中
tools = [get_weather]
# 导入 create_react_agent 函数,用于创建 REACT 代理
from langgraph.prebuilt import create_react_agent
# 使用指定的模型和工具创建 REACT 代理
graph = create_react_agent(model, tools=tools)
# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent.png", "wb") as f:
f.write(graph_png)
# 定义一个函数用于打印流数据
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
# 使用需要工具调用的输入运行应用程序
inputs = {"messages": [("user", "长沙的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values"))
# 尝试一个不需要工具的问题
inputs = {"messages": [("user", "如何学AI")]}
print_stream(graph.stream(inputs, stream_mode="values"))
inputs = {"messages": [("user", "深圳的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values"))
inputs = {"messages": [("user", "武汉的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values"))
上面代码生成的流程图如下:

上面代码我们分别问了四个问题,对应的输出如下:
================================ Human Message =================================
长沙的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_2db5e20f75474d5489225b)
Call ID: call_2db5e20f75474d5489225b
Args:
city: 长沙
================================= Tool Message =================================
Name: get_weather
不想告诉你
================================== Ai Message ==================================
很抱歉,无法获取当前长沙的天气信息。请稍后再试。
================================ Human Message =================================
如何学AI
================================== Ai Message ==================================
学习人工智能(AI)是一个多步骤的过程,涉及理论知识的学习和实践技能的培养。以下是一些基本的建议,帮助你开始你的AI学习之旅:
**数学基础**:AI依赖于大量的数学概念,包括线性代数、微积分、概率论和统计学。这些数学知识对于理解机器学习算法的工作原理至关重要。
**编程技能**:Python是目前最常用的AI编程语言,因为它有许多强大的库和框架支持,如TensorFlow、PyTorch、Scikit-learn等。熟悉Python编程语言及其相关库对于AI开发非常重要。
**机器学习基础**:机器学习是AI的一个重要分支,它使计算机能够从数据中自动学习和改进。了解监督学习、无监督学习、强化学习等概念以及相关的算法,如线性回归、决策树、神经网络等。
**深度学习**:深度学习是机器学习的一个子领域,它使用人工神经网络来模拟人脑处理信息的方式。学习深度学习可以帮助你理解如何构建和训练复杂的模型来解决更复杂的问题。
**数据处理与分析**:学会如何清洗、转换和分析数据,因为这在AI项目中是非常重要的步骤。掌握数据可视化技术也很有帮助,它可以帮助你更好地理解和展示数据。
**项目实践**:理论学习固然重要,但实际操作经验同样不可或缺。尝试参与一些AI项目,比如图像识别、自然语言处理等,通过实践来巩固所学知识。
**持续学习**:AI领域发展迅速,新的技术和方法不断涌现。保持对新技术的关注,并持续学习,对于在AI领域取得成功至关重要。
**加入社区**:加入AI相关的论坛、小组或者参加线下活动,与其他学习者和专业人士交流,可以让你获得更多的资源和支持。
**阅读文献**:阅读最新的研究论文和技术文章,可以帮助你了解行业趋势和前沿技术。
**动手实验**:利用在线平台(如Kaggle、Google Colab等)进行实验和练习,可以快速验证你的想法,并提高解决问题的能力。
通过以上步骤,你可以逐步建立起扎实的AI知识体系,并具备一定的实践能力。记住,学习AI是一个长期且持续的过程,保持好奇心和耐心是非常重要的。
================================ Human Message =================================
深圳的天气怎么样
================================== Ai Message ==================================
目前`get_weather`工具仅支持查询武汉和长沙的天气信息。如果您需要查询深圳的天气,建议使用其他天气预报服务。
================================ Human Message =================================
武汉的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_6cf152a8605f46d6a74cc5)
Call ID: call_6cf152a8605f46d6a74cc5
Args:
city: 武汉
================================= Tool Message =================================
Name: get_weather
很热
================================== Ai Message ==================================
武汉今天的天气很热。
向 ReAct 代理添加记忆
我们可以简单的 将记忆存储到内存中,当然也可以存储到其他中间件中,比如redis、mongo等其他介质。要启用内存,我们只需要将 checkpointer 传递给create react agents。
代码示例如下:
# 首先我们初始化我们想要使用的模型。
from langchain_openai import ChatOpenAI
import os
apiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(
api_key=apiKey, # 请替换成您的ModelScope SDK Token
base_url="https://api-inference.modelscope.cn/v1/",
model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool
# 定义一个工具函数 get_weather,它根据城市名称返回预定义的天气信息
@tool
def get_weather(city: Literal["武汉", "长沙"]):
"""Use this to get weather information."""
if city == "武汉":
return "很热"
elif city == "长沙":
return "不想告诉你"
else:
raise AssertionError("未知的城市名")
# 将工具放入一个列表中
tools = [get_weather]
# 导入 create_react_agent 函数,用于创建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
memory =MemorySaver()
# 使用指定的模型和工具创建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory)
# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent.png", "wb") as f:
f.write(graph_png)
# 定义一个函数用于打印流数据
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
# 使用需要工具调用的输入运行应用程序
config = {"configurable": {"thread_id": "1"}}
inputs = {"messages": [("user", "武汉的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
inputs = {"messages": [("user", "怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
打印内容如下:
================================ Human Message =================================
武汉的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_21d7ec337ddb4a3382b9c1)
Call ID: call_21d7ec337ddb4a3382b9c1
Args:
city: 武汉
================================= Tool Message =================================
Name: get_weather
很热
================================== Ai Message ==================================
武汉今天的天气非常热。
================================ Human Message =================================
怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_dd70f99943ef40acbe2ce4)
Call ID: call_dd70f99943ef40acbe2ce4
Args:
city: 武汉
================================= Tool Message =================================
Name: get_weather
很热
================================== Ai Message ==================================
武汉今天的天气非常热。
由上面打印我们可以知道,第二个问题没有指明具体的问题,但是模型还是回答了,说明他具备了记忆功能。
向 ReAct 代理添加系统提示
本教程将展示如何向预构建的 ReAct 代理添加自定义系统提示。
代码示例如下:
# 首先我们初始化我们想要使用的模型。
from langchain_openai import ChatOpenAI
import os
apiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(
api_key=apiKey, # 请替换成您的ModelScope SDK Token
base_url="https://api-inference.modelscope.cn/v1/",
model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool
# 定义一个工具函数 get_weather,它根据城市名称返回预定义的天气信息
@tool
def get_weather(city: Literal["武汉", "长沙"]):
"""Use this to get weather information."""
if city == "武汉":
return "很热"
elif city == "长沙":
return "不想告诉你"
else:
raise AssertionError("未知的城市名")
# 将工具放入一个列表中
tools = [get_weather]
# 导入 create_react_agent 函数,用于创建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
#添加内存存储
memory =MemorySaver()
# 我们可以在这里添加系统提示
prompt = "请用繁体字回答"
# 使用指定的模型和工具创建 REACT 代理
# 使用指定的模型、工具和状态修改器(系统提示)创建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory,prompt=prompt)
# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-prompt.png", "wb") as f:
f.write(graph_png)
# 定义一个函数用于打印流数据
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
# 使用需要工具调用的输入运行应用程序
config = {"configurable": {"thread_id": "1"}}
inputs = {"messages": [("user", "武汉的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
inputs = {"messages": [("user", "怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
打印结果如下:
================================ Human Message =================================
武汉的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_044f77360fa14deca3390e)
Call ID: call_044f77360fa14deca3390e
Args:
city: 武汉
================================= Tool Message =================================
Name: get_weather
很热
================================== Ai Message ==================================
武漢的天氣很熱。
================================ Human Message =================================
怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_c3752beac3e34751a980d4)
Call ID: call_c3752beac3e34751a980d4
Args:
city: 武漢
================================= Tool Message =================================
Name: get_weather
Error: 1 validation error for get_weather
city
Input should be '武汉' or '长沙' [type=literal_error, input_value='武漢', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
Please fix your mistakes.
================================== Ai Message ==================================
輸入的城市名稱有誤,請輸入「武漢」或「長沙」。
从上面的打印,我们知道提示词已生效。
向 ReAct 代理添加人机交互
本教程将演示如何向预构建的 ReAct 代理添加人机交互环过程,主要是在工具执行前进行中断,interrupt_before=["tools"]。
代码示例如下:
# 首先我们初始化我们想要使用的模型。
from langchain_openai import ChatOpenAI
import os
apiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(
api_key=apiKey, # 请替换成您的ModelScope SDK Token
base_url="https://api-inference.modelscope.cn/v1/",
model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool
# 定义一个工具函数 get_weather,它根据城市名称返回预定义的天气信息
@tool
def get_weather(city: Literal["武汉", "长沙"]):
"""Use this to get weather information."""
if city == "武汉":
return "很热"
elif city == "长沙":
return "不想告诉你"
else:
raise AssertionError("未知的城市名")
# 将工具放入一个列表中
tools = [get_weather]
# 导入 create_react_agent 函数,用于创建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
memory =MemorySaver()
# 使用指定的模型和工具创建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory, interrupt_before=["tools"])
# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-hl.png", "wb") as f:
f.write(graph_png)
# 定义一个函数用于打印流数据
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
# 使用需要工具调用的输入运行应用程序
config = {"configurable": {"thread_id": "1"}}
inputs = {"messages": [("user", "武汉的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
# # 获取图的状态快照
snapshot = graph.get_state(config)
# 打印下一步信息
print("Next step: ", snapshot.next)
# 打印后续流输出
print_stream(graph.stream(None, config, stream_mode="values"))
上面代码打印结果如下:
================================ Human Message =================================
武汉的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_40adb899316d45e2bf14a0)
Call ID: call_40adb899316d45e2bf14a0
Args:
city: 武汉
Next step: ('tools',)
================================== Ai Message ==================================
Tool Calls:
get_weather (call_40adb899316d45e2bf14a0)
Call ID: call_40adb899316d45e2bf14a0
Args:
city: 武汉
================================= Tool Message =================================
Name: get_weather
很热
================================== Ai Message ==================================
武汉今天的天气非常热。
将最后几行代码注释掉后:
# 首先我们初始化我们想要使用的模型。
from langchain_openai import ChatOpenAI
import os
apiKey = os.environ.get("MODELSCOPE_SDK_TOKEN")
model = ChatOpenAI(
api_key=apiKey, # 请替换成您的ModelScope SDK Token
base_url="https://api-inference.modelscope.cn/v1/",
model="Qwen/Qwen2.5-Coder-32B-Instruct"
)
from typing import Literal
from langchain_core.tools import tool
# 定义一个工具函数 get_weather,它根据城市名称返回预定义的天气信息
@tool
def get_weather(city: Literal["武汉", "长沙"]):
"""Use this to get weather information."""
if city == "武汉":
return "很热"
elif city == "长沙":
return "不想告诉你"
else:
raise AssertionError("未知的城市名")
# 将工具放入一个列表中
tools = [get_weather]
# 导入 create_react_agent 函数,用于创建 REACT 代理
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
memory =MemorySaver()
# 使用指定的模型和工具创建 REACT 代理
graph = create_react_agent(model, tools=tools, checkpointer=memory, interrupt_before=["tools"])
# 将生成的图片保存到文件
graph_png = graph.get_graph().draw_mermaid_png()
with open("create_react_agent-hl.png", "wb") as f:
f.write(graph_png)
# 定义一个函数用于打印流数据
def print_stream(stream):
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
# 使用需要工具调用的输入运行应用程序
config = {"configurable": {"thread_id": "1"}}
inputs = {"messages": [("user", "武汉的天气怎么样")]}
print_stream(graph.stream(inputs, stream_mode="values",config=config))
# # 获取图的状态快照
# snapshot = graph.get_state(config)
# # 打印下一步信息
# print("Next step: ", snapshot.next)
#
# # 打印后续流输出
# print_stream(graph.stream(None, config, stream_mode="values"))
当我们把后面几行代码注释掉后,执行结果如下:
================================ Human Message =================================
武汉的天气怎么样
================================== Ai Message ==================================
Tool Calls:
get_weather (call_f9aaf3002f664cd5b05157)
Call ID: call_f9aaf3002f664cd5b05157
Args:
city: 武汉
Process finished with exit code 0
由上面对比,可知人机交互效果已实现。