V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
p1nk
V2EX  ›  程序员

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

  •  2
     
  •   p1nk · 4 天前 · 5557 次点击

    背景

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

    问题

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

    尝试

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

    疑惑

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

    77 条回复    2025-04-10 15:58:51 +08:00
    leonhao
        1
    leonhao  
       4 天前   ❤️ 1
    你需要先把表结构转化成简单的结构,现在的 AI 还没这么智能,题外话,随便应付一下领导得了,反正无法上线,这个场景现阶段就是个玩具
    mumbler
        2
    mumbler  
       4 天前
    我们团队能做到,找我们合作啊
    ferock
        3
    ferock  
       4 天前 via iPhone
    写那么多提示词就差自己写 sql 教 ai 了
    Varsion13
        4
    Varsion13  
       4 天前   ❤️ 3
    可以换一个思路(目前我们是这么做的)

    开放 API 给 AI ,喊 AI 根据对话内容直接请求对应的 API ,然后展示 Response
    elron
        5
    elron  
       4 天前
    text2sql 很常见的技术啊
    sunmacarenas
        6
    sunmacarenas  
       4 天前   ❤️ 1
    可以看下 ragflow 里的 DB Assistant 这个 Agent
    p1nk
        7
    p1nk  
    OP
       4 天前
    @leonhao #1 我也是这么觉得,得让数据库同事弄个简单的表出来,别整那么复杂。而且说这么多到头来也是给自己和别的同事找工作,还不一定有成效...

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

    @elron #5 我指的是对于复杂的表结构和问题,模型不能生成正确的 sql
    Fca
        8
    Fca  
       4 天前
    我觉得是无法做到百分百准确,最多接近正确答案
    daodao
        9
    daodao  
       4 天前
    你说的这个需求 是现在大模型落地最常见的应用场景。。。
    sunny352787
        10
    sunny352787  
       4 天前   ❤️ 1
    这不就是 MCP 吗?你搭一个 MCP 服务让 AI 调用就好了
    hmxxmh
        11
    hmxxmh  
       4 天前   ❤️ 1
    最早可以用 function call,现在都是 mcp
    hefish
        12
    hefish  
       4 天前
    不能把机器当人使。。。。

    同理,也不能把人当机器使。。。
    p1nk
        13
    p1nk  
    OP
       4 天前
    @sunmacarenas #6

    @sunny352787 #10

    @hmxxmh #11

    感谢大佬,我研究一下。
    我一直在弄 function call ,敢情都有 mcp 了。一直瞎造轮子😂
    sayoko
        14
    sayoko  
       4 天前   ❤️ 1
    可以参考下这个库,只试用过 https://github.com/vanna-ai/vanna
    Fca
        15
    Fca  
       4 天前
    @p1nk #13 楼主最靠谱的就是用 MCP 参考 4 楼说的,生成 sql 都是白扯
    ChoiYoonJung
        16
    ChoiYoonJung  
       4 天前   ❤️ 1
    除了 mcp 什么的,如果一定想要用大模型生成 sql 直接用,可以参考 dify 工作流的方式,加一个节点让大模型去校验 sql 并给出修改意见,然后根据修改意见再改一版
    MRlaopeng
        17
    MRlaopeng  
       4 天前
    大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求)
    super452
        18
    super452  
       4 天前
    要是这个需求能落地,sqlboy 的末日就到了 hh
    hhyyd
        19
    hhyyd  
       4 天前
    很难哎,应该把大模型更多当人来看,就像一个新入职的员工,直接让他按 XXX 口径取 XXX 数据, 他不知道数据不知道业务,很容易取错。


    就算带了两年给训练成熟练工了,取相同的数据也很难一口气写个 100%对的 sql 。更别说业务的迭代了
    skyemin
        20
    skyemin  
       4 天前
    @Varsion13 请教一下 ai 现在可以直接请求 api 吗,怎么实现的
    qianmoumou
        21
    qianmoumou  
       4 天前
    prompt+mcp 就行了
    jimrok
        22
    jimrok  
       4 天前
    提取数据的事情还是让 mcp 做吧,又能控制权限,又能适配数据库变化。
    NizumaEiji
        23
    NizumaEiji  
       4 天前
    这不就是 text2sql 么 我最近也在搞类似的问题 但是感觉还好

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

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

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

    每次更新数据库结构,表结构,去训练模型.
    luoyide2010
        25
    luoyide2010  
       4 天前
    有条件就大模型微调呗,感觉 deepseek 知识库一般般,幻觉相对严重,不太适合这种任务
    ljpCN
        26
    ljpCN  
       4 天前
    听 4 楼的,在大模型能力有下一个台阶飞跃之前,你只能做点中间层的工作来弥补
    kjstart
        27
    kjstart  
       4 天前
    我也做了, 查询太复杂你就先定义一些 mcp 顶一下. 否则提示写太多模型也蒙了.
    mumbler
        28
    mumbler  
       4 天前
    @skyemin #20 function calling,tools use,mcp 了解一下
    cylaw
        29
    cylaw  
       4 天前
    @Varsion13 请教一下,如果用 MCP ,应该用什么思路去做通用查询?用户每次查询的请求都不同,对应到具体 SQL 或 API 肯定也不同
    p1nk
        30
    p1nk  
    OP
       4 天前
    @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 没差,也不知道还是我理解错了😂
    Fca
        31
    Fca  
       4 天前
    @p1nk #30 考虑把数据库的数据都向量化,这样也能通过向量模型和向量数据库匹配出最相似的数据
    ChoiYoonJung
        32
    ChoiYoonJung  
       4 天前   ❤️ 1
    @p1nk #30 还是可以尝试一下,我这边去做类似的需求的时候,基本语法和表结构还是可以修复的,这个不一定在 sql 执行后做,初版 sql 写出来就可以做校验了,然后就是看之前的提示词有没有用类似少样本的一些技巧,也可以有一些提升
    Charon2050
        33
    Charon2050  
       4 天前
    方案 1:While 语句没成功 : {请求大模型回答}
    方案 2:把返回值发给大模型,让它自行判断是否成功
    davidqw
        34
    davidqw  
       4 天前
    MCP 最有用的场景之一就是数据库
    r00mz
        35
    r00mz  
       4 天前
    放弃遐想,现阶段你老板的需求是伪需求,无法做到精准查询。题外话,数据库查询和 MCP 有啥关系,MCP 就一个协议而已。
    pweng286
        36
    pweng286  
       4 天前
    简单的应该可以吧
    我们数据库里边字段一大堆还涉及到 json 字段的处理.ai 就完全胡言乱语了
    fcbwalk
        37
    fcbwalk  
       4 天前
    MCP-server 是更好的方案。你在本地部署的 deepseek 够用吗,需要啥配置?我目前就是没有好的 LLM 可用,感觉效果最好的是 Claude Desktop(Claude 3.7 Sonnet),但是免费每天有使用限制。如果不在乎数据隐私安全的话,我建议你直接使用 Claude Desktop ,然后配置下 MCP ,就可以直接用了,甚至还能根据 sql 查询结果直接生成 react 代码编写的可视化图表。
    billbob
        38
    billbob  
       4 天前
    @p1nk 模型训练,你用的所有模型都是训练出来的.
    你可以根据你的业务,数据库专门去训练模型,来帮你.
    bbao
        39
    bbao  
       4 天前
    一个领导的玩具~~
    Suger828
        40
    Suger828  
       4 天前
    mcp 有毛用,他不也是生成 sql , 最大的难点是大模型不能理解你的业务需求,还有表多导致的多表连接查询,和选择表会出错
    Clannad0708
        41
    Clannad0708  
       4 天前
    mcp function call 都行,顺便问下
    大佬这个咋实现的 (构建公司内部的知识库、连接公司内部的数据库,实现领导和员工对访问需求)
    这个是怎么做的
    YOUXIAZ
        42
    YOUXIAZ  
       4 天前   ❤️ 1
    skyemin
        43
    skyemin  
       4 天前
    @YOUXIAZ 没理解 Cursor 调 MCP Server 是怎么能直接查数据库,用的什么技术
    aeron
        44
    aeron  
       4 天前
    @cylaw ReAct ,模型自己生成 sql ,自己去尝试执行,自己判定执行结果。最简单的参考 langchain 的官方示例就能写一个
    z1gui
        45
    z1gui  
       4 天前
    我没太懂如何结合 ds+mcp 的,是通过 dify_或者 fastgpt 这类 agent 工具么,看楼上的教程,通过 cursor 或者 cherry studio 配置 mcp 服务的。另外,mcp 服务查询常规的 mysql ,oracle 数据库肯定是没问题,如果是不常规的一些国产数据库,mcp 服务是不是要自己写,那如何创建一个 mcp 服务啊
    dabingbing
        46
    dabingbing  
       4 天前   ❤️ 2
    1.反正不能随便问,设计几个可能用的到的业务,数据做成宽表,视图貌似就可以
    2.mcp 没毛用
    lawrencelee
        47
    lawrencelee  
       4 天前   ❤️ 1
    常规的 text2sql 在宽表上表现比较好,但一旦涉及星型和雪花这种模型就容易吃瘪。我们采取的方式是根据业务精调模型,效果还挺好,就是精调模型有前期成本。
    easing
        48
    easing  
       4 天前   ❤️ 2
    说 MCP 的是以为 OP 不知道怎么让大模型执行 sql 查询么。。。
    OP 的问题是大模型生成的 sql 语句准确率不足的问题,这个和 MCP 有半毛钱关系
    zzxCNCZ
        49
    zzxCNCZ  
       4 天前   ❤️ 2
    正好我也做过这方面的相关业务,楼上说的 mcp 给开发用用还行,实际公司业务一般都是分块,设计多表关联,都比较复杂,mcp 应对简单的还行,复杂的业务,比方说表关联是在应用层做的,在数据表设计中没有体现,直接使用 mcp 就会吃瘪。我们最终实现比价精准的方案是通过 1.表数据清晰 2.清洗表结构整理,字段说明 3.业务分块代入到 ai 上下文中 最终就能实现描述特定业务,找到业务表,生成 sql ,再查询
    niubiman
        50
    niubiman  
       4 天前   ❤️ 1
    我今天下午也在测试这个, 我用通义灵码然后把数据库结构文件添加到上下文进行对话, 可以针对表结构进行比较准确的生成, 并且语法也符合目标库的语法
    Orlion
        51
    Orlion  
       4 天前
    恰好我最近在做类似的事情,思路是:给大模型一个简单的表结构,输出“正确的”SQL ,然后再做一个 sql parser ,适配输出符合真实业务表结构的 sql
    luqicoder67
        52
    luqicoder67  
       4 天前
    好奇 op 背景中的 3 个任务怎么完成的,学习一下
    highkay
        53
    highkay  
       4 天前   ❤️ 2
    1. mcp 只是一套标准的协议,也就是 api 设计和实现规范,和你业务完全没关系,目前 db 相关的几个 mcp 基本处于玩具的状态,满足不了实际的业务需求。
    2. 一般用户需要的其实是 BI ,所以可以看看 headless bi 的产品,比如腾讯的 https://github.com/tencentmusic/supersonic
    mightybruce
        54
    mightybruce  
       4 天前   ❤️ 1
    大模型和 MCP 并不能直接解决这些问题, 这个任务叫做 NL2SQL, 看你的任务有多复杂,这 NL2SQL 比大模型出现都早好几年, 你多研究研究吧, 多数人说的都是错的。
    https://github.com/hkustdial/nl2sql_handbook
    https://help.aliyun.com/zh/polardb/polardb-for-mysql/user-guide/llm-based-nl2sql
    mightybruce
        55
    mightybruce  
       4 天前
    如果你们想一部到位,不如花钱去买 chatbi 的 AI 产品,网易数帆和百度千帆都有这种的。

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

    https://github.com/eosphoros-ai/DB-GPT
    p1nk
        56
    p1nk  
    OP
       4 天前
    @Fca #31 数据库的数据怎么向量化呢?我搜到的都是非结构化内容向量化成 faiss ,没有搜到把 sql 、oracle 这种数据库向量化的内容,大佬方便说下吗?


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


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


    @fcbwalk #37
    本地的是个小的,目前单位在采购设备布 671B 。至于数据安全,领导最担心的就是数据安全,不然也不会花老鼻子钱买设备了😂
    关于提到 “MCP-server 是更好的方案”,我的理解不知道对不对。我研究了几个 demo ,目前客户端怎么开发还没整明白,但是他大概的逻辑我看明白了,可是我感觉还是走的 function 那套呀,不过是大家都是同一种协议可以公开互相用。但面对公司独特的业务场景,server 端还是得自己写,同时也没办法公开出去,不是又和 function calling 一样了吗
    mightybruce
        57
    mightybruce  
       4 天前
    RAG 是可以解决一部分问题,不过 V2EX 上的人回答都不对, 可以看看 finglm 智谱金融行业大模型挑战赛, V2EX 上没几个做这个相关的,这都是前沿技术,要都懂了怎么可能。
    https://github.com/MetaGLM/FinGLM2/tree/main/baseline/soldier_baseline
    https://github.com/Jinglever/FinGLM2-semi-final
    eric227
        58
    eric227  
       4 天前
    关键词:Text2DSL
    frandy
        59
    frandy  
       4 天前   ❤️ 9
    巧了,仅一个月就在弄这样的产品,首先罗列下相关的开源项目
    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,做此类需求,只能尽人事,听天命,懂甩锅,会报命。
    xvan
        60
    xvan  
       4 天前
    不管是大模型或者是专门的 nl2sql 的模型,都会有生成语句无法查询出结果甚至复杂到无限输出的问题,尤其是复杂的查询。如果是给领导演示,尽可能的梳理业务将可能查询的数据生成的新的简单的表,而不是现场进行各种多表查询。
    vem
        61
    vem  
       4 天前
    Dify + 这个插件 https://marketplace.dify.ai/plugins/jaguarliuu/rookie_text2data
    实测 MySQL 在表不多的情况下,比我预想的要好
    iyaozhen
        62
    iyaozhen  
       4 天前
    可能没那么复杂

    在本地配置一个 deepseek 大模型,换成字节火山云上的满血版,可能就好了
    yufeng0681
        63
    yufeng0681  
       4 天前
    @frandy #59 我感觉应该是分析语义,识别用户真实意图,系统以前实现的数据查询场景都可以映射出来,通过语义来控制。 如果是新的查询场景,那就要一步步拆解,先分析出要用到哪几张表,表里的哪几个字段; 输出是要呈现哪几个字段。 然后再告知 AI ,输入和输出 [我想象,应该是 AI Agent 来拆分实现这个]
    macadurian
        64
    macadurian  
       4 天前
    能问一下你的服务器配置吗?部署的 deepseek 哪个版本的模型?
    Loocor
        65
    Loocor  
       4 天前
    斗胆分享一个我弄的试验库: https://github.com/loocor/db2llm
    视频介绍在: https://www.zhihu.com/zvideo/1883089086501352960
    kjstart
        66
    kjstart  
       4 天前
    @p1nk 没差, 但你写了 mcp 不就能用大模型分析回复了吗? 你自己查数不是还要自己估嘛, 那不 AI...
    XCFOX
        67
    XCFOX  
       3 天前
    分析一下我的思路:

    1. 将数据库以 GraphQL 的形式暴露 API ,使用 Hasura 或 Graphile
    2. 将 GraphQL 通过 MCP 连接到 AI ,使用 https://github.com/blurrah/mcp-graphql
    akira
        68
    akira  
       3 天前
    最近刚好在做 chat bi 的东西,其实如果你们之前 bi 构建了的话,
    不要直接用 生产库的数据 来出, 走 BI 的宽表 ,这个时候出来的效果就好很多啦
    horizon
        69
    horizon  
       3 天前
    不能,你需要 function calling
    提供 sql api ,让大模型填充参数
    elevioux
        70
    elevioux  
       3 天前
    不知道楼上说的 mcp 和 题主的需求有什么关系,mcp 本质不就是远程的 function call 吗?难道还要限定用户的话题范围? function call 没有覆盖的,一律不知道?

    最近公司老板也有相似需求,而且还要鉴别用户权限,限定可查数据。我的做法是根据用户 ID 手动创建固定的临时表,整理好所有可查数据。AI 只需要对接几个临时表就好,不用管数据库一大堆乱七八糟的表。

    效果是,生成 SQL 本身没问题,但 AI 还不能完全理解业务,差强人意,还要调教。
    chunshuxvgou
        71
    chunshuxvgou  
       3 天前
    你本地部署的是哪个模型? 32b? 70b ?
    111111111111
        72
    111111111111  
       3 天前   ❤️ 1
    怎么这么多人无脑 MCP ,MCP 只是个接口协议和数据库没啥关系呀

    我这边自己做的 demo 是:
    - rag (描述业务关系和数据关系)+
    - function calling (执行 sql )
    - 提示词工程(要求 LLM 按照既定步骤进行,比如先查表结构再生成 SQL ,认真检查和验证 SQL ,最后再执行 SQ 取数据回答问题)

    在表不多而且表关系不那么复杂的情况下,效果看起来还好,至少没有再出现生成的 SQL 执行不了,几乎不太需要代码级别干预,但是 LLM 在生成 SQL 过于聚焦你提出的“问题”,问题之外的事情考虑还是不完善,比如人的重名,数据的统计维度。所以还是需要每次的反馈,不断调整问题或者提示词。

    在这个 demo 中,我的感受是:其他人必须要通过我来使用效果才好,直接给他们用效果非常差
    因为我会把他们的的问题或者需求理解一遍后,再以 LLM 更容易理解正确的方式进行提问,
    这有点像专职司机,车是公司的,但是只有我最懂它,最能用好它,知道怎么对它进行保养维护
    areless
        73
    areless  
       3 天前 via Android
    text2sql 是有专门的比赛 排名的。现在只不过换了一种使用 llm 的方式去解决这个问题。实际上排名靠前的成功率也是不高的。
    lawrencelee
        74
    lawrencelee  
       3 天前
    @areless 话说这个比赛在哪里呀?
    kelvinji2009
        75
    kelvinji2009  
       3 天前
    @frandy 👍 相似理解和感受
    Hyxiao
        76
    Hyxiao  
       3 天前
    场景跟你差不多,但是我们数据是保存在 es 中的,最近将 es 升到了 8 ,支持了语义搜索,在 dify 设置外置知识库对接项目提供的接口,就可以做到问的问题都可以关联上 es 相关的内容
    areless
        77
    areless  
       3 天前 via Android
    @lawrencelee 在阿里在阿里,2019 年首届中文 nl2sql
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 20:53 · PVG 04:53 · LAX 13:53 · JFK 16:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.