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_query
            cursor.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, AutoModel

tokenizer = 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_message
        system_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_response
    
    return 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大模型探索之路

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景:一个库存服务部署在上面三台机器上,数据库里有 100 件库存,现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上(即三台…

AI绘画 究竟在哪些方面降低了门槛

AI绘画的产物是图像。图像对人类的认知、情感和文化发展起着重要的作用,包括信息传递、创造性表达、历史记录、审美享受和交流。 从原来的纸笔调色板到数字时代的数字板、绘图软件,再到AI绘画时代,任何人都可以用几行简单的文字创作出高质量…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句,可以重复使用。它们包含在类或对象中,并通过调用来执行。 举个例子,println() 是一个方法&#xff…

论文阅读:BEVBert: Multimodal Map Pre-training for Language-guided Navigation

BEVBert:语言引导导航的多模态地图预训练 摘要 现存的问题:目前大多数现有的预训练方法都采用离散的全景图来学习视觉-文本关联。这要求模型隐式关联全景图中不完整、重复的观察结果,这可能会损害智能体的空间理解。 本文解决方案&#xf…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云: 百度智能云是百度提供的公有云平台,于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景,致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

【漏洞复现】泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞

漏洞描述 泛微e-cology依托全新的设计理念,全新的管理思想。 为中大型组织创建全新的高效协同办公环境。 智能语音办公,简化软件操作界面。 身份认证、电子签名、电子签章、数据存证让合同全程数字化。泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞 免责声…

怎么看自己是不是公网IP?

当我们需要进行网络连接或者网络配置的时候,经常会遇到需要知道自己是否拥有公网IP的情况。公网IP是全球唯一的IP地址,在互联网上可直接访问和被访问,而私有IP则是在本地网络中使用,无法从互联网上直接访问。我们将介绍如何查看自…

Java - 阿里巴巴命名规范

文章目录 前言一、编程规约(一) 命名风格(二) 常量定义(三) 代码格式(四) OOP 规约(五) 日期时间(六) 集合处理(七) 并发处理(八) 控制语句(九) 注释规约(十) 前后端规约(十一) 其他 二、异常日志(一) 错误码(二) 异常处理(三) 日志规约 三、单元测试四、安全规约五、MySQL 数据…

C# winform s7.net expected 22 bytes.”

S7.Net.PlcException:“Received 12 bytes: 32-02-00-00-00-00-00-00-00-00-81-04, expected 22 bytes.” 原因是博图的连接机制未勾选

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标:让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

Spring AOP (二)

本篇将介绍Spring AOP的相关原理。 一、代理模式 Spring 在实现AOP时使用了代理模式这种设计模式,什么是代理模式呢我们来了解一下。 代理模式可以理解为当我们需要调用某个类的方法时,在我们与这个目标类之间增加一个代理类,我们要使用目标…

vue2响应式 VS vue3响应式

Vue2响应式 存在问题: 新增属性,删除属性,界面不会更新。 直接通过下标修改数组界面不会自动更新。 Vue2使用object.defineProperty来劫持数据是否发生改变,如下: 能监测到获取和修改属性: 新增的属性…

【C++打怪之路】-- C++开篇

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ &…

【C语言】深入解析选择排序算法

一、算法原理二、算法性能分析三、C语言实现示例四、总结 一、算法原理 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小(或最大)元素,放到已排序的序列的末尾&#xff…

securecrt 批量登录服务器介绍

一、前言 在有一些IT环境中,可能存在各种情况的服务器,因为各种原因不能统一部署类似ansible、saltstack等批量操控软件,当遇到需要对这些服务器进行某项信息的排查或调整配置时,你是否还是通过securecrt一台一台登录后进行操作&a…

endnote21从安装到使用!文献引用!Mac版

视频学习和资源获取 新建库 选择上方导航栏处的File下的New 软件 软件界面可以分成四个部分 2是个人图书馆 3是对某一分类中文献的展示 最右侧是对具体一篇文献的摘要、编辑以及PDF 有回形针标志意味着这篇有全文,也就是有pdf 如果没有回形针代表它只有引文信…

社交媒体数据恢复:BF Messager

BF Messenger 数据恢复方法 一、前言 BF Messenger(BF加密聊天软件)是一款基于布尔式循环移位加密算法的聊天应用程序。它使用对称密钥加密技术,用户可以在安全的环境下进行私密聊天。除此之外,该应用还具有防截屏、应用锁屏、密…

LeetCode in Python 55. Jump Game (跳跃游戏)

跳跃游戏的游戏规则比较简单,若单纯枚举所有的跳法以判断是否能到达最后一个下标需要的时间复杂度为O(),为此,本文采用贪心策略,从最后一个下标开始逆着向前走,若能跳到第一个元素则表明可以完成跳跃游戏,反…

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后,在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的,但在外网电脑和设备如何访问呢?由于内网环境下,无法提供公网IP使用,外网访问内网就需要一个内外网转换的介质。这里介绍…