DAIL-SQL的Token节省之道:每问仅1600 Tokens,示例组织策略与成本优化全解析
【免费下载链接】DAIL-SQLA efficient and effective few-shot NL2SQL method on GPT-4.项目地址: https://gitcode.com/gh_mirrors/da/DAIL-SQL
DAIL-SQL 是运行在 GPT-4 上的高效高精度 few-shot Text-to-SQL(NL2SQL)方案:在 Spider 榜单上以 86.2% 的执行准确率登顶,而每个问题平均仅消耗约1600 Tokens。本文将拆解它的三大 Token 节省策略——示例组织、贪心预算裁剪、双相似度示例选择,并教你估算 LLM API 的真实调用成本。
先选对问题表示:代码风格 Schema 胜出
DAIL-SQL 在零样本场景下对比了 5 种问题表示方式(自然文本、代码、OpenAI 官方演示格式、指令格式、CoT),结论是:用 SQL 建表语句(Code Representation)描述 Schema,且带上外键、加一句"with no explanation",是 GPT-4 上最稳的组合。
- 用
CREATE TABLE语句替代"Table xxx, columns = [...]"的纯文本列表,LLM 更不容易写错表名列名; - 外键信息直接给出,省掉模型自行猜测表连接关系的成本;
- "with no explanation" 规则约束输出只给 SQL,避免废话占用输出 Token。
两种关键组件(外键、无解释规则)带来的增益对比:
对应模板定义可参考 prompt/PromptReprTemplate.py。
Token预算控制实现:把 Prompt 压进 1600 怎么做的
DAIL-SQL 的 Prompt 由「Schema + 若干示例 + 目标问题」拼接而成,核心裁剪逻辑在 prompt/PromptICLTemplate.py 的format()中:
- 总预算:
max_seq_len(默认 4096)减去预留的答案空间max_ans_len(200),得到 Prompt 可用上限约 3896 Tokens; - 贪心装箱:从候选池(示例数 ×
scope_factor)中按相似度排序逐个尝试加入,每加一个就用真实 tokenizer 重新计数,一旦超预算立即丢弃该示例; - 宁缺毋滥:凑不满 k-shot 就不硬凑——示例质量差不如示例数量少。
这套机制让 Spider-dev 上的平均 Prompt 稳定在约 1600 Tokens,只占模型上下文上限的四成左右,既留足安全边际,又直接压低 API 账单。
示例组织三策略:为什么 QA 对最适合 GPT-4 这类强 LLM
few-shot 示例的组织方式有 3 种(见 prompt/ExampleFormatTemplate.py):
| 策略 | 每个示例包含 | Token 代价 | 适合 |
|---|---|---|---|
| Full-Information(COMPLETE) | Schema + 问题 + SQL | 最高 | 弱模型 |
| SQL-Only(ONLYSQL) | 仅 SQL | 最低 | 语义信息不足 |
| QA 对(DAIL-SQL 采用) | 问题 + SQL | 中低 | 强 LLM |
DAIL-SQL 的关键洞察是:示例里重复的数据库 Schema 是最贵的冗余。Schema 已在 Prompt 头部给出,示例只需保留"问题 → SQL"的映射关系,即可教会模型任务模式。实验对比(GPT-4 上 QA 对全面领先):
示例选择策略:掩码问题相似度 + SQL 骨架相似度
选好组织方式后,选"哪些"示例同样重要。DAIL-SQL 采用两步走(实现见 prompt/ExampleSelectorTemplate.py):
- 第一步(问题相似度):先用 Schema 链接把问题中的表名、列名、实体值替换为
<mask>/<unk>,再编码比对句向量距离——掩码后比的是"问法结构"而非字面词汇; - 第二步(查询骨架相似度):先用廉价模型预生成一次 SQL,取其骨架(去掉常量值),与训练集 SQL 骨架做 Jaccard 相似度,阈值0.85,确保示例与目标问题的查询模式一致。
该策略在 9-shot 下 GPT-4 执行准确率达 82.4%(Spider train 上),显著优于随机选取。相关结果文件见 results/ 目录。
API成本估算:GPT-4 账单这样算
generate_question.py 在生成 Prompt 后会自动汇总每个 Prompt 的 Token 数,并按内置单价估算成本(单价表定义在 utils/enums.py):
| 模型 | 每 1K Tokens 价格 | 每问约 1600 Tokens 的成本 |
|---|---|---|
| GPT-4 | $0.03 | ≈ $0.05 |
| GPT-3.5-Turbo | $0.002 | ≈ $0.003 |
| text-davinci-003 | $0.02 | ≈ $0.03 |
也就是说,单问成本仅 5 美分左右;若开启 self-consistency(5 次投票取多数),成本乘以 5 仍可接受,换来 0.4% 的准确率提升(86.2% → 86.6%)。
快速上手:三步跑通 DAIL-SQL 流水线
一键脚本 run_dail_sql_mini.sh 展示了完整流程,核心就三步:
python data_preprocess.py # 1. 预处理 Spider 数据集 python generate_question.py \ # 2. 掩码相似度选示例,生成 9-shot Prompt --split test --k_shot 9 --prompt_repr SQL \ --example_type QA --selector_type EUCDISQUESTIONMASK python ask_llm.py \ # 3. 调用 GPT-4 生成最终 SQL --model gpt-4 --question ./dataset/process/...完整 DAIL 策略(含预生成 SQL 二次筛选)见 run_dail_sql.sh;BIRD 数据集(带外部知识证据)的运行方式见 run_for_bird.sh。
结果一览:精度与成本兼得
| 方法 | Dev EX | Test EX |
|---|---|---|
| DAIL-SQL + GPT-4 | 83.1% | 86.2% |
| DAIL-SQL + GPT-4 + Self-consistency | 83.6% | 86.6% |
小结
💡 DAIL-SQL 的 Token 经济学可以浓缩为三句话:
- Schema 只写一遍——示例里删掉重复的建表语句,改用 QA 对组织(省 60% 示例 Token);
- 预算内贪心装箱——真实 tokenizer 计数 + 超限即丢,把 Prompt 稳定压在 1600 Tokens;
- 双相似度挑示例——掩码问题相似度选"问法像"的,SQL 骨架相似度选"查询像"的,少而精。
这套思路不局限于 Text-to-SQL:任何用 GPT-4 做 few-shot 推理的场景,都可以照搬"预算控制 + 去冗余示例 + 结构相似度选样"三板斧来压缩 API 成本。
【免费下载链接】DAIL-SQLA efficient and effective few-shot NL2SQL method on GPT-4.项目地址: https://gitcode.com/gh_mirrors/da/DAIL-SQL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考