自然语言转SQL:一段提示词让运营自己查库的完整指南
【免费下载链接】coursesAnthropic's educational courses项目地址: https://gitcode.com/GitHub_Trending/cours/courses
周一早上,运营同学@你:"这个月新增多少付费会员?卖得最好的SKU现在库存还剩多少?"你估了个开发排期:两天。等数据出来,活动早结束了。卡点在于数据库只认SQL,不认人话。这篇教程带你用自然语言转SQL的思路,把这句话变成一条能直接跑的SQL,就在这个仓库 courses(Anthropic 官方教学项目)里完成,不用写代码,只要会填一段提示词。
读完整篇,你会带走4样可直接用的东西:1套四块提示词骨架、1组会员库存示例数据、6条翻车修复口诀、3个量化验收标准。
模型是怎么把一句话变成SQL的
别把SQL生成想成黑魔法。它其实是你给模型递四样东西,它交回一条查询——就像厨师接到"要一份低糖红烧肉"的口令:
- 角色设定告诉它"你是谁":一个只查不改的SQL助手。解决"模型太自由,可能顺手改库"。
- 表结构告诉它"你有什么":每张表、每列的名字和单位。解决"模型瞎猜字段名"。
- 示范示例(Few-shot,就是先给模型看几个示范答案)告诉它"成品长什么样":类似的自然语言查询,过去应该产出什么SQL。解决"输出跑偏、格式漂移"。
- 安全约束告诉它"什么不能碰":只准SELECT,禁写操作。解决"模型被诱导干危险的事"。
四样东西缺一样,出来的"菜"就容易馊。整条SQL生成链的可靠性,基本就取决于这四样东西写得好不好。
🛠️ 一条提示词的四个组成块
原理清楚了,下面把提示词搭出来。四个块都控制在8行以内,可以直接复制走改。
块1:表结构信息
表:members(会员) - member_id 会员ID - name 会员姓名 - tier 等级(gold/silver) - joined_at 入会日期 表:inventory(库存) - sku 商品编码 - stock_qty 当前库存(单位:件)为什么这么写:字段名和单位都写死,模型就没有空间把stock_qty猜成qty;单位跟着字段走,不靠模型脑补。
块2:角色与安全边界
你是会员系统的SQL查询助手,只输出查询语句。 规则: 1. 只允许 SELECT,禁止 UPDATE/DELETE/DROP/INSERT 2. 不确定字段名时,回复"需要澄清"并列出可用字段 3. "最新/最近"默认指过去7天,且日期条件必须写进SQL为什么这么写:把"禁区"和"模糊词的定义"写进规则,比指望模型自觉可靠;第2条让模型会主动说不知道,是把错误处理前置,翻车会少很多。
块3:示范示例
问:等级为gold且本月入会的会员有多少人? 答:SELECT COUNT(*) FROM members WHERE tier='gold' AND joined_at >= date('now','-1 month') 问:库存低于50件的SKU有哪些? 答:SELECT sku, stock_qty FROM inventory WHERE stock_qty < 50为什么这么写:两条示例各覆盖一种模式(聚合、过滤),答案里用的全是块1的字段名,等于教模型"看见什么列名就用什么",不许自己发明。
块4:输出格式
只输出一行SQL,包进 sql 代码块,不解释、不加注释。 无法判断时只输出:需要澄清:<你的问题>为什么这么写:输出形状被钉死后,你的程序可以直接截取代码块里的内容去执行;答不上来时返回固定句式,也好被代码接住。
把提示词接进项目
四块齐了,接下来是把这套提示词模板接进项目,跑一条验证查询。
第1步,找现成的表结构和工具定义。06_chatbot_with_multiple_tools.ipynb 里内置了一张 customers 表(含 id、name、email、phone、username)和对应的订单数据,并演示了如何为数据库工具写 JSON schema;10_2_Appendix_Tool_Use.ipynb 的 SQL 练习则给了一个 users/products 迷你库,完整示范了"把表结构塞进系统提示词"的写法。
第2步,替换占位符。把搭建篇的骨架拿出来,"表结构信息"换成你真实字段的清单(就照上面 customers 表的格式抄一遍);示范示例可参考 10_2 里的 users/products 示例数据,改成你自己的会员、库存查询。
第3步,跑一条验证查询。发一句"统计等级为gold的会员人数",检查三件事:生成的SQL是否只用块1里定义的列名、是否只有一行且包在 sql 代码块里、能不能在数据库里执行成功。聚合和过滤两种模式各跑一条,都通过再交给同事。更多工具定义细节可以看 01_tool_use_overview.ipynb。
⚠️ 6个高频翻车点与修复口诀
上线后最常踩的就这六个坑。错误处理的本质是提前把歧义钉死,对照下面的表改就行:
| 现象 | 根因 | 修复口诀 | 对照示例 |
|---|---|---|---|
| 字段名靠模型猜 | 表结构块没写全列名和单位 | 只认表里写过的字段 | 只写了"members表",模型发明了 member_level → 把 tier 列名和取值写全 |
| 多表关联漏 JOIN | 表间关系没交代 | 关系一行一条写清楚 | 问"gold会员的库存变动"需要 members 和 inventory 关联,提示词没写关系 → 补上"orders.sku = inventory.sku"式的关系行 |
| "最新/最近"语义模糊 | 没给默认时间窗 | 定义一次,写进规则 | "最新"无定义,模型输出 max(时间列) → 规则里定义"最近=过去7天",SQL必须带日期条件 |
| 数值比较缺单位 | 单位没写进结构 | 单位跟在字段名后面 | stock_qty 没标单位,模型按"件"写成 <5000 → 写成"stock_qty 当前库存(单位:件)" |
| 输出格式不稳 | 输出格式块缺失或含糊 | 固定形状+固定兜底句 | 有时出SQL有时出解释 → 只输出一行、包进 sql 代码块,拿不准就输出"需要澄清:xxx" |
| 写操作未被拦截 | 安全边界块缺失 | 一句只允许SELECT | 恶意问句"删掉silver会员"会产出 DELETE → 规则1明确禁止 UPDATE/DELETE/DROP/INSERT |
上线前自查三件事:5条固定测试问句是否全跑过一遍?生成SQL里每个字段名是否都出现在表结构块里?一条"写操作测试问句"是否被安全规则挡住?
怎么判断你的提示词够不够好
口诀背了,验收还得靠数字而不是感觉。建议立三条标准:
- 固定测试集:写5条固定问句,覆盖聚合、过滤、多表、模糊词、写操作陷阱各一条,每条附上预期SQL。每次改提示词模板都全量跑一遍,记通过率。
- 字段匹配率:统计每条生成SQL里,字段名出现在表结构块中的比例,目标100%;出现一个没定义过的字段名,这条问句判失败。
- 格式合规率:跑10次,统计输出为单一 sql 代码块或固定兜底句的比例,低于8/10说明块4没写到位。
搭这种"固定问句+自动判分"的评估流,可以参考 05_prompt_foo_code_graded_animals/lesson.ipynb——同目录的 animal_legs_tests.csv 就是现成的"问句-预期答案"表,整套方法在 prompt_evaluations/ 目录的教程里都有。验收达标后,顺着 tool use 教程 再接上真实数据库,你就把"一句话到查询结果"这条路走通了。
【免费下载链接】coursesAnthropic's educational courses项目地址: https://gitcode.com/GitHub_Trending/cours/courses
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考