0.知其然,不必知其所以然
从冰冷的数据到活泼的可视化展现,往往需要多个岗位协助来进行;在岗位职责越来越细分的当下,似乎也很少再会要求有全栈能力的人来做数据分析了。
所以经常会发生这样的场景:数据分析师需要某些数据,却发现数据平台没有现成的模型,需要找到开发添加,而开发对需求理解也不一定准确,写出来的sql模型又容易出现问题,这种时候,你肯定会想:如果我说一句话,就能从数据库查出数据该多好。
Text2SQL,准确的说叫自然语言转数据库查询语句,在很多年前就出现了,但是受限于技术和NLP的发展,一直没有太大的进步;直到大语言模型的出现,这项技术也得到了史诗级的强化。
这一次,我们通过一个简单的例子来验证这项技术。
1.阿里云百练
在这里,我们使用阿里云百炼,而不是直接使用通义千问或者文心一言,是为了后期能够方便地融入我们自己的平台,你肯定也不想每次查询数据都要打开百度或者阿里的网站吧。
1.1创建应用
完成注册等前期工作后,我们进入阿里云百炼的页面,首先在模型广场中找到通义千问-max模型(限时免费使用,所以先薅一薅):
点击创建应用,输入名称:
1.2调试应用
我们先进行测试,测试页面如下图展示:
第一步,我们先选择prompt模板,在搜索框输入sql,选择‘SQL专家’模板:
第二步,我们可以看到该模板有两个参数,require代表你的查询需求,table_structure代表数据库的表结构;我们在require中填入“我想查看2023年的销售数据,并按照地区排名显示前十位”,在table_structure填入准备好的数据库表sale_table(year,month,area_name,amount),点击应用至测试窗,便可以将内容填充近prompt模板中。
点击发送,便可以得到我们想要的sql:
2.接口调用
上面的步骤其实可以完成一些工作了,不过就如前文所述,你肯定也不想每次查询数据都要打开百度或者阿里的网站;为了达成这个目的,阿里云百炼提供了api调用和sdk调用,这里,我们先使用api调用来完成。
2.1必要信息准备
首先,我们需要准备四个必要参数,Access Key、Access Secret Key、Agent Key、AppId,用以调用我们刚才创建的应用。
第一步,通过RAM访问控制获取Access Key和Access Secret Key,进入官网 ,点击创建Access Key,完成验证后可得到Access Key和Access Secret Key,需要注意的是,请保存好这两个参数,如果遗忘了就只能重新创建。
第二步,在应用管理中,点击调用,在打开的页面中可以看到Agent Key和AppId。
2.2token获取
在使用推理前,需要先获取token,可以在官方的文档中找到获取token的代码,我们以python为例:
1. 获取和安装SDK
pip install broadscope-bailian
2. 调用代码示例
import os
from alibabacloud_bailian20230601.client import Client
from alibabacloud_bailian20230601.models import CreateTokenRequest
from alibabacloud_tea_openapi.models import Config
def create_token():
access_key_id = os.environ.get("ACCESS_KEY_ID")
access_key_secret = os.environ.get("ACCESS_KEY_SECRET")
agent_key = os.environ.get("AGENT_KEY")
endpoint = "bailian.cn-beijing.aliyuncs.com"
config = Config(access_key_id=access_key_id,
access_key_secret=access_key_secret,
endpoint=endpoint)
client = Client(config=config)
token_response = client.create_token(CreateTokenRequest(agent_key=agent_key))
if token_response.status_code != 200 or token_response.body is None:
raise RuntimeError("create token error, code=%d" % token_response.status_code)
token_body = token_response.body
if not token_body.success:
request_id = token_body.request_id
if not request_id:
request_id = token_response.headers.get("x-acs-request-id")
raise RuntimeError("create token error, code=%s, message=%s RequestId: %s"
% (token_body.code, token_body.message, request_id))
print('token: %s, expired_time: %s' % (token_body.data.token, token_body.data.expired_time))
将参数替换成我们上一步得到的内容即可:
执行后便可得到token:
2.3推理接口调用
拿到token后,我们便可以进行推理应用。
还是使用python,使用刚才的prompt,然后自定义需要的参数即可:
# 需要替换'Authorization':'Bearer token'中的token为上一步得到的token
import requests
import json
require = '我想查看2023年的销售数据,并按照地区排名显示前十位'
table_structure = 'sale_table(year,month,area_name,amount)'
prompt='您是SQL专家,现在需要根据以下具体场景编写一个正确且规范的SQL查询语句。问题情境:用户希望从数据库中查询满足特定条件的数据,请提供该SQL查询任务的详细描述。问题需求:'+require+'。请基于以下表格结构'+table_structure+'请使用以下格式编写SQL代码,并确保其解答了用户的问题:```sql-- 请在此处编写SQL查询语句SELECT ...FROM ...WHERE ...GROUP BY ...HAVING ...ORDER BY ... ;```其中,查询条件和字段选择应当基于用户的实际需求""'+require+'""来确定。'
url = 'https://bailian.aliyuncs.com/v2/app/completions'
headers = {
'Content-Type': 'application/json; charset=utf-8',
'Authorization':'Bearer token',
'Accept-charset': 'utf-8'
}
data = {
"RequestId": "202402191007001",
"AppId": "bcec908da3ba4930959e5e963c258bcc",
"Prompt": prompt}
result = requests.post(url, headers=headers, data=json.dumps(data))
print(result.content.decode('utf-8'))
执行后,便可得到结果。
3.一些说在最后的话
这只是一个应用的基本流程,你可以放入你自己的工程中,也可以试试能不能让通义千问处理一些更复杂的查询问题。