目录
一、Text2SQL简介二、基于TDSQL-C Serverless的Text2SQL实战2.1、程序流程图2.2、实践流程2.2.1、配置TDSQL-C2.2.2、部署LLAMA模型2.2.3、本地依赖安装2.2.4、应用构建 2.3、运行效果 三、Text2SQL下的AI驱动
Text2SQL 是一种将自然语言查询转换为 SQL 查询的技术,旨在使用户能够以更直观和自然的方式与数据库进行交互,而无需深入了解 SQL 语法。本篇通过 Python + Langchain + Llama大模型 + TDSQL-C Serverless 的框架,开发完成 AI电商数据分析系统 Demo的构建和部署。
一、Text2SQL简介
Text2SQL 是一种将自然语言查询转换为 SQL 查询的技术,其核心工作原理涉及自然语言处理和语义理解。用户可以通过输入自然语言问题来与数据库进行交互,而无需了解 SQL 语法。系统首先分析用户的输入,识别出关键字和查询意图,然后根据数据库的结构生成相应的 SQL 查询。
在工作过程中,Text2SQL 首先利用自然语言处理技术,解析用户的语言,提取出查询的主题、操作和条件。例如,当用户输入“找出2023年销售额最高的产品”时,系统需要理解“2023年”作为时间条件,“销售额”作为数值字段,以及“最高的产品”表示需要对结果进行排序和限制输出。接着,系统会将这些信息映射到数据库的表和字段上,生成具体的 SQL 查询。
在应用场景方面,Text2SQL 使非技术用户能够更轻松地从数据库中提取信息,帮助企业快速获取关键信息,促进数据驱动决策的制定。教育领域也逐渐采用 Text2SQL,以帮助学习者理解数据库查询的逻辑,提高他们的学习效率。
二、基于TDSQL-C Serverless的Text2SQL实战
2.1、程序流程图
整个系统的流程整个流程从用户提出自然语言问题,到自动生成 SQL 查询,再到数据的可视化呈现,形成了一个完整的闭环,极大地简化了数据分析的过程
首先,从用户提问开始,用户通过自然语言输入他们的查询需求,比如想知道“今年销售额最高的商品是什么”。此时系统会接收到用户的提问并进入 SQL 查询链。然后,大语言模型(LLM)会解析用户的自然语言输入,理解用户的意图,然后结合数据库的结构信息,生成相应的 SQL 查询语句。其次,生成的 SQL 语句随后通过 Langchain 等数据库工具执行。Langchain 通过连接大语言模型与数据库,帮助将自动生成的 SQL 语句提交给数据库执行,并获取查询结果。当数据库查询完毕后,返回的结果通常是结构化的数据,比如销售额、产品信息等,这些数据随后会传递回 LLM。在获取到数据之后,LLM 的工作并未结束。系统会再次调用 LLM,根据查询返回的结果,生成数据可视化的代码。本篇文章使用的是 Plotly,根据数据的特征,生成合适的 Plotly 代码,创建相应的图表,比如销售趋势图、柱状图或饼图。最后,生成的 Plotly 代码会被执行,最终生成可视化的图表。2.2、实践流程
2.2.1、配置TDSQL-C
本篇实践使用了云原生数据库 TDSQL-C(Cloud Native Database TDSQL-C)。TDSQL-C 是腾讯云自研的新一代高性能高可用的企业级分布式云数据库。融合了传统数据库、云计算与新硬件技术的优势,100%兼容 MySQL 和 PostgreSQL,实现超百万级 QPS 的高吞吐,海量分布式智能存储,保障数据安全可靠。
首先,进入官网,点击立即选购:
选定的服务器为 serverless 的服务器,数据库引擎采用MySQL,地域可以随意,选离自己近的就好。
设置数据库密码与配置信息后,前往数据库管理界面,开启实例公网访问:
开启公网链接后,会得到一个公网ip,记下他,后面会用到。然后点击登录在线管理工具
进入数据库后,点击新建库,新建数据库 shop
然后,点击新建的shop表,点击打开SQL窗口:
将以下SQL语句输入到SQL语句输入框中:
CREATE TABLE `ecommerce_sales_stats` ( `category_id` int NOT NULL COMMENT '分类ID(主键)', `category_name` varchar(100) NOT NULL COMMENT '分类名称', `total_sales` decimal(15,2) NOT NULL COMMENT '总销售额', `steam_sales` decimal(15,2) NOT NULL COMMENT 'Steam平台销售额', `offline_sales` decimal(15,2) NOT NULL COMMENT '线下实体销售额', `official_online_sales` decimal(15,2) NOT NULL COMMENT '官方在线销售额', PRIMARY KEY (`category_id`)) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 COMMENT='电商分类销售统计表';INSERT INTO `ecommerce_sales_stats` VALUES (1,'电子产品',150000.00,80000.00,30000.00,40000.00),(2,'服装',120000.00,20000.00,60000.00,40000.00),(3,'家居用品',90000.00,10000.00,50000.00,30000.00),(4,'玩具',60000.00,5000.00,30000.00,25000.00),(5,'书籍',45000.00,2000.00,20000.00,23000.00),(6,'运动器材',70000.00,15000.00,25000.00,30000.00),(7,'美容护肤',80000.00,10000.00,30000.00,40000.00),(8,'食品',50000.00,5000.00,25000.00,20000.00),(9,'珠宝首饰',30000.00,2000.00,10000.00,18000.00),(10,'汽车配件',40000.00,10000.00,15000.00,25000.00),(11,'手机配件',75000.00,30000.00,20000.00,25000.00),(12,'电脑配件',85000.00,50000.00,15000.00,20000.00),(13,'摄影器材',50000.00,20000.00,15000.00,15000.00),(14,'家电',120000.00,60000.00,30000.00,30000.00),(15,'宠物用品',30000.00,3000.00,12000.00,16800.00),(16,'母婴用品',70000.00,10000.00,30000.00,30000.00),(17,'旅行用品',40000.00,5000.00,15000.00,20000.00),(18,'艺术品',25000.00,1000.00,10000.00,14000.00),(19,'健康产品',60000.00,8000.00,25000.00,27000.00),(20,'办公用品',55000.00,2000.00,20000.00,33000.00);CREATE TABLE `users` ( `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户ID(主键,自增)', `full_name` varchar(100) NOT NULL COMMENT '用户全名', `username` varchar(50) NOT NULL COMMENT '用户名', `email` varchar(100) NOT NULL COMMENT '用户邮箱', `password_hash` varchar(255) NOT NULL COMMENT '用户密码的哈希值', `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `is_active` tinyint(1) DEFAULT '1' COMMENT '是否激活', PRIMARY KEY (`user_id`), UNIQUE KEY `email` (`email`)) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';INSERT INTO `users` VALUES (1,'张伟','zhangwei','zhangwei@example.com','hashed_password_1','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(2,'李娜','lina','lina@example.com','hashed_password_2','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(3,'王芳','wangfang','wangfang@example.com','hashed_password_3','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(4,'刘洋','liuyang','liuyang@example.com','hashed_password_4','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(5,'陈杰','chenjie','chenjie@example.com','hashed_password_5','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(6,'杨静','yangjing','yangjing@example.com','hashed_password_6','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(7,'赵强','zhaoqiang','zhaoqiang@example.com','hashed_password_7','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(8,'黄丽','huangli','huangli@example.com','hashed_password_8','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(9,'周杰','zhoujie','zhoujie@example.com','hashed_password_9','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(10,'吴敏','wumin','wumin@example.com','hashed_password_10','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(11,'郑伟','zhengwei','zhengwei@example.com','hashed_password_11','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(12,'冯婷','fengting','fengting@example.com','hashed_password_12','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(13,'蔡明','caiming','caiming@example.com','hashed_password_13','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(14,'潘雪','panxue','panxue@example.com','hashed_password_14','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(15,'蒋磊','jianglei','jianglei@example.com','hashed_password_15','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(16,'陆佳','lujia','lujia@example.com','hashed_password_16','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(17,'邓超','dengchao','dengchao@example.com','hashed_password_17','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(18,'任丽','renli','renli@example.com','hashed_password_18','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(19,'彭涛','pengtao','pengtao@example.com','hashed_password_19','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(20,'方圆','fangyuan','fangyuan@example.com','hashed_password_20','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(21,'段飞','duanfei','duanfei@example.com','hashed_password_21','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(22,'雷鸣','leiming','leiming@example.com','hashed_password_22','2024-08-18 04:07:18','2024-08-18 04:07:18',1),(23,'贾玲','jialing','jialing@example.com','hashed_password_23','2024-08-18 04:07:18','2024-08-18 04:07:18',1);CREATE TABLE `orders` ( `order_id` int NOT NULL AUTO_INCREMENT, `user_id` int DEFAULT NULL, `order_amount` decimal(10,2) DEFAULT NULL, `order_status` varchar(20) DEFAULT NULL, `order_time` datetime DEFAULT NULL, PRIMARY KEY (`order_id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ;INSERT INTO `orders` VALUES (1,3,150.50,'已支付','2024-08-23 10:01:00'),(2,7,89.20,'待支付','2024-08-23 10:03:15'),(3,12,230.00,'已支付','2024-08-23 10:05:30'),(4,2,99.90,'已发货','2024-08-23 10:07:45'),(5,15,120.00,'待发货','2024-08-23 10:10:00'),(6,21,180.50,'已支付','2024-08-23 10:12:15'),(7,4,105.80,'待支付','2024-08-23 10:14:30'),(8,18,210.00,'已支付','2024-08-23 10:16:45'),(9,6,135.20,'已发货','2024-08-23 10:19:00'),(10,10,160.00,'待发货','2024-08-23 10:21:15'),(11,1,110.50,'已支付','2024-08-23 10:23:30'),(12,22,170.80,'待支付','2024-08-23 10:25:45'),(13,8,145.20,'已发货','2024-08-23 10:28:00'),(14,16,190.00,'待发货','2024-08-23 10:30:15'),(15,11,125.50,'已支付','2024-08-23 10:32:30'),(16,19,165.20,'待支付','2024-08-23 10:34:45'),(17,5,130.00,'已发货','2024-08-23 10:37:00'),(18,20,175.80,'待发货','2024-08-23 10:39:15'),(19,13,140.50,'已支付','2024-08-23 10:41:30'),(20,14,155.20,'待支付','2024-08-23 10:43:45'),(21,9,135.50,'已发货','2024-08-23 10:46:00'),(22,23,185.80,'待发货','2024-08-23 10:48:15'),(23,17,160.50,'已支付','2024-08-23 10:50:30'),(24,12,145.20,'待支付','2024-08-23 10:52:45'),(25,3,130.00,'已发货','2024-08-23 10:55:00'),(26,8,115.50,'已支付','2024-08-23 10:57:15'),(27,19,120.20,'待支付','2024-08-23 10:59:30'),(28,6,145.50,'已发货','2024-08-23 11:01:45'),(29,14,130.20,'待支付','2024-08-23 11:04:00'),(30,5,125.50,'已支付','2024-08-23 11:06:15'),(31,21,135.20,'待支付','2024-08-23 11:08:30'),(32,7,140.50,'已发货','2024-08-23 11:10:45'),(33,16,120.20,'待支付','2024-08-23 11:13:00'),(34,10,135.50,'已支付','2024-08-23 11:15:15'),(35,2,140.20,'待支付','2024-08-23 11:17:30'),(36,12,145.20,'待支付','2024-08-23 12:00:00'),(37,15,130.20,'已支付','2024-08-23 12:02:15'),(38,20,125.50,'待发货','2024-08-23 12:04:30'),(39,17,135.20,'已支付','2024-08-23 12:06:45'),(40,4,140.50,'待支付','2024-08-23 12:09:00'),(41,10,120.20,'已发货','2024-08-23 12:11:15'),(42,13,135.50,'已支付','2024-08-23 12:13:30'),(43,18,145.20,'待支付','2024-08-23 12:15:45'),(44,6,130.20,'已发货','2024-08-23 12:18:00'),(45,11,125.50,'已支付','2024-08-23 12:20:15'),(46,19,135.20,'待支付','2024-08-23 12:22:30'),(47,5,140.50,'已发货','2024-08-23 12:24:45'),(48,20,120.20,'待支付','2024-08-23 12:27:00'),(49,17,135.50,'已支付','2024-08-23 12:29:15'),(50,4,145.20,'待支付','2024-08-23 12:31:30'),(51,10,130.20,'已发货','2024-08-23 12:33:45'),(52,13,125.50,'已支付','2024-08-23 12:36:00'),(53,18,135.20,'待支付','2024-08-23 12:38:15'),(54,6,140.50,'已发货','2024-08-23 12:40:30'),(55,11,120.20,'待支付','2024-08-23 12:42:45'),(56,19,135.50,'已支付','2024-08-23 12:45:00'),(57,5,145.20,'待支付','2024-08-23 12:47:15'),(58,20,130.20,'已发货','2024-08-23 12:49:30'),(59,17,125.50,'已支付','2024-08-23 13:01:45'),(60,4,135.20,'待支付','2024-08-23 13:04:00'),(61,10,140.50,'已发货','2024-08-23 13:06:15'),(62,13,120.20,'待支付','2024-08-23 13:08:30'),(63,18,135.50,'已支付','2024-08-23 13:10:45'),(64,6,145.20,'待支付','2024-08-23 13:13:00'),(65,11,130.20,'已发货','2024-08-23 13:15:15'),(66,19,125.50,'已支付','2024-08-23 13:17:30'),(67,5,135.20,'待支付','2024-08-23 13:19:45'),(68,20,140.50,'已发货','2024-08-23 13:22:00'),(69,17,120.20,'待支付','2024-08-23 13:24:15'),(70,4,135.50,'已支付','2024-08-23 13:26:30'),(71,10,145.20,'待支付','2024-08-23 13:28:45'),(72,13,130.20,'已发货','2024-08-23 13:31:00'),(73,18,125.50,'已支付','2024-08-23 13:33:15'),(74,6,135.20,'待支付','2024-08-23 13:35:30'),(75,11,140.50,'已发货','2024-08-23 13:37:45'),(76,19,120.20,'待支付','2024-08-23 13:40:00'),(77,5,135.50,'已支付','2024-08-23 13:42:15'),(78,20,145.20,'待支付','2024-08-23 13:44:30'),(79,17,130.20,'已发货','2024-08-23 13:46:45'),(80,4,125.50,'已支付','2024-08-23 13:49:00'),(81,10,135.20,'待支付','2024-08-23 13:51:15'),(82,13,140.50,'已发货','2024-08-23 13:53:30'),(83,18,120.20,'待支付','2024-08-23 13:55:45'),(84,6,135.50,'已支付','2024-08-23 13:58:00'),(85,11,145.20,'待支付','2024-08-23 14:00:15'),(86,19,130.20,'已发货','2024-08-23 14:02:30'),(87,5,125.50,'已支付','2024-08-23 14:04:45'),(88,20,135.20,'待支付','2024-08-23 14:07:00'),(89,17,140.50,'已发货','2024-08-23 14:09:15'),(90,4,120.20,'待支付','2024-08-23 14:11:30'),(91,10,135.50,'已支付','2024-08-23 14:13:45'),(92,13,145.20,'待支付','2024-08-23 14:16:00'),(93,18,130.20,'已发货','2024-08-23 14:18:15'),(94,6,125.50,'已支付','2024-08-23 14:20:30'),(95,11,135.20,'待支付','2024-08-23 14:22:45'),(96,19,140.50,'已发货','2024-08-23 14:25:00'),(97,5,120.20,'待支付','2024-08-23 14:27:15'),(98,20,135.50,'已支付','2024-08-23 14:29:30'),(99,17,145.20,'待支付','2024-08-23 14:31:45'),(100,4,130.20,'已发货','2024-08-23 14:34:00'),(101,10,125.50,'已支付','2024-08-23 14:36:15'),(102,13,135.20,'待支付','2024-08-23 14:38:30'),(103,18,140.50,'已发货','2024-08-23 14:40:45'),(104,16,120.20,'待支付','2024-08-23 14:43:00'),(105,12,135.50,'已支付','2024-08-23 14:45:15'),(106,3,145.20,'待支付','2024-08-23 14:47:30'),(107,8,130.20,'已发货','2024-08-23 14:49:45'),(108,19,125.50,'已支付','2024-08-23 14:52:00'),(109,6,135.20,'待支付','2024-08-23 14:54:15'),(110,14,140.50,'已发货','2024-08-23 14:56:30'),(111,10,120.20,'待支付','2024-08-23 14:58:45'),(112,13,135.50,'已支付','2024-08-23 15:01:00'),(113,18,145.20,'待支付','2024-08-23 15:03:15'),(114,6,130.20,'已发货','2024-08-23 15:05:30'),(115,11,125.50,'已支付','2024-08-23 15:07:45'),(116,19,135.20,'待支付','2024-08-23 15:10:00'),(117,5,140.50,'已发货','2024-08-23 15:12:15'),(118,20,120.20,'待支付','2024-08-23 15:14:30'),(119,17,135.50,'已支付','2024-08-23 15:16:45'),(120,4,145.20,'待支付','2024-08-23 15:19:00'),(121,10,130.20,'已发货','2024-08-23 15:21:15'),(122,13,125.50,'已支付','2024-08-23 15:23:30'),(123,18,135.20,'待支付','2024-08-23 15:25:45'),(124,6,140.50,'已发货','2024-08-23 15:28:00'),(125,11,120.20,'待支付','2024-08-23 15:30:15'),(126,19,135.50,'已支付','2024-08-23 15:32:30'),(127,5,145.20,'待支付','2024-08-23 15:34:45'),(128,20,130.20,'已发货','2024-08-23 15:37:00'),(129,17,125.50,'已支付','2024-08-23 15:39:15'),(130,4,135.20,'待支付','2024-08-23 15:41:30'),(131,10,140.50,'已发货','2024-08-23 15:43:45'),(132,13,120.20,'待支付','2024-08-23 15:46:00'),(133,18,135.50,'已支付','2024-08-23 15:48:15'),(134,6,145.20,'待支付','2024-08-23 15:50:30'),(135,11,130.20,'已发货','2024-08-23 15:52:45'),(136,19,125.50,'已支付','2024-08-23 15:55:00'),(137,5,135.20,'待支付','2024-08-23 15:57:15'),(138,20,140.50,'已发货','2024-08-23 15:59:30'),(139,17,120.20,'待支付','2024-08-23 16:01:45'),(140,4,135.50,'已支付','2024-08-23 16:04:00'),(141,10,145.20,'待支付','2024-08-23 16:06:15'),(142,13,130.20,'已发货','2024-08-23 16:08:30'),(143,18,125.50,'已支付','2024-08-23 16:10:45'),(144,6,135.20,'待支付','2024-08-23 16:13:00'),(145,11,140.50,'已发货','2024-08-23 16:15:15'),(146,19,120.20,'待支付','2024-08-23 16:17:30'),(147,5,135.50,'已支付','2024-08-23 16:19:45'),(148,20,145.20,'待支付','2024-08-23 16:22:00'),(149,17,130.20,'已发货','2024-08-23 16:24:15'),(150,4,125.50,'已支付','2024-08-23 16:26:30'),(151,10,135.20,'待支付','2024-08-23 16:28:45'),(152,13,140.50,'已发货','2024-08-23 16:31:00'),(153,18,120.20,'待支付','2024-08-23 16:33:15'),(154,6,135.50,'已支付','2024-08-23 16:35:30'),(155,11,145.20,'待支付','2024-08-23 16:37:45'),(156,19,130.20,'已发货','2024-08-23 16:40:00'),(157,5,125.50,'已支付','2024-08-23 16:42:15'),(158,20,135.20,'待支付','2024-08-23 16:44:30'),(159,17,140.50,'已发货','2024-08-23 16:46:45'),(160,4,120.20,'待支付','2024-08-23 16:49:00'),(161,10,135.50,'已支付','2024-08-23 16:51:15'),(162,13,145.20,'待支付','2024-08-23 16:53:30'),(163,18,130.20,'已发货','2024-08-23 16:55:45'),(164,6,125.50,'已支付','2024-08-23 16:58:00'),(165,11,135.20,'待支付','2024-08-23 17:00:15'),(166,19,140.50,'已发货','2024-08-23 17:02:30'),(167,5,120.20,'待支付','2024-08-23 17:04:45'),(168,20,135.50,'已支付','2024-08-23 17:07:00'),(169,17,145.20,'待支付','2024-08-23 17:09:15'),(170,4,130.20,'已发货','2024-08-23 17:11:30'),(171,10,125.50,'已支付','2024-08-23 17:13:45'),(172,13,135.20,'待支付','2024-08-23 17:16:00'),(173,18,140.50,'已发货','2024-08-23 17:18:15'),(174,6,120.20,'待支付','2024-08-23 17:20:30'),(175,11,135.50,'已支付','2024-08-23 17:22:45'),(176,19,145.20,'待支付','2024-08-23 17:25:00'),(177,5,130.20,'已发货','2024-08-23 17:27:15'),(178,20,125.50,'已支付','2024-08-23 17:29:30'),(179,17,135.20,'待支付','2024-08-23 17:31:45'),(180,4,140.50,'已发货','2024-08-23 17:34:00'),(181,10,120.20,'待支付','2024-08-23 17:36:15'),(182,13,135.50,'已支付','2024-08-23 17:38:30'),(183,18,145.20,'待支付','2024-08-23 17:40:45'),(184,6,130.20,'已发货','2024-08-23 17:43:00'),(185,11,125.50,'已支付','2024-08-23 17:45:15'),(186,19,135.20,'待支付','2024-08-23 17:47:30'),(187,5,140.50,'已发货','2024-08-23 17:49:45'),(188,20,120.20,'待支付','2024-08-23 17:52:00'),(189,17,135.50,'已支付','2024-08-23 17:54:15'),(190,4,145.20,'待支付','2024-08-23 17:56:30'),(191,10,130.20,'已发货','2024-08-23 17:58:45'),(192,13,125.50,'已支付','2024-08-23 18:01:00'),(193,18,135.20,'待支付','2024-08-23 18:03:15'),(194,6,140.50,'已发货','2024-08-23 18:05:30'),(195,11,120.20,'待支付','2024-08-23 18:07:45'),(196,19,135.50,'已支付','2024-08-23 18:10:00'),(197,5,145.20,'待支付','2024-08-23 18:12:15'),(198,20,130.20,'已发货','2024-08-23 18:14:30'),(199,17,125.50,'已支付','2024-08-23 18:16:45'),(200,4,135.20,'待支付','2024-08-23 18:19:00'),(201,10,140.50,'已发货','2024-08-23 18:21:15'),(202,13,120.20,'待支付','2024-08-23 18:23:30'),(203,18,135.50,'已支付','2024-08-23 18:25:45'),(204,6,145.20,'待支付','2024-08-23 18:28:00'),(205,11,130.20,'已发货','2024-08-23 18:30:15'),(206,19,125.50,'已支付','2024-08-23 18:32:30'),(207,5,135.20,'待支付','2024-08-23 18:34:45'),(208,20,140.50,'已发货','2024-08-23 18:37:00'),(209,17,120.20,'待支付','2024-08-23 18:39:15'),(210,4,135.50,'已支付','2024-08-23 18:41:30'),(211,10,145.20,'待支付','2024-08-23 18:43:45');
然后点击刷新,可以看到数据,说明TDSQL-C Mysql Serverless 数据库服务器准备完毕!
2.2.2、部署LLAMA模型
Llama模型起到了核心的桥梁作用,帮助将自然语言转换为数据库能够理解的结构化查询语言(SQL),其解析用户的自然语言输入,理解用户意图,并根据数据库的结构生成正确的 SQL 查询语句。
这里使用腾讯云高性能HAI应用服务,进入https://cloud.tencent.com/product/hai后,点击立即使用,新建服务器:
根据配置需求选择算力服务器,选择Llama3.1 8B模型,GPU选择基础性即可,然后硬盘选择默认的80GB就够用了:
创建成功后查看HAI算力服务器的llama对外端口(公网ip)并查看检查是否已经默认开放 6399端口。
至此,llama 大模型服务也准备完毕!
2.2.3、本地依赖安装
新建一个名为workspace文件夹,终端运行pip命令安装依赖包,请分别运行以下pip命令逐个安装:
pip install openai pip install langchain pip install langchain-core pip install langchain-community pip install mysql-connector-python pip install streamlit pip install plotly pip install numpypip install pandaspip install watchdogpip install matplotlibpip install kaleido
如果安装了anaconda的话,也可以新建一个虚拟环境,再用conda安装以上的环境。
安装成功后,所有开发环境准备完毕!
2.2.4、应用构建
新建名为 workspace 文件夹进行保存项目代码
在项目文件夹(workspace)中新建配置文件 config.yaml
在项目文件夹(workspace)中新建应用主文件 text2sql2plotly.py
其中,config.yaml的内容如下:
database: db_user: root db_password: Hjs1999526 db_host: sh-cynosdbmysql-grp-ma6b7b5i.sql.tencentcdb.com db_port: 25380 db_name: shophai: model: llama3.1:8b base_url: http://101.35.239.9:6399
这里database 的配置详解:
db_user: 数据库账号,默认为 root db_password: 创建数据库时的密码
db_host: 数据库连接地址
db_port: 数据库公网端口
db_name:创建的数据库名称,如果按手册来默认是 shop
其中,db_host、db_port可以在集群列表中找到。
hai 配置详解:
model:使用的大模型
base_url:模型暴露的 api 地址,是公网 ip 和端口的组合,默认 llama端口是6399
其中,base_url可以在HAI的控制台-> 算力管理中找到。
text2sql2plotly.py的内容如下:
from langchain_community.utilities import SQLDatabasefrom langchain_core.prompts import ChatPromptTemplatefrom langchain_community.chat_models import ChatOllamafrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthroughimport yamlimport mysql.connectorfrom decimal import Decimalimport plotly.graph_objects as goimport plotlyimport pkg_resourcesimport matplotlibyaml_file_path = 'config.yaml'with open(yaml_file_path, 'r') as file: config_data = yaml.safe_load(file)#获取所有的已安装的pip包def get_piplist(p): return [d.project_name for d in pkg_resources.working_set]#获取llm用于提供AI交互ollama = ChatOllama(model=config_data['hai']['model'],base_url=config_data['hai']['base_url'])db_user = config_data['database']['db_user']db_password = config_data['database']['db_password']db_host = config_data['database']['db_host']db_port= config_data['database']['db_port']db_name = config_data['database']['db_name']# 获得schemadef get_schema(db): schema = mysql_db.get_table_info() return schemadef getResult(content): global mysql_db # 数据库连接 mysql_db = SQLDatabase.from_uri(f"mysql+mysqlconnector://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}") # 获得 数据库中表的信息 #mysql_db_schema = mysql_db.get_table_info() #print(mysql_db_schema) template = """基于下面提供的数据库schema, 根据用户提供的要求编写sql查询语句,要求尽量使用最优sql,每次查询都是独立的问题,不要收到其他查询的干扰: {schema} Question: {question} 只返回sql语句,不要任何其他多余的字符,例如markdown的格式字符等: 如果有异常抛出不要显示出来 """ prompt = ChatPromptTemplate.from_template(template) text_2_sql_chain = ( RunnablePassthrough.assign(schema=get_schema) | prompt | ollama | StrOutputParser() ) # 执行langchain 获取操作的sql语句 sql = text_2_sql_chain.invoke({"question": content}) print(sql) #连接数据库进行数据的获取 # 配置连接信息 conn = mysql.connector.connect( host=db_host, port=db_port, user=db_user, password=db_password, database=db_name ) # 创建游标对象 cursor = conn.cursor() # 查询数据 cursor.execute(sql.strip("```").strip("```sql")) info = cursor.fetchall() # 打印结果 #for row in info: #print(row) # 关闭游标和数据库连接 cursor.close() conn.close() #根据数据生成对应的图表 print(info) template2 = """ 以下提供当前python环境已经安装的pip包集合: {installed_packages}; 请根据data提供的信息,生成是一个适合展示数据的plotly的图表的可执行代码,要求如下: 1.不要导入没有安装的pip包代码 2.如果存在多个数据类别,尽量使用柱状图,循环生成时图表中对不同数据请使用不同颜色区分, 3.图表要生成图片格式,保存在当前文件夹下即可,名称固定为:图表.png, 4.我需要您生成的代码是没有 Markdown 标记的,纯粹的编程语言代码。 5.生成的代码请注意将所有依赖包提前导入, 6.不要使用iplot等需要特定环境的代码 7.请注意数据之间是否可以转换,使用正确的代码 8.不需要生成注释 data:{data} 这是查询的sql语句与文本: sql:{sql} question:{question} 返回数据要求: 仅仅返回python代码,不要有额外的字符 """ prompt2 = ChatPromptTemplate.from_template(template2) data_2_code_chain = ( RunnablePassthrough.assign(installed_packages=get_piplist) | prompt2 | ollama | StrOutputParser() ) # 执行langchain 获取操作的sql语句 code = data_2_code_chain.invoke({"data": info,"sql":sql,'question':content}) #删除数据两端可能存在的markdown格式 print(code.strip("```").strip("```python")) exec(code.strip("```").strip("```python")) return {"code":code,"SQL":sql,"Query":info}# 构建展示页面import streamlit# 设置页面标题streamlit.title('AI驱动的数据库TDSQL-C 电商可视化分析小助手')# 设置对话框content = streamlit.text_area('请输入想查询的信息', value='', max_chars=None)# 提问按钮 # 设置点击操作if streamlit.button('提问'): #开始ai及langchain操作 if content: #进行结果获取 result = getResult(content) #显示操作结果 streamlit.write('AI生成的SQL语句:') streamlit.write(result['SQL']) streamlit.write('SQL语句的查询结果:') streamlit.write(result['Query']) streamlit.write('plotly图表代码:') streamlit.write(result['code']) # 显示图表内容(生成在getResult中) streamlit.image('./图表.png', width=800)
这段代码主要使了LangChain库与MySQL数据库搭建了一个简单的 AI电商数据分析demo。首先,它从配置文件加载数据库连接信息,并定义了获取已安装pip包和数据库schema的函数。通过用户输入的查询内容,代码生成SQL语句,并执行该查询以获取数据。接着,它使用获取到的数据生成一个Plotly图表的代码,并将图表保存为PNG格式。最后,使用Streamlit构建用户界面,允许用户输入查询并展示生成的SQL、查询结果及图表。
2.3、运行效果
打开终端执行以下命令:streamlit run text2sql2plotly.py
开始执行:
这里让他查询每个用户账号的名称和长度,可以看到右侧成功读取了数据库返回了数据。并且在等待一段时间后,成功出图:
三、Text2SQL下的AI驱动
本篇实践中,我们基于Text2SQL原理,利用腾讯云的TDSQL-C MySQL Serverless和高性能应用服务HAI构建一个高效、可扩展的AI电商数据分析系统,其中:
数据存储:TDSQL-C MySQL Serverless提供弹性存储和高可用性,适合电商数据的大规模存储和查询需求。可以轻松管理用户、产品、订单等数据。自然语言接口:使用Text2SQL技术,构建一个自然语言查询接口,用户可以通过简单的文本输入(如“显示过去一周的销售数据”)进行数据查询。AI模型集成:集成HAI等高性能AI服务,利用LLama模型解析用户查询,理解用户的自然语言输入,识别查询中的意图和关键词,并生成相应的SQL语句,让整个系统具有复杂查询的理解能力。数据可视化:将查询结果转化为可视化图表,使用Plotly或其他图表库,方便用户进行数据分析。用户可以直接在界面中查看销售趋势、用户行为等。最后,随着AI技术的发展,我觉得,TDSQL-C未来可能会通过精细化的资源管理和调度,帮助企业进一步降低运营成本,并进一步拓展到更多行业,如金融、医疗、物联网等,提供更加定制化的数据库解决方案。