ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LLM 规划,编译器生成:以工作流为契约的确定性 SQL 生成器

LLM 规划,编译器生成:以工作流为契约的确定性 SQL 生成器 AI已能产出可运行的 SQL但可运行不等于可审计。在复杂查询上公开评测显示最先进模型在 BIRD-bench 等基准上的执行准确率常在六成左右徘徊远未达到可直接评审通过的程度。典型偏差不在语法而在窗口边界、分区键、聚合口径等较复杂逻辑尤以会话化、时序 gap、动态透视等场景尤甚。SQL需多层嵌套 CTE 与窗口累加关联条件隐蔽改一处需从最内层逐层验证是否影响外层。后果是三重成本叠加难以 review、难以单步调试、难以跨库移植。代码确实能跑但逻辑是否对还需要把嵌套在脑子里完整重跑一遍才能确认。LLM 直出 SQL 的确定性问题问题的根因不在 AI 能力而在范式。让概率模型直接承担终态 SQL 的生成把“规划”与“生成”绑在同一次采样中确定性无从保证。看个例子一张状态流水表每行记录一个 ID 在某时刻的状态 NewStatus需求是取出每个 ID 在 ConfirmationStarted 之前最近的那条 Closed。直接让 AI 产出这条 SQL常见结果为多层嵌套WITH t2 AS ( SELECT CreatedAt, ID, NewStatus , 1 SUM(CASE WHEN NewStatus ConfirmationStarted THEN 1 ELSE 0 END) OVER (PARTITION BY ID ORDER BY ID ASC, CreatedAt ASC ROWS UNBOUNDED PRECEDING) AS seg FROM mytable ) SELECT ID, MAX(CreatedAt) AS CreatedAt FROM ( SELECT CreatedAt, ID, NewStatus, seg FROM ( SELECT CreatedAt, ID, NewStatus, seg FROM ( SELECT CreatedAt, ID, NewStatus, seg FROM t2 WHERE NewStatus Closed ) t_1 WHERE seg 1 ) t_2 WHERE ID IN ( SELECT ID FROM ( SELECT ID FROM t2 WHERE NewStatus Closed AND seg 1 ) t_3 GROUP BY ID ) ) t_4 GROUP BY ID ORDER BY ID这段 SQL 能跑对但要逐层展开才能验证逻辑是否正确这就是让 AI 直接产终态 SQL 的代价每一步都藏在嵌套里无法单步审计。要恢复确定性需将规划与生成分离。架构总览规划与生成分离把一次性的 Prompt→SQL 黑盒拆为 Prompt→Workflow→SQL 白盒Workflow 即契约。三个环节Planner人或 LLM 产出自然语言步骤集负责把口语需求拆解为顺序步骤WorkflowDSL 契约结构清晰、问题分解、人类可读、每步可执行预览、本身就是可执行的文档。同一 Workflow 永远对应同一结果Compiler确定性编译器按固定规则将 Workflow 翻译为目标方言的原生 SQL。一份 Workflow 可编译为 MySQL、PostgreSQL、Snowflake、BigQuery 的原生 SQL契约作用在于约束两端。LLM 的输出受 DSL 约束不直接产出SQL编译器的输入即 Workflow不做猜测。同一 Workflow 今天与明天编译结果完全一致。Workflow 本身成为可审计的逻辑文档审查者无需猜测 AI 意图只需审阅步骤。SQLazy正是这种架构的具体实现LLM只规划步骤编译器确定性生成SQL。关键设计三个设计点共同支撑确定性与可审计性。设计 1步骤 DSL 与单步调试步骤按人类思考顺序组织错在第 2 步就只改第 2 步。每步可独立执行并预览中间表边界偏差在中间结果中直接显现无需在最终结果中反推。以分段为例执行后立即看到分段列的取值分段是否按预期切分当场可判。设计 2确定性编译编译器按固定规则翻译非概率生成。Workflow 中的排序、筛选、分段、聚合等操作分别一一对应到 ORDER BY、WHERE、SUM(CASE WHEN) OVER(PARTITION BY) 分段、GROUP BY 等 SQL 语法无幻觉可复现。同一 Workflow 跨次执行、跨机器执行始终一致满足受监管场景对可追溯的要求。设计 3变更审计与版本化Workflow是纯文本契约天然可进 Git 做版本管理。逻辑变更只改对应步骤SQL 由编译器自动重建逻辑与 SQL 不会脱节。每次变更可 diff、可评审、可回滚历史清晰可查监管审计只需翻 Git 提交记录。实例验证与适用范围用前面的例子验证一下。源数据 mytableCreatedAtIDNewStatus2022-05-25 23:17:44147Active2022-05-28 05:59:02147Closed2022-06-18 05:59:01147Closed2022-06-25 05:59:01147Closed2022-07-13 00:02:47147ConfirmationStarted2022-08-25 05:59:01147Closed2023-04-29 05:59:021645Closed2023-05-08 14:53:341645ConfirmationStarted期望结果仅两行147→2022-06-251645→2023-04-29其余 Closed 要么过早要么在 ConfirmationStarted 之后。在 SQLazy 中同一逻辑按顺序写作 WorkflowNameAnchorStatementt1mytablesort ID, CreatedAt asct2segment condition (NewStatus ConfirmationStarted) partition ID as segt3filter (NewStatus Closed and seg 1)t4summarize max CreatedAt as CreatedAt; group ID第 1 步 sort ID, CreatedAt asc按 ID 与时间排序确保时序正确。sort对应 ORDER BY。第 2 步 segment condition (NewStatus ConfirmationStarted) partition ID as seg按 ConfirmationStarted 切段partition ID保证每 ID 独立分段。执行后多出一列 segseg1 即目标区间无需手写SUM(CASE WHEN ...) OVER。分段对不对点开 t2 看 seg 列即可。第 3 步 filter (NewStatus Closed and seg 1)只保留目标区间内的 Closed。filter对应 WHERE。第 4 步 summarize max CreatedAt as CreatedAt; group ID按 ID 分组取最大时间即最近一条。summarize对应 GROUP BY 与聚合。Workflow写完点编译按固定规则产出的 SQL与前面的 SQL 相比步骤更清晰WITH t2 AS ( SELECT CreatedAt, ID, NewStatus , 1 SUM(CASE WHEN (NewStatus ConfirmationStarted) THEN 1 ELSE 0 END) OVER (PARTITION BY ID ORDER BY ID ASC, CreatedAt ASC ROWS UNBOUNDED PRECEDING) AS seg FROM mytable ) SELECT ID, MAX(CreatedAt) AS CreatedAt FROM ( SELECT CreatedAt, ID, NewStatus, seg FROM t2 WHERE (NewStatus Closed AND seg 1) ) t_3 GROUP BY ID ORDER BY ID同一 Workflow 多次编译结果完全一致切换方言无需改 Workflow。适用范围同样需要诚实说明。简单 CRUD 直接写 SQL 更合适为三五行逻辑引入 Workflow 并不划算宏与循环等能力尚在路线图中。SQLazy 的定位是复杂分析逻辑的设计与验证随后嵌入 dbt 等工作流而非替代。产品与开源的边界SQLazy 的语法与示例开源编译器与 IDE 为商业闭源并提供免费版IDE 支持本地 / 私有化部署契合企业对数据出境与离线使用的要求。AI writes the logic. A compiler writes the SQL.
返回列表