LangChain教程 - 创建 ReAct 风格智能代理

系列文章索引
LangChain教程 - 系列文章

在构建复杂的对话系统和智能助手时,我们常常会遇到多步骤决策问题。例如,一个用户询问当前天气,并希望系统能推荐适合的户外活动。这就需要系统能够逐步推理动态调用工具,不仅仅给出直接答案,还能灵活地在外部资源之间进行调度。这类需求可以通过 ReAct(Reasoning and Acting)框架来实现,今天我们将使用 LangChain 来创建一个这样的智能助手。

什么是 ReAct 框架?

ReAct 框架,即 Reasoning and Acting(推理和行动),是一种让模型在处理复杂任务时通过推理逐步制定行动决策的模式。ReAct 让模型能够:

  1. 推理:逐步理解任务需求,制定行动计划。
  2. 行动:在每个步骤中调用所需的工具(如 API、数据库),并基于反馈继续推理。

这种模式尤其适合用于构建智能助手、问答系统等复杂应用,能让模型根据上下文灵活选择下一步操作。

使用 LangChain 实现 ReAct 风格的智能助手

LangChain 是一个优秀的语言模型应用开发框架,它提供了丰富的工具调用、代理 (Agent) 和任务链功能,非常适合用于 ReAct 框架的实现。在本文中,我们将使用 LangChain 创建一个简单的智能助手,帮助用户查询天气并推荐户外活动。具体流程如下:

  1. 接收用户查询,识别出需要的操作。
  2. 使用天气查询工具获取指定位置的天气数据。
  3. 根据天气数据推荐适合的户外活动。

代码实现步骤

1. 创建工具函数

首先,我们定义两个模拟工具函数:一个用于获取天气,另一个用于根据天气条件推荐活动。

python 复制代码
# 创建用于天气查询和活动推荐的模拟函数
def get_weather(location):
    """模拟天气查询工具函数"""
    return "晴朗,温度 25°C"  # 假设返回晴朗天气

def suggest_outdoor_activities(weather):
    """基于天气推荐户外活动"""
    if "晴朗" in weather:
        return "推荐进行远足、骑行或野餐。"
    else:
        return "不推荐户外活动,建议在室内进行活动。"

在真实环境中,这些函数可以替换为调用实际的 API,例如天气数据 API。

2. 将函数封装为 LangChain 工具

接下来,我们将这两个函数封装为 LangChain 的 Tool 对象。这些工具将允许模型在生成回答时按需调用。

python 复制代码
from langchain import Tool

# 将函数封装成 LangChain 工具
weather_tool = Tool(
    name="Weather Query",
    func=lambda location: get_weather(location),
    description="根据位置查询当前天气情况。"
)

activity_tool = Tool(
    name="Activity Suggestion",
    func=lambda weather: suggest_outdoor_activities(weather),
    description="根据天气情况推荐适合的活动。"
)
3. 构建 Prompt 模板

Prompt 是引导模型生成正确回答的重要部分。在这里,我们将 Prompt 模板设计成按 ReAct 的推理与行动步骤处理用户查询。

python 复制代码
from langchain.prompts import PromptTemplate

# 构建 Prompt 模板,用于指导模型逐步推理和行动
prompt_template = PromptTemplate(
    input_variables=["query"],
    template="""
你是一个智能助手,用户向你查询户外活动的建议。
首先,查询用户位置的天气情况,然后基于天气推荐适合的活动。
如果天气适合户外活动,推荐户外活动;如果不适合,则建议室内活动。
用户的请求:{query}
"""
)
4. 初始化 LLM 并创建代理

我们选择 OpenAI 的 gpt-3.5-turbo 作为语言模型,并使用 LangChain 提供的 ChatOpenAI 类,以确保正确调用聊天模型的 API。此外,我们使用 initialize_agent 初始化一个 ReAct 风格的代理,使其能够根据用户请求自动选择合适的工具。

python 复制代码
from langchain.chat_models import ChatOpenAI
from langchain import LLMChain
from langchain.agents import initialize_agent, AgentType

# 初始化 Chat 模型
llm = ChatOpenAI(model="gpt-3.5-turbo")

# 创建 LangChain 任务链
chain = LLMChain(llm=llm, prompt=prompt_template)

# 初始化代理,设置为 ReAct 风格
agent = initialize_agent(
    tools=[weather_tool, activity_tool],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # 设置为 ReAct 风格
    verbose=True
)
5. 测试 ReAct 智能助手

现在,我们可以测试这个 ReAct 风格的智能助手。用户输入查询后,代理将根据多步骤推理和行动流程逐步完成查询和推荐活动。

python 复制代码
# 用户查询
query = "帮我查询纽约的天气,并推荐适合的活动。"

# 使用代理处理查询
response = agent({"input": query})

print(response["output"])
预期输出

假设天气查询结果为"晴朗,温度 25°C",则最终输出可能如下:

复制代码
纽约的天气是晴朗,温度 25°C,适合户外活动。推荐进行远足、骑行或野餐。

整体代码实例

python 复制代码
import getpass
import os

from langchain_openai import ChatOpenAI
from langchain import OpenAI, LLMChain
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.prompts import PromptTemplate

os.environ["OPENAI_API_KEY"] = getpass.getpass()

# 创建用于天气查询和活动推荐的模拟函数
def get_weather(location):
    """模拟天气查询工具函数"""
    # 假设返回晴朗天气
    return "晴朗,温度 25°C"

def suggest_outdoor_activities(weather):
    """基于天气推荐户外活动"""
    if "晴朗" in weather:
        return "推荐进行远足、骑行或野餐。"
    else:
        return "不推荐户外活动,建议在室内进行活动。"

# 将函数封装为 LangChain 工具
weather_tool = Tool(
    name="Weather Query",
    func=lambda location: get_weather(location),
    description="根据位置查询当前天气情况。"
)

activity_tool = Tool(
    name="Activity Suggestion",
    func=lambda weather: suggest_outdoor_activities(weather),
    description="根据天气情况推荐适合的活动。"
)

# 初始化语言模型 (可以使用 OpenAI 或其他 LLM)
llm = ChatOpenAI(model="gpt-4")

# 构建 Prompt 模板,用于指导模型逐步推理和行动
prompt_template = PromptTemplate(
    input_variables=["query"],
    template="""
你是一个智能助手,用户向你查询户外活动的建议。
首先,查询用户位置的天气情况,然后基于天气推荐适合的活动。
如果天气适合户外活动,推荐户外活动;如果不适合,则建议室内活动。
用户的请求:{query}
"""
)

# 创建 LangChain 任务链
chain = LLMChain(llm=llm, prompt=prompt_template)

# 初始化代理,设置为 ReAct 风格
agent = initialize_agent(
    tools=[weather_tool, activity_tool],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,  # 设置为 ReAct 风格
    verbose=True
)

# 用户查询
query = "帮我查询纽约的天气,并推荐适合的活动。"

# 使用代理处理查询
response = agent({"input": query})

print(response["output"])

代码说明

  1. 工具定义 :首先,我们定义了天气查询和活动推荐的工具函数。这些函数被封装为 Tool 对象,供模型在生成回答时调用。

  2. Prompt 模板:设计 Prompt 模板,引导模型逐步推理和行动,按 ReAct 框架处理用户请求。

  3. 初始化代理 :使用 initialize_agent 创建 LangChain 的代理,并设置为 AgentType.ZERO_SHOT_REACT_DESCRIPTION,使模型具备 ReAct 风格的推理和行动能力。

  4. 执行查询:用户输入查询,代理根据 ReAct 模式逐步推理并调用工具,最终生成详细的回答。

总结

通过 LangChain 和 ReAct 框架,我们可以构建具备推理与行动能力的智能助手,让其能够逐步分解复杂任务并动态调用工具,为用户提供更智能的服务。本文的示例代码展示了如何利用 LangChain 来构建这样一个智能系统,并集成 OpenAI 的聊天模型,实现动态的多步骤决策。这种设计不仅适用于查询天气和推荐活动,还可以扩展到其他复杂应用场景,比如技术支持、知识问答、甚至是自动化任务执行。

在未来的应用中,ReAct 框架的推理和行动特性将使得智能助手和对话系统更加灵活智能,进一步提升用户体验。希望这篇博客能为您带来新的灵感,让我们期待未来更多基于 ReAct 的创新应用!

相关推荐
谁在黄金彼岸10 分钟前
构建一个多Agent系统(Multi-Agent System, MAS)方法论
人工智能
pandafeeder15 分钟前
Agent工具调用范式:ReAct 和Function Calling
人工智能
jinanwuhuaguo15 分钟前
OpenClaw字节跳动的三只不同的claw龙虾飞书妙搭 OpenClaw、ArkClaw、扣子 OpenClaw 核心区别深度解析
人工智能·语言模型·自然语言处理·visual studio code·openclaw
咚咚王者23 分钟前
人工智能之语言领域 自然语言处理 第十八章 Python NLP生态
人工智能·python·自然语言处理
yeflx24 分钟前
三维空间坐标转换早期笔记
人工智能·算法·机器学习
zzh9407724 分钟前
Gemini 3.1 Pro 2026年国内使用指南:技术解析与镜像站实测
人工智能
初学大模型24 分钟前
基于三层架构的自动驾驶系统设计:环境建模、标准驾驶与风险调制
人工智能
●VON24 分钟前
半小时从零开发鸿蒙记事本应用:AI辅助开发实战
人工智能·华为·harmonyos
特立独行的猫a28 分钟前
ESP32小智AI的WebSocket 调试工具实现,小智AI后台交互过程揭秘(一、开篇介绍 )
人工智能·websocket·网络协议·esp32·小智ai
qq_3975623132 分钟前
卷积神经网络 CNN
人工智能·神经网络·cnn