一、Text-to-SQL应用概述
什么是Text-to-SQL?Text-to-SQL也称为NL2SQL,是将自然语言查询转换为可在关系数据库上执行的SQL查询的技术。
其核心目标是准确捕捉并反映用户意图,生成相应的SQL查询,确保执行后返回符合预期的结果。
在前面一篇文章中,链接如下:https://www.cnblogs.com/xiao987334176/p/18816166
需要3个文件ddl.txt,description.txt,qa.xlsx才能实现Text-to-SQL。
其中最重要的qa.xlsx,里面的sql就是黄金语句。但是正常情况下,需要准备2000-5000条sql,才能满足需求。
特别的耗时耗力,如果一旦表结构发生更改,就需要重写。
二、提示工程优化
为解决这些问题,可考虑采用提示工程(Prompt Engineering)、模型微调(Fine-tuning)、
联合检索增强生成和智能代理(RAG & Agent)等方法,以优化模型及应用的Text-to-SQL任务设计。
通过设计特定的提示词或语句,引导模型生成更贴合用户意图的输出内容。在处理SQL查询时,
向模型注入特定领域的知识,如SQL规范、数据库架构以及数据字段注释等额外信息,
能够显著提升模型对于SQL语句结构和逻辑的理解能力。
提示工程的关键在于将自然语言问题与必要的数据库信息转化为适用于大语言模型(LLM)的自然语言序列输入,
即问题表示。同时,当允许输入一些样例以利用LLM的上下文学习能力时,
还需要考虑如何选择样例以及如何将这些样例有机地组织到输入序列中。
提示工程的关键在于将自然语言问题与必要的数据库信息转化为适用于大语言模型(LLM)的自然语言序列输入,即问题表示。同时,当允许输入一些样例以利用LLM的上下文学习能力时,还需要考虑如何选择样例以及如何将这些样例有机地组织到输入序列中。
通过构建包含基本提示、文本表示提示、OpenAI范式提示、代码表示提示、指令微调提示以及上下文学习等综合Prompt策略的方法,在Text-to-SQL的Prompt设计中融入说明、数据结构、示例、提示或约束、领域知识及用户问题等要素,能够取得较好的效果,具体如下:
(1)说明:如,“你是一个SQL生成专家。请参考如下的数据表结构,输出SQL语句。”
(2)数据结构:相当于语言翻译中的字典。即需要使用的数据库表结构,把数据结构组装进Prompt,包括表名、列名、列的类型、列的含义、主外键信息。
(3)示例:作为可选项,也是提示工程的常见方式。即指导大模型生成SQL的参考范本。
(4)提示或约束:其他必要的指示。
(5)领域知识:可选项,某些特定问题中,对常识描述的解释。
(6)用户问题:用户提出的问题。
融合上述元素,可以得到TEXT-TO-SQL通用Prompt模板框架如下:
# 描述Text-to-SQL任务的说明
${示例}
# 描述数据库表结构信息
${数据库表结构}
# 相似用户问题及对应的SQL语句/[可选]
${示例}
# 用户问题相关的领域知识/[可选]
${领域知识}
# 提示或其他约束条件[可选]
${提示/约束}
# 需要生成SQL的用户问题
${用户问题}
Agent增强
AI Agent(智能体)是一种模拟人类或其他智能体行为和决策过程的系统。通过引入行动能力、
长期记忆机制和工具整合能力,能够感知环境、处理信息、制定策略并执行行动来完成任务。
AI Agent通过一个框架规划多个方法,这个框架具有一些具体模块,支持整个结构的运行。
在Text-to-SQL任务中,这通常涉及多个步骤,Agent需要了解这些步骤并提前规划,具体的类型包括:
目标和任务分解:Agent将大型任务分解为更小、更易管理的子目标,以便有效地处理复杂任务。
反思与改进:Agent可以对过去的行为进行自我校准和自我反思,从错误中学习并改进未来步骤,从而提高最终结果的质量。
外部工具与资源利用:Agent可以调用各种外部工具集,如搜索引擎、数据库接口等,以扩展其功能并增强解决问题的能力。
对话管理与上下文保持:通过维护对话历史和关键信息,Agent能够在连续提问或修正查询时保持上下文的连贯性,提升用户体验。
三、MySQL数据
新建表结构
本文使用的MySQL数据为8.0.41
新建数据库test
CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
新建5个表
班级表
CREATE TABLE `classes` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级ID,示例:202301',
`className` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级名称,示例:2023级计算机1班',
`grade` int NOT NULL COMMENT '年级,示例:2023',
`headTeacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班主任ID,外键(teachers.id),示例:T003',
`classroom` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教室位置,示例:1号楼302',
`studentCount` int NOT NULL COMMENT '学生人数,示例:35',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注信息,示例:市级优秀班集体',
PRIMARY KEY (`id`),
KEY `headTeacherId` (`headTeacherId`),
CONSTRAINT `headTeacherId` FOREIGN KEY (`headTeacherId`) REFERENCES `teachers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='班级表';
课程表
CREATE TABLE `courses` (
`id` v

最低0.47元/天 解锁文章
1535

被折叠的 条评论
为什么被折叠?



