LLM大语言模型(四):在ChatGLM3-6B中使用langchain
目录
- 背景
- 准备工作
- 工具添加
- LangChain 已实现工具
- Calculator、Weather Tool配置
- 自定义工具
- 自定义kuakuawo Agent
- 多工具使用
- 参考
背景
LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够:
- 具有上下文意识:将语言模型与上下文源(提示指令,少量示例,基于其响应的内容等)联系起来。
- 推理:依靠语言模型进行推理(关于如何根据提供的上下文进行回答,采取什么行动等)。
相信大家都很熟悉LangChain里很流行的两个概念Chain和Agent,本文将介绍在ChatGLM3-6B里是如何使用LangChain的。
准备工作
进入如下目录: cd langchain_demo
修改模型文件的路径:在 main.py
文件中,修改 model_path = ¥你本地的模型文件路径¥
路径,也可以填写 THUDM/chatglm3-6b
自动下载模型(推荐使用本地模型,如果你能使用魔法当我没说)。
模型下载参考:LLM大语言模型(一):ChatGLM3-6B本地部署
安装依赖:推荐使用conda环境, pip install -r .requirements.txt
工具添加
LangChain 已实现工具
参考 langchain 工具相关函数,在 main.py
中导入工具模块,例如导入 arxiv
工具
run_tool(["arxiv"], llm, ["帮我查询AgentTuning相关工作"
])
Calculator、Weather Tool配置
如果你的 Python 环境中 LangChain
的版本低于 0.0.278
则需要在这两个预定义工具类中实现 _arun
方法
否则将会出现
TypeError: Can't instantiate abstract class Weather with abstract method _arun
示例如下:
class Weather(BaseTool):name = "weather"description = "Use for searching weather at a specific location"async def _arun(self, *args: Any, **kwargs: Any) -> Any:# 用例中没有用到 arun 不予具体实现pass
运行 main.py
文件
python main.py
模型会因找不到 arxiv
工具的 yaml 文件描述而中断,需要用户手动构建 ./Tool/arxiv.yaml
文件。用户可自行添加工具描述,也可以参考 LangChain 对该工具的描述。
对 arxiv
这个例子而言,参考内容位于 ./Tool/arxiv_example.yaml
文件,可参考该文件构建 Tool/arxiv.yaml
文件(最简单的方式修改名称即可),重新运行模型就能合理调用工具。
有些工具需要导入 API_KEY,按照 langchain 报错添加到环境变量即可。
自定义工具
如果用户想自定义工具,可以参考 Tool/Weather.py
以及 Tool/Weather.yaml
文件,重载新的 Tool
类,实现其对应的 _run()
方法,然后在 main.py
中导入该工具模块,例如导入 Weather
工具,即可以调用
# 对同一个工具调用多次
# 需要 export SENIVERSE_KEY=<YOUR_API_KEY_HERE>
run_tool([Weather()], llm, ["今天北京天气怎么样?","What's the weather like in Shanghai today",
])
自定义kuakuawo Agent
参考Weather.py
实现KuaKuaWo.py
import os
from typing import Anyimport requests
from langchain.tools import BaseToolclass KuaKuaWo(BaseTool):name = "kuakuawo"description = "Use for generating a awesome praise for user"def __init__(self):super().__init__()async def _arun(self, *args: Any, **kwargs: Any) -> Any:# 用例中没有用到 arun 不予具体实现passdef get_weather(self, name):return f"{name} 你真的太棒了" # 简单粗暴直接返回def _run(self, para: str) -> str:return self.get_weather(para)if __name__ == "__main__":kuakuawo_tool = KuaKuaWo()kuakuawo_info = kuakuawo_tool.run("张三")print(kuakuawo_info)
生成kuakuawo.yaml
文件
name: kuakuawo
description: Use for generating a awesome praise for user
parameters:type: objectproperties:name:type: stringdescription: User namerequired:- name
在main.py
中导入KuaKuaWo工具
MODEL_PATH = os.environ.get('MODEL_PATH', '¥你的本地模型路径¥')def run_tool(tools, llm, prompt_chain: List[str]):loaded_tolls = []for tool in tools:if isinstance(tool, str):loaded_tolls.append(load_tools([tool], llm=llm)[0])else:loaded_tolls.append(tool)agent = initialize_agent(loaded_tolls, llm,agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,verbose=True,handle_parsing_errors=True)for prompt in prompt_chain:agent.run(prompt)if __name__ == "__main__":llm = ChatGLM3()llm.load_model(model_name_or_path=MODEL_PATH)# kuakuawo 导入自定义的工具run_tool([KuaKuaWo()], llm, ["请夸一夸隔壁老王"])
运行效果如下:
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████| 7/7 [00:07<00:00, 1.05s/it]
Action:
{"action": "kuakuawo", "action_input": "隔壁老王"}
Observation: 隔壁老王 你真的太棒了
Action:
{"action": "Final Answer", "action_input": "谢谢夸奖,请问有什么我可以帮助您的吗?"}
Finished chain.
多工具使用
可以将多个工具组装在一起让模型自动选择调用,例如
run_tool([Calculator(), "arxiv", KuaKuaWo()], llm, ["帮我检索GLM-130B相关论文","根号3减去根号二再加上4等于多少?","请夸一夸张三李四"])
Entering new AgentExecutor chain…
Action:
{"action": "arxiv", "action_input": "GLM-130B"}
Observation: Published: 2023-10-25
Title: GLM-130B: An Open Bilingual Pre-trained Model
Authors: Aohan Zeng, Xiao Liu, Zhengxiao Du, Zihan Wang, Hanyu Lai, Ming Ding, Zhuoyi Yang, Yifan Xu, Wendi Zheng, Xiao Xia, Weng Lam Tam, Zixuan Ma, Yufei Xue, Jidong Zhai, Wenguang Chen, Peng Zhang, Yuxiao Dong, Jie Tang
Summary: We introduce GLM-130B, a bilingual (English and Chinese) pre-trained language
model with 130 billion parameters. It is an attempt to open-source a 100B-scale
model at least as good as GPT-3 (davinci) and unveil how models of such a scale
can be successfully pre-trained. Over the course of this effort, we face
numerous unexpected technical and engineering challenges, particularly on loss
spikes and divergence. In this paper, we introduce the training process of
GLM-130B including its design choices, training strategies for both efficiency
and stability, and engineering efforts. The resultant GLM-130B model offers
significant outperformance over GPT-3 175B (davinci) on a wide range of popular
English benchmarks while the performance advantage is not observed in OPT-175B
and BLOOM-176B. It also consistently and significantly outperforms ERNIE TITAN
3.0 260B – the largest Chinese language model – across related benchmarks.
Finally, we leverage a unique scaling property of GLM-130B to reach INT4
quantization without post training, with almost no performance loss, making it
the first among 100B-scale models and more importantly, allowing its effective
inference on 4 × \times ×RTX 3090 (24G) or 8 × \times ×RTX 2080 Ti (11G) GPUs, the
most affordable GPUs required for using 100B-scale models. The GLM-130B model
weights are publicly accessible and its code, training logs, related toolkit,
and lessons learned are open-sourced at
\url{https://github.com/THUDM/GLM-130B/}.
Thought:
Action:
{"action": "Final Answer", "action_input": "根据您的查询,我找到了一篇名为“GLM-130B: An Open Bilingual Pre-trained Model”的论文 ,由Aohan Zeng, Xiao Liu, Zhengxiao Du, Zihan Wang, Hanyu Lai, Ming Ding, Zhuoyi Yang, Yifan Xu, Wendi Zheng, Xiao Xia, Weng Lam Tam, Zixuan Ma, Yufei Xue, Jidong Zhai, Wenguang Chen, Peng Zhang, Yuxiao Dong, Jie Tang等人发表于2023年10月25日。该论文介绍了 一种名为GLM-130B的双语(英语和中文)预训练语言模型,具有1300亿参数。该模型是在尝试开放源代码100B规模的语言模型至少与GPT-3(davinci)相当,并揭示如何成功预训练这样的模型。在本文中,我们介绍了GLM-130B的训练过程,包括其设计选择,对效率和稳定性的训练策略,以及工程努力。GLM-130B模型在大多数流行的英语基准上显著优于GPT-3 175B (davinci),但在OPT-175B和BLOOM-176B上并未观察到性能优势。同时,它也 consistently显著优于ERNIE TITAN 3.0 260B -- 最大的中文语言模型 -- across 相关基准。最后,我们利用GLM-130B的独特标度特性,在 不进行后训练的情况下达到INT4量化,性能损失几乎为零,使其能够在4xRTX 3090 (24G)或8xRTX 2080 Ti (11G) GPU上有效推理,这些GPU是最实惠的用于100B规模模型的GPU。GLM-130B模型权重是公开可用的,其代码,训练日志,相关工具包和相关教训都 open-sourced at\nhttps://github.com/THUDM/GLM-130B/。"
}
Finished chain.
Entering new AgentExecutor chain…
Action:
{"action": "Calculator", "action_input": "sqrt(3)-sqrt(2)+4"}
Observation: 4.317837245195782
Thought:
Action:
{"action": "Final Answer", "action_input": "分析「根号3减去根号二再加上4等于多少」这个问题,我们可以通过请求Python解释器执行「sqrt(3)-sqrt(2)+4」得到答案:4.317837245195782"
}
Finished chain.
Entering new AgentExecutor chain…
Action:
{"action": "kuakuawo", "action_input": "李四"}
Observation: 李四 你真的太棒了
Thought:
Action:
{"action": "Final Answer", "action_input": "谢谢夸奖!请问有什么我可以帮助你的吗?"}
Finished chain.
参考
LLM大语言模型(一):ChatGLM3-6B本地部署
LLM大语言模型(二):Streamlit 无需前端经验也能画web页面
LLM大语言模型(三):使用ChatGLM3-6B的函数调用功能前先学会Python的装饰器
相关文章:
LLM大语言模型(四):在ChatGLM3-6B中使用langchain
目录 背景准备工作工具添加LangChain 已实现工具Calculator、Weather Tool配置 自定义工具自定义kuakuawo Agent 多工具使用参考 背景 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够: 具有上下文意识:将语言模型与上下文源(提示指令&…...

Dubbo入门介绍和实战
1. 引言 Dubbo是一款开源的高性能、轻量级的Java RPC(远程过程调用)框架,旨在解决分布式服务之间的通信问题。本文将介绍Dubbo的基础概念、核心特性以及使用场景,包括实际示例演示。 2. 什么是Dubbo? Dubbo是阿里巴…...

如何实现无人机识别功能
无人机识别算法可以基于不同的传感器和技术,结合多种方法进行实现。以下是一些常见的无人机识别算法和技术: 视觉识别: 图像处理: 使用计算机视觉技术对无人机图像进行处理,包括特征提取、目标检测和跟踪等。深度学习&…...
Python学习笔记(四)流程控制方法
流程控制有三种方法:分支、循环、跳出 流程的控制通过布尔值来实现,分支和循环都需要对一定的条件进行判断,根据判断结果(布尔值)决定下一步要做什么 布尔值通过比较运算符、逻辑运算符来进行判断是True还是False 不…...

【Qt- C++ Qml 交互】
Qt编程指南 VX:hao541022348 ■ 将C对象注册到 QML中,在QML使用C对象■ C对象注册到元对象系统■ Q_INVOKABLE 宏定义是将C 的 函数(方法)声明为元对象系统可调用的函数■ 演示步骤 ■ 将 C类注册到 QML,并在QML声明一…...

ubuntu 20.04 自由切换 python 的版本
问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本,执行 python 时,默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…...

程序性能优化全能手册
本文聊一个程序员都会关注的问题:性能。 当大家谈到“性能”时,你首先想到的会是什么? 是每次请求需要多长时间才能返回? 是每秒钟能够处理多少次请求? 还是程序的CPU和内存使用率高不高? 这些问题基本上…...

LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明
LiveSIPB 国网B接口服务安装使用说明 1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS) 2、服务运行2.1、Windows2.2、Linux 3、配置设备接入3.1、海康STATE_GRID接入示例 4、平台使用4.1、管…...

利用小红书笔记详情API:为内容运营提供强大的支持
利用小红书笔记详情API,内容运营者可以获得对小红书平台上的笔记内容的深入洞察,从而为其运营工作提供强大的支持。以下是该API如何支持内容运营的几个关键方面: 获取笔记内容与数据: API允许内容运营者直接获取小红书平台上的笔记…...
地理空间分析1——入门Python地理空间分析
写在开头 地理空间分析是一门涉及地球表面数据处理和解释的科学,通过对地理现象的研究,我们可以更深入地了解地球各个角落的关系。Python作为一种功能强大的编程语言,在地理空间分析领域展现了强大的潜力。本文将带您深入了解入门级别的Pyth…...

哈尔滨爆火的背后有什么值得我们学习的,2024普通人如何创业/2024风口行业
这个冬天,“南方小土豆”带火东北冰雪游。“冰城”黑龙江哈尔滨的文旅市场异常火爆,元旦假期3天,哈尔滨市累计接待游客304.79万人次,实现旅游总收入59.14亿元。旅游总收入达到历史峰值。哈尔滨旅游怎么就爆火了?背后究…...

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式
目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…...
数据结构OJ实验15-插入排序与交换排序
A. DS内排—直插排序 题目描述 给定一组数据,使用直插排序完成数据的升序排序。 --程序要求-- 若使用C只能include一个头文件iostream;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分…...

鹿目标检测数据集VOC格式500张
鹿,一种优雅而神秘的哺乳动物,以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等,四肢细长,身体线条流畅。它们的头部较小,耳朵大而直立,眼睛明亮有神。鹿的毛色因品种而异,…...

静态网页设计——电影推荐网(HTML+CSS+JavaScript)
前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…...
ARM CCA机密计算架构软件栈简介
本博客描述了Arm机密计算架构(Arm CCA)的固件和软件组件。 在这篇博客中,您将学到如何: 列出组成Arm CCA软件栈的组件集了解Arm CCA引入新软件组件的原因了解监视器和领域管理监视器(RMM)的角色了解如何创建和管理领域1.1 开始之前 我们假设您熟悉AArch64异常模型、AAr…...

C#编程-使用集合
使用集合 您学习了如何使用数组来有效地存储和操作相似类型额数据。但是,以下限制于数组的使用相关联: 您必须在声明时定义数组的大小。您必须编写代码以对数组执行标准操作,如排序。让我们思考一个示例。假设您想要存储在组织工作的五个雇员的姓名。您可以使用以下语句来声…...
linux 设备模型之设备
在最低层, Linux 系统中的每个设备由一个 struct device 代表: struct device { struct device *parent; struct kobject kobj; char bus_id[BUS_ID_SIZE]; struct bus_type *bus; struct device_driver *driver; void *driver_data; void (*release)(struct device *dev); /* …...
电源滤波可采用 RC、LC、π 型滤波。电源滤波建议优选磁珠,然后才是电感。同时电阻、电感和磁珠必须考虑其电阻产生的压降。
电源滤波是为了减少电源中的噪声和干扰,确保电子设备正常工作。RC、LC、π 型滤波是常用的电源滤波器结构,其选择主要取决于需要滤波的频率范围和所需的滤波效果。 RC滤波器是由电阻和电容组成,适用于高频噪声的滤波。当电流通过电容时,电容会阻止高频噪声信号的通过,起到…...

STM32通用定时器-输入捕获-脉冲计数
一、知识点 编码器 两相编码器(正交编码器):两相编码器由 A 相和 B 相组成,相位差为 90 度。当旋转方向为顺时针时,A 相先变化,然后 B 相变化;当旋转方向为逆时针时,B 相先变化…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...