LangGraph 进阶:构建 ReACT 架构的智能 Agent
引言
在人工智能和大语言模型(LLM)快速发展的今天,如何构建高效、灵活的智能 Agent 成为了一个热门话题。LangGraph 作为一个强大的工具,为我们提供了一种新的方式来实现复杂的 AI 工作流,特别是在构建 ReACT(Reasoning and Acting)架构的智能 Agent 方面表现出色。本文将深入探讨如何使用 LangGraph 来实现 ReACT 架构,并提供详细的代码示例和解释。
LangGraph 的基本概念
LangGraph 是一个用于构建基于 LLM 的应用程序的 Python 框架。它的核心理念是将复杂的 AI 工作流程表示为一个状态图(State Graph),其中包含节点、边和数据状态。这种方法使得我们可以更直观地设计和实现智能 Agent 的行为逻辑。
在 LangGraph 中,我们可以使用基础组件(节点、边、数据状态)来构建 Agent,这也是 LangGraph 自由度高的一个重要优点。同时,LangGraph 还提供了一些预构建的代理,如 ReACT 智能体和工具调用智能体,使得我们可以更快速地创建 Agent。
状态图的优势
与传统的线性链式调用不同,状态图允许循环和条件分支。这意味着 Agent 可以根据执行结果动态调整后续步骤,例如在搜索失败时重试,或者根据用户反馈修正行动路径。这种灵活性对于处理真实世界的不确定性任务至关重要。
ReACT 架构简介
ReACT(Reasoning and Acting)是一种智能 Agent 架构,它结合了推理和行动的能力。在 ReACT 架构中,Agent 通过不断地思考(Reasoning)、采取行动(Acting)和观察结果(Observing)来解决问题。这种方法使得 Agent 能够更灵活地应对复杂的任务,并且可以利用外部工具来增强其能力。
ReACT 的核心在于让大模型自己决定何时调用工具以及何时直接回答问题。这种机制减少了幻觉的产生,因为模型可以通过实际的工具输出来验证自己的推理。
使用 LangGraph 实现 ReACT 架构
现在,让我们通过一个具体的例子来看看如何使用 LangGraph 实现 ReACT 架构的智能 Agent。
1. 环境设置
首先,我们需要导入必要的库和模块。确保已安装 langchain, langgraph, python-dotenv 等依赖包。
import dotenv
from langchain_community.tools import GoogleSerperRun
from langchain_community.tools.openai_dalle_image_generation import OpenAIDALLEImageGenerationTool
from langchain_community.utilities import GoogleSerperAPIWrapper
from langchain_community.utilities.dalle_image_generator import DallEAPIWrapper
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
from langgraph.prebuilt.chat_agent_executor import create_react_agent
dotenv.load_dotenv()
2. 定义工具和参数模式
接下来,我们定义了两个工具:Google 搜索和 DALL-E 图像生成。同时,我们也为这些工具定义了参数模式,以便大模型能准确理解输入要求。
class GoogleSerperArgsSchema(BaseModel):
query: str = Field(description="执行谷歌搜索的查询语句")
class DallEArgsSchema(BaseModel):
query: str = Field(description="输入应该是生成图像的文本提示(prompt)")
google_serper = GoogleSerperRun(
name="google_serper",
description=(
"一个低成本的谷歌搜索 API。"
"当你需要回答有关时事的问题时,可以调用该工具。"
"该工具的输入是搜索查询语句。"
),
args_schema=GoogleSerperArgsSchema,
api_wrapper=GoogleSerperAPIWrapper(),
)
dalle = OpenAIDALLEImageGenerationTool(
name="openai_dalle",
api_wrapper=DallEAPIWrapper(model="dall-e-3"),
args_schema=DallEArgsSchema,
)
tools = [google_serper, dalle]
3. 创建语言模型
我们使用 OpenAI 的 GPT-4o-mini 模型作为我们的大语言模型。温度设置为 0 以确保输出的稳定性。
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
4. 使用预构建函数创建 ReACT 智能体
LangGraph 提供了预构建的函数来创建 ReACT 智能体,使用起来非常简单。这大大降低了开发门槛。
agent = create_react_agent(
model=model,
tools=tools
)
5. 调用智能体并输出内容
最后,我们可以调用我们创建的智能体,并打印输出结果。这里测试了一个多模态任务:绘制图片。
print(agent.invoke({"messages": [("human", "帮我绘制一幅鲨鱼在天上飞的图片")] }))
运行结果分析
当我们运行这段代码时,智能体会首先理解任务需求,然后决定使用 DALL-E 工具来生成图像。它会生成一个详细的图像描述,然后调用 DALL-E API 来创建图像。最后,它会返回生成的图像 URL,并提供一个简短的描述。
输出内容可能如下所示:
{
'messages': [
HumanMessage(content='帮我绘制一幅鲨鱼在天上飞的图片'),
AIMessage(content='', additional_kwargs={'tool_calls': [...]}),
ToolMessage(content='https:
AIMessage(content='这是您请求的画面:一只鲨鱼在天上飞翔的图片。您可以点击下面的链接查看这幅图。\n\n,并在必要时对上下文进行压缩。
尽管如此,LangGraph 的核心设计理念和封装思路仍然非常值得学习和借鉴。随着 AI 技术的不断进步,我们可以期待 LangGraph 在未来会提供更多强大和易用的功能,进一步简化智能 Agent 的开发过程。