text2sql 怎么把表结构喂给模型
先抛结论让模型写对 SQL难点不在模型,在你怎么把库里的表结构喂给它。表结构给得糙再聪明的模型也会瞎编字段名。我自己踩了一圈最后稳定下来的喂法记在这。我做的是一个让运营同学用大白话查数据的小工具。第一版我偷懒直接把整个库的CREATE TABLE语句一股脑拼进 prompt37 张表全塞进去结果两件事同时发生一是 token 直接顶到八千多二是模型经常把别的表的字段张冠李戴写出来的 SQL 跑都跑不起来。表结构到底喂什么我现在只喂三样多一个字都不给表名 一句话表注释这张表是干啥的字段名 类型 字段注释每张表挑 2~3 行真实样例数据样例数据是后加的,效果出乎意料地好。模型光看status int不知道 1 代表啥但看到样例里status1那行用户是已付款它就懂了枚举含义,WHERE 条件不再乱填。喂进去的格式我用的是这种紧凑写法,比贴原始 DDL 省一半 token表: orders (订单主表) 字段: - id bigint 订单ID - user_id bigint 下单用户ID - amount decimal 金额(元) - status int 状态 1已付款 2已发货 3已完成 0已取消 - created_at datetime 下单时间 样例: id1001 user_id88 amount29.90 status3 created_at2026-06-01 10:22:00注意我把status的枚举含义直接写进字段注释了。这一步比给样例还关键——枚举值不解释模型十有八九猜错。表太多怎么办37 张表全喂肯定不行。我的做法是先做一轮表召回把用户问题和每张表的表注释做一次向量检索只把最相关的 3~5 张表的结构喂给写 SQL 的那一步。落地我是在一个能拖低代码工作流的平台上搭的第一个节点做表召回(挂了个 RAG 检索),第二个节点才是真正写 SQL。这样平均喂进去的表从 37 张降到 4 张token 从八千多压到一千出头准确率反而上去了——因为干扰项少了。两个具体的坑坑一:外键关系模型看不出来。光给单表结构遇到要 JOIN 的问题模型就抓瞎。我后来在 prompt 里单独加了一段表关系说明,像orders.user_id users.id写明哪些表能 JOIN、JOIN 哪个字段。加完之后跨表查询的成功率从大概六成涨到九成。坑二:别让模型直接连库。我让模型只输出 SQL 文本,再由后端代码去执行而且执行前强制套一层LIMIT 200。有次模型生成了个没带条件的全表 scan,要不是这个 LIMIT 兜底那张两千万行的表能把库拖垮。小结text2sql 这事七分在数据准备(表结构怎么裁、怎么注释、给不给样例),三分才在模型。把这套喂法跑顺之后运营那边自助查数的比例明显上来了找我跑 SQL 的人少了一多半。剩下唯一没根治的是模糊问法——用户问上个月卖得好的,到底好是按数量还是金额模型只能猜这种我现在是让它先反问一句。模型那层我直接用了讯飞星辰提供的现成大模型 API,免得自己搭推理服务省下的精力都花在打磨表结构上了。