如何利用约束提示优化LLM在问题转sql的一致性

LLM将用户问题转化为sql时,会面临多次运行生成sql不一致的问题。

LLM将问题转化为sql需要在精确性和有效性间做权衡,LLM每次运行都有可能做出不同的选择。

这里借鉴one-shot learning思路,采用约束提示的方式,尝试解决sql生成不一致的问题。

1 转化问题示例

1.1 应用场景

这里选择chinook数据集。chinook-database是一种应用于教学目的的关系型数据集,包含了音乐、艺术家、专辑等信息。chinook适用于sqlite3、mysql、oracle,可通过运行一个完整的sql脚本建立数据库。

1.2 转化模版

将问题转化为sql的prompt模版如下所示。

你是一位项目信息管理员,请将以下用户问题转化为sql查询。

要求:

1 如果涉及到文本匹配,采用模糊查找的方式

2 数据库表的相关信息来show create table table_name。

3 如果一条sql不能回答问题,可以采用多条sql实现

4 请用一条sql实现。

输出示例如下

```sql

SELECT COUNT(*) AS TotalArtists FROM Artist;

```

以下是用户问题:

{question}

以下是数据库项目相关表的信息:

{table_infos}

"""

1.3 问题展示

档查询问题是"公司总经理和董事"时,多次运行可能会生成如下结果。

对于这三个case,LLM均抓主要查询要点,差异主要体现在select目标、查询条件。

case1:

sql: SELECT EmployeeId, FirstName, LastName, Title

FROM Employee

WHERE Title LIKE '%Manager%' OR Title LIKE '%Director%';

'EmployeeId', 'FirstName', 'LastName', 'Title'

(1, 'Andrew', 'Adams', 'General Manager')

(2, 'Nancy', 'Edwards', 'Sales Manager')

(6, 'Michael', 'Mitchell', 'IT Manager')

case2:

SELECT * FROM Employee

WHERE Title LIKE '%General Manager%' OR Title LIKE '%Director%';

'EmployeeId', 'LastName', 'FirstName', 'Title', 'ReportsTo', 'BirthDate', 'HireDate', 'Address', 'City', 'State', 'Country', 'PostalCode', 'Phone', 'Fax', 'Email'

(1, 'Adams', 'Andrew', 'General Manager', None, datetime.datetime(1962, 2, 18, 0, 0), datetime.datetime(2002, 8, 14, 0, 0), '11120 Jasper Ave NW', 'Edmonton', 'AB', 'Canada', 'T5K 2N1', '+1 (780) 428-9482', '+1 (780) 428-3457', 'andrew@chinookcorp.com')

case3:

sql: SELECT EmployeeId, FirstName, LastName, Title

FROM Employee

WHERE Title LIKE '%General Manager%' OR Title LIKE '%Director%';

'EmployeeId', 'FirstName', 'LastName', 'Title'

(1, 'Andrew', 'Adams', 'General Manager')

2 转化约束示例

2.1 约束模版

在以上prompt模版的基础上,增加sql生成约束,示例如下所示。

你是一位项目信息管理员,请将以下用户问题转化为sql查询。

要求:

1 如果涉及到文本匹配,采用模糊查找的方式

2 数据库表的相关信息来show create table table_name。

3 如果一条sql不能回答问题,可以采用多条sql实现

4 请用一条sql实现。

sql生成注意事项:
1 针对人物搜索类,输出id、名字、职位title即可
2 总经理title对应General Manager

输出示例如下

```sql

SELECT COUNT(*) AS TotalArtists FROM Artist;

```

以下是用户问题:

{question}

以下是数据库项目相关表的信息:

{table_infos}

2.2 约束示例

然后重新运行多次sql生成,示例如下所示。

可以看出,除字段拼接有些差异外,sql输出基本上就很稳定了。

case1:

sql: SELECT

EmployeeId AS id,

CONCAT(FirstName, ' ', LastName) AS name,

Title AS title

FROM Employee

WHERE

Title = 'General Manager'

OR Title LIKE '%Director%';

'id', 'name', 'title'

(1, 'Andrew Adams', 'General Manager')

case2:

sql: SELECT

EmployeeId AS id,

CONCAT(FirstName, ' ', LastName) AS name,

Title AS title

FROM Employee

WHERE

Title LIKE '%General Manager%'

OR Title LIKE '%Director%';

'id', 'name', 'title'

(1, 'Andrew Adams', 'General Manager')

case3:

sql: SELECT EmployeeId AS id, FirstName, LastName, Title

FROM Employee

WHERE Title LIKE '%General Manager%' OR Title LIKE '%Director%';

'id', 'FirstName', 'LastName', 'Title'

(1, 'Andrew', 'Adams', 'General Manager')

reference


关系型数据库数据集 - northwind & chinook

https://blog.csdn.net/liliang199/article/details/153821509

langchain agent将用户问题转sql并运行sql查询

https://blog.csdn.net/liliang199/article/details/154007162

langchain将用户问题转sql查询探索

https://blog.csdn.net/liliang199/article/details/153839198

相关推荐
Java爱好狂.3 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
Elastic 中国社区官方博客3 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头1064 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库·mysql·安全·金仓数据库
小鸡毛程序员4 小时前
我在CSDN学MYSQL之----数据库基本概念和基本知识(下)
数据库·mysql
程序定小飞5 小时前
基于springboot的web的音乐网站开发与设计
java·前端·数据库·vue.js·spring boot·后端·spring
小灰灰搞电子5 小时前
Rust 操作Sqlite数据库详细教程
数据库·rust·sqlite
武昌库里写JAVA5 小时前
element-ui 2.x 及 vxe-table 2.x 使用 css 定制主题
java·vue.js·spring boot·sql·学习
IvorySQL6 小时前
你真的知道你正在运行哪个 PostgreSQL吗?
数据库·postgresql
l1t6 小时前
利用DeepSeek采用hugeint转字符串函数完善luadbi-duckdb的decimal处理
数据库·lua·c·duckdb·deepseek