C3
- C3: Zero-shot Text-to-SQL with ChatGPT
- https://github.com/bigbigwatermalon/C3SQL
- 通过优化schema description+多路投票的解码方案,用zero-shot prompt基本追平DIN的效果
在DIN-SQL提出的Few-shot方案的基础上,C3使用chatgpt作为基座模型,探索了zero-shot的方案,这样可以进一步降低推理成本。并且在生成效果上和DIN-SQL不相上下。
论文实现有很多细节,个人感觉比较重要的是以下两个部分,其他细节不做赘述
Clear Prompting
C3也通过Schema Linking先定位问题相关的数据表和查询字段。不过在指令构建上,论文认为在编写指令时,简洁的文本格式(clear layout),以及不引入不相关的表结构(clear context),会降低模型理解难度,对模型效果有很大提升。下面我们分别看下这两个部分
Clear Layout
后面的SQL-Palm也进行了类似的消融实验,对比符合人类自然语言描述的Table Schema,使用符号表征的prompt效果显著更好,在执行准确率上有7%左右的提升。
Clear Context
把整个数据库的全部表结构放入schema linking Context,一方面增加了推理长度,一方面会使得模型有更大概率定位到无关的查询字段。因此C3通过以下两步先召回相关的数据表和表字段,再进行schema linking
- 数据表召回
C3使用以下zero-shot指令,让大模型基于数据表schema,召回问题相关的数据表。这一步作者采用了self-consistency来投票得到概率最高的Top4数据表。当前的一些开源方案例如ChatSQL等,也有采用相似度召回的方案,更适合低延时,面向超大数据库的场景。不过需要先人工先对每张表生成一段表描述,描述该表是用来干啥的,然后通过Query*Description的Embedding相似度来筛选TopK数据表。
instruction = """Given the database schema and question, perform the following actions:
1 - Rank all the tables based on the possibility of being used in the SQL according to the question from the most relevant to the least relevant, Table or its column that matches more with the question words is highly relevant and must be placed ahead.
2 - Check whether you consider all the tables.
3 - Output a list object in the order of step 2, Your output should contain all the tables. The format should be like:
[&