AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践

本文主要是介绍AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、技术架构设计
  • 二、本地知识库准备
  • 三、SQLServer服务
    • 1. 数据库准备
      • 步骤1:安装MySQL数据库
      • 步骤2:启动MySQL数据库
      • 步骤3:登录MySQL数据库
      • 步骤4:创建数据库用户glm
      • 步骤5:给数据库用户赋权限
      • 步骤6:创建数据库
    • 2. 数据准备
    • 3. SQL服务封装
  • 四、核心代码落地
    • 1.模型加载
    • 2.本地知识库读取
    • 3.function call函数封装
    • 4.工具函数封装
    • 5. 调用查询测试
  • 五、结束思考


前言

在众多大型企业中,数据资产庞大无比,因此它们纷纷构建了多种大数据平台。然而,关键在于如何高效地利用这些数据,例如,将数据有效地提供给产品经理或数据分析师以供他们进行设计和分析。在传统工作流程中,由于这些角色通常不是技术专家,他们往往无法直接使用和操控SQL,导致必须依赖技术人员来编写SQL查询并返回结果,然后才能由产品经理、数据分析师或其他相关人员进一步处理。

然而,随着强大的大模型]的出现,我们对自然语言的理解能力得到了极大的提升,同时通过支持的插件式扩展(允许自主调用相关外部方法或API),为我们解决这一难题提供了全新的思路。这些大模型不仅能够理解复杂的自然语言查询,还能够与现有的数据处理工具无缝集成,从而使得非技术用户也能够直接参与到数据分析的过程中,无需通过技术人员作为中介,极大地提高了工作效率和决策的速度。

一、技术架构设计

用户输入说明要查询的信息,LLM基于本地知识库生成SQL,调用不同的Funcation Call,每个一个Funcation call中都封装一个不同的数据服务的调用;比如Mysql、Hive、Spark、Flink。

在这里插入图片描述

二、本地知识库准备

大模型擅长将输出转化为不同格式,比如从一种语言翻译成另一种语言,帮助拼写、语法纠正以及编写正则表达式;整个平台有两个基础支持的部分,第一部分就是数据字典,我们先将所有需要查询的数据库、表、字段信息结构化整理成数据字典,作为本地知识库。
在这里插入图片描述

三、SQLServer服务

平台中两个核心支撑中另外一个就是数据服务的开发,基于不同的数据库类型,开发不同的数据服务,用于支撑LLM的数据查询;包括但不限于:MySQL数据服务,Hive数据服务、Spark数据服务、Flink数据服务等;
在这里插入图片描述

1. 数据库准备

步骤1:安装MySQL数据库

sudo apt-get update
sudo apt-get install mysql-server

步骤2:启动MySQL数据库

sudo service mysql start
sudo systemctl start mysqld

步骤3:登录MySQL数据库

mysql -u root -p 

步骤4:创建数据库用户glm

CREATE USER 'glm'@'localhost' IDENTIFIED BY 'glm';

步骤5:给数据库用户赋权限

GRANT ALL PRIVILEGES ON *.* TO 'glm'@'localhost';
FLUSH PRIVILEGES;

步骤6:创建数据库

CREATE DATABASE glm;
USE glm;

2. 数据准备

CREATE TABLE user_info (
customerID VARCHAR(255),
gender VARCHAR(255),
SeniorCitizen INT,
Partner VARCHAR(255),
Dependents VARCHAR(255)
);
INSERT INTO user_info (customerID, gender, SeniorCitizen, Partner, Dependents)
VALUES
('1', 'Female', 0, 'Yes', 'No'),
('2', 'Male', 1, 'No', 'Yes'),
('3', 'Male', 0, 'No', 'No'),
('4', 'Female', 1, 'Yes', 'Yes'),
('5', 'Male', 0, 'No', 'No'),
('6', 'Female', 0, 'Yes', 'Yes'),
('7', 'Male', 1, 'Yes', 'No'),
('8', 'Female', 0, 'No', 'No'),
('9', 'Male', 1, 'Yes', 'Yes'),
('10', 'Female', 0, 'No', 'No'),
('11', 'Male', 0, 'Yes', 'Yes'),
('12', 'Female', 1, 'No', 'No'),
('13', 'Male', 0, 'No', 'Yes'),
('14', 'Female', 0, 'Yes', 'No'),
('15', 'Male', 1, 'Yes', 'Yes'),
('16', 'Female', 0, 'No', 'No'),
('17', 'Male', 0, 'No', 'Yes'),
('18', 'Female', 1, 'Yes', 'No'),
('19', 'Male', 0, 'No', 'No'),
('20', 'Female', 1, 'No', 'Yes');

3. SQL服务封装

安装依赖:! pip install pymysql
封装SQL执行函数(将传入的SQL代码传输至MySQL环境中进行运行,并最终返回SQL代码运行结果)。

import pymysql
import json
def sql_inter(sql_query):"""用于执行一段SQL代码,并最终获取SQL代码执行结果,\核心功能是将输入的SQL代码传输至MySQL环境中进行运行,\并最终返回SQL代码运行结果。需要注意的是,本函数是借助pymysql来连接MySQL数据库。:param sql_query: 字符串形式的SQL查询语句,用于执行对MySQL中telco_db数据库中各张表进行查询,并获得各表中的各类相关信息:return:sql_query在MySQL中的运行结果。"""connection = pymysql.connect(host="localhost",  # 数据库地址user='glm',  # 数据库用户名passwd="glm",  # 数据库密码db=glm',  # 数据库名charset='utf8'  # 字符集选择utf8)try:with connection.cursor() as cursor:# SQL查询语句sql = sql_querycursor.execute(sql)# 获取查询结果results = cursor.fetchall()finally:connection.close()return json.dumps(results)
#函数测试
sql_inter("select count(*) from user_info")
'[[20]]'

四、核心代码落地

接收前端用户的输入信息,LLM基于本地知识库,生成SQL;自主判断(根据提示和描述信息的相关性)通过Funcation Call调用不同数据服务;返回结果给到前端用户;

1.模型加载

从huggingface拉取分词器模型和基础大模型,进行加载运行到本地服务器

##测试模型
from transformers import AutoTokenizer, AutoModeltokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b",
trust_remote_code=True)#model = AutoModel.from_pretrained("THUDM/chatglm3-6b",trust_remote_code=True).quantize(8).cuda()
model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True,device='cuda')model = model.eval()

2.本地知识库读取

将数据库、表、字段等数据字典信息,整理成一个Markdown文件

# 打开并读取Markdown文件
with open('user_info.md', 'r', encoding='utf-8') as f:data_dictionary = f.read()## 定义一个简单的数据库测试服务
sql_inter(sql_query='SELECT COUNT(*) FROM user_info;')

3.function call函数封装

sql_inter_function_info = [{'name': 'sql_inter','description': '用于执行一段SQL代码,并最终获取SQL代码执行结果,核心功能是将输入的SQL代码传输至MySQL环境中进行运行,并最终返回SQL代码运行结果。','parameters': {'type': 'object','properties': {'sql_query': {'type': 'string','description': '字符串形式的SQL代码,可以在MySQL中运行,并获取运行结果'}},'required': ['sql_query']}
}
]

4.工具函数封装

def run_conv_glm(query,tokenizer, history, model,functions_list=None, functions=None, return_function_call=True):"""能够自动执行外部函数调用的Chat对话模型:param messages: 必要参数,输入到Chat模型的messages参数对象:param functions_list: 可选参数,默认为None,可以设置为包含全部外部函数的列表对象:param model: Chat模型,可选参数,默认模型为chatglm3-6b:return:Chat模型输出结果"""# 如果没有外部函数库,则执行普通的对话任务if functions_list == None:response, history = model.chat(tokenizer, query, history=history)final_response = response# 若存在外部函数库,则需要灵活选取外部函数并进行回答else:# 创建调用外部函数的system_messagesystem_info = {"role": "system","content": "Answer the following questions as best as you can. You have access to the following tools:","tools": functions,}# 创建外部函数库字典available_functions = {func.__name__: func for func in functions_list}history=[system_info]## 第一次调用,目的是获取函数信息    response,history = model.chat(tokenizer, query, history=history)print(response)# 需要调用外部函数function_call = response# 获取函数名function_name = function_call["name"]# 获取函数对象fuction_to_call = available_functions[function_name]# 获取函数参数function_args = function_call['parameters']# 将函数参数输入到函数中,获取函数计算结果function_response = fuction_to_call(**function_args)# print("答案")# print(function_response)# ## 第二次调用,带入进去函数# history=[]# history.append(#         {#             "role": "observation",#             "name": function_name,#             "content":function_response,#         }# ) # print(history)# query= "请帮我到查询一下有多少电信用户,并给出答案"# response, history = model.chat(tokenizer, query, history=history)final_response=function_responsereturn final_response,history

5. 调用查询测试

query = data_dictionary + ",请帮我到查询一下有多少电信用户,并给出答案?"
history=[]
functions_list = [sql_inter]
functions=sql_inter_function_info
response,history = run_conv_glm(query=query,functions=functions,model=model,functions_list=functions_list,history=history,tokenizer=tokenizer)

第一次:执行输出如下:结果很正确😀)

{'name': 'sql_inter', 'parameters': {'sql_query': 'SELECT COUNT(*) FROM user_info'}}

打印:print(response) 输出结果正确: [[20]]
第二次:执行输出如下:结果也没啥问题😀)

{'name': 'sql_inter', 'parameters': {'sql_query': 'SELECT COUNT(*) FROM user_info WHERE gender IN("Male", "Female")'}}

第三次:执行输出如下:条件中出现了未知字段 is_senior ,很明显翻车了😂)

{'name': 'sql_inter', 'parameters': {'sql_query': 'SELECT COUNT(*) FROM user_info WHERE is_senior = 0;'}}

第四次:执行输出如下:不知道怎么查询了,彻底蒙圈了🤣)

您好,我可以帮您查询这个问题。请问您需要使用哪种编程语言进行查询?

第五次:执行输出如下:还是回答错误😂)

{'name': 'sql_inter', 'parameters': {'sql_query': 'SELECT COUNT(*) FROM user_info WHERE gender = "Male"'}}

第五次:执行输出如下:又回答对了😀)

{'name': 'sql_inter', 'parameters': {'sql_query': 'SELECT COUNT(*) FROM user_info'}}

五、结束思考

1)大模型的问世,为我们带来了前所未有的便捷性。众多传统应用正从全新的角度,借助大模型的力量进行着颠覆性的重构。然而,大模型的稳定性尚存变数,这一点在功能设计时必须予以充分考虑。
2)对于本平台的本地知识库,如果采纳微调的策略来丰富和优化大模型,将显得更为合理。鉴于知识库涵盖的内容广泛,数据字典信息繁多,这种微调方式有助于提升大模型的理解力和应用效果。

👉上一篇: AI大模型探索之路-应用篇16:GLM大模型-ChatGLM3 API开发实践
🔖更多专栏系列文章:AIGC-AI大模型探索之路

文章若有瑕疵,恳请不吝赐教;若有所触动或助益,还望各位老铁多多关注并给予支持。

这篇关于AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920211

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng