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

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche