领导给了个任务,在本地配置一个 deepseek 大模型,然后构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求。 现在上述三个任务都已经实现了,但是在对接数据库查询这块有很大问题。
在将提示词(包含任务要求、数据表信息)和用户给到模型之后,模型给出的 sql 语句,十次有七次是直接无法执行的,基本就是语法有问题(常见错误 order by 、to_char 等等),再有三次就是和表结构有冲突,无法执行。
我尝试根据它 sql 的错误语法再加提示词,但是问题是越来越多的提示词再加上需要告知的表结构,提示词都快把可输入最长 token 占满了,而且提示词也不是百分百有效(比如我告诉它不要使用任何 order by ,但是还是输出...)
我一开始就怀疑这件事是否可行,现在变得严格怀疑这件事是否可行。
表结构很简单的话我尝试过没有任何问题,可以做到百分百不出错,但是一旦企业的表结构极其复杂各种嵌套,在这种情况下还一定要用自然语言生成需要精准执行的 SQL 语句,我严格怀疑能做到么?
希望是我的技术水平不够,能有大佬帮我解解惑
1
leonhao 4 天前 ![]() 你需要先把表结构转化成简单的结构,现在的 AI 还没这么智能,题外话,随便应付一下领导得了,反正无法上线,这个场景现阶段就是个玩具
|
2
mumbler 4 天前
我们团队能做到,找我们合作啊
|
![]() |
3
ferock 4 天前 via iPhone
写那么多提示词就差自己写 sql 教 ai 了
|
![]() |
4
Varsion13 4 天前 ![]() 可以换一个思路(目前我们是这么做的)
开放 API 给 AI ,喊 AI 根据对话内容直接请求对应的 API ,然后展示 Response |
5
elron 4 天前
text2sql 很常见的技术啊
|
6
sunmacarenas 4 天前 ![]() 可以看下 ragflow 里的 DB Assistant 这个 Agent
|
7
p1nk OP |
8
Fca 4 天前
我觉得是无法做到百分百准确,最多接近正确答案
|
![]() |
9
daodao 4 天前
你说的这个需求 是现在大模型落地最常见的应用场景。。。
|
10
sunny352787 4 天前 ![]() 这不就是 MCP 吗?你搭一个 MCP 服务让 AI 调用就好了
|
11
hmxxmh 4 天前 ![]() 最早可以用 function call,现在都是 mcp
|
12
hefish 4 天前
不能把机器当人使。。。。
同理,也不能把人当机器使。。。 |
13
p1nk OP |
14
sayoko 4 天前 ![]() 可以参考下这个库,只试用过 https://github.com/vanna-ai/vanna ,
|
16
ChoiYoonJung 4 天前 ![]() 除了 mcp 什么的,如果一定想要用大模型生成 sql 直接用,可以参考 dify 工作流的方式,加一个节点让大模型去校验 sql 并给出修改意见,然后根据修改意见再改一版
|
17
MRlaopeng 4 天前
大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求)
|
18
super452 4 天前
要是这个需求能落地,sqlboy 的末日就到了 hh
|
19
hhyyd 4 天前
很难哎,应该把大模型更多当人来看,就像一个新入职的员工,直接让他按 XXX 口径取 XXX 数据, 他不知道数据不知道业务,很容易取错。
就算带了两年给训练成熟练工了,取相同的数据也很难一口气写个 100%对的 sql 。更别说业务的迭代了 |
![]() |
21
qianmoumou 4 天前
prompt+mcp 就行了
|
![]() |
22
jimrok 4 天前
提取数据的事情还是让 mcp 做吧,又能控制权限,又能适配数据库变化。
|
![]() |
23
NizumaEiji 4 天前
这不就是 text2sql 么 我最近也在搞类似的问题 但是感觉还好
你是直接给了业务表的表结构和查询权限给 llm 了么 然后因为业务表结构太多太乱导致模型自己的生成的 sql 比较混乱么 是否可以考虑缩减给 llm 的 prompt 里的表结构中的字段,把你觉得没用的或者冗余的字段给删掉 或者你可以自己定义实现一个跟业务有关的宽表给 llm 做查询 |
![]() |
24
billbob 4 天前
你要把你的数据库,数据化,训练模型才能达到你们说的这个效果,用开源的就是一个玩具,它是辅助,不会思考的.
每次更新数据库结构,表结构,去训练模型. |
![]() |
25
luoyide2010 4 天前
有条件就大模型微调呗,感觉 deepseek 知识库一般般,幻觉相对严重,不太适合这种任务
|
26
ljpCN 4 天前
听 4 楼的,在大模型能力有下一个台阶飞跃之前,你只能做点中间层的工作来弥补
|
27
kjstart 4 天前
我也做了, 查询太复杂你就先定义一些 mcp 顶一下. 否则提示写太多模型也蒙了.
|
30
p1nk OP @Fca #15 感谢大佬,我看了下 mcp 介绍和几个小 demo ,确实很像 #4 那种实现方式,通过语句分析出执行哪个方法然后去 server 执行。我再研究研究
@sayoko #14 感谢,我看 readme 可能和我理解的普通的差不多,我具体细看一下 @ChoiYoonJung #16 使用过但是没研究过 dify ,“加一个节点让大模型去校验 sql 并给出修改意见然后再次执行”,感觉意义不大,因为 sql 的报错的参考价值不大... @MRlaopeng #17 分别是本地生成 faiss 、langchain 和 sqlalchemy 通过 create_sql_query_chain 连接、使用 fastapi @super452 #18 hahhaa 我真想过这个事 @NizumaEiji #23 是的,给了表结构,不然 llm 不知道列代表啥。我目前只测试了两个表总共十个列属性给到 prompt ,就这都各种错。正式库中总共一百多个表,每个表至少 5 个关键列,再加上各种外键,光提示结构估计都要把 prompt 的 token 占满 至于单独建一个跟业务有关的表只给 llm 做查询用,这个也是退而求其次的想法了,感觉也只能这样了。不然表结构那么大,别说模型,就是告诉一个人,他都得来回查来回对比 @billbob #24 大佬方便细说一下吗?“把数据库数据化”没明白,是指把数据库的数据提取成知识给到 llm 吗? @luoyide2010 #25 数据库相关也不太好微调呀,数据库每时每刻都在变 @kjstart #27 我听前面的大佬说的 mcp 也去研究了下,感觉其实就是个封装好的 function calling 。面对公司定制化的业务端的需求,自己手动 function calling 没差,也不知道还是我理解错了😂 |
32
ChoiYoonJung 4 天前 ![]() @p1nk #30 还是可以尝试一下,我这边去做类似的需求的时候,基本语法和表结构还是可以修复的,这个不一定在 sql 执行后做,初版 sql 写出来就可以做校验了,然后就是看之前的提示词有没有用类似少样本的一些技巧,也可以有一些提升
|
![]() |
33
Charon2050 4 天前
方案 1:While 语句没成功 : {请求大模型回答}
方案 2:把返回值发给大模型,让它自行判断是否成功 |
![]() |
34
davidqw 4 天前
MCP 最有用的场景之一就是数据库
|
35
r00mz 4 天前
放弃遐想,现阶段你老板的需求是伪需求,无法做到精准查询。题外话,数据库查询和 MCP 有啥关系,MCP 就一个协议而已。
|
![]() |
37
fcbwalk 4 天前
MCP-server 是更好的方案。你在本地部署的 deepseek 够用吗,需要啥配置?我目前就是没有好的 LLM 可用,感觉效果最好的是 Claude Desktop(Claude 3.7 Sonnet),但是免费每天有使用限制。如果不在乎数据隐私安全的话,我建议你直接使用 Claude Desktop ,然后配置下 MCP ,就可以直接用了,甚至还能根据 sql 查询结果直接生成 react 代码编写的可视化图表。
|
39
bbao 4 天前
一个领导的玩具~~
|
40
Suger828 4 天前
mcp 有毛用,他不也是生成 sql , 最大的难点是大模型不能理解你的业务需求,还有表多导致的多表连接查询,和选择表会出错
|
![]() |
41
Clannad0708 4 天前
mcp function call 都行,顺便问下
大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求) 这个是怎么做的 |
42
YOUXIAZ 4 天前 ![]() |
![]() |
45
z1gui 4 天前
我没太懂如何结合 ds+mcp 的,是通过 dify_或者 fastgpt 这类 agent 工具么,看楼上的教程,通过 cursor 或者 cherry studio 配置 mcp 服务的。另外,mcp 服务查询常规的 mysql ,oracle 数据库肯定是没问题,如果是不常规的一些国产数据库,mcp 服务是不是要自己写,那如何创建一个 mcp 服务啊
|
![]() |
46
dabingbing 4 天前 ![]() 1.反正不能随便问,设计几个可能用的到的业务,数据做成宽表,视图貌似就可以
2.mcp 没毛用 |
47
lawrencelee 4 天前 ![]() 常规的 text2sql 在宽表上表现比较好,但一旦涉及星型和雪花这种模型就容易吃瘪。我们采取的方式是根据业务精调模型,效果还挺好,就是精调模型有前期成本。
|
![]() |
48
easing 4 天前 ![]() 说 MCP 的是以为 OP 不知道怎么让大模型执行 sql 查询么。。。
OP 的问题是大模型生成的 sql 语句准确率不足的问题,这个和 MCP 有半毛钱关系 |
![]() |
49
zzxCNCZ 4 天前 ![]() 正好我也做过这方面的相关业务,楼上说的 mcp 给开发用用还行,实际公司业务一般都是分块,设计多表关联,都比较复杂,mcp 应对简单的还行,复杂的业务,比方说表关联是在应用层做的,在数据表设计中没有体现,直接使用 mcp 就会吃瘪。我们最终实现比价精准的方案是通过 1.表数据清晰 2.清洗表结构整理,字段说明 3.业务分块代入到 ai 上下文中 最终就能实现描述特定业务,找到业务表,生成 sql ,再查询
|
![]() |
50
niubiman 4 天前 ![]() 我今天下午也在测试这个, 我用通义灵码然后把数据库结构文件添加到上下文进行对话, 可以针对表结构进行比较准确的生成, 并且语法也符合目标库的语法
|
![]() |
51
Orlion 4 天前
恰好我最近在做类似的事情,思路是:给大模型一个简单的表结构,输出“正确的”SQL ,然后再做一个 sql parser ,适配输出符合真实业务表结构的 sql
|
![]() |
52
luqicoder67 4 天前
好奇 op 背景中的 3 个任务怎么完成的,学习一下
|
![]() |
53
highkay 4 天前 ![]() 1. mcp 只是一套标准的协议,也就是 api 设计和实现规范,和你业务完全没关系,目前 db 相关的几个 mcp 基本处于玩具的状态,满足不了实际的业务需求。
2. 一般用户需要的其实是 BI ,所以可以看看 headless bi 的产品,比如腾讯的 https://github.com/tencentmusic/supersonic |
![]() |
54
mightybruce 4 天前 ![]() 大模型和 MCP 并不能直接解决这些问题, 这个任务叫做 NL2SQL, 看你的任务有多复杂,这 NL2SQL 比大模型出现都早好几年, 你多研究研究吧, 多数人说的都是错的。
https://github.com/hkustdial/nl2sql_handbook https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/llm-based-nl2sql |
![]() |
55
mightybruce 4 天前
如果你们想一部到位,不如花钱去买 chatbi 的 AI 产品,网易数帆和百度千帆都有这种的。
国内业界做的比较好的是蚂蚁搞的 text2sql 相关的项目 下面这个 DB-GPT 支持对 text2sql 的微调。 https://github.com/eosphoros-ai/DB-GPT |
56
p1nk OP @Fca #31 数据库的数据怎么向量化呢?我搜到的都是非结构化内容向量化成 faiss ,没有搜到把 sql 、oracle 这种数据库向量化的内容,大佬方便说下吗?
@ChoiYoonJung #32 感谢,那我明天试试,循环几次同时带上错误信息 @pweng286 #36 简单的可以,复杂的就不行了。哪怕用很简单的方式就能调戏模型。给他一段代码其中包含 ` # 这种东西,然后让他正则匹配其中某一部分。模型给的结果就会乱掉 @fcbwalk #37 本地的是个小的,目前单位在采购设备布 671B 。至于数据安全,领导最担心的就是数据安全,不然也不会花老鼻子钱买设备了😂 关于提到 “MCP-server 是更好的方案”,我的理解不知道对不对。我研究了几个 demo ,目前客户端怎么开发还没整明白,但是他大概的逻辑我看明白了,可是我感觉还是走的 function 那套呀,不过是大家都是同一种协议可以公开互相用。但面对公司独特的业务场景,server 端还是得自己写,同时也没办法公开出去,不是又和 function calling 一样了吗 |
![]() |
57
mightybruce 4 天前
RAG 是可以解决一部分问题,不过 V2EX 上的人回答都不对, 可以看看 finglm 智谱金融行业大模型挑战赛, V2EX 上没几个做这个相关的,这都是前沿技术,要都懂了怎么可能。
https://github.com/MetaGLM/FinGLM2/tree/main/baseline/soldier_baseline https://github.com/Jinglever/FinGLM2-semi-final |
![]() |
58
eric227 4 天前
关键词:Text2DSL
|
![]() |
59
frandy 4 天前 ![]() 巧了,仅一个月就在弄这样的产品,首先罗列下相关的开源项目
https://github.com/tencentmusic/supersonic 腾讯音乐出的 chatbi,结合 llm 和 bi 能力,看完源码,你会发现,是先通过传统的 bi 进行语义匹配,然后仍给 llm 做处理,减少模型的幻觉产生 https://github.com/eosphoros-ai/DB-GPT 核心是它的提示词,核心是它的提示词,核心是它的提示词,可以得到图表 https://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,做此类需求,只能尽人事,听天命,懂甩锅,会报命。 |
60
xvan 4 天前
不管是大模型或者是专门的 nl2sql 的模型,都会有生成语句无法查询出结果甚至复杂到无限输出的问题,尤其是复杂的查询。如果是给领导演示,尽可能的梳理业务将可能查询的数据生成的新的简单的表,而不是现场进行各种多表查询。
|
![]() |
61
vem 4 天前
Dify + 这个插件 https://marketplace.dify.ai/plugins/jaguarliuu/rookie_text2data
实测 MySQL 在表不多的情况下,比我预想的要好 |
![]() |
62
iyaozhen 4 天前
可能没那么复杂
在本地配置一个 deepseek 大模型,换成字节火山云上的满血版,可能就好了 |
![]() |
63
yufeng0681 4 天前
@frandy #59 我感觉应该是分析语义,识别用户真实意图,系统以前实现的数据查询场景都可以映射出来,通过语义来控制。 如果是新的查询场景,那就要一步步拆解,先分析出要用到哪几张表,表里的哪几个字段; 输出是要呈现哪几个字段。 然后再告知 AI ,输入和输出 [我想象,应该是 AI Agent 来拆分实现这个]
|
64
macadurian 4 天前
能问一下你的服务器配置吗?部署的 deepseek 哪个版本的模型?
|
![]() |
65
Loocor 4 天前
斗胆分享一个我弄的试验库: https://github.com/loocor/db2llm ,
视频介绍在: https://www.zhihu.com/zvideo/1883089086501352960 |
![]() |
67
XCFOX 3 天前
分析一下我的思路:
1. 将数据库以 GraphQL 的形式暴露 API ,使用 Hasura 或 Graphile 2. 将 GraphQL 通过 MCP 连接到 AI ,使用 https://github.com/blurrah/mcp-graphql |
![]() |
68
akira 3 天前
最近刚好在做 chat bi 的东西,其实如果你们之前 bi 构建了的话,
不要直接用 生产库的数据 来出, 走 BI 的宽表 ,这个时候出来的效果就好很多啦 |
69
horizon 3 天前
不能,你需要 function calling
提供 sql api ,让大模型填充参数 |
![]() |
70
elevioux 3 天前
不知道楼上说的 mcp 和 题主的需求有什么关系,mcp 本质不就是远程的 function call 吗?难道还要限定用户的话题范围? function call 没有覆盖的,一律不知道?
最近公司老板也有相似需求,而且还要鉴别用户权限,限定可查数据。我的做法是根据用户 ID 手动创建固定的临时表,整理好所有可查数据。AI 只需要对接几个临时表就好,不用管数据库一大堆乱七八糟的表。 效果是,生成 SQL 本身没问题,但 AI 还不能完全理解业务,差强人意,还要调教。 |
71
chunshuxvgou 3 天前
你本地部署的是哪个模型? 32b? 70b ?
|
![]() |
72
111111111111 3 天前 ![]() 怎么这么多人无脑 MCP ,MCP 只是个接口协议和数据库没啥关系呀
我这边自己做的 demo 是: - rag (描述业务关系和数据关系)+ - function calling (执行 sql ) - 提示词工程(要求 LLM 按照既定步骤进行,比如先查表结构再生成 SQL ,认真检查和验证 SQL ,最后再执行 SQ 取数据回答问题) 在表不多而且表关系不那么复杂的情况下,效果看起来还好,至少没有再出现生成的 SQL 执行不了,几乎不太需要代码级别干预,但是 LLM 在生成 SQL 过于聚焦你提出的“问题”,问题之外的事情考虑还是不完善,比如人的重名,数据的统计维度。所以还是需要每次的反馈,不断调整问题或者提示词。 在这个 demo 中,我的感受是:其他人必须要通过我来使用效果才好,直接给他们用效果非常差 因为我会把他们的的问题或者需求理解一遍后,再以 LLM 更容易理解正确的方式进行提问, 这有点像专职司机,车是公司的,但是只有我最懂它,最能用好它,知道怎么对它进行保养维护 |
![]() |
73
areless 3 天前 via Android
text2sql 是有专门的比赛 排名的。现在只不过换了一种使用 llm 的方式去解决这个问题。实际上排名靠前的成功率也是不高的。
|
74
lawrencelee 3 天前
@areless 话说这个比赛在哪里呀?
|
![]() |
75
kelvinji2009 3 天前
@frandy 👍 相似理解和感受
|
![]() |
76
Hyxiao 3 天前
场景跟你差不多,但是我们数据是保存在 es 中的,最近将 es 升到了 8 ,支持了语义搜索,在 dify 设置外置知识库对接项目提供的接口,就可以做到问的问题都可以关联上 es 相关的内容
|
![]() |
77
areless 3 天前 via Android
@lawrencelee 在阿里在阿里,2019 年首届中文 nl2sql
|