自然语言转SQL:一段提示词让运营自己查库的完整指南
2026/9/6 16:45:42 网站建设 项目流程

自然语言转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里每个字段名是否都出现在表结构块里?一条"写操作测试问句"是否被安全规则挡住?

怎么判断你的提示词够不够好

口诀背了,验收还得靠数字而不是感觉。建议立三条标准:

  1. 固定测试集:写5条固定问句,覆盖聚合、过滤、多表、模糊词、写操作陷阱各一条,每条附上预期SQL。每次改提示词模板都全量跑一遍,记通过率。
  2. 字段匹配率:统计每条生成SQL里,字段名出现在表结构块中的比例,目标100%;出现一个没定义过的字段名,这条问句判失败。
  3. 格式合规率:跑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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询