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

简介: AI生成SQL虽可运行,但逻辑难审计、调试难、移植难。SQLazy提出“规划-契约-编译”新范式:LLM仅输出人类可读的步骤化Workflow(DSL),确定性编译器将其精准转为各数据库原生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 即契约。
3bb83e99cf933b6384731e93e0d142c7_260208cff14644518e9113856db0d3e3_Picture1.png
三个环节:

Planner:人或 LLM 产出自然语言步骤集,负责把口语需求拆解为顺序步骤

Workflow:DSL 契约,结构清晰、问题分解、人类可读、每步可执行预览、本身就是可执行的文档。同一 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 提交记录。

实例验证与适用范围

用前面的例子验证一下。

源数据 mytable:

image.png
期望结果仅两行(147→2022-06-25,1645→2023-04-29),其余 Closed 要么过早,要么在 ConfirmationStarted 之后。

在 SQLazy 中,同一逻辑按顺序写作 Workflow:
image.png
第 1 步 sort ID, CreatedAt asc 按 ID 与时间排序,确保时序正确。sort对应 ORDER BY。

第 2 步 segment condition (NewStatus = "ConfirmationStarted") partition ID as seg 按 ConfirmationStarted 切段,partition ID保证每 ID 独立分段。执行后多出一列 seg,seg=1 即目标区间,无需手写SUM(CASE WHEN ...) OVER。分段对不对,点开 t2 看 seg 列即可。
ccbf265d2a438ef694ce0ed5ce55e4ba_6b539eb42f954d50ad9d2cad83c4619e_Picture2.png
第 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。
39d0d44553bf444c4511e2ce228a5b87_2e9b90a3f992470d804842cbf62aa252_Picture3.png
适用范围同样需要诚实说明。简单 CRUD 直接写 SQL 更合适,为三五行逻辑引入 Workflow 并不划算;宏与循环等能力尚在路线图中。SQLazy 的定位是复杂分析逻辑的设计与验证,随后嵌入 dbt 等工作流,而非替代。

产品与开源的边界:SQLazy 的语法与示例开源,编译器与 IDE 为商业闭源并提供免费版;IDE 支持本地 / 私有化部署,契合企业对数据出境与离线使用的要求。

AI writes the logic. A compiler writes the SQL.

相关文章
Mac Source Tree拉代码报错,remote: CODING 提示: Authentication failed. remote: 认证失败,请确认您输入了正确的账号密码。 fatal...
Mac Source Tree拉代码报错,remote: CODING 提示: Authentication failed. remote: 认证失败,请确认您输入了正确的账号密码。 fatal...
2721 0
Mac Source Tree拉代码报错,remote: CODING 提示: Authentication failed. remote: 认证失败,请确认您输入了正确的账号密码。 fatal...
|
4月前
|
SQL 人工智能 JSON
智能问数(Text2SQL)工业级落地,纯 AI 黑盒方案都没戏
本文剖析Text2SQL领域“高准确率宣传”与“无公开DEMO”之间的矛盾,指出黑盒方案因AI幻觉、不可解释、不可审计,难担企业级信任;润乾NLQ采用白盒路线——以人类可读可确认的“规范文本”为中间层,AI仅作翻译,后续规则编译100%确定,真正实现稳定、可解释、可落地的智能问数。
|
11月前
|
SQL 自然语言处理 BI
另辟蹊径的 Text2SQL,不用大模型也能搞 chatBI
润乾报表NLQ组件摒弃大模型路线,采用规则词典与领域知识库,将自然语言精准转化为MQL查询语言,实现稳定、低成本、可维护的ChatBI。其核心在于结构化语义解析,避免“幻觉”,支持复杂多表关联与计算,适用于企业级BI场景,是可靠高效的自然语言查询解决方案。
|
4月前
|
SQL 人工智能 自然语言处理
准确率 100% 的智能问数(Text2SQL)实践,还要关心什么指标?
润乾NLQ创新采用“规范文本+规则编译”架构,将口语转为可验证的中间语言,再确定性生成SQL,实现规范文本→SQL环节100%准确率。规避大模型幻觉,支持多表JOIN、子查询、聚合等复杂场景,实施门槛低、结果稳定可控。(239字)
|
11月前
|
SQL 自然语言处理 BI
万字长文解析 NLQ 破局 Text2SQL,兼得灵活复杂准确
润乾NLQ创新采用“规范文本”作中间层,兼顾问题灵活性与查询准确性。通过人类可读的规范文本确认意图,结合规则引擎生成精确SQL,并支持复杂查询,以低成本实现企业级Text2SQL的可靠落地,突破传统三难困境。
|
6月前
|
人工智能 JavaScript BI
用 AI 编程生成 ECharts 图表
报表内置图表有限,复杂图表(如K线图、地图等)需手写ECharts代码,学习成本高、调试耗时。本文以K线图为例,介绍“参数导出→AI生成→脚本回填”三步法:用Trae等AI工具根据报表导出的参数自动生成JS脚本,再替换嵌入报表模板,大幅提升开发效率。(239字)
|
11月前
|
SQL XML 自然语言处理
Text2SQL 破局技术解析之一:规范文本与灵活性
润乾NLQ创新采用“规范文本”作为中间层,将自然语言转SQL分为三阶段:LLM生成可读的规范文本,用户确认意图后,通过规则引擎转为MQL再生成准确SQL。该方案兼顾灵活性、准确性与复杂查询支持,大幅降低企业实施成本,为人机协同的Text2SQL提供了可行的工程化路径。
|
3月前
|
机器学习/深度学习 人工智能 资源调度
银行零售信贷AI实践:从尽调到贷后的全链路Skill化
信贷审批的本质不是批不批,而是还得起多少。本文详解等额本息与提前还款的算法实现,构建WOE+IV值信用评分模型实现自动审批,用RFM+K-Means聚类完成零售客户分层,设计基于余弦相似度+TopN的产品推荐和AUM增长测算,实现马科维茨投资组合优化和退休规划AI推演引擎。附带7大维度完整性检查清单。
|
9月前
|
XML 人工智能 自然语言处理
ChatBI 不止 Text2SQL,加上多维分析才算全链 AI+ 商业智能
润乾BI突破传统ChatBI局限,以规则引擎实现从“问数据”到“操作数据”的全链路自然语言分析。支持分组汇总、排名、环比、图表生成等复杂操作,指令规范、结果确定,杜绝AI幻觉。通过智能提示降低使用门槛,更可与LLM协同,将口语问题转化为精准分析步骤,让数据决策高效、可信、可控。
|
9月前
|
SQL 人工智能 自然语言处理
这款 Text2SQL 技术为什么能对噩梦般的 JOIN 免疫
润乾 NLQ 以“语义层+确定性编译”破解 Text2SQL 复杂 JOIN 难题。通过 DQL 实现外键属性化与按维对齐,将多表关联转化为可验证规则,摆脱 LLM 幻觉依赖,准确率高、成本低,适合企业复杂场景落地。