GammaSQL提示词误解?3步精准避坑指南
写一个能直接跑起来的GammaSQL提示词,其实只需要四步。但大多数人第一步就错了——上下文没锁死,模型就容易自由发挥。
GammaSQL提示词之所以经常翻车,归根结底是因为模型默认把那些模糊动词、缺省主语、没限定环境的描述,自动脑补成了一套通用逻辑。而你真正要执行的SQL,是跑在MySQL 8.0的订单库上的,而且还不能碰主键字段。这种错位,才是问题的核心。
第一步:用三要素锁死执行上下文
提示词的开头,必须把【数据库类型】+【表名】+【字段约束】这三样东西交代清楚,缺一项都不行。举个例子:“MySQL 8.0,orders表,order_id为主键,status为TINYINT(1),禁止修改主键结构”。
这一步如果不写,Gamma大概率会把“更新状态”理解成UPDATE status SET value=1 WHERE id=xxx,而你实际想要的是UPDATE orders SET status=1 WHERE order_id=12345。它只要没拿到你明确说出的表名和主键名,就敢自己造一个语法合法但一跑就报错的SQL出来。
数据库类型必须精确到小版本号,比如只写“MySQL”是不够的,要写“MySQL 8.0.33”,因为只有这个版本才支持JSON_CONTAINS函数。同样,写“PostgreSQL”也不如写“PostgreSQL 14”保险,不然Gamma很可能给你推荐一个pg_trgm扩展,而你的生产环境还是12.6。
第二步:动词必须绑定操作对象
方法一:用“对XX执行YY”这个句式,替换掉所有模糊动词。
比如,旧写法“筛选异常订单”,Gamma就会给你生成WHERE status NOT IN (0,1,2)。而正确的写法应该是“对orders表执行筛选:WHERE status < 0 OR status > 9”,这样一来,Gamma输出的就是精准的WHERE条件,还会自动加上表别名o。
方法二:在动词后面直接跟字段名和取值范围。
“统计近7天支付金额总和”这句话非常容易被误解。如果你的字段名不是total_amount,而是pay_amount_cents(单位是分),那就必须写成“统计orders表中pay_amount_cents字段在2026-06-09至2026-06-16的SUM值,结果除以100转元”。
字段名必须与真实表结构完全一致,大小写、下划线、缩写,一个都不能错。Gamma不会去校验字段是否存在,你只要写错一个字母,它就照着错的生成SQL。
第三步:禁用所有软性指令词
首先,把提示词里所有“请”“建议”“可以”“尽量”“可能”这些字眼全部删掉。这些词一出现,Gamma就会自动切换到解释模式,而不是执行模式。
其次,把“查一下用户最近下单时间”改成“SELECT MAX(created_at) FROM orders WHERE user_id = ?”。
然后,所有的WHERE条件必须带上具体值或者参数占位符,绝不能用“某用户”“相关数据”“部分记录”这种模糊指代。Gamma一看到这类表达,就会自行脑补成SELECT * FROM users LIMIT 10,而不是你想要的带WHERE的精确查询。
最后,明确告诉Gamma哪些操作是禁止的。比如:“禁止使用子查询;禁止JOIN user_info表;禁止SELECT *;必须用ORDER BY created_at DESC LIMIT 20”。
第四步:强制返回可验证结构
在提示词末尾加上一句格式要求,比如:“输出严格按以下格式:① SQL语句单独成段,包裹在标签中;② 每个WHERE条件后标注业务依据,如‘status=3(对应已发货状态)’;③ 若涉及计算,注明单位与精度,如‘SUM(pay_amount_cents)/100.0 AS total_yuan(保留两位小数)’。”
有了这个指令,Gamma就会放弃自由发挥,转而按照填空式模板输出。如果没有这条指令,它经常会把注释写成自然语言段落,结果你复制SQL的时候连注释一起粘进去,一执行就报错。
SQL语句必须能直接粘贴进DataGrip执行,不能含中文括号、全角空格、换行符。Gamma默认输出带缩进的美化格式,所以需要额外加一句“禁用缩进,所有关键词大写,字段名小写,一行写完”。
