背景
领导给了个任务,在本地配置一个 deepseek 大模型,然后构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求。
现在上述三个任务都已经实现了,但是在对接数据库查询这块有很大问题。
问题
在将提示词(包含任务要求、数据表信息)和用户给到模型之后,模型给出的 sql 语句,十次有七次是直接无法执行的,基本就是语法有问题(常见错误 order by 、to_char 等等),再有三次就是和表结构有冲突,无法执行。
尝试
我尝试根据它 sql 的错误语法再加提示词,但是问题是越来越多的提示词再加上需要告知的表结构,提示词都快把可输入最长 token 占满了,而且提示词也不是百分百有效(比如我告诉它不要使用任何 order by ,但是还是输出...)
疑惑
我一开始就怀疑这件事是否可行,现在变得严格怀疑这件事是否可行。
表结构很简单的话我尝试过没有任何问题,可以做到百分百不出错,但是一旦企业的表结构极其复杂各种嵌套,在这种情况下还一定要用自然语言生成需要精准执行的 SQL 语句,我严格怀疑能做到么?
希望是我的技术水平不够,能有大佬帮我解解惑

你需要先把表结构转化成简单的结构,现在的 AI 还没这么智能,题外话,随便应付一下领导得了,反正无法上线,这个场景现阶段就是个玩具

我们团队能做到,找我们合作啊

写那么多提示词就差自己写 sql 教 ai 了

可以换一个思路(目前我们是这么做的)

开放 API 给 AI ,喊 AI 根据对话内容直接请求对应的 API ,然后展示 Response

text2sql 很常见的技术啊

可以看下 ragflow 里的 DB Assistant 这个 Agent

#1 我也是这么觉得,得让数据库同事弄个简单的表出来,别整那么复杂。而且说这么多到头来也是给自己和别的同事找工作,还不一定有成效...

#4 大佬这个思路好厉害,确实是一个方法我琢磨琢磨

#5 我指的是对于复杂的表结构和问题,模型不能生成正确的 sql

我觉得是无法做到百分百准确,最多接近正确答案

你说的这个需求 是现在大模型落地最常见的应用场景。。。

这不就是 MCP 吗?你搭一个 MCP 服务让 AI 调用就好了

最早可以用 function call,现在都是 mcp

不能把机器当人使。。。。

同理,也不能把人当机器使。。。

#6
#10
#11
感谢大佬,我研究一下。
我一直在弄 function call ,敢情都有 mcp 了。一直瞎造轮子😂

可以参考下这个库,只试用过 github.com/vanna-ai/vanna ,

#13 楼主最靠谱的就是用 MCP 参考 4 楼说的,生成 sql 都是白扯

除了 mcp 什么的,如果一定想要用大模型生成 sql 直接用,可以参考 dify 工作流的方式,加一个节点让大模型去校验 sql 并给出修改意见,然后根据修改意见再改一版

大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求)

要是这个需求能落地,sqlboy 的末日就到了 hh

很难哎,应该把大模型更多当人来看,就像一个新入职的员工,直接让他按 XXX 口径取 XXX 数据, 他不知道数据不知道业务,很容易取错。
就算带了两年给训练成熟练工了,取相同的数据也很难一口气写个 100%对的 sql 。更别说业务的迭代了

请教一下 ai 现在可以直接请求 api 吗,怎么实现的

prompt+mcp 就行了

提取数据的事情还是让 mcp 做吧,又能控制权限,又能适配数据库变化。

这不就是 text2sql 么 我最近也在搞类似的问题 但是感觉还好

你是直接给了业务表的表结构和查询权限给 llm 了么 然后因为业务表结构太多太乱导致模型自己的生成的 sql 比较混乱么

是否可以考虑缩减给 llm 的 prompt 里的表结构中的字段,把你觉得没用的或者冗余的字段给删掉

或者你可以自己定义实现一个跟业务有关的宽表给 llm 做查询

你要把你的数据库,数据化,训练模型才能达到你们说的这个效果,用开源的就是一个玩具,它是辅助,不会思考的.

每次更新数据库结构,表结构,去训练模型.

有条件就大模型微调呗,感觉 deepseek 知识库一般般,幻觉相对严重,不太适合这种任务

听 4 楼的,在大模型能力有下一个台阶飞跃之前,你只能做点中间层的工作来弥补

我也做了, 查询太复杂你就先定义一些 mcp 顶一下. 否则提示写太多模型也蒙了.

#20 function calling,tools use,mcp 了解一下

请教一下,如果用 MCP ,应该用什么思路去做通用查询?用户每次查询的请求都不同,对应到具体 SQL 或 API 肯定也不同

#15 感谢大佬,我看了下 mcp 介绍和几个小 demo ,确实很像 #4 那种实现方式,通过语句分析出执行哪个方法然后去 server 执行。我再研究研究

#14 感谢,我看 readme 可能和我理解的普通的差不多,我具体细看一下

#16 使用过但是没研究过 dify ,“加一个节点让大模型去校验 sql 并给出修改意见然后再次执行”,感觉意义不大,因为 sql 的报错的参考价值不大...

#17 分别是本地生成 faiss 、langchain 和 sqlalchemy 通过 create_sql_query_chain 连接、使用 fastapi

#18 hahhaa 我真想过这个事

#23
是的,给了表结构,不然 llm 不知道列代表啥。我目前只测试了两个表总共十个列属性给到 prompt ,就这都各种错。正式库中总共一百多个表,每个表至少 5 个关键列,再加上各种外键,光提示结构估计都要把 prompt 的 token 占满
至于单独建一个跟业务有关的表只给 llm 做查询用,这个也是退而求其次的想法了,感觉也只能这样了。不然表结构那么大,别说模型,就是告诉一个人,他都得来回查来回对比

#24 大佬方便细说一下吗?“把数据库数据化”没明白,是指把数据库的数据提取成知识给到 llm 吗?

#25 数据库相关也不太好微调呀,数据库每时每刻都在变

#27 我听前面的大佬说的 mcp 也去研究了下,感觉其实就是个封装好的 function calling 。面对公司定制化的业务端的需求,自己手动 function calling 没差,也不知道还是我理解错了😂

#30 考虑把数据库的数据都向量化,这样也能通过向量模型和向量数据库匹配出最相似的数据

#30 还是可以尝试一下,我这边去做类似的需求的时候,基本语法和表结构还是可以修复的,这个不一定在 sql 执行后做,初版 sql 写出来就可以做校验了,然后就是看之前的提示词有没有用类似少样本的一些技巧,也可以有一些提升

方案 1:While 语句没成功 : {请求大模型回答}
方案 2:把返回值发给大模型,让它自行判断是否成功

MCP 最有用的场景之一就是数据库

放弃遐想,现阶段你老板的需求是伪需求,无法做到精准查询。题外话,数据库查询和 MCP 有啥关系,MCP 就一个协议而已。

简单的应该可以吧
我们数据库里边字段一大堆还涉及到 json 字段的处理.ai 就完全胡言乱语了

MCP-server 是更好的方案。你在本地部署的 deepseek 够用吗,需要啥配置?我目前就是没有好的 LLM 可用,感觉效果最好的是 Claude Desktop(Claude 3.7 Sonnet),但是免费每天有使用限制。如果不在乎数据隐私安全的话,我建议你直接使用 Claude Desktop ,然后配置下 MCP ,就可以直接用了,甚至还能根据 sql 查询结果直接生成 react 代码编写的可视化图表。

模型训练,你用的所有模型都是训练出来的.
你可以根据你的业务,数据库专门去训练模型,来帮你.

一个领导的玩具~~

mcp 有毛用,他不也是生成 sql , 最大的难点是大模型不能理解你的业务需求,还有表多导致的多表连接查询,和选择表会出错

mcp function call 都行,顺便问下
大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求)
这个是怎么做的

MCP

详细手把手教程喂你嘴里
mp.weixin.qq.com/s/0l6-nEw-ZwkY5vD13pAo-w?scene=1

没理解 Cursor 调 MCP Server 是怎么能直接查数据库,用的什么技术

ReAct ,模型自己生成 sql ,自己去尝试执行,自己判定执行结果。最简单的参考 langchain 的官方示例就能写一个

我没太懂如何结合 ds+mcp 的,是通过 dify_或者 fastgpt 这类 agent 工具么,看楼上的教程,通过 cursor 或者 cherry studio 配置 mcp 服务的。另外,mcp 服务查询常规的 mysql ,oracle 数据库肯定是没问题,如果是不常规的一些国产数据库,mcp 服务是不是要自己写,那如何创建一个 mcp 服务啊

1.反正不能随便问,设计几个可能用的到的业务,数据做成宽表,视图貌似就可以
2.mcp 没毛用

常规的 text2sql 在宽表上表现比较好,但一旦涉及星型和雪花这种模型就容易吃瘪。我们采取的方式是根据业务精调模型,效果还挺好,就是精调模型有前期成本。

说 MCP 的是以为 OP 不知道怎么让大模型执行 sql 查询么。。。
OP 的问题是大模型生成的 sql 语句准确率不足的问题,这个和 MCP 有半毛钱关系

正好我也做过这方面的相关业务,楼上说的 mcp 给开发用用还行,实际公司业务一般都是分块,设计多表关联,都比较复杂,mcp 应对简单的还行,复杂的业务,比方说表关联是在应用层做的,在数据表设计中没有体现,直接使用 mcp 就会吃瘪。我们最终实现比价精准的方案是通过 1.表数据清晰 2.清洗表结构整理,字段说明 3.业务分块代入到 ai 上下文中 最终就能实现描述特定业务,找到业务表,生成 sql ,再查询

我今天下午也在测试这个, 我用通义灵码然后把数据库结构文件添加到上下文进行对话, 可以针对表结构进行比较准确的生成, 并且语法也符合目标库的语法

恰好我最近在做类似的事情,思路是:给大模型一个简单的表结构,输出“正确的”SQL ,然后再做一个 sql parser ,适配输出符合真实业务表结构的 sql

好奇 op 背景中的 3 个任务怎么完成的,学习一下

  1. mcp 只是一套标准的协议,也就是 api 设计和实现规范,和你业务完全没关系,目前 db 相关的几个 mcp 基本处于玩具的状态,满足不了实际的业务需求。
  1. 一般用户需要的其实是 BI ,所以可以看看 headless bi 的产品,比如腾讯的 github.com/tencentmusic/supersonic

    大模型和 MCP 并不能直接解决这些问题, 这个任务叫做 NL2SQL, 看你的任务有多复杂,这 NL2SQL 比大模型出现都早好几年, 你多研究研究吧, 多数人说的都是错的。
    github.com/hkustdial/nl2sql_handbook
    help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/llm-based-nl2sql

    如果你们想一部到位,不如花钱去买 chatbi 的 AI 产品,网易数帆和百度千帆都有这种的。

国内业界做的比较好的是蚂蚁搞的 text2sql 相关的项目
下面这个 DB-GPT 支持对 text2sql 的微调。

github.com/eosphoros-ai/DB-GPT

#31 数据库的数据怎么向量化呢?我搜到的都是非结构化内容向量化成 faiss ,没有搜到把 sql 、oracle 这种数据库向量化的内容,大佬方便说下吗?

#32 感谢,那我明天试试,循环几次同时带上错误信息

#36 简单的可以,复杂的就不行了。哪怕用很简单的方式就能调戏模型。给他一段代码其中包含 ` # 这种东西,然后让他正则匹配其中某一部分。模型给的结果就会乱掉

#37
本地的是个小的,目前单位在采购设备布 671B 。至于数据安全,领导最担心的就是数据安全,不然也不会花老鼻子钱买设备了😂
关于提到 “MCP-server 是更好的方案”,我的理解不知道对不对。我研究了几个 demo ,目前客户端怎么开发还没整明白,但是他大概的逻辑我看明白了,可是我感觉还是走的 function 那套呀,不过是大家都是同一种协议可以公开互相用。但面对公司独特的业务场景,server 端还是得自己写,同时也没办法公开出去,不是又和 function calling 一样了吗

RAG 是可以解决一部分问题,不过 V2EX 上的人回答都不对, 可以看看 finglm 智谱金融行业大模型挑战赛, V2EX 上没几个做这个相关的,这都是前沿技术,要都懂了怎么可能。
github.com/MetaGLM/FinGLM2/tree/main/baseline/soldier_baseline
github.com/Jinglever/FinGLM2-semi-final

关键词:Text2DSL

巧了,仅一个月就在弄这样的产品,首先罗列下相关的开源项目
github.com/tencentmusic/supersonic 腾讯音乐出的 chatbi,结合 llm 和 bi 能力,看完源码,你会发现,是先通过传统的 bi 进行语义匹配,然后仍给 llm 做处理,减少模型的幻觉产生
github.com/eosphoros-ai/DB-GPT 核心是它的提示词,核心是它的提示词,核心是它的提示词,可以得到图表
github.com/CodePhiliaX/Chat2DB 开源版就是挂羊头卖狗肉,广告做的好
好了,说了那么多,就是 Text2Sql 的本质就是大模型自身的能力,
我们能做的是
1 、在喂给大模型之前,做一些语义处理,然后大模型生成 sql 之后,对 sql 进行校正,这一块,又可以让大模型来校正,反复迭代
2 、表结构不要有歧义性,关联的 id 等需要明确表明是哪个表的哪个字段,这样处理之后,32b 参数量的模型,至少能准确生成 2-3 张表关联的 sql 语句
3 、引入 rag,可以把 ddl 的信息做成 rag ,然后先进行相似度匹配,然后得到对应的相关表结构信息,最后生成 sql.
4 、切分场景,不要一把梭把所有表结构信息都仍给大模型,大模型也扛不住,尽量切分场景,场景的识别也可以依靠大模型,专业术语叫意图识别
5 、指令型的大模型比推理型的速度要高,但是出的结果不一定准确,可以结合使用。
至于 mcp,emm,别太神话。追根到对应的某个 mcp 服务器的相关源码,其实还是上面那些
以上就是我近一个月开发此类产品的最大体会。
ps:这种类型的需求,领导是最喜欢的,但是,mmp 的这种需求,你必须得知道你的数据库里有哪些信息的数据,所以就等于领导要有提问的艺术,而这,是领导缺乏的。so,做此类需求,只能尽人事,听天命,懂甩锅,会报命。

不管是大模型或者是专门的 nl2sql 的模型,都会有生成语句无法查询出结果甚至复杂到无限输出的问题,尤其是复杂的查询。如果是给领导演示,尽可能的梳理业务将可能查询的数据生成的新的简单的表,而不是现场进行各种多表查询。

Dify + 这个插件 marketplace.dify.ai/plugins/jaguarliuu/rookie_text2data
实测 MySQL 在表不多的情况下,比我预想的要好

可能没那么复杂

在本地配置一个 deepseek 大模型,换成字节火山云上的满血版,可能就好了

#59 我感觉应该是分析语义,识别用户真实意图,系统以前实现的数据查询场景都可以映射出来,通过语义来控制。 如果是新的查询场景,那就要一步步拆解,先分析出要用到哪几张表,表里的哪几个字段; 输出是要呈现哪几个字段。 然后再告知 AI ,输入和输出 [我想象,应该是 AI Agent 来拆分实现这个]

能问一下你的服务器配置吗?部署的 deepseek 哪个版本的模型?

斗胆分享一个我弄的试验库: github.com/loocor/db2llm ,
视频介绍在: www.zhihu.com/zvideo/1883089086501352960