LatentRefusal:让 Text-to-SQL 在生成 SQL 前学会停手
LatentRefusal:让 Text-to-SQL 在生成 SQL 前学会停手
它不问 LLM“你确定吗”,而是直接读取模型中间层的状态:问题与 schema 对不上时,在任何 SQL 被生成之前就拒绝。
先说结论:在 SQL 生成之前,先判断这个问题是否真的能回答
LatentRefusal 不让 LLM 自己说“我不知道”,而是读取 LLM 中间层的隐藏状态,训练一个很小的分类器判断问题是否可回答。分数低于阈值就直接拒绝,连 SQL token 都不生成。
“看起来合理”的 SQL 更危险
缺字段、指代不清、超出数据库范围的问题,LLM 仍可能编出能执行但答非所问的 SQL。
读取中间隐藏状态
冻结基础 LLM,从选定的中间层取出 token 表示,再用 TRGE probe 输出“可回答概率”。
高 F1,约 2ms 额外开销
在两个 8B 模型、四个基准上平均 F1 为 88.5% / 88.8%,probe 只占约 19M 参数。
哪些问题应该拒绝
缺失或越界
- 问题要求的字段或表不存在
- 询问数据库范围之外的知识
- 实体在当前 schema 中找不到
无法唯一解释
- 多个字段都可能对应同一句话
- 约束条件含糊或依赖主观标准
- 必须进行复杂多跳推理,但缺少关键关系
整个流程怎么走
拼接输入
把自然语言问题和数据库 schema 组成提示序列。
只做一次前向计算
冻结的 LLM 处理输入,但暂不解码 SQL;从中间层 \(l^*\) 取隐藏状态。
TRGE 打分
轻量 probe 聚合 token 表示,输出可回答概率 \(\hat p\)。
阈值门控
低于阈值直接返回安全拒绝;高于阈值才启动 SQL 生成。
阈值 \( au\) 在验证集上校准。安全优先时可以提高拒绝召回率,但会误拒一些本可回答的问题;业务优先时则反过来。这使取舍变成可配置、可审计的参数。
TRGE 到底做了什么
为什么普通线性分类器不够
Text-to-SQL 提示里 schema token 很多,真正的风险信号却可能只是“少了一个字段”“某个实体对不上”。平均池化后,这些稀疏信号很容易被淹没。
第三条门控残差的作用
SwiGLU 像一个由输入决定的软筛子:压低大量无关 schema 模板信息,放大问题与 schema 不匹配的位置,并让这些特征跨层积累。
TRGE 叠加若干层后做 mean pooling,接一个线性头和 sigmoid 得到概率。基础 LLM 全部冻结,只训练 probe,所以原有 SQL 生成能力不会被修改。
训练时需要什么
监督数据
每条样本包含 schema、问题和二值标签:1 表示可回答,0 表示应拒绝。论文按数据集分别训练 probe。
隐藏状态缓存
先用冻结 LLM 跑一次前向,把选定层的隐藏状态抽出来,再训练 probe。异常的 NaN / Inf 会被截断并归一化。
部署前校准
在验证集选择阈值,明确允许多少误拒和漏拒。论文的目标是高拒绝召回下控制误拒。
实验结果怎么读
主结果:所有基线都列出来
| 模型 / 方法 | MD-Enterprise | AMBROSIA | SQuAD 2.0 | TriageSQL | 平均 F1 |
|---|---|---|---|---|---|
| Llama / Semantic Entropy | 66.1 | 62.1 | 82.3 | 66.7 | 69.3 |
| Llama / CCS | 53.1 | 54.1 | 62.6 | 62.9 | 58.2 |
| Llama / Self-evaluation* | 66.7 | 64.6 | 74.2 | 67.2 | 68.2 |
| Llama / Eigenscore | 82.5 | 63.2 | 72.4 | 77.8 | 73.8 |
| Llama / TSV | 97.4 | 74.3 | 74.7 | 85.2 | 82.9 |
| Llama / HaloScope | 97.0 | 73.7 | 66.1 | 82.8 | 79.9 |
| Llama / SAPLMA* | 97.5 | 77.7 | 75.4 | 81.0 | 82.9 |
| Llama / LatentRefusal | 99.6 | 80.2 | 86.6 | 87.7 | 88.5 |
| Qwen / Semantic Entropy | 72.7 | 58.0 | 82.4 | 66.6 | 70.0 |
| Qwen / CCS | 55.4 | 47.0 | 82.3 | 73.4 | 64.5 |
| Qwen / Self-evaluation* | 68.1 | 60.2 | 87.4 | 56.3 | 68.0 |
| Qwen / Eigenscore | 80.0 | 59.1 | 70.0 | 77.8 | 71.7 |
| Qwen / TSV | 98.9 | 73.3 | 78.0 | 85.0 | 83.8 |
| Qwen / HaloScope | 98.0 | 72.8 | 80.1 | 80.0 | 82.7 |
| Qwen / SAPLMA* | 97.8 | 81.2 | 76.8 | 82.6 | 84.6 |
| Qwen / LatentRefusal | 98.8 | 80.9 | 88.6 | 87.1 | 88.8 |
| DeepSeek-Chat API / Prompt | 97.2 | 70.3 | 87.4 | 77.8 | 83.2 |
怎么读:LatentRefusal 的优势不是只赢某一个数据集,而是平均 F1 在两种 8B 主模型上都接近 89%。AMBROSIA 上 Qwen 的 SAPLMA 高 0.3 点,说明它不是每格都第一;但跨四个数据集的稳定性最好。带 * 的 Self-evaluation 和 SAPLMA 也需要监督训练,不能把它们当纯 zero-shot 方法。
Qwen 总延迟
基础前向约 52ms,TRGE 增加约 2ms;语义熵需要 10 次采样,约 740ms。
四层 TRGE 参数量
不到 8B 主模型的 0.3%,并且只训练这个小模块。
论文声称的适配样本规模
约 10 分钟可完成域内训练,但这是单张 A100-80G 的实验条件。
速度:一次前向和多次采样的差别
| 方法 | 前向次数 N | 延迟 | 直观解释 |
|---|---|---|---|
| Semantic Entropy | 10 | 52 × 10ms;实测约 740ms | 要生成多份答案再算分歧 |
| CCS | 2 | 100ms | 需要正反提示各跑一次 |
| Self-evaluation* | 1 | 53ms | 单次生成式自评 |
| Eigenscore | 5 / 10 | 51.7 × N ms | 依赖多样本表示 |
| TSV | 1 | 52ms | 单次隐藏状态检测 |
| HaloScope | 1 | 50ms | 单次内部信号检测 |
| SAPLMA* | 1 | 53ms | 监督式 latent probe |
| LatentRefusal | 1 | 54ms | 主模型前向约 52ms,TRGE 约 2ms |
结构消融:TRGE 的哪部分有效
| 变体 | F1 | Probe 延迟 | 说明 |
|---|---|---|---|
| 完整 TRGE | 87.1 | 2.6ms | 四层 + SwiGLU |
| 去掉 SwiGLU | 85.4 | 2.3ms | 门控贡献约 1.7 个 F1 点 |
| SwiGLU → MLP | 83.0 | 2.2ms | 普通非线性变换不够 |
| SwiGLU → GLU | 75.5 | 2.3ms | 门控形式本身很关键 |
| SwiGLU → GeGLU | 85.1 | 2.0ms | 接近但仍低 2.0 点 |
| 线性 probe | 70.4 | 0.8ms | 最快,但无法捕捉复杂不匹配 |
| 读取层 | Accuracy | Precision | Recall | AUC | F1 |
|---|---|---|---|---|---|
| -1 | 84.4 | 76.7 | 99.0 | 87.6 | 86.5 |
| -8 | 84.5 | 77.4 | 97.8 | 88.7 | 86.4 |
| -16 | 85.0 | 77.2 | 99.8 | 88.4 | 87.1 |
| -24 | 84.4 | 76.4 | 99.8 | 87.7 | 86.5 |
| -32 | 82.9 | 74.7 | 99.8 | 88.4 | 85.4 |
层位消融:-16 层综合最好,但差距并不大;结论是“中间层略优”,不是只有这一层才有信号。
| TRGE 深度 | 参数量 | F1 | 延迟 |
|---|---|---|---|
| 1 层 | 9.6M | 82.03 | 1.04ms |
| 2 层 | 12.7M | 83.87 | 1.64ms |
| 4 层 | 19.0M | 87.09 | 2.60ms |
| 6 层 | 25.3M | 85.28 | 3.40ms |
| 8 层 | 31.7M | 84.61 | 4.45ms |
| 12 层 | 44.3M | 83.02 | 6.46ms |
深度消融:四层是甜点位;继续堆层既更慢又过拟合,并非越深越好。
| 损失函数 | F1 | AUC |
|---|---|---|
| Label smoothing ε=0.1 | 87.1 | 88.7 |
| Label smoothing ε=0.05 | 85.1 | 88.4 |
| Focal loss γ=2 | 85.3 | 88.3 |
| Focal loss γ=1 | 85.2 | 86.9 |
| BCE | 84.8 | 87.8 |
| Dropout | F1 | AUC |
|---|---|---|
| 0.0 | 85.4 | 88.0 |
| 0.1 | 86.5 | 88.4 |
| 0.2(默认) | 87.1 | 88.7 |
| 0.3 | 85.5 | 88.0 |
附录消融的含义:适度 label smoothing 和 dropout 最好,说明约 300 条训练数据下容易过拟合;这些数字也提醒我们,论文效果并非完全“免调参”。
创新点
把拒绝变成生成前门控
不依赖模型最后是否听话地说“不知道”,也不需要先产生或执行风险 SQL。
利用中间层的 latent signal
把可回答性视作表示空间里的分类问题,单次前向即可完成。
为 schema-heavy 输入设计 TRGE
第三条门控残差专门针对“schema 噪声多、错误线索少且局部”的 Text-to-SQL 特性。
放到智能问数系统里怎么用
问题 + 权限裁剪后的 schema
先按用户权限裁剪元数据,避免不可见字段进入模型。
LatentRefusal Gate
判断问题在当前 schema 和业务语境下是否可回答。
Text-to-SQL Agent
只有通过门控才做 schema linking、SQL 生成与修复。
权限与执行校验
再做 SQL AST 权限校验、成本控制、数据库执行和结果脱敏。
审稿人视角
- 四个数据集是分别训练、分别测试,尚不能证明一个 probe 能跨数据库、跨领域通用。
- MD-Enterprise 是内部数据集,无法复现;论文的“企业级中文金融 QA”结论需要谨慎看待。
- 它擅长缺字段和局部不匹配,但语义近似字段(如 revenue / gross_profit)和复杂多跳 JOIN 仍会失败。
- 阈值决定真实安全性。只报告固定阈值 F1 不足以替代生产中更重要的风险覆盖率、误拒成本和分布漂移监控。
综合评价:这是一个很适合做“SQL 生成前安全闸”的思路,尤其适合私有化部署模型;但它解决的是 answerability,不应与 RBAC、数据脱敏或最终 SQL 授权混为一谈。
