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

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

  •  2
     
  •   p1nk · 16 天前 · 5979 次点击

    背景

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

    问题

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

    尝试

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

    疑惑

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

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

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

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

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

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

    @sunny352787 #10

    @hmxxmh #11

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


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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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