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 的创新应用!

相关推荐
奔跑中的小象4 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南4 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang4 小时前
LangGraph 状态机实战
人工智能
刹那芳华19924 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作4 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门4 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜4 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟4 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能
天国梦5 小时前
自习室智能化升级避坑指南:天学网AI智习室方案实测与选型建议
大数据·人工智能