LLM 在 text2sql 上的应用 | 京东云技术团队
一、前言:
目前,大模型的一个热门应用方向 text2sql 它可以帮助用户快速生成想要查询的 SQL 语句。那对于用户来说,大部分简单的 sql 都是正确的,但对于一些复杂逻辑来说,需要用户在产出 SQL 的基础上进行简单修改,Text2SQL 应用主要还是帮助用户去解决开发时间,减少开发成本。
Text to SQL: 简称 Text2SQl,是将自然语言文本(Text)转换成结构化查询语言 SQL 的过程,属于自然语言处理-语义分析(Semantic Parsing)领域中的子任务。
它的目的可以简单概括为:“打破人与结构化数据之间的壁垒”,即普通用户可以通过自然语言描述完成复杂数据库的查询工作,得到想要的结果。
二、背景应用:
目前大家对 T2S 的做法大致分为两种,
一种是用现有的大模型来直接生成,例如 ChatGPT、GPT-4 模型,但是对于一些公司来说,数据是属于保密资产,这种方式相当于将自己公司的数据信息透漏给大模型,属于数据泄露行为;
另一种方式是利用开源的大模型做 finetune,比如 chatglm2-6b 来做微调,这个也是目前我们在做的,同时开源的数据集也有很多,简单罗列如下:
三、Text2SQL 使用:
我们在 Text2SQL 上面的应用主要包括两个阶段,第一阶段是利用 LLM 理解你的请求,通过请求去生成结构化的 SQL;下一个阶段是在生成的 SQL 上自动化的查询数据库,返回结果,然后利用 LLM 对结果生成总结,提供分析。
3.1 第一阶段:
利用 LLM 理解文本信息,生成 SQL,目前通过 spider 数据集来评测,GPT 家族还是笑傲群雄。但是这里我们如果只借助 GPT 来做的话,就会出现之前说的数据隐私问题。
这里我们通过两部分来提升 LLM 对文本的理解,生成更符合我们要求的结果。
1. 构建数据信息表的 schema,利用 LLM 生成 embedding
由于我们从离线评测效果来看,开源模型 chatglm2-6b 直接生成的 SQL 和 GPT 对比,还是有比较大的差距,所以无法直接使用。这里我们根据用户描述的 text,让预训练的 chatglm2-6b 生成 embedding,通过 embedding 检索的方式,选出 top1 数据表,这个过程属于先验过滤阶段。
数据表的 schema 设计非常重要,需要描述清楚这个表它的主体信息以及表中重要字段和字段含义。
例:
数据表的 embedding 可以提前计算保存,这样利用后期检索效率。
2. prompt 构建,生成 SQL
这部分我认为最重要的还是如何去合理构建 prompt,让 LLM 去理解你的真实意图,生成标准的 SQL。
一是 prompt 的开头需要定义构建,二是 prompt 整体结构以及结构中数据表的信息也需要涵盖进去,这里我们 prompt 的开头首先定义 LLM 的工作目的是生成 SQL,通过我们根据第一部分返回的 top1 数据表,解析数据表中的信息,加入到 prompt 中,以此来构建完成的 prompt。
1)开头 prompt 定义:
2)数据表 prompt 定义:
3)In-context-prompt:如果想强化 prompt,可以增加一些正样本“问答”式的结构,让 LLM 去学习理解,最终生成更理想的结果
prompt 的构建对最终结果的影响非常重要,构建一个完美的 prompt 可能已经成功了一半。
通过以上的 prompt 构建,我们就可以给 LLM 让模型生成最终的 SQL 结果。
3.2 第二阶段:
其实很多场景上一阶段生成 SQL 就已经达到我们想要的结果,但这里我们还想进一步根据 SQL 生成最终的数据,所以需要连接数据库,SQL 运行返回结果。这里我们通过连接集团 CK 数据库,以接口的形式进行部署,我们在运行 SQL 的时候,其实就是调用接口,这样方便简洁,对接口返回的结果进行结构化的输出就可以。
通过接口访问结构化输出:
四、结果:
以上就是目前我们根据 LLM 来生成 SQL,同时让 SQL 自动运行产生结果。前期我们利用 GPT 模型去跑通整个 pipeline,同时生成一些训练数据集,来提供 chatglm2-6b 微调,后期我们还会对产出的结果进行数据分析,这个阶段也是利用 LLM 来完成,通过这种方式给用户一些指导性的意见或总结。
以下是整个 pipeline 的流程:
作者:京东零售 郑少强
来源:京东云开发者社区 转载请注明来源
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/d9d318caf2af11f71fec2d701】。文章转载请联系作者。
评论