引言
3 月份 chatGPT 是不安分的、微软是不安分的、那么勇哥就应该安分?不可能,绝对不可能。简单来说,勇哥 3 月份成功的把 chatGPT3.5 集成到 bg-tinkle 软件中发布了 v1.0.5 版本。集成后的 bg-tinkle 对于数据库的修改、统计、删除等操作就都是一句话的事了,非常 NICE。
阅读本文你会了解 3 月份 chatGPT 重大的事件,体验如何使用 AI 帮助数据库优化、设计 SQL 等操作?以及了解本功能开发实现的思路?
事件回顾:不安分的 3 月大事
chatGPT 竞品出现:(谷歌的)Bard、(百度的)文心一言
chatGPT 发布新版:chatGPT4 隆重发布(但是勇哥并不 CARE,因为太贵和没资格)
chatGPT 成品出现:微软 office 正式接入 chatGPT,写好 word、ppt、excel 再也不用报班学习了(但是价格不便宜呀~)
数据库+AI:功能体验
AI 功能是以聊天的方式进行,然后对聊天的结果可直接执行 SQL、制作图表得操作。
通过数据库软件,直接获取数据库表结构,然后再此基础上可用让 AI 帮您设计统计分析、修改、优化等,并直接生成 SQL 语句。然后可在结果中一键执行 SQL、或者生成 SQL 的统计图。
AI 补全表注释
忘记写注释也不用怕,一键让 AI 补充+一键运行,10 秒不到完成工作!大赞~
AI 设计表索引
可以发送表常用的 SQL 语句,然后让其设计合理的索引。其设计的索引还挺符合行业规范的。大赞~
AI 创建新表
依据现有的数据库,参考设计一张新的表。分成多次会话沟通,依然没有问题。
AI 结果直接运行
AI 结果中的查询 SQL 会自动执行,并以表格的方式展示结果。同时相关 SQL 如果有问题,还支持编辑后执行。
AI 结果做成图表
AI 生成的 SQL 语句,可以直接转到图表生成功能中,快速正常折线图、饼图、柱状图、树图、桑基图等。
数据库+AI:使用帮助-开启对话
在数据库软件中,进入 AI 聊天非常简单按照以下 2 步进行即可:
选择你要操作的表,可以选择多张;
右键选择 Sql Chat 即可打开聊天窗口了
ChatGPT 访问需要 Token:
数据库+AI:使用帮助-保存会话
数据库 AI 聊天对话会保持到用户本地,以便再次打开,节省流量。要自定义保存文件名称,则参考以下操作步骤:
点击右下角‘小齿轮’
再弹出的对话框中填写保存的 ‘文件名称’
再次发送请求,程序会自动保存会话。
打开则只需要双击对应的会话名称即可(比如双击下图的 3,就可以再次打开会话)。
数据库+AI:实现思路
还实现以上带有会话上下文的聊天功能,其实现原理其实很简单,但是有点费钱。具体实现的思路如下:
把对话中所有的消息都存储到一个集合中,比如下面第 1 处代码
过滤集合中那些请求失败的对话消息,比如下面第 2 处代码
ps:处理失败的消息,过滤掉主要原因是减少请求的 Token,节省成本;
请求接口并获取响应数据,对响应数据进行 SQL 语句的解析,标记出来以便前端渲染演示和执行,比如下面第 3 处代码
// 1、存放所有的对话消息
List<ChatMessageDto> dtos = JSON.parseArray(tempMessages, ChatMessageDto.class);
// 2、过滤失败的消息
List<ChatMessage> messages = dtos.stream().filter(item -> item.getIsCall()==null||item.getIsCall()).map(item ->{
ChatMessage chatMessage = new ChatMessage();
chatMessage.setRole(item.getRole());
chatMessage.setContent(item.getContent());
return chatMessage;
}
).collect(Collectors.toList());
ChatMessageDto result = new ChatMessageDto();
List<ChatCompletionChoice> chatCompletionChoices = AiUtils.chatGpt(token, messages);
for (ChatCompletionChoice chatCompletionChoice : chatCompletionChoices) {
String content = chatCompletionChoice.getMessage().getContent();
// 3、把字符串消息,转成结构化的消息,便于运行SQL
result.setChatTerms(AiUtils.parseChatMessage(content));
result.setContent(content);
result.setRole(chatCompletionChoice.getMessage().getRole());
dtos.add(result);
}
复制代码
第 3 处例子:
非结构化的数据:
\n\n统计维度:\n\n1. 按照用户ID统计总销售额\n2. 按照支付方式统计销售额占比\n3. 按照订单状态统计订单数量和销售额\n4. 按照下单时间统计每月销售额\n\nSQL语句:\n\n1. 按照用户ID统计总销售额\n\n```sql\nSELECT user_id, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY user_id;\n```\n\n2. 按照支付方式统计销售额占比\n\n```sql\nSELECT payment_type, SUM(total_fee) as total_sales, \n ROUND(SUM(total_fee)/(SELECT SUM(total_fee) FROM tb_order)*100,2) as sales_percentage\nFROM tb_order\nGROUP BY payment_type;\n```\n\n3. 按照订单状态统计订单数量和销售额\n\n```sql\nSELECT status, COUNT(*) as order_count, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY status;\n```\n\n4. 按照下单时间统计每月销售额\n\n```sql\nSELECT DATE_FORMAT(create_time, '%Y-%m') as month, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY month;\n```
复制代码
转成结构化的数据:
[
{
"content": "\n\n统计维度:\n\n1. 按照用户ID统计总销售额\n2. 按照支付方式统计销售额占比\n3. 按照订单状态统计订单数量和销售额\n4. 按照下单时间统计每月销售额\n\nSQL语句:\n\n1. 按照用户ID统计总销售额\n\n",
"type": "MES"
},
{
"content": "\nSELECT user_id, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY user_id;\n",
"type": "SQL"
},
{
"content": "\n\n2. 按照支付方式统计销售额占比\n\n",
"type": "MES"
},
{
"content": "\nSELECT payment_type, SUM(total_fee) as total_sales, \n ROUND(SUM(total_fee)/(SELECT SUM(total_fee) FROM tb_order)*100,2) as sales_percentage\nFROM tb_order\nGROUP BY payment_type;\n",
"type": "SQL"
},
{
"content": "\n\n3. 按照订单状态统计订单数量和销售额\n\n",
"type": "MES"
},
{
"content": "\nSELECT status, COUNT(*) as order_count, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY status;\n",
"type": "SQL"
},
{
"content": "\n\n4. 按照下单时间统计每月销售额\n\n",
"type": "MES"
},
{
"content": "\nSELECT DATE_FORMAT(create_time, '%Y-%m') as month, SUM(total_fee) as total_sales\nFROM tb_order\nGROUP BY month;\n",
"type": "SQL"
}
]
复制代码
评论