自然语言查数据库:数据问答智能体怎么搭稳
业务同事天天找我跑数:"上季度华南区退货率多少""排个 Top10 客户出来"。我嫌烦,搭了个能用大白话查数据库的智能体,让他们自己问。听着简单,真要搭稳,坑不少。重点不是把自然语言转成 SQL——那一步现在的模型基本能做——而是怎么让它别查错、别瞎编。
整体怎么搭
我在一个拖拽就能配流程的智能体平台上拉了这么一条链路:
用户用大白话提问。
模型结合表结构把问题转成 SQL。
把 SQL只读地跑到数据库。
拿结果再让模型组织成人话回复。
最关键的是第 2 步要把表结构喂给模型——表名、字段名、字段含义。不喂,它就按自己的想象编字段名,SELECT 退货率 FROM 订单表,数据库里压根没这字段,直接报错。
让它查准的几个动作
字段加注释。光给字段名
cust_lv模型不懂,我把"cust_lv=客户等级,1普通2银卡3金卡"一起喂进去,它才不会把"金卡客户"翻译错。枚举值列出来。地区字段实际存的是"华南/华东"还是"south/east",差一个字就查空。我把可选值都列给它。
限制只读。这条是底线。只给查询权限,物理上杜绝它生成
UPDATE/DELETE把生产库干掉。我一开始没限,测试时它真的生成过一条 DELETE,吓出汗。SQL 先回显。复杂查询我让它先把生成的 SQL 亮出来,结果旁边标"基于以下查询",业务同事能核对,我调试也方便。
踩得最狠的坑:聚合口径
同事问"销售额",模型默认SUM(amount),但公司口径是要扣掉退款的。模型不知道这条业务规则,算出来的数比真实值高一截,同事拿去汇报差点出事。后来我把这类业务口径写进系统提示,当成硬规则:"销售额一律 = 订单额 - 退款额"。这种隐性口径,模型再聪明也猜不到,必须人喂。
没搞定的部分
多表 JOIN 一复杂,它还是会偶尔关错表。我现在的兜底是:把最高频的几个查询做成预设模板,模型只填参数;只有非标准的临时问题才让它现写 SQL。模板覆盖了大概七成日常需求,剩下三成接受偶尔要我兜一下。
搭完这个,业务同事自助查数的比例明显上来了,我清净了不少。
(转 SQL 和组织回复用的模型我挂讯飞 MaaS,调现成 API,没自部署,省得为这点查询自己养模型。)
