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. 创建工具函数

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

# 创建用于天气查询和活动推荐的模拟函数
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 osfrom langchain_openai import ChatOpenAI
from langchain import OpenAI, LLMChain
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.prompts import PromptTemplateos.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 的创新应用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因:镜像服务器地址不可用。 2.可用地址 编辑daemon.json: vi /etc/docker/daemon.json内容修改如下: {"registry-mirrors": ["https://…

【MySQL】深层理解索引及特性(重点)--下(12)

索引(重点) 1. 索引的作用2. 索引操作2.1 主键索引2.1.1 主键索引的特点2.1.2 创建主键索引 2.2 唯一键索引2.2.1 唯一键索引的特点2.2.2 唯一索引的创建 2.3 普通索引2.3.1 普通索引的特点2.3.2 普通索引的创建 2.4 全文索引2.4.1 全文索引的作用2.4.2 …

临街矩阵乘以自己转置的含义

总结: 临街矩阵* 邻接矩阵转置的(i,j) 位置表示有多少种线路从元素A跳转一条边最终落到元素j的路线. 这个也叫1_degree.

A010-基于SpringBoot的宠物健康咨询系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

DP3复现基础知识(一)—— Hydra 库

DP3 无论是 train 还是 eval 均使用了 Hydra 这一个python 库,这就有些代码在看的时候难以理解其通讯逻辑,例如: hydra.main(version_baseNone,config_pathstr(pathlib.Path(__file__).parent.joinpath(diffusion_policy_3d, config)) ) Hy…

记单词,不要迷信一种方法

记单词,不要迷信一种方法。因为,记单词的目的,就是记住单词呀。 哪一种方法能让你记住,快速、高效、长久地记住,你就使用哪种方法;而且,方法和方法之间,不见得是矛盾的呀。 我们举个…

【自动化利器】12个评估大语言模型(LLM)质量的自动化框架

LLM评估是指在人工智能系统中评估和改进语言和语言模型的过程。在人工智能领域,特别是在自然语言处理(NLP)及相关领域,LLM评估具有至高无上的地位。通过评估语言生成和理解模型,LLM评估有助于细化人工智能驱动的语言相…

IO流篇(一、File)

目录 一、学习前言 二、文件简介 三、文件使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 属性(字段) 4. 构造方法 5. 常用方法 5.1. 获取文件的相关信息 5.2. 判断功能 5.3. 新建和删除 5.4. 文件的获取 5.5. 重命名文件 四、文件使用练习…

spring ai 入门 之 结构化输出 - 把大模型llm返回的内容转换成java bean

目录 ​编辑 将AI非结构化文本转换为特定格式数据的应用场景说明 Spring AI 介绍 :为Java开发者打造的AI应用开发框架 Qwen 介绍 : 一个国内领先的开源大模型 Spring AI Alibaba框架介绍 : 一个国内最好的spring ai实现 使用spring ai …

文心一言 VS 讯飞星火 VS chatgpt (383)-- 算法导论24.5 3题

三、对引理 24.10 的证明进行改善,使其可以处理最短路径权重为 ∞ ∞ ∞ 和 − ∞ -∞ −∞ 的情况。引理 24.10(三角不等式)的内容是:设 G ( V , E ) G(V,E) G(V,E) 为一个带权重的有向图,其权重函数由 w : E → R w:E→R w:E→R 给出&…

漫途焊机安全生产监管方案,提升安全生产管理水平!

随着智能制造时代的到来,企业安全生产管理的重要性日益凸显。特别是在现代工厂中,焊机的安全生产监管成为了一个不容忽视的重要环节。传统的焊机安全生产监管方式存在诸多不足,如人工巡检频率低、数据延迟、安全隐患发现不及时等问题。因此&a…

csp2024T3

题目大意:对于每个数而言,可以将其染成红或蓝,对于每一个数,定义其贡献为,当且仅当这个数最近的同色数与其相等,否则其贡献为0,求最大贡献和。 思路:考虑dp 1.考场20多分钟想的奇怪…

十六届蓝桥杯嵌入式资料 看这个就够了(附CSDN开源程序)

蓝桥杯嵌入式终极模板,简单配置,功能全面 一小时玩转蓝桥杯嵌入式开发版 除按键和 LED 其余模块都来自官方选手资料包 代码简洁工整,参数,函数体分模块,有非常详细的注释,初始化由 cubemx 生成 &#xff08…

【测试工具】Fastbot 客户端稳定性测试

背景 做这个主要为了发版之前提前发现崩溃,风险前置。适合客户端很重的业务。 优点:你不改动也能用, 维护成本不高。 缺点:容易进入H5页面无法返回,效果有限。 备注:我这边接手别人维护,公司…

苍穹外卖Bug集合

初始化后端项目运行出现以下问题 以上报错是因为maven和jdk版本不符合,需要将jdk改成17,mavne改成3.9.9

中国雕塑、

孙溟㠭浅析“印章” 印章又称“图章”,玺印起源商代,至少在春秋战国时已出现,因战国时代已普遍使用。 商玺 古玺是先秦印章的通称,秦始皇统一六国之后,皇帝用印称“璽(玺)”&…

Android App 技能在DuerOS的调试方法

温故知新,我们先回顾一下DuerOS的技能分类。根据不同的视角可以对DuerOS 目前支持的技能类型进行不同的分类,例如,从用户与技能的语音交互方式来看, 可以将技能分为这四种技能类型: L1技能:只支持语音的打开和关闭L2技…

Ghidra无头模式(自动化批处理执行重复性任务)

Ghidra无头模式(自动化批处理执行重复性任务) 与Ghidra GUI探索单个项目中的单个文件不同,Ghidra headless analyzer(Ghidra无头分析器)更加适合批处理和用脚本控制Ghidra。 (一)启动analyzeHea…

ES海量数据插入如何优化性能?

2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》,探讨了大模型赋能下的研发变革及如何在公司和行业中落地,AI原生研发新范式的内涵和推动经验。 …

el-date-picker日期选择器动态设置日期

需求&#xff1a;选择开始时间&#xff0c;或者在开始时间已存在的情况下&#xff1b;结束时间下拉日期选择框展示从开始日期展示&#xff1b;而不是当前日期&#xff0c;并且结束时间下拉框日期要禁用开始时间之前的日期。 <el-form-item label"开始时间" prop&q…