大模型出来后,让用户用自然语言的方式做数据分析就成了BI领域关注的焦点,这其中最关键的点在于如何将数据分析的问题转化成能够执行的SQL,从而跨越业务理解到数据提取的巨大鸿沟。
今天就来谈谈ChatdSQL的实现思路,下面以“分地区统计4月1日年龄>50岁的客户的购物金额”需求为例说明SQL组装实现的过程。
一、需求分析
需求分析是将自然语言转换为SQL语句的整个流程的第一步。具体包括以下几个方面:
1、确定支持哪种类型的数据统计问题
(1)聚合查询:如平均值、总和、计数等。
(2)时间序列分析:如月度销售额、季度利润等。
(3)多维度分析:如按地区、年龄段、性别等不同维度进行数据分析。
本案例的“分地区统计购物金额“涉及多维度分析、总和等类型的统计问题。
2、确定支持哪些数据源和数据表结构
(1)数据源:数据可以存储在不同类型的数据库中,如关系数据库(MySQL, PostgreSQL)、NoSQL数据库(MongoDB, Cassandra)或者是分布式数据仓库(如Snowflake, Redshift)。
(2)数据表结构:了解每个数据表的结构,包括表名、字段名、字段类型等。这样才能确保自然语言的需求能准确地映射到具体的数据库字段。
本案例涉及客户信息表(CustomerInfo)、购物记录表(ShoppingRecords),如下所示。
为了简化后续操作,这里假设大模型具备连续问答的能力,同时两张表内容已经成为本次问答的上下文。
3、了解目标用户和使用场景
(1)目标用户:了解将使用这个系统的主要用户群体,他们可能是管理者、数据分析师、业务人员或者是没有数据库经验的普通用户。
(2)使用场景:了解在哪些具体场景下,用户最有可能使用这个系统。是为了报告生成、实时数据监控,还是为了业务决策支持。
起步的时候,ChatSQL只能实现非常简单的取数逻辑,其不是为IT人员服务的,他们也不需要,其服务的对象,更可能是不懂SQL的业务人员或者老板。
业务人员希望自己能快速的获得某个数据,比如取上月arpu大于50的用户清单进行营销,管理人员希望能快速灵活的获得某个维度的指标数据,但让他自己找或找别人要这个指标没个半天下不来,比如要知道杭州地区的利润增长率,这是ChatSQL可以发挥价值的地方。
通过这一阶段的需求分析,我们将能更清晰地了解系统需要解决的具体问题,以及如何去解决这些问题。这为后续的设计和实现提供了明确的方向。
二、大模型识别出基础元素
SQL做统计要明确四个要素:维度、指标、条件及时间,我们要从需求描述中把四个要素准确的提取出来:
(1)识别维度:找出句子中表示维度(如地区、时间等)的词汇。
(2)识别指标:找出句子中表示指标(如购物金额、次数等)的词汇。
(3)识别条件:找出句子中表示筛选条件的词汇。
(4)识别时间:如果有,找出句子中表示时间范围的词汇。
这个就需要靠大模型的语义理解能力了,这里以ChatGPT4为例说明,可以这么问大模型:
问题:
“假设你是自然语言处理专家和统计学家,并是XX行业的数据分析师,请理解以下业务需求,将需求描述进行统计元素拆解,并采用{【指标】:比如”在网用户数“;【时间】:比如”2020年5月“;【维度】:比如”地市“;【条件】:比如”收入大于100元“}的格式输出,需求描述:分地区统计4月1日年龄>50岁的客户的购物金额”
ChatGPT4:
【指标】:购物金额
【时间】:4月1日
【维度】:地区
【条件】:年龄>50岁
可以看到,chatgpt准确的提取出了四个关键要素,这是非常关键的一步。
三、字段映射
【指标】、【维度】及【条件】通过向量检索查询最相似的列,然后提取表名和列名,也可以直接问大模型要答案:
问题:
“请将购物金额、地区、年龄>50岁、时间与CustomerInfo、ShoppingRecords表对应的字段做匹配,输出格式参考:购物金额->ShoppingRecords.shopping_amount”
ChatGPT4:
购物金额->ShoppingRecords.shopping_amount;
地区->CustomerInfo.region;
年龄>50岁->CustomerInfo.age;
时间->ShoppingRecords.shopping_date
四、SQL组装
大模型支持连续对话,可以直接让chatgpt基于前面的语义分析给出组装SQL:
问题:
“请基于字段匹配关系,对“分地区统计4月1日年龄>50岁的客户的购物金额“给出拼装的统计SQL”
ChatGPT4:
事实上,ChatGPT4已经足够聪明到能够推理出你统计的意图,并且给出了正确的组装SQL。
五、大模型的挑战
以上只是基于ChatGPT 4的测试结果,还是比较理想化的,但要实现一个真正实用的ChatSQL,要解决的问题其实很多。
1、大模型的能力问题
现在大多数模型跟chatgpt4有巨大的差距,为了得到你想要的结果,往往需要给出更多的提示词和使用更多的辅助工具。
下面我们基于chatgpt3.5再走一遍流程,看看会发生什么问题,探讨下应该怎么解决:
(1)大模型识别出基础元素
问题:
“假设你是自然语言处理专家和统计学家,并是XX行业的数据分析师,请理解以下业务需求,将需求描述进行统计元素拆解,并采用{【指标】:比如”在网用户数“;【时间】:比如”2020年5月“;【维度】:比如”地市“;【条件】:比如”收入大于100元“}的格式输出,需求描述:分地区统计4月1日年龄>50岁的客户的购物金额”
ChatGPT3.5:
1、指标:购物金额
2、时间:4月1日
3、维度:地区
4、条件:年龄大于50岁的客户
可以看到,ChatGPT3在条件中把“客户”带进来了,这会干扰后续条件字段的映射。
(2)字段映射
问题:
“请将购物金额、地区、年龄大于50岁的客户、时间与CustomerInfo、ShoppingRecords表对应的字段做匹配,输出格式参考:购物金额->ShoppingRecords.shopping_amount“
ChatGPT3.5:
购物金额->ShoppingRecords.shopping_amount
地区->CustomerInfo.region
年龄大于50岁的客户->CustomerInfo.age > 50
时间->ShoppingRecords.shopping_date
果然,”年龄大于50岁的客户“无法很好的与某个字段匹配,这里可以有两种解决方式:
第一种是调整提示词:
问题:
“请将购物金额、地区、客户年龄大于50岁、时间与CustomerInfo、ShoppingRecords表对应的字段做匹配,输出格式参考:购物金额->ShoppingRecords.shopping_amount“,如果无法直接匹配到字段,请选择含义最近的字段进行匹配“
ChatGPT3.5:
购物金额 -> ShoppingRecords.shopping_amount
地区 -> CustomerInfo.region
客户年龄大于50岁 -> CustomerInfo.age(尽管无法直接匹配,但代表客户年龄信息)
时间 -> ShoppingRecords.shopping_date
这时它终于匹配上了正确的字段,但需要不停的优化提示词才能做到通用性。
第二种就是采取分词、词性标注、实体识别等方式,先把”客户年龄“这个实体名称单独识别出来再去匹配字段,这是在特定领域解决大模型能力不足的特定方法,但会导致ChatSQL的复杂度大大增加。
(3)SQL组装
问题:
”请基于字段匹配关系,对“分地区统计4月1日年龄>50岁的客户的购物金额“给出拼装的统计SQL“
chatgpt3.5:
ChatGPT3.5基于上下文,还是能拼装出这个简单的SQL,我也测试了文心一言等大模型,对于这个简单场景基本还是OK。
但统计需求的灵活性实在太高了,下面稍加变化一下统计用词,再来看看各大模型的表现:
问题:
”分地区统计昨天购物金额的同比增长情况“
ChatGPT4:
ChatGPT4的组装SQL是正确的,它精准的理解了按天同比的概念。
ChatGPT3.5:
ChatGPT3.5的SQL基本正确,但它有BUG:
第一、没有考虑空值,当去年同一天没有数据时,同比增长率的计算可能会出现问题。
第二、完整性问题,LEFT JOIN会导致去年没有数据的地区显示为NULL,如果对NULL进行数学运算,结果也会是NULL,子查询。
第三、性能问题,子查询可能会影响查询性能,特别是当表非常大的时候。
但总体来讲勉强及格。
文心一言:
文心一言的SQL完全是错误的,它没有理解按天同比的概念,语法也有大量错误,基本是不可用的。
ChatSQL难点就在于此,为了弥补大模型每个阶段能力的不足,我们得针对特定的场景进行大量的定制化自然语言模型的开发、配备合适的工具、同时优化大量的提示词来引导笨笨的大模型一步一步达成组装SQL的目标,当这个代价特别大的时候,就意味着ChatSQL的失败。
2、数据管理的问题
ChatSQL的成功还依赖于企业数据目录的完备程度,其关键一步是大模型要将四要素跟企业的数据字典元数据进行精准匹配,如果企业数据字典的业务元数据、技术元数据不完善的话,匹配率会非常差,ChatSQL也无实用性可言。
当前我们只能采取临时补充元数据的方法来解决问题,但当ChatSQL规模化后,这种做法就不可持续了,企业需要建立较为完备的数据治理体系,能够对数据目录进行常态化的运营,否则,一切基于数据的大模型创新就会举步维艰。
3、ChatdSQL的场景问题
正如前面所说,初期的ChatSQL能力有限,对于开发人员、取数人员价值有限,当前愿意用ChatSQL的用户要满足两个条件:
第一、有较为强烈的实时,准实时用数的需求
第二、没有SQL开发能力或者对数据架构不熟悉
满足这两种条件的,ChatSQL才有下场的机会,我想到的有两种场景:一种是业务人员需要快速取数,另一种是管理者有快速灵活看指标的需求,如果不满足这些条件,那就让子弹再飞一会儿吧。
ChatSQL最终能成功的,一定是在不断缩小垂直领域的业务分析范围和不断增强的大模型能力之间达成了某种平衡的企业,如果ChatSQL真的能成功,BI的增强分析就是水到渠成的事了。