引言
想象一下你正在复习一场高难度的数学考试。打开课本时,你不会只是按顺序阅读每一页,你会发现章节是按主题划分的: 几何、代数、微积分和统计学。当你在这个几何题型上遇到困难时,你不会通过解微积分方程来练习。相反,你会进行针对性训练 (Targeted Drilling) ——你会找来一组几何题,学习它们所需的特定公式,并反复练习直到掌握这一类题型。
人类的学习在很大程度上依赖于归纳推理 (Inductive Reasoning) ——我们将问题分类,并应用特定的思维模式来解决它们。然而,当我们使用大型语言模型 (LLM) 处理诸如将自然语言转换为 SQL 查询 (Text-to-SQL) 这类复杂任务时,我们通常将模型视为通才。我们输入一个提示词,然后希望它能弄清楚其中的逻辑,而不管这个问题是需要复杂的集合运算、嵌套查询,还是简单的过滤。
LLM 缺乏这种“分类思维”,正是论文 “PTD-SQL: Partitioning and Targeted Drilling with LLMs in Text-to-SQL” (PTD-SQL: Text-to-SQL 中基于 LLM 的划分与针对性训练) 的作者们试图解决的问题。他们提出了一个模仿人类学习过程的框架: 第一步,识别这是什么类型的问题;第二步,使用专为该问题类型设计的“训练”策略。
在这篇深度文章中,我们将探讨 PTD-SQL 的工作原理、其“划分与训练”策略背后的架构,以及这种方法如何让 LLM 在基准数据集上取得最先进的结果。
背景: Text-to-SQL 的挑战
Text-to-SQL 任务涉及将自然语言问题 (例如,“哪些学生的 GPA 超过 3.5 并且是足球队的成员?”) 转换为可执行的 SQL 查询。
虽然早期的方法依赖于专门为此任务训练编码器-解码器模型,但像 GPT-4 这样的 LLM 的兴起将焦点转移到了上下文学习 (In-Context Learning, ICL) 上。像思维链 (Chain-of-Thought, CoT) 提示这样的技术,鼓励模型“逐步思考”,从而显著提高了性能。
然而,现有的方法通常将 SQL 生成视为一个单一的任务。一种领先的方法 DIN-SQL 试图根据复杂性 (简单查询 vs. 嵌套查询) 分解任务。虽然这是一个正确的方向,但它忽略了一个关键的细微差别: SQL 查询不仅仅分“难”或“易”,它们还有结构上的类别。一个需要 UNION 运算符的问题所涉及的思维过程,与一个需要 GROUP BY 和 ORDER BY 子句的问题是完全不同的。
PTD-SQL 认为,要真正解锁 LLM 的推理能力,我们需要超越难度分级,转向结构化划分 。
PTD-SQL 框架
PTD-SQL 的核心假设很简单: 采用查询组划分可以让 LLM 专注于学习特定问题类型的思维过程。
该框架在一个三阶段的流程中运行,可以可视化如下:
- 查询组划分 (Query Group Partition, QGP) : 将用户的问题分类到特定的类别中。
- 针对性训练库构建 (Targeted Drilling Bank Construction) : 为每个类别离线创建专门的“教科书” (提示词库) 。
- 推理 (Inference) : 从正确的库中检索最相关的示例来指导 LLM。
让我们看看系统的整体流程:

如图 4 所示,流程始于“QGP 子任务” (阶段 a) ,即对问题进行分类。这导致了特定“样本库 (Shot Banks) ”的创建 (阶段 b) 。最后,当一个新的查询进入时,系统会自动选择正确的示例 (阶段 c) 以生成最终的 SQL。
第一阶段: 查询组划分 (QGP)
SQL 查询是独特的,因为它们有固定的模式。与一般的编程问题不同,SQL 严重依赖特定的关键字来定义逻辑。研究人员根据真实 SQL 中所需的关键字,确定了四个不同的“问题组”:
- 多集合问题 (Multi-set Problems) : 需要诸如
INTERSECT(交集) 、UNION(并集) 或EXCEPT(差集) 等关键字的问题。这些通常涉及合并两个不同子查询的结果。 - 组合问题 (Combination Problems) : 需要
GROUP BY来聚合数据,通常随后会有ORDER BY或聚合函数 (如COUNT、MAX) 。 - 过滤问题 (Filtering Problems) : 专注于使用
WHERE子句根据条件筛选数据的问题。 - 其他简单问题 (Other Simple Problems) : 基本的检索任务。
下图通过具体的例子说明了这些划分:

分类器: 微调优于提示工程
系统如何知道一个新问题属于哪个组?你可能认为他们只是让 GPT-4 对问题进行分类。然而,研究人员发现,即使是强大的 LLM 在少样本 (few-shot) 设置下也难以进行准确的分类。
相反,他们采用了一种更稳健的方法: 参数高效微调 (PEFT) 。 他们采用了一个较小的开源模型 (Llama-2-7b) ,并使用 LoRA (低秩自适应) 专门针对分类任务对其进行了微调。
LoRA 允许通过冻结预训练的模型权重并注入可训练的秩分解矩阵来进行高效微调。前向传递如下所示:

其中 \(W_0\) 是冻结的权重,\(A\) 和 \(B\) 是可训练矩阵。这种方法计算效率高,而且正如实验所示,非常有效。
下表强调了微调后的小模型与使用少样本提示的巨型模型 (如 ChatGPT) 之间的性能差距:

正如你所见,使用 LoRA 的 Llama-2-7b 模型在问题分类上达到了 85.0% 的准确率 , 显著优于 ChatGPT 的 68.0%。这证明了对于专门的判别任务,一个经过微调的小型专家模型往往能击败一个大型通才模型。
第二阶段: 针对性训练库
一旦问题被划分,系统就需要教 LLM 如何解决它们。这就是针对性训练 (Targeted Drilling) 发挥作用的地方。
研究人员为四个类别中的每一个构建了特定的提示词模板。这些模板不仅仅提供答案;它们提供了针对该特定类型 SQL 逻辑量身定制的思维链 (CoT) 推理路径。
“训练”的概念
这就好比是给学生的题库。如果一个学生正在学习集合运算 (交集和并集) ,他会拿到一张练习卷,上面明确演示了如何分解这些特定的问题。

图 1 展示了这个概念的实际应用。提示词提供了 INTERSECT、UNION 和 EXCEPT 问题的示例。当 LLM 遇到一个新问题 (例如,“查找是女性…或者男性…的学生”) 时,它会参考这个特定的库,触发关于如何构建 UNION 查询的记忆。
分解策略
这些提示词中包含的“思维过程”至关重要。作者使用了一种称为分解提示 (Decomposed Prompting) 的技术。
- 对于多集合问题: 提示词鼓励模型将问题分解为子查询 (例如,“子问题 1: 查找英国艺术家”,“子问题 2: 查找英文歌曲”) ,然后使用集合运算符将它们连接起来。
- 对于组合问题: 提示词强调识别分组键 (
GROUP BY) 和排序条件 (ORDER BY) 。
下面是针对多集合与组合问题的提示词差异的并排比较:

注意图 3 中截然不同的推理步骤。多集合提示侧重于将问题“分解”为子部分。组合提示侧重于“模式链接”以及像 COUNT() 和 GROUP BY 这样的特定关键字。这种可变性是关键——对所有 SQL 问题使用通用的推理模板会导致次优的结果。
第三阶段: 少样本选择与推理
在最后阶段,当用户提出问题时,PTD-SQL 系统会:
- 使用微调过的 Llama 模型对问题进行分类 (例如,“这是一个多集合问题”) 。
- 进入“多集合针对性训练库”。
- 选择最相关的少样本 (few-shot) 示例包含在最终提示词中。
混合匹配策略 (Mix-of-Matching)
它是如何从库中选择“最佳”示例的?论文提出了一种混合匹配策略,结合了两个指标:
1. 语义匹配 (公式 4) : 这使用向量嵌入 (OpenAI text-embedding-ada-002) 来衡量用户问题 (\(s\)) 与库中示例 (\(s_i\)) 之间的意义相似度。

2. 句法匹配 (公式 5) : 这衡量特定 Token (单词/关键字) 的重叠。这对 SQL 来说至关重要,因为像“每个 (each) ”、“总共 (total) ”或“最高 (highest) ”这样的词的出现强烈暗示了特定的 SQL 操作。

通过选择既在语义上相似 (相同主题) 又在句法上相似 (相同措辞) 的示例,模型获得了生成正确 SQL 查询的最佳上下文。
实验与结果
研究人员在两个主要基准上评估了 PTD-SQL: Spider (一个标准的跨领域数据集) 和 BIRD (一个大规模数据库基准) 。他们将 PTD-SQL 与标准提示方法以及像 DIN-SQL 和 DAIL-SQL 这样的最先进框架进行了比较。
主要性能
结果令人印象深刻。PTD-SQL 始终优于或匹配之前的最先进方法。

在表 2 (Spider-dev) 中,配备 GPT-4 的 PTD-SQL 实现了 85.7% 的执行准确率 (EX) ,超过了 DAIL-SQL (83.6%) 和 DIN-SQL (80.6%) 。即使使用像 Deepseek-coder 这样较弱的开源模型,PTD-SQL 也显示出了强劲的提升。
在以难度显著更高、规模更大著称的 BIRD 数据集上,也观察到了类似的趋势:

在这里,PTD-SQL + GPT-4 达到了 57.0% 的准确率,明显高于 DAIL-SQL 的 53.6%。
突破“能力边界”
这就论文最引人入胜的发现之一是 PTD-SQL 如何影响不同能力水平的模型。作者分析了不同难度级别 (简单、中等、困难、极难) 的性能。

图 5 揭示了一种类似于人类学习进程的模式:
- ChatGPT (蓝线) : 在“困难”类别中显示出巨大的收益,但在“极难”类别中有所下降。这就像一个学生掌握了核心课程,但在最搞级的难题上仍然挣扎。
- GPT-4 (绿线) : 在“极难”/“挑战性”类别中显示出最大的进步。因为 GPT-4 已经是一个“精英学生”,针对性训练使它能够攻克以前无法解决的最坚硬的难题。
这表明针对性训练有助于模型突破其当前的能力边界。
为什么分类很重要
分类真的有必要吗?我们能不能直接把所有例子都扔进一个大库里?研究人员进行了一项消融研究来找出答案。

图 6 展示了不同方法在四个问题组上的表现。PTD-SQL (绿线) 显示出明显的优势,特别是在多集合和组合类别 (左上轴和右上轴) 中。这些是需要最具体结构推理的类别,验证了“训练”特定逻辑模式比通用提示产生更好结果的假设。
结论与启示
PTD-SQL 论文为大型语言模型中的分类思维提出了令人信服的论据。通过承认并非所有的 SQL 查询都是生而平等的,并通过创建专门的学习路径 (划分与针对性训练) ,作者成功地实现了最先进的性能。
这项工作的主要收获是:
- 分而治之: 将像 SQL 这样的复杂领域分解为结构类别 (多集合、过滤等) 比简单的难度分级更有效。
- 专门的教师: 使用小型微调模型进行分类比要求大型模型进行零样本分类更可靠。
- 针对性上下文: 提供反映目标问题逻辑 (而不仅仅是主题) 的少样本示例,可以显著提高推理能力。
这种方法可能不仅仅适用于 Text-to-SQL。无论是数学应用题、其他语言的代码生成,还是复杂的逻辑推理任务,“划分与训练”框架都表明,就像人类一样,当 LLM 确切知道它们试图解决什么样的问题时,它们的学习效果最好。
](https://deep-paper.org/en/paper/2409.14082/images/cover.png)