使用ChatGLM3自定义工具实现大模型查询MySQL数据库

ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。

什么是工具调用

大模型虽然强大,但是由于训练的时间和语料限制。大模型通常会存在以下问题:

  1. 只能获取训练数据集中有的事件和内容,这意味着大模型不具备访问最新资料的能力。
  2. ChatGLM3-6B模型以通用语料训练为主,因此,缺少专业领域的知识。
  3. ChatGLM3-6B体量较小,虽然拥有较强的数学,英语等能力,但仍然无法与GPT4等大模型进行抗衡,因此,会出现数学计算不准确等问题。

简而言之,就是给大模型加上“四肢“,让大模型学会使用工具,很多问题将迎刃而解。

如何进行工具调用

ChatGLM3自带了查询某地实时天气的工具,如下图所示:
在这里插入图片描述

如何进行自定义工具:

(1)了解工具注册流程

在ChatGLM3项目的tool_register.py中定义了register_tool工具注册的函数,这个 Python 函数 register_tool(注册工具)的目的是将另一个函数作为参数(用 func: 可调用参数表示),注册它并收集它的元数据。感兴趣的可自行去看源码。

(2)编写自定义工具代码

我们这里想要大模型能够返回给我一些想要看的数据库数据,代码如下:

import pymysql
import pandas as pddef getDataFromMysql(table_name):# 创建连接conn = pymysql.connect(host="10.8.xxx.xxx", port=3306, user='root', passwd='123456', db='chat', charset='utf8mb4')# 创建游标cursor = conn.cursor()cursor.execute("select * from "+table_name)# 获取前n行数据datas = cursor.fetchmany(5)cols_info = cursor.description       # 获取行相关信息cols = [col[0] for col in cols_info] # 处理保留列名# 关闭游标cursor.close()# 关闭连接conn.close()df = pd.DataFrame(datas,columns=cols)return df@register_tool
def get_mysqlData(table_name: Annotated[str, 'The name of the table to be queried', True],
) -> str:"""Get the mysql data for `table_name`"""data = getDataFromMysql(table_name)return data

将以上代码全部复制到tool_registry.py中。
当然这只是很简单的查询,更多复杂的查询可根据实际需求修改;

(3)使用自定义的工具
①使用官方页面:启动问答页面:
cd composite_demo
streamlit run main.py

在这里插入图片描述

②使用api调用

官方没有给兼容openAi的接口实现,可以通过简单修改tool_using/openai_api_demo.py代码或者自己写代码实现,但就没有流式响应的效果了:
在这里插入图片描述

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

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

相关文章

java struts2教务管理系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java struts2 教务管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 struts2 框架开发,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库…

【数据结构-单链表】(C语言版本)

今天分享的是数据结构有关单链表的操作和实践(图解法,图变化更利于理解) 记录宗旨📝: 眼(脑)过千遍,不如手过一遍。 我们都知道单链表是一种常见的链表数据结构,由一系列…

泽攸科技PECVD设备助力开发新型石墨烯生物传感器

近日,松山湖材料实验室许智团队与清华大学符汪洋合作在纳米领域头部期刊《Small》上发表了一项引人注目的研究成果,题为“Ultrasensitive biochemical sensing platform enabled by directly grown graphene on insulator”(硅晶圆上直接生长…

34--JDK8新特性

1. Java版本迭代概述 1.1 发布特点(小步快跑,快速迭代) 发行版本 发行时间 备注 Java 1.0 1996.01.23 Sun公司发布了Java的第一个开发工具包 Java 5.0 2004.09.30 ①版本号从1.4直接更新至5.0;②平台更名为JavaSE、JavaE…

[每周一更]-(第49期):一名成熟Go开发需储备的知识点(答案篇)- 2

答案篇 1、Go语言基础知识 什么是Go语言?它有哪些特点? Go语言(也称为Golang)是一种由Google开发的开源编程语言。它于2007年首次公开发布,并在2012年正式推出了稳定版本。Go语言旨在提供简单、高效、可靠的编程解决…

【Spring】AOP的AspectJ开发

AOP基础不了解可以阅读:【Spring】AOP原来如此-CSDN博客 AspectJ是一个居于JAVA开发的AOP框架 基于XML的声明式AspectJ 基于XML的声明式AspectJ是通过XML文件来定义切面,切入点及通知,所有的切面、切入点和通知必须定义在内, 元…

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

Qt高质量的开源项目合集

文章目录 1.Qt官网下载/文档2.第三方开源 1.Qt官网下载/文档 Qt Downloads Qt 清华大学开源软件镜像站 Qt 官方博客 2.第三方开源 记录了平常项目开发中用到的第三方库,以及一些值得参考的项目! Qt AV 基于Qt和FFmpeg的跨平台高性能音视频播放框…

Javascript 循环结构while do while for实例讲解

Javascript 循环结构while do while for实例讲解 目录 Javascript 循环结构while do while for实例讲解 一、while语句 二、do…while语句 三、for循环 疑难解答 我们从上一节课知道,JavaScript循环结构总有3种: (1)while语…

【网络面试(1)】浏览器如何实现生成HTTP消息

我们经常会使用浏览器访问各种网站,获取各种信息,帮助解决工作生活中的问题。那你知道,浏览器是怎么帮助我们实现对web服务器的访问,并返回给我们想要的信息呢? 1. 浏览器生成HTTP消息 我们平时使用的浏览器有很多种&…

基于蜉蝣算法优化的Elman神经网络数据预测 - 附代码

基于蜉蝣算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蜉蝣算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蜉蝣优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

css原子化的框架Tailwindcss的使用教程(原始html和vue项目的安装与配置)

安装教程 中文官网教程 原始的HTML里面使用 新建文件夹npm init -y 初始化项目 安装相关依赖 npm install -D tailwindcss postcss-cli autoprefixer初始化两个文件 npx tailwindcss init -p根目录下新建src/style.css tailwind base; tailwind components; tailwind ut…