当前位置: 首页 > news >正文

title: 用 LangChain 构建基于资料库的问答机器人(四):通过代理使用外部工具

上一篇教程我们介绍了 ReAct 系统,这是一个非常强大的行为模式,但它需要编写大量的示例来告诉 LLM 如何思考、行动,并且为了遵循这个模式,还需要编写代码来分析生成文字、调用函数、拼接 prompt 等,这些工作都是十分繁琐且冗长的。而 LangChain 帮我们把这些步骤都隐藏起来了,将这一系列动作都封装成 “代理”,我们只需要提供有那些工具可以使用,以及这些工具的功能,就可以让 LLM 自动完成这些工作了。这样我们的代码就会变得简洁、易读,并且拥有更高的灵活性。

代理(Agent)

所谓代理,就是将一系列的行为和可以使用的工具封装起来,让我们可以通过一个简单的接口来调用这些动作,而不需要关心这些动作是如何完成的。这样可以让我们的代码更简洁、易读,并且拥有更高的灵活性。接下来我们就结合 ReAct 和向量数据库来介绍代理的使用。

准备工作

和之前一样,我们先设置环境变量。

# set the environment variables needed for openai package to know to reach out to azure
import osos.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint.openai.azure.com/"
os.environ["OPENAI_API_KEY"] = "your AzureOpenAI key"
os.environ["OPENAI_API_VERSION"] = "2023-03-15-preview"

接下来我们先把 llm 类创建好。

from langchain.chat_models import AzureChatOpenAI
from langchain.embeddings import OpenAIEmbeddin Whether to return only outputs in theresponse. If True, only new keys generated by this chain will bereturned. If False, both input keys and new keys generated by thischain will be returned. Defaults to False.gsllm = AzureChatOpenAI(deployment_name="gpt-35-turbo", temperature=0)
embeddings = OpenAIEmbeddings(deployment="text-embedding-ada-002", chunk_size=1)

因为我们的向量数据库已经在之前的教程中创建好了,所以我们用 from_existing_index 直接连接到数据库。这里 index_name 是我们之前创建数据库时指定的名字。另外不同的数据库所使用的链接方法可能不同,具体还是要参考各个数据库的文档。

from langchain.vectorstores.redis import Redisrds = Redis.from_existing_index(embeddings, redis_url="redis://localhost:6379", index_name="link"
)
retriever = rds.as_retriever()

创建工具

虽然代理可以让 llm 使用外部工具,但我们首先要创建工具,并为工具编写描述。我们的目的是为了要能够让 llm 根据问题从数据库中检索出答案,因此我们创建的工具一定是与此相关的。我们可以将检索器的搜索功能包装成一个函数,然后以此作为工具,但我们完全可以用之前教程中所介绍的 RetrievalQA Chain ,它的输出本就是字符串,而且已经先将相关的资料进行了整理,这显然比检索器更高效。

from langchain.chains import RetrievalQAqa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

然后用 Tool 将上面创建的 Chain 包装起来。其中 func 参数是告诉代理系统要调用哪个函数,description 是对这个工具的描述。我们将包装好的工具放在一个列表中,这样就是告诉系统他可以使用的工具有哪些了。

from langchain.agents import Tooltools = [Tool(name="Contract QA System",func=qa.run,description="useful for when you need to answer questions about contracts.")
]

创建代理

我们用 initialize_agent 函数来创建代理。这里 agent 参数是告诉系统我们要创建的代理类型,这里我们创建的是 CHAT_ZERO_SHOT_REACT_DESCRIPTION,名字中的 CHAT 表示这是一个聊天代理,因为我们用的是聊天模型;ZERO_SHOT 表示它的 prompt 没有编写示例,而是仅通过描述来引导 llm 的行为。

agent_chain = initialize_agent(tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

然后用 run 方法来运行代理。

agent_chain.run("在什么情况下可以单方面解除合同?")
> Entering new  chain...
Thought: This question is asking about the circumstances under which a contract can be unilaterally terminated.Action:
\```
{"action": "Contract QA System","action_input": "在什么情况下可以单方面解除合同?"
}
\```Observation: 根据文本,可以单方面解除合同的情况包括:- 在承担国家重大科研项目期间;
- 掌握重大科技成果关键技术和资料,未脱离保密期;
- 被审查期间或因经济问题未作结案处理之前;
- 合同订立时所依据的客观情况发生重大变化,致使合同无法履行,经甲乙双方协商不能就变更合同达成协议的;
- 甲方提出解除本合同,乙方同意解除的;
- 乙方患病或者非因工负伤,医疗期满后,不能从事原工作也不能从事由甲方安排的其他工作,甲方单方面解除本合同的;
- 乙方年度考核或者聘期考核不合格,又不同意甲方调整其工作岗位的;
- 在试用期内被证明不符合本岗位要求;
- 连续旷工超过 10 个工作日或者 1 年内累计旷工超过 20 个工作日的;
...Final Answer: 根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。> Finished chain.'根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。'

这样我们很容易的完成 ReAct 的流程,并且它确实可以从资料源中检索出答案。用 LangChain 我们就可以用简洁的代码完成如此复杂的任务,并且也不需要编写 prompt,这样我们就可以更专注于业务的逻辑了。

相关文章:

title: 用 LangChain 构建基于资料库的问答机器人(四):通过代理使用外部工具

上一篇教程我们介绍了 ReAct 系统&#xff0c;这是一个非常强大的行为模式&#xff0c;但它需要编写大量的示例来告诉 LLM 如何思考、行动&#xff0c;并且为了遵循这个模式&#xff0c;还需要编写代码来分析生成文字、调用函数、拼接 prompt 等&#xff0c;这些工作都是十分繁…...

使用 CSS 自定义属性

我们常见的网站日夜间模式的变化&#xff0c;其实用到了 css 自定义属性。 CSS 自定义属性&#xff08;也称为 CSS 变量&#xff09;是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值&#xff0c;使得样式更易于维护和修改。…...

Unity 性能优化一:性能标准、常用工具

性能标准 推荐耗时&#xff1a; 性能提现到玩家直观感受&#xff0c;就是帧率&#xff0c;为了达到要求的帧率&#xff0c;就要控制CPU的耗时&#xff0c;不同类型的游戏&#xff0c;对帧率要求不一样。下面是推荐耗时&#xff1a; 推荐内存&#xff1a; 避免游戏闪退的重点…...

【http长连接+池化】

参考&#xff1a; https://it.cha138.com/ios/show-49862.html http://blog.chinaunix.net/uid-16480950-id-103597.html https://www.cnblogs.com/kevin-yuan/p/13731552.html https://www.jianshu.com/p/17e9aacca438 一、http长连接和短连接 HTTP协议是无状态的协议&#…...

opencv-20 深入理解HSV 色彩空间(通过指定,标记颜色等来拓展ROI区域)

RGB 色彩空间是一种被广泛接受的色彩空间&#xff0c;但是该色彩空间过于抽象&#xff0c;我们不能够直接通过其值感知具体的色彩。 我们更习惯使用直观的方式来感知颜色&#xff0c;HSV 色彩空间提供了这样 的方式。 通过 HSV色彩空间&#xff0c;我们能够更加方便地通过色调、…...

python调用arcgis功能一例

python调用arcgis功能一例 执行方法&#xff1a; D:\data\python>python test_Select.pywindow11下环境变量设置 此电脑/属性/系统/高级系统设置/高级/环境变量/path path中添加全局目录&#xff1a;C:\Python27\ArcGIS10.4 test_Select.py脚本内容 # Name: Select_Examp…...

Spring MVC 是什么?

一、什么是 Spring MVC&#xff1f; 官方对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web …...

Rust操作MySQL

查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库&#xff1a; chrono 流式查询使用&#xff1a; query_iter 输出到Vec使用&#xff1a; query 映射到结构体使用&#xff1a; query_map 获取单条数据使用&#xff1a; query_first 命名…...

JAVA面试总结-Redis篇章(二)——缓存击穿

JAVA面试总结-Redis篇章&#xff08;二&#xff09; 缓存击穿解决方案一&#xff1a;互斥锁解决方案二&#xff1a;逻辑过期![在这里插入图片描述](https://img-blog.csdnimg.cn/176dfab3e26044a9a730fabea4314e8e.png) 缓存击穿 解决方案一&#xff1a;互斥锁 解决方案二&…...

Spring相关知识点

概述 分层的轻量级的全栈开源框架 展示层SprigMVC 持久层 Spring JDBCTemplate 业务层事务管理 注&#xff1a; 轻量级&#xff1a;API简单 全栈&#xff1a;各层都有相应解决方案 在Spring的体系结构中&#xff0c;由上而下&#xff0c;逐层依赖 Spring相当于是一个粘合剂&…...

Nginx专题--反向代理(未完成)

反向代理   正向代理&#xff1a;如果把局域网外的 Internet 想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问 Internet&#xff0c;则需要通过代理服务器来访问&#xff0c;这种代理服务就称为正向代理。 反向代理&#xff1a;其实客户端对代理是无感知的&…...

什么是搜索引擎?2023 年搜索引擎如何运作?

目录 什么是搜索引擎&#xff1f;搜索引擎的原理什么是搜索引擎爬取&#xff1f;什么是搜索引擎索引&#xff1f;什么是搜索引擎检索?什么是搜索引擎排序&#xff1f; 搜索引擎的目的是什么&#xff1f;搜索引擎如何赚钱&#xff1f;搜索引擎如何建立索引?网页抓取文本处理建…...

Spring系列一:spring的安装与使用

文章目录 &#x1f49e; 官方资料&#x1f34a;Spring5下载&#x1f34a;文档介绍 &#x1f49e;Spring5&#x1f34a;内容介绍&#x1f34a;重要概念 &#x1f49e;快速入门&#x1f34a;Spring操作演示&#x1f34a;类加载路径&#x1f34a;Debug配置&#x1f34a;Spring容器…...

Ubuntu--科研工具系列

翻译系列 pot-desktop github链接: https://github.com/pot-app/pot-desktop 下载deb Releases pot-app/pot-desktop GitHub 安装过程 在下载好的deb目录下打开终端(自动安装依赖) sudo apt install "XXX.deb" &#xff08;后面可以直接托文件到终端&#…...

【压测指南|压力测试核心性能指标及行业标准】

文章目录 压力测试核心性能指标及行业标准指标1&#xff1a;响应时间指标2&#xff1a;吞吐量&#xff08;TPS)指标3&#xff1a;失败率总结&#xff1a; 压力测试核心性能指标及行业标准 在做压力测试时&#xff0c;新手测试人员常常在看报告时倍感压力&#xff1a;这么多性能…...

spark-submit --files

一、原理 spark-submit --files通常用来加载外部资源文件&#xff0c;在driver和executor进程中进行访问 –files和–jars基本相同 二、使用步骤 2.1 添加文件 spark-submit --files file_paths 其中file_paths可为多种方式&#xff1a;file: | hdfs:// | http:// | ftp:// |…...

应该选云服务器还是物理服务器

应该选云服务器还是物理服务器 一、为什么需要云服务器或独立服务器取代共享主机 在最早之前&#xff0c;大多数的网站都是共享主机开始的&#xff0c;这里也包含了云虚拟机。这一类的站点还有其他站点都会共同托管在同一台服务器上。但是这种共享机只适用于小的网站&#xff…...

【iOS】动态链接器dyld

参考&#xff1a;认识 dyld &#xff1a;动态链接器 dyld简介 dyld&#xff08;Dynamic Linker&#xff09;是 macOS 和 iOS 系统中的动态链接器&#xff0c;它是负责在运行时加载和链接动态共享库&#xff08;dylib&#xff09;或可执行文件的组件。在 macOS 系统中&#xf…...

RocketMQ集成Springboot --Chapter1

RocketMQ集成Springboot 三种消息发送方式 生产者 引入依赖 <!--⽗⼯程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><…...

【Unity3D日常开发】Unity3D中比较string字符串的常用方法

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 字符串string的比较有很多方法&#xff0c;比如&#xff1a; …...

vue3+ts+element-plus 之使用node.js对接mysql进行表格数据展示

vue3tselement-plus axiosnode.jsmysql开发管理系统之表格展示 ✏️ 1. 新建一个node项目* 初始化node* 安装可能用到的依赖* 配置文件目录* 添加路由router1. 添加router.js文件&#xff0c;添加一个test目录2. 修改app.js ,引入router&#x1f4d2; 3. 启动并在浏览器打开 * …...

华为eNSP:isis配置跨区域路由

一、拓扑图 二、路由器的配置 1、配置接口IP AR1: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]q AR2: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawe…...

IUPAC和SMILES的相互转换

这种方法只能解决非常简单的转换&#xff0c;更难的SMILES之间应该是无法直接转换&#xff0c;我可能很多人都使用神经网络解决 &#xff0c;暂时还没仔细看&#xff0c;后面再仔细看吧... 简单的转换&#xff1a; import urllib.error import urllib.parse import urllib.re…...

逻辑回归概述

逻辑回归介绍 1. 逻辑回归的应用场景 逻辑回归(Logistic Regression)是机器学习中的 一种分类模型 ,逻辑回归是一种分类算法,虽然名字中带有回归。由于算法的简单和高效,在实际中应用非常广泛 广告点击率是否为垃圾邮件是否患病信用卡账单是否会违约 逻辑回归就是解决二…...

React 框架下自己写一个braft编辑器,然后将编辑器内容展示在网页端

1.首先自己写一个编辑器 输入文字&#xff1b; 支持选择表情&#xff1b; 可添加小程序链接&#xff1b;可添加网页链接&#xff1b;并且可以编辑删除&#xff1b;效果如下 2.输入完毕后&#xff0c;点击文本输入框保存&#xff0c;将便携式内容回显&#xff0c; 渲染时…...

基于DNN深度学习网络的OFDM+QPSK信号检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................. Transmitt…...

学生管理系统-05封装选项卡

一、选项卡的添加 1、在router/index.js修改之前的动态添加二级路由的代码 router.addRoute("homeName",{ path:routeObj.path, component:()=>import(`@/views${routeObj.permission}.vue`), meta:{ name:routeObj.title …...

关于一些C++、Qt、Python方面的术语

杂鱼之前纯粹用python没细致理解过的术语整理一下&#xff0c;常看常新&#xff08; 定义 (Definition)&#xff1a; 定义是指给一个实体分配内存空间&#xff0c;以便在程序中使用。在C和Python中&#xff0c;这个实体可以是变量、函数或类。在C中&#xff0c;定义通常是在声…...

k8s中强制删除pv

K8s 集群内有一个已经不再使用的 PV&#xff0c;虽然已经删除了与其关联的 Pod 及 PVC&#xff0c;并对其执行了删除命令&#xff0c;但仍无法正常删除&#xff0c;一直处于 Terminating 状态&#xff1a; 解决办法&#xff1a; 1. 获取pv信息 kubectl get pv 2. 解除pv锁定 …...

60寸透明屏的透明度怎么样?

60寸透明屏是一种新型的显示屏技术&#xff0c;它具有透明度高、色彩鲜艳、清晰度高等特点&#xff0c;可以广泛应用于商业展示、户外广告、智能家居等领域。 首先&#xff0c;60寸透明屏的透明度高。 透明屏采用了特殊的材料和技术&#xff0c;使得屏幕在显示内容的同时&…...