微信扫码
添加专属顾问
我要投稿
参加Text2SQL比赛的心得分享,带你深入了解自然语言转SQL查询技术的应用和挑战。 核心内容: 1. Text2SQL技术介绍及其商业价值 2. “2024金融行业·大模型挑战赛”概况及数据集特点 3. Text2SQL技术难点分析及解决方案探讨
简单来说,Text2SQL(或者叫 NL2SQL)就是把我们平时说的话(自然语言)自动翻译成数据库能懂的查询语言(SQL)。这样一来,就算你完全不懂 SQL,也能直接问数据库问题,拿到你想要的数据。这技术能:
总之,商业价值挺大的。
我参加的是“2024 金融行业・大模型挑战赛”。这个比赛由清华大学基础模型研究中心主办,智谱 AI 提供支持,聚焦大模型在金融领域的应用。
比赛方提供了挺“豪华”的金融数据集:77 个数据表,3000 多个字段,涵盖 A 股、港股、美股、基金、财务报表等等。
题目也分了难度:初级(简单查个数)、中级(带点统计分析)、高级(复杂的金融分析),挺全面地考察我们用大模型处理金融数据的能力。
感兴趣可以去官网看看:(2024金融行业·大模型挑战赛) https://competitions.zhipuai.cn/matchDetail?id=120241202000000003
搞 Text2SQL 并不容易,我总结了几个主要的难点:
这是第一道坎。用户问个问题,模型得先弄明白该去哪些表里、找哪些字段才能回答。
比如,用户问“最近三年盈利能力最强的科技公司”,模型得知道去哪找“科技公司”的定义,怎么关联“财务数据”,还得理解啥叫“盈利能力”,涉及哪些字段,怎么计算。
用户的提问方式千奇百怪,而且往往不够精确:
用户很少一次就把需求说明白,都是边问边想,这对模型的理解力是巨大考验。
特别是金融领域,很多问题不是一条简单 SQL 能搞定的:
WHERE
, GROUP BY
, HAVING
嵌套,还得用聚合函数。这类问题需要模型有规划能力,把大问题拆成小步骤去执行。
光懂技术不行,还得懂业务:
缺了领域知识,就算 SQL 语法没错,结果也可能完全没意义。
要把 Text2SQL 做成好用的系统,工程挑战也不小:
一个靠谱的系统,不仅要准,还得快、稳、省钱,能扛住各种压力。
面对上面这些难点,我们在比赛中尝试了一些解决方案,效果还不错:
怎么让模型在茫茫多的表和字段里找到对的?我们试了两种方法:
这就像“缩小包围圈”,让 LLM 分几步走:
我们发现,直接把表名、字段名和它们的描述(比如 revenue_growth_rate: 营收增长率
)做成向量,然后去检索,效果很差。
灵光一闪的创新点:让 LLM 帮忙“编”问题!
让 LLM 给每个字段写“模拟问题”:想象一下用户可能会怎么问到这个字段?
revenue_growth_rate
这个字段,用户可能问:向量化这些“模拟问题”:注意,是向量化这些问题,而不是原始的字段描述。
用户提问时,用向量检索:用户的真实问题进来后,我们去匹配最相似的“模拟问题”,就能找到背后对应的字段了。
聪明的召回结果整合
直接按字段分数排序选 top N 个字段?效果不好。因为一个模拟问题可能对应多个字段,而且有些表可能整体相关性很高,但单个字段分数不算最高。
我们的做法是:
对比一下
两种方案都需要“最后确认”:无论用哪种方法召回,最后都需要再让 LLM 从候选表和字段里,最终确认哪些是真正回答问题所必需的。这一步很关键,因为无关字段太多会严重干扰 LLM 生成 SQL。我们的向量检索方案因为前期召回更准,最后这一步的压力也小很多。
多轮对话里,用户经常问得很简洁,比如前面问了 A 公司的营收,接着问“那增长率呢?”。
我最初的想法是:
比如,把“那增长率呢?”,根据上下文改写成类似“A 公司的营收增长率是多少?”。
但是,这个方法有坑!
后来发现,一个更简单直接的方法效果反而更好:
实践证明:
这个经验告诉我们:处理多轮对话理解,有时保持信息的完整性比做过多“聪明”的加工更靠谱。
遇到那种一步到位的 SQL 很难写出来、甚至写不出来的复杂问题,怎么办?我用了一个简单但很有效的迭代思考框架。
就像我们人解决复杂问题一样,我让 AI:
这个过程可以循环几次,直到 AI 认为信息足够回答用户问题为止。
关键是让模型在每一步都明确地输出它的思考过程,比如:
通过这种方式,AI 能更好地拆解复杂任务,一步步逼近答案。
对于需要多表连接、复杂计算、多重条件嵌套的问题,这个“边想边做”的方法特别管用。
模型不懂金融术语和业务规则怎么办?硬塞肯定不行,得讲究方法:
一些最常用、最基础的业务术语,可以直接加到 System Prompt 里。
这是个好方法:在定义数据库 Schema 时,就给重要的字段加上详细的业务含义解释。
PE_TTM
字段,注释可以写:“滚动市盈率,衡量股价相对于每股收益的倍数,常用于估值”。这招效果最好:提前准备一些典型问题的 SQL 样例。当用户提出类似问题时,动态地把最相似的几个 SQL 样例(问题+SQL)塞到 Prompt 里,作为示例(Few-shot)给模型看。
为什么有效?
通过这几种方法组合,就能比较好地解决领域知识不足的问题了。
怎么让系统跑得快点、稳点、省点钱?
前面提到的 DB 召回方案其实已经在省 Token 了:
这两个都是为了在保证效果的前提下,尽量减少喂给大模型的信息量,从而降低 Token 消耗。
在上面提到的“迭代思考”框架里,我们加了几道保险:
这些机制就像安全带,保证了系统在遇到各种异常时,不会彻底崩溃。
为了方便大家交流学习,我把这次比赛用到的核心代码框架整理开源了。
GitHub 链接:(FinGLM2-semi-final)
https://github.com/Jinglever/FinGLM2-semi-final
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-19
Text-to-SQL准确率破局之道:从基础优化到前沿技术
2025-04-18
破茧成蝶:传统J2EE应用无缝升级AI原生
2025-04-17
揭秘agent+MCP架构首次落地企业智能数据场景案例
2025-04-17
DataAgent是最容易落地的Agent场景?
2025-04-16
易用+高效+开放!实测卡奥斯智能体:让AI真正懂生产
2025-04-14
工业领域的Manus,为什么是一家杭州公司跑出来了?
2025-04-14
MindsDB :借 MCP 一句话打通20+数据库,大模型秒变SQL专家!
2025-04-13
如何优化 AskTable AI 生成 SQL 的准确率
2024-10-14
2024-06-20
2024-10-09
2025-02-04
2024-06-14
2024-06-16
2024-06-14
2024-05-31
2024-07-24
2025-02-09