CodeBuddy+SQLazy 编写复杂 SQL 实践过程
1. 安装配置 SQLazy
下载安装 SQLazy
进入官网https://www.raqsoft.com.cn/download-NaturalSPL,下载 SQLazy(Natural SPL)

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

配置项目目录
在操作系统中,新建任意目录作为本项目根目录,比如 "d:\AI\workbuddyNSPL",在该目录下新建空目录 nspl,将来存放 CodeBuddy 生成的 nspl 代码文件。
打开 "SQLazy安装目录\LLM" 目录,找到 SQLazy 知识库,即该目录下的 2 个文件:规划.md、sqlazy 规划.md,以及 2 个目录:函数、功能。
规划.md:全局规约文件,集中定义了全部表结构、输出流程、SQLazy 格式规范、硬性约束,并声明了所有 SQLazy 函数 / 功能文档的加载路径。
sqlazy 规划.md:自定义命令文件,定义了在 LLM 对话框调用本 skills 的格式。
函数:SQLazy 所有的函数定义文件。
功能:SQLazy 所有的功能定义文件。
将这些文件和目录复制到本项目根目录,形如下图:

配置 JDBC
配置 JDBC 是为了让后续步骤使用内存表和 SQL 数据源,如果使用文本数据源,可以跳过本步骤。
将数据库对应的驱动放入 "SQLazy安装目录\..\common\jdbc",这里以 mysql8 为例:

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

2. 安装配置 CodeBuddy
进入官网https://www.codebuddy.cn/ide/,下载 CodeBuddy IDE。

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

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

3. 基本解题步骤
可以把一些常用的数据表定义为全局表,从而在本项目的任意对话框中直接引用。下面将基于一个全局表进行计算,结果生成 nspl 文件,再在 SQLazy 中验证该 nspl,验证无误后编译成 SQL,最后执行 SQL。
定义全局表
在文件 "规划.md" 的 "业务数据表结构" 章节,编写股票表的定义:stock:CODE(INT),DT(DATETIME),CL(FLOAT)。

注意,如果没有在 "规划.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 文件是核心。

用内存表运行 nspl
在 SQLazy IDE 中打开 "本项目根目录\nspl" 中的 nspl 文件。

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

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

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

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

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

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

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

4. 进阶:更多数据源
SQL数据源
上面解题步骤的数据源是库表生成的内存表,这里介绍 SQL 实时数据源。
在 nspl 代码的第一行插入新行,命名为 stock(必须与下一行的锚点同名),编写 SQL 功能用于取数 ":SQL"select * from stock"; 数据库 mysql8
其中,mysql8 是之前配置好的数据源名。

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

文本数据源
使用指定符号分隔的文本文件做数据源,可以脱离数据库运行 nspl。
将前面的股票记录保存成文件 stock.csv。
将 nspl 代码中原第一行(命名为 stock 的行)替换为以下内容,用 nspl 的文件功能取数:文件 "d:\\stock.csv"; 逗号分隔; 标题
其中,"逗号分隔" 表示分隔符是逗号,可以指定其他符号; "标题" 表示文本的首行为字段名。
运行后如图所示。

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
计算结果如下。

编译为 SQL。

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

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

如此反复,通常可以解决问题。
使用高性能模型
使用性能一般的模型时可能失败率偏高,可尝试在 CodeBuddy 中切换到高性能模型后重试。

