系列文章索引
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. 创建工具函数

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

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

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

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

2. 将函数封装为 LangChain 工具

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

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 的推理与行动步骤处理用户查询。

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 风格的代理,使其能够根据用户请求自动选择合适的工具。

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 风格的智能助手。用户输入查询后,代理将根据多步骤推理和行动流程逐步完成查询和推荐活动。

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

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

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

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

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

整体代码实例

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部