系列文章索引
LangChain教程 - 系列文章
在构建复杂的对话系统和智能助手时,我们常常会遇到多步骤决策问题。例如,一个用户询问当前天气,并希望系统能推荐适合的户外活动。这就需要系统能够逐步推理 并动态调用工具,不仅仅给出直接答案,还能灵活地在外部资源之间进行调度。这类需求可以通过 ReAct(Reasoning and Acting)框架来实现,今天我们将使用 LangChain 来创建一个这样的智能助手。
什么是 ReAct 框架?
ReAct 框架,即 Reasoning and Acting(推理和行动),是一种让模型在处理复杂任务时通过推理逐步制定行动决策的模式。ReAct 让模型能够:
- 推理:逐步理解任务需求,制定行动计划。
- 行动:在每个步骤中调用所需的工具(如 API、数据库),并基于反馈继续推理。
这种模式尤其适合用于构建智能助手、问答系统等复杂应用,能让模型根据上下文灵活选择下一步操作。
使用 LangChain 实现 ReAct 风格的智能助手
LangChain 是一个优秀的语言模型应用开发框架,它提供了丰富的工具调用、代理 (Agent) 和任务链功能,非常适合用于 ReAct 框架的实现。在本文中,我们将使用 LangChain 创建一个简单的智能助手,帮助用户查询天气并推荐户外活动。具体流程如下:
- 接收用户查询,识别出需要的操作。
- 使用天气查询工具获取指定位置的天气数据。
- 根据天气数据推荐适合的户外活动。
代码实现步骤
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"])
代码说明
-
工具定义 :首先,我们定义了天气查询和活动推荐的工具函数。这些函数被封装为
Tool
对象,供模型在生成回答时调用。 -
Prompt 模板:设计 Prompt 模板,引导模型逐步推理和行动,按 ReAct 框架处理用户请求。
-
初始化代理 :使用
initialize_agent
创建 LangChain 的代理,并设置为AgentType.ZERO_SHOT_REACT_DESCRIPTION
,使模型具备 ReAct 风格的推理和行动能力。 -
执行查询:用户输入查询,代理根据 ReAct 模式逐步推理并调用工具,最终生成详细的回答。
总结
通过 LangChain 和 ReAct 框架,我们可以构建具备推理与行动能力的智能助手,让其能够逐步分解复杂任务并动态调用工具,为用户提供更智能的服务。本文的示例代码展示了如何利用 LangChain 来构建这样一个智能系统,并集成 OpenAI 的聊天模型,实现动态的多步骤决策。这种设计不仅适用于查询天气和推荐活动,还可以扩展到其他复杂应用场景,比如技术支持、知识问答、甚至是自动化任务执行。
在未来的应用中,ReAct 框架的推理和行动特性将使得智能助手和对话系统更加灵活智能,进一步提升用户体验。希望这篇博客能为您带来新的灵感,让我们期待未来更多基于 ReAct 的创新应用!