CodeBuddy+SQLazy 编写复杂 SQL 实践过程

1. 安装配置 SQLazy

下载安装 SQLazy

进入官网https://www.raqsoft.com.cn/download-NaturalSPL,下载 SQLazy(Natural SPL)

Picture2png
一键安装 SQLazy,可保留默认配置项。点击桌面图标 "NaturalSPL" 打开 IDE。

Picture3png

配置项目目录

在操作系统中,新建任意目录作为本项目根目录,比如 "d:\AI\workbuddyNSPL",在该目录下新建空目录 nspl,将来存放 CodeBuddy 生成的 nspl 代码文件。

打开 "SQLazy安装目录\LLM" 目录,找到 SQLazy 知识库,即该目录下的 2 个文件:规划.md、sqlazy 规划.md,以及 2 个目录:函数、功能。

规划.md:全局规约文件,集中定义了全部表结构、输出流程、SQLazy 格式规范、硬性约束,并声明了所有 SQLazy 函数 / 功能文档的加载路径。

sqlazy 规划.md:自定义命令文件,定义了在 LLM 对话框调用本 skills 的格式。

函数:SQLazy 所有的函数定义文件。

功能:SQLazy 所有的功能定义文件。

将这些文件和目录复制到本项目根目录,形如下图:

Picture4png

配置 JDBC

配置 JDBC 是为了让后续步骤使用内存表和 SQL 数据源,如果使用文本数据源,可以跳过本步骤。

将数据库对应的驱动放入 "SQLazy安装目录\..\common\jdbc",这里以 mysql8 为例:

Picture5png
在 SQLazy IDE 中,用菜单 "工具 -> 数据连接" 新建数据源。新建 My_SQL 数据源,按 Java 规范填写,命名为 mysql8。点击连接按钮,如果数据源名变为粉色,则说明连接成功。

Picture6png

2. 安装配置 CodeBuddy

进入官网https://www.codebuddy.cn/ide/,下载 CodeBuddy IDE。

Picture7png
按缺省选项安装 CodeBuddy,安装后按官方要求登录。

Picture8png
用菜单 "文件 -> 打开文件夹" 打开本项目的根目录,CodeBuddy 会自动索引上下文,并自动以 Craft 类型打开右下角的 LLM 对话框。如果没有自动打开,请点击右上角的按钮展开 LLM 对话框,并在对话类型中选择 "Craft"。

Picture9png

3. 基本解题步骤

可以把一些常用的数据表定义为全局表,从而在本项目的任意对话框中直接引用。下面将基于一个全局表进行计算,结果生成 nspl 文件,再在 SQLazy 中验证该 nspl,验证无误后编译成 SQL,最后执行 SQL。

定义全局表

在文件 "规划.md" 的 "业务数据表结构" 章节,编写股票表的定义:stock:CODE(INT),DT(DATETIME),CL(FLOAT)。

Picture10png
注意,如果没有在 "规划.md" 中定义表结构,则必须在将来输入用户指令时定义。
在 mysql8 数据库中新建 stock 表,导入下面的股票记录。

CODE,DT,CL
100030,2009-01-01 00:00:00,3.89
100046,2009-01-05 00:00:00,3.78
100046,2009-01-06 00:00:00,4.04
100046,2009-01-08 00:00:00,4.02
100046,2009-01-07 00:00:00,3.77
100046,2009-01-12 00:00:00,4.86
100046,2009-01-09 00:00:00,4.42
100046,2009-01-13 00:00:00,4.44
100046,2009-01-14 00:00:00,4.88
100046,2009-01-15 00:00:00,4.98
100046,2009-01-19 00:00:00,4.83
100046,2009-01-16 00:00:00,4.99
100046,2009-01-21 00:00:00,5.51
100046,2009-01-20 00:00:00,5.12

生成 nspl 文件

在 CodeBuddy 的对话框中输入指令:/sqlazy 规划 计算股票代码为 100046 的股票,最长连续上涨了多少天?

上面指令中,"/sqlazy 规划" 是自定义命令,后面是计算要求,"股票" 通常会被 LLM 识别为全局表 stock。

经过一段时间的计算,Codebuddy 会根据全局规约文件输出结果,包括:计算过程、核心逻辑、nspl 文件等。其中 nspl 文件是核心。

Picture11png

用内存表运行 nspl

在 SQLazy IDE 中打开 "本项目根目录\nspl" 中的 nspl 文件。

Picture12png
点击菜单 "工具 -> 内存表" 打开配置内存表的界面。

Picture13png
点击 "导入数据库表",将列出数据库所有的表(当前 schema)。勾选需要用的表 stock,并点击 "确定"。

Picture14png
在内存表界面中再次勾选需要用的表 stock,并关闭界面。

Picture15png
点击执行(或单步运行)按钮,如果右边显示正确计算结果,则说明 nspl 代码正常。注意,实际代码可能与下面有偏差,甚至每次生成的 nspl 文件都有少许偏差,这是由 LLM 的不确定性决定的。

Picture16png
点击左边某行 nspl 代码时,右边会自动跳转到对应的中间计算结果,这在调试时非常方便。比如点击 t5,可以看到最终计算结果。

Picture17png

编译 SQL

在 SQLazy IDE 中打开菜单 "程序 -> 编译",在目标数据库中选择 MYSQL,点击 "编译",将自动生成 SQL 语句。

Picture18png
点击 "执行",将执行该 SQL,返回执行结果。该结果应与 IDE 中最后一步 nspl 的计算结果一致。

Picture19png

4. 进阶:更多数据源

SQL数据源

上面解题步骤的数据源是库表生成的内存表,这里介绍 SQL 实时数据源。

在 nspl 代码的第一行插入新行,命名为 stock(必须与下一行的锚点同名),编写 SQL 功能用于取数 ":SQL"select * from stock"; 数据库 mysql8

其中,mysql8 是之前配置好的数据源名。

Picture20png
点击执行按钮,如果右边显示正确计算结果,则说明 SQL 数据源取数成功。

Picture21png

文本数据源

使用指定符号分隔的文本文件做数据源,可以脱离数据库运行 nspl。

将前面的股票记录保存成文件 stock.csv。

将 nspl 代码中原第一行(命名为 stock 的行)替换为以下内容,用 nspl 的文件功能取数:文件 "d:\\stock.csv"; 逗号分隔; 标题

其中,"逗号分隔" 表示分隔符是逗号,可以指定其他符号; "标题" 表示文本的首行为字段名。

运行后如图所示。

Picture22png

5. 进阶:失败处理

LLM 一定有幻觉,不能保证百分百成功,但有一些办法可以提高成功率。

清晰描述算法

计算失败主要原因是表达不清晰,越复杂的算法越怕不清晰。下面介绍一种推荐的表达方法:把指令分为源数据、计算要求、预期结果三个清晰的部分。比如下面这个较复杂的例子 "跨子组按序列填充字段值",指令如下:

/sqlazy规划
源数据:库表lines前两个字段是分组字段,后两个字段是组内明细。按前 3 个字段排序后,数据有以下规律:同一个大组的各小组的记录数一定相同;每个大组里只有最后一个小组的第 4 个字段有值,其他小组都是 null。
Group1	Group2	LineID	TargetField
1	1	5	
1	1	6	
1	2	3	
1	2	4	
1	3	1	1
1	3	2	2
2	4	11	
2	4	12	
2	4	13	
2	5	16	5
2	5	17	3
2	5	18	4

计算要求:现在要在每个大组内,把最后一个小组的第 4 列,按序列的顺序更新或复制到其他小组。

预期结果:
Group1	Group2	LineID	TargetField
1	1	5	1
1	1	6	2
1	2	3	1
1	2	4	2
1	3	1	1
1	3	2	2
2	4	11	5
2	4	12	3
2	4	13	4
2	5	16	5
2	5	17	3
2	5	18	4

计算结果如下。

Picture23png
编译为 SQL。

Picture24png

反馈错误日志

如果 SQLazy IDE 执行 nspl 时报错,则可以点击菜单 "工具 -> 控制台",将错误日志复制出来。

Picture25png
全部粘贴到 CodeBuddy 中,并简单说明这是错误日志。LLM 会分析日志并重新生成 nspl 文件。

Picture26png

如此反复,通常可以解决问题。

使用高性能模型

使用性能一般的模型时可能失败率偏高,可尝试在 CodeBuddy 中切换到高性能模型后重试。

Picture27png