可从公众号“AI早高峰”看全文
https://mp.weixin.qq.com/s/Vs0iqZVFphc-QCsr3X1ywA

跟数据库对话机器人对话,我可不止一个问题。
可能基于第一句问话,还有第二句、第三句问话。。。第N句对话。所以本文测试了多轮对话功能

单轮对话的环境搭建参考博客 Text-to-SQL 工具Vanna + MySQL本地部署 | 数据库对话机器人

我的数据是这样
在这里插入图片描述

1. 基础配置

import vanna
from vanna.remote import VannaDefault
from vanna.flask import VannaFlaskApp
import pandas as pd
import mysql.connector

api_key = '7acxxx68c'
vanna_model_name = 'community'
vn = VannaDefault(model=vanna_model_name, api_key=api_key)

def run_sql(sql: str) -> pd.DataFrame:
    cnx = mysql.connector.connect(user='root',password='111000',host='localhost',database='Community')
    cursor = cnx.cursor()
    cursor.execute(sql)
    result = cursor.fetchall()
    columns = cursor.column_names
    # print('columns:',columns)
    df = pd.DataFrame(result, columns=columns)
    return df

# 将函数设置到vn.run_sql中
vn.run_sql = run_sql
vn.run_sql_is_set = True

2. 多轮生成SQL

代码如下:

first_sql = vn.generate_sql('查询30岁以上的姓名、年龄、身份证?')
if first_sql is not None:
    print('first_sql:\n',first_sql,)

    second_sql = vn.generate_sql(f'基于SQL语句{first_sql}修改,添加查询性别?')
    print('\nsecond_sql:\n',second_sql)

    third_sql = vn.generate_sql(f'基于SQL语句{second_sql}修改,查询女性、苗族?')
    print('\nthird_sql:\n',third_sql)

    forth_sql = vn.generate_sql(f'基于SQL语句{third_sql}修改,要查询男性的少数民族信息?')
    print('\nforth_sql:\n',forth_sql)

    fivth_sql = vn.generate_sql(f'基于SQL语句{forth_sql}修改,不要身份证号,要手机号?')
    print('\nfivth_sql:\n',fivth_sql)

无任何训练语句,SQL生成结果如下:

first_sql:
 SELECT name, age, id_card
FROM customer
WHERE age > 30;

second_sql:
 SELECT name, age, id_card, gender
FROM customer
WHERE age > 30;

third_sql:
 SELECT name, age, id_card, gender
FROM customer
WHERE age > 30 AND gender = 2 AND nation = '苗族';

forth_sql:
 SELECT name, age, id_card, gender, nation
FROM customer
WHERE gender = 1 AND nation NOT IN ('汉族', '壮族', '回族', '满族', '维吾尔族', '苗族', '彝族', '藏族', '布依族', '侗族', '瑶族', '朝鲜族', '白族', '哈尼族', '哈 萨克族', '黎族', '傣族', '畲族', '傈僳族', '仡佬族', '东乡族', '高山族', '拉祜族', '水族', '佤族', '纳西族', '羌族', '土族', '仫佬族', '锡伯族', '柯尔克孜族', '达斡尔族', '景颇族', '毛南族', '撒拉族', '布朗族', '塔吉克族', '阿昌族', '普米族', '鄂温克族', '怒族', '京族', '基诺族', '德昂族', '保安族', '俄罗斯族', '裕固族', '乌孜别克族', '门巴族', '鄂伦春族', '独龙族', '塔塔尔族', '赫哲族', '珞巴族')

fivth_sql:
 SELECT name, age, mobile, gender, nation
FROM customer
WHERE gender = 1 AND nation NOT IN ('汉族', '壮族', '回族', '满族', '维吾尔族', '苗族', '彝族', '藏族', '布依族', '侗族', '瑶族', '朝鲜族', '白族', '哈尼族', '哈 萨克族', '黎族', '傣族', '畲族', '傈僳族', '仡佬族', '东乡族', '高山族', '拉祜族', '水族', '佤族', '纳西族', '羌族', '土族', '仫佬族', '锡伯族', '柯尔克孜族', '达斡尔族', '景颇族', '毛南族', '撒拉族', '布朗族', '塔吉克族', '阿昌族', '普米族', '鄂温克族', '怒族', '京族', '基诺族', '德昂族', '保安族', '俄罗斯族', '裕固族', '乌孜别克族', '门巴族', '鄂伦春族', '独龙族', '塔塔尔族', '赫哲族', '珞巴族')

添加训练语句,让vn学习优化SQL语句

vn.train(question='哪些是少数民族?',sql="SELECT name FROM std_people WHERE nation !='汉族'")

SQL生成结果如下:
在这里插入图片描述

first_sql:
 SELECT name, age, id_card
FROM customer
WHERE age > 30;

second_sql:
 SELECT name, age, id_card, gender
FROM customer
WHERE age > 30;

third_sql:
 SELECT name, age, id_card, gender
FROM customer
WHERE age > 30 AND gender = 2 AND nation = '苗族';

forth_sql:
 SELECT name, age, id_card, gender, nation
FROM customer
WHERE gender = 1 AND nation != 'hanNat';

fivth_sql:
 SELECT name, age, gender, nation, mobile
FROM customer
WHERE gender = 1 AND nation != 'hanNat';

3. 多轮对话

  • vn.ask 生成SQL
    使用方法看Vanna源代码
    在这里插入图片描述

代码如下:

first_result = vn.ask('查询30岁以上的姓名、年龄、身份证?')
if first_result is not None:
    first_sql,_,_ = first_result
    print('first_sql:\n',first_sql,)

    second_sql,_,_ = vn.ask(f'基于SQL语句{first_sql}修改,添加查询性别?')
    print('\nsecond_sql:\n',second_sql)

    third_sql,_,_ = vn.ask(f'基于SQL语句{second_sql}修改,查询女性、苗族?')
    print('\nthird_sql:\n',third_sql)

    forth_sql,_,_ = vn.ask(f'基于SQL语句{third_sql}修改,查询男性的少数民族信息?')
    print('\nforth_sql:\n',forth_sql)

    fivth_sql,_,_ = vn.ask(f'基于SQL语句{forth_sql}修改,不要身份证号,要手机号?')
    print('\nfivth_sql:\n',fivth_sql)
  • askgenerate_sql的区别
    • generate_sql: 只给出SQL语句
    • ask : 给出SQL语句 和 执行结果(dataframe格式)。如果把print_results = False, 则vn.ask返回结果取第一项,则与generate_sql无异。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐