写点什么

【AI】我没写一行 SQL,就让 AI 查出了销售报表

作者:非晓为骁
  • 2025-05-15
    福建
  • 本文字数:5264 字

    阅读完需:约 17 分钟

你有没有想过,不写 SQL,不开发前端图表,甚至不懂数据库结构,仅通过“聊天”的方式,就能查询销售数据?


这次我尝试了一件事:用大模型来构建一个“对话式 BI 系统”。目标是:


  • 完全不写代码

  • 用自然语言提问

  • 让 AI 代替我处理 Excel → 数据库 → SQL → 图表的全过程


当然,它远远谈不上成熟,更别说能替代现有的 BI 工具,但这次尝试带来了不少收获,也暴露了许多关键问题。这篇博客会完整记录我这一路“用 AI 做 BI”的过程,以及对几个主流大模型表现的观察、对比和吐槽。


  • 如果不是一个程序员来做,会碰到什么?

  • 使用大模型时碰到的问题,不同的思维模式(用 chatgpt 和 qwen,gemini 一开头就没理解所以就不用了)


数据准备 &手上有的环境


  • excel 表格,有一些销售情况。表头都是中文,表关联的字段名相同。

  • PC 有 Go 语言开发环境(v1.20),cursor(v0.49)

  • 服务器有部署一个 MySQL(5.7)

  • 服务器有 python 环境(3.10)

  • 对话工具,deepchat(v0.1.1)


实现步骤


  1. 让 AI 写一个代码来把 excel 表格的数据导入 MySQL 数据库,假装是一个销售日常报表的数据源

  2. 让 AI 写一个 MySQL 的 mcp server,实现读的相关功能

  3. 用 deepchat 加载 MySQL 的 mcp server,问一些销售情况的问题



Excel 描述

  • .xlsx 文件

  • 12 Sheets

  • 每个 Sheet 表头有唯一 id,名称不固定

  • 每个 Sheet 表头字段除了 id 都是中文



用 AI 写把 Excel 文件导入数据库的代码

这边就不贴代码了


耗时:2h


模型


  • ChatGPT-4o

  • QWen3-235B-A22B


R 代表 Round

R1:第一版代码

提示词:”我想要把这个 excel 表格里面的所有 sheet,导入到 mysql 数据库,给我 python 代码“ + 上传 excel 文件


ChatGPT-4o


输出


  • 给 pip install 的指令,要安装一些包,然后一份导入的 python 代码

  • 额外的注意事项提示,表名处理,数据类型自动推断,安全建议


执行后


  • 表名是中文,表字段是中文


QWen3-235B-A22B


输出


  • 给 pip install 的指令,要安装一些包,然后一份导入的 python 代码

  • 额外的注意事项提示,表名命名规则,字段类型自动推断,重复导入行为,中文支持问题


执行后


  • 表名是中文,表字段是中文


小结


  • 给出的 pip install,没有跟上国内的源下载会很慢(如果你在安装 python 的时候有默认修改那没事,不过一般是不会有)。没有改的话,可能在 pip install 就可以等半天了,这几个还是小的依赖包。

  • 没有说明 excel 表格内的 Sheet 名称和表头都是中文,所以生成的表以及表字段都是中文。这边可能不是开发或者没有碰过数据库的,表名是中文不是说不行,就是很奇怪,而且常规开发都是要用英文字段。所以下一步转换成英文,有可能有人就不会去修改,就直接去用了。

  • 这边其实还跳过了很多,部署 MySQL,创建数据库,安装 python,这几步可能非开发就要绕一绕了。

  • 这一步我也试了 gemini 2.5pro,但是它一直说我上传的不是 xlxs 是 csv,而且没有多个 sheet,所以我就直接放弃了。

R2:修改成英文的

提示词:”我还需要把每个表的中文字段改成英文的,不然数据库里面的表字段都是中文了”


ChatGPT-4o


输出


  • 解决方案逻辑:读取每个 Sheet,提取首行字段名(中文),自动将中文列名翻译为英文,重命名列后导入 MySQL。

  • 会再询问:要不要我先帮你提取所有 sheet 的字段列表?你确认翻译后,我再生成导入脚本。这样最稳妥。是否继续?


执行后


  • 执行后,代码卡了很久,执行不了。我感觉是用了 googletrans ,是不是跑到外网去了。


QWen3-235B-A22B


输出


  • 提供了一个 Sheet 的转换代码

  • 会再询问:如果你能提供完整的列名列表,我可以帮你更完整地定义 column_mapping。是否需要我继续为你整理所有列名?


执行后


  • 这个不是全部,我没有执行


小结


  • 这一步 2 个大模型的思维就发生了变化,我感觉 ChatGPT 会更自动一点,不会先想说我用一个 map 来把已经有的做一个关系映射,而是时时想着我需要自动去实现。这一个思维其实对我的感官确实不一样,先不说卡的问题,这表示我的思维也要变成,事事需要想想全部变成自动化,抽象来做。

  • QWen 的模型直接写了一个 map 来对应,中文跟英文。我觉得也没问题,这样看得也清楚,也比较稳定。而且提供了一个小的版本,来让我先确定是不是要这样做,要的话再跟他说。

  • ChatGPT 的方式可能会让一些人卡住,因为不知道是什么问题,当然再去问大模型为什么跑这么久,可能大模型会改个方法出来,我就不知道了。如果不去问,可能有些人也不会说要改成 map 的形式。

R3:要全部的 sheet 字段的 map 关系

ChatGPT-4o


提示词:能不能直接用每个 sheet 字段 map 的方式,直接定义好,全部的 map 关系


输出


  • 只给了我哪些字段要转换,是要让我填转换后的英文名称

  • 会再询问:请你填上每个中文字段对应的英文字段(可以粘贴回我这里),我随后会帮你生成一个完整的字段映射字典和导入脚本。是否继续?


执行后


  • 没有执行,因为还要我去手动填,有好多字段


QWen3-235B-A22B


提示词:我需要所有的 sheet 的 map


输出


  • 给了我全部转换的中文跟英文的定义,不过还没有写到代码里面


执行后


  • 没有输出新代码,没有执行


小结


  • ChatGPT 很有意思,感觉它的下一步都要让我帮它填,然后再问你要不要我帮你做下一步。这种引导的方式,让你参与这个过程,好像也没有毛病,可能用这种方式来加深学习的印象还挺好。

  • Qwen 是给了我全部的字段对应关系,不过这是给了我一个变量,并没有直接改到代码里面。不过这边发现了一个致命问题,我是到后面才发现的,**漏了 2 个表的字段映射。我前面说的我有 12 个 Sheet,我没看出来少了 2 个表,这个对大规模的项目,估计这个坑会有点深。另外还自己修改了 2 个 Sheet 的名字**,这样在代码执行的时候会对应不上,导入数据的时候又会报错。

  • 说明对于让大模型来处理那种数量要一致的,要留个心眼,或者让它自证一下。

R4:合并到代码里面去

ChatGPT-4o


提示词:可以


输出


  • 只给了我哪些字段要转换,是要让我填转换后的英文名称

  • 会再询问:是否还需要:将表名也翻译成英文(或转拼音)?追加模式(append)而不是覆盖(replace)?添加主键或索引?


执行后


  • 没有执行,因为问了我是否要把表名翻译成英文


QWen3-235B-A22B


提示词:我需要你帮我都写到 python 代码里面,能够创建表,如果存在就删除,然后把数据写入数据库


输出


  • 第二版代码

  • 会再询问:如需添加字段清洗、空值处理、批量导入优化等功能,请告诉我,我可以继续帮你完善 😊


执行后


  • 执行了,表名还是中文,字段是英文了


小结


  • ChatGPT 每一步的询问感觉都还挺在点上的,而且只需要你回答是否可以,继续,这种。Qwen 虽然也有询问是否要做什么什么,不过那些偏专业,对真的开发代码的人还是有帮助的,不过对非开发,感觉也看不懂说的是什么。

  • ChatGPT 回答后再经过 2 轮,它给了最后代码。因为给了转换后的表名,让我确认,确认了才合到代码里面。(这边就先跳过)

  • Qwen 这边虽然提示词有说创建表,不过它没有意识到表名称也可能是中文,这个跟 ChatGPT 是不一样,ChatGPT 可能只是习惯性问下表名要不要改中文,而 Qwen 是直接忽略。

R5:问创建表的 SQL 包含索引

ChatGPT-4o


提示词(并非提示词,是个过程):改成代码后,让它同时在代码里面加上索引,是直接默认选择表里面 _id 的字段,我以为是会让我选择指定,所以后面我就换成,直接给我创建表的 SQL,包含主键。


输出


  • 给了我创建数据库的 SQL 包含索引的创建


执行后


  • 执行后成功创建表


QWen3-235B-A22B


提示词:你先给我表的创建 sql 吧,我直接在创建表的时候创建 index


输出


  • 给了我创建数据库的 SQL 包含索引的创建


执行后


  • 创建没有问题,创建成功


小结


  • Qwen 给我的是英文的表名,但是没有给我更新后的脚本,脚本还是中文的表名,并没有提示我。

  • 索引这一句,估计非开发又不知道什么是数据库索引,所以这一步有可能很多人就直接跳过了。

  • 这一步过去到创建表的 SQL,估计也有人不知道要去哪里执行。

R6:要最后导入数据的脚本

ChatGPT-4o


提示词:那你在给我修改后的 python 代码,只要写入数据的就行,不用在管表是否存在


输出


  • 第二版代码


执行后


  • 数据成功写入


QWen3-235B-A22B


提示词:那你在给我修改后的 python 代码,只要写入数据的就行,不用在管表是否存在


输出


  • 第三版代码


执行后


  • 提示少了员工表对应关系


小结


  • ChatGPT 到这一步就 OK 了,导入数据也就完成了。

  • Qwen 代码直到这版执行,才发现原来少了 2 个表,后面更新了一版,发现又少了 1 个表。其实从 R2 就已经漏了,我到这步才发现。当然,加上去之后就是好的了。

  • 不过整个过程,还涉及到删除数据库表,清空表内容。因为脚本没有记录已经成功导入的表,每次执行都会再重新来一次。但是我们前面设置了主键,主键是不能重复的,不是改了代码,再执行就 OK 的了。如果没有删除,会有 primary key duplicate 的报错,这个报错可以通过询问大模型解决,不过得绕多几次。数据库的可视化工具,也是一个问题,可能大模型会让你去用指令删除数据和表。



用 Cursor 写 mysql go mcp server

模型:claude sonnet 3.7

R1:空目录创建一个 mysql go mcp server

也不能说空目录,只不过是在我的一个 mcp server 目录下,创建一个新的目录来实现这个功能


提示词:在 mysql-mcp-server/server 里面帮我实现一个 mysql 的 mcp server,用 go-mcp 实现,我只需要读的功能。


输出:有些许代码报错,因为在引用 go-mcp 的时候估计是搜索到旧文章,所以用的方法不对。大体都已经出来了。

R2:按照我这个根目录下其他实现方式修改

因为我前面已经写过了其他例子,所以我直接让它按照其他目录里面的实现


提示词:注册方法跟 xxx 里面的注册方式保持一样


输出:修改一致,可以编译

R3:修改 bug,deepchat 调用后,不知道报了什么错,直接丢给 cursor


提示词:报错内容


输出:因为返回的接口体内容,不符合 go-mcp 要求,所以又根据已有项目代码修改了逻辑。

R4:修改查询错误

错误描述:问的内容是返回一个加总的值,但是返回一个数组,查了 deepchat 调用 mcp server 的 SQL 也是没有问题的。



提示词:为什么调用 tool mysql query 的时候这个 sql ‘SELECT order_amount FROM orders WHERE customer_id = (SELECT customer_id FROM customers WHERE customer_name = '蔡伟')’返回的是一个数组,而我直接执行 sql 的时候只返回一个数值


输出:答的不是我想要的

R5:讲清楚问题

提示词


不是,你的代码返回的是| order_amount        ||---------------------|| [53 56 53 46 52 56] |,但是数据库查出来的是| order_amount        ||---------------------|| [585.48] |我需要你打满日志,好用于排查问题
复制代码


输出:修改正确



R6:优化返回

这一步主要是在问 deepchat 的过程中,大模型有些理解的有问题,以及我返回出来的结果可能会影响对大模型的输入,所以


提示词:你觉得怎么拼回传的 content 可以让大模型更看得懂,从而可以给用户说的清楚,甚至可以给到大模型去生成一些趋势图之类的


输出:这个是修改内容,确实比之前的形式更好一点


结构化JSON数据输出- 添加了JSON格式化输出,包含完整的结构化数据- 保留了易读的表格文本格式,两者结合提供最佳体验智能类型处理- 添加了数据类型推断机制- 自动将数值字符串转换为实际数值- 支持整数和浮点数区分丰富的元数据- 添加列名、列类型、行数等元数据- 提供数据的语义信息,方便大模型理解数据含义优化数据结构- 使用嵌套的JSON对象表示数据行- 让每个数据点具有明确的字段名和类型
复制代码



用 Deepchat + mysql mcp server 去询问销售情况

模型:deepseek-chat


这边只是简单列了一下总结


  • 询问的问题只涉及到单表的都没有问题,能回答

  • 涉及到多个的时候就不行了,以及涉及到一个专有的表字段,比如 kp 数,可能就乱来了。原本 deepchat 是会通过我的 tool 里面有一个 查看数据库表信息来获取相关的表字段,从而能够拼出 SQL,不过这一个目的可能无法实现,或者说是我的这个接口返回的信息不够好。



  • 这个不了解表的问题,有可能是大模型能力还不够,也有可能是我接口返回信息写的不够好。不过不纠结,原本我也有这个打算。因此,我接着前面问 ChatGPT 的对话,让它帮我再生成这些表的描述。

  • 提示词:帮我生成这个表以及表字段的说明内容,我要给大模型去生成精确的 sql 指令。输出:原本只是给了几个表格,不过问我 “如需我再生成:JSON Schema 描述?数据库表之间的关系图?生成适用于自然语言 → SQL 的提示模板?我也可以继续帮你生成。需要吗?“。我觉得生成 json 好像对大模型来说理解更好,然后就保存成 json 格式在用 deepchat 问题的时候,就先上传这个 json 文件。

  • 事实证明,配上表描述,表字段描述,效果非常不错。问题:这些没有新增 kp 的都是什么部门的,哪个部门的最多?



总结

AI 的确帮我自动完成了数据导入、表结构设计、SQL 拼接,甚至能生成可用的查询结果。但整个过程中,我也碰到了不少非程序员很可能会被卡住的问题,比如字段名不统一、索引缺失、模型理解错误等。


结论是:自然语言 BI 并不是空谈,但仍需配合大量“人类经验”和“架构设计”来兜底。


未来,我觉得几个方向值得继续实验:


  • 如何让 Agent 来自动理解并拼接更复杂的查询逻辑?

  • 表结构设计本身如果不合理,AI 的理解能力还能不能兜得住?

  • 如果不是我自己做,而是一个不懂技术的人来操作,这套流程会不会直接崩溃?


这个实验还在继续,也欢迎你和我一起交流碰撞更多的思路。数据还不够多,所以图的部分还没实验。


用户头像

非晓为骁

关注

no pain no gain 2019-04-10 加入

用我的勤奋,一点一点地努力,提升自己的能力,拓展自己的视野,提高自己的认知。 我的知乎:https://www.zhihu.com/people/zhengfke

评论

发布
暂无评论
【AI】我没写一行 SQL,就让 AI 查出了销售报表_人工智能_非晓为骁_InfoQ写作社区