大模型在技术上 能 / 怎么 实现比较准确的数据库查询 吗/呢 ?

87 天前
 p1nk

背景

领导给了个任务,在本地配置一个 deepseek 大模型,然后构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求。 现在上述三个任务都已经实现了,但是在对接数据库查询这块有很大问题。

问题

在将提示词(包含任务要求、数据表信息)和用户给到模型之后,模型给出的 sql 语句,十次有七次是直接无法执行的,基本就是语法有问题(常见错误 order by 、to_char 等等),再有三次就是和表结构有冲突,无法执行。

尝试

我尝试根据它 sql 的错误语法再加提示词,但是问题是越来越多的提示词再加上需要告知的表结构,提示词都快把可输入最长 token 占满了,而且提示词也不是百分百有效(比如我告诉它不要使用任何 order by ,但是还是输出...)

疑惑

我一开始就怀疑这件事是否可行,现在变得严格怀疑这件事是否可行。
表结构很简单的话我尝试过没有任何问题,可以做到百分百不出错,但是一旦企业的表结构极其复杂各种嵌套,在这种情况下还一定要用自然语言生成需要精准执行的 SQL 语句,我严格怀疑能做到么?
希望是我的技术水平不够,能有大佬帮我解解惑

7346 次点击
所在节点    程序员
78 条回复
qianmoumou
87 天前
prompt+mcp 就行了
jimrok
87 天前
提取数据的事情还是让 mcp 做吧,又能控制权限,又能适配数据库变化。
NizumaEiji
87 天前
这不就是 text2sql 么 我最近也在搞类似的问题 但是感觉还好

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

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

或者你可以自己定义实现一个跟业务有关的宽表给 llm 做查询
billbob
87 天前
你要把你的数据库,数据化,训练模型才能达到你们说的这个效果,用开源的就是一个玩具,它是辅助,不会思考的.

每次更新数据库结构,表结构,去训练模型.
luoyide2010
87 天前
有条件就大模型微调呗,感觉 deepseek 知识库一般般,幻觉相对严重,不太适合这种任务
ljpCN
87 天前
听 4 楼的,在大模型能力有下一个台阶飞跃之前,你只能做点中间层的工作来弥补
kjstart
87 天前
我也做了, 查询太复杂你就先定义一些 mcp 顶一下. 否则提示写太多模型也蒙了.
mumbler
87 天前
@skyemin #20 function calling,tools use,mcp 了解一下
cylaw
87 天前
@Varsion13 请教一下,如果用 MCP ,应该用什么思路去做通用查询?用户每次查询的请求都不同,对应到具体 SQL 或 API 肯定也不同
p1nk
87 天前
@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 没差,也不知道还是我理解错了😂
XG9H3BN7CWMMmnjw
87 天前
@p1nk #30 考虑把数据库的数据都向量化,这样也能通过向量模型和向量数据库匹配出最相似的数据
ChoiYoonJung
87 天前
@p1nk #30 还是可以尝试一下,我这边去做类似的需求的时候,基本语法和表结构还是可以修复的,这个不一定在 sql 执行后做,初版 sql 写出来就可以做校验了,然后就是看之前的提示词有没有用类似少样本的一些技巧,也可以有一些提升
Charon2050
87 天前
方案 1:While 语句没成功 : {请求大模型回答}
方案 2:把返回值发给大模型,让它自行判断是否成功
davidqw
87 天前
MCP 最有用的场景之一就是数据库
r00mz
87 天前
放弃遐想,现阶段你老板的需求是伪需求,无法做到精准查询。题外话,数据库查询和 MCP 有啥关系,MCP 就一个协议而已。
pweng286
87 天前
简单的应该可以吧
我们数据库里边字段一大堆还涉及到 json 字段的处理.ai 就完全胡言乱语了
fcbwalk
87 天前
MCP-server 是更好的方案。你在本地部署的 deepseek 够用吗,需要啥配置?我目前就是没有好的 LLM 可用,感觉效果最好的是 Claude Desktop(Claude 3.7 Sonnet),但是免费每天有使用限制。如果不在乎数据隐私安全的话,我建议你直接使用 Claude Desktop ,然后配置下 MCP ,就可以直接用了,甚至还能根据 sql 查询结果直接生成 react 代码编写的可视化图表。
billbob
87 天前
@p1nk 模型训练,你用的所有模型都是训练出来的.
你可以根据你的业务,数据库专门去训练模型,来帮你.
bbao
87 天前
一个领导的玩具~~
Suger828
87 天前
mcp 有毛用,他不也是生成 sql , 最大的难点是大模型不能理解你的业务需求,还有表多导致的多表连接查询,和选择表会出错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1124121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX