提升大语言模型生成SQL的准确性

在之前介绍利用大语言模型进行SQl问答的文章中,都还是以实现思路的介绍为主,但是在实际应用中,我们会发现NL2SQL的准确性问题是一个很大的挑战。

本文主要总结一下常见的问题,以及解决这些问题的策略。

NL2SQL的准确性问题

  • 需求描述不清晰:多数时候用户很难完整、准确、清晰地表达自己的数据需求,这个并不是用户的过错,因为自然语言本身就是多样性且非结构化的。

  • 输入信息不充分:用户不清楚应使用哪些表,不了解表结构,或对数据仓库中已有的指标理解不足,数据维度不清晰等等。

  • SQL生成不准确:由于模型本身的能力和泛化水平限制,导致对于复杂问题难以生成准确的SQL。

  • LLM对特定数据库语法缺乏理解:由于数据库的种类多样,尤其是大企业有自己定制的数据库,部分SQL函数和语法是不通用的。

解决方法

  • 优化指标需求描述:在需求描述阶段提供结构化的建议,如使用公司内部常用的指标描述,需求描述的套路,必须要说明哪些关键信息。

  • 复杂问题拆解:利用 Agent 将复杂问题拆解成多个简单问题,然后逐个迭代解决。

  • 构建案例库:整理常见问题和解决方案,形成知识库,在 prompt 中插入 example selector,根据用户输入的问题,自动选择相似的问题和解决方案作为提示。

  • SQL改写:利用 Agent 对生成的SQL进行语法改写,确保与目标数据库的语法一致。在生成提示(prompt)时提供数据库特定的函数建议,并在SQL执行出错时进行修正。

  • 模型微调:利用自有数据集对模型进行微调和强化学习,但成本较高,需要平衡收益和成本。