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

Text2SQL(NL2SQL, 大模型问数据库)有什么成熟、准确率高的解决方案?

  •  
  •   NothingExist · 57 天前 · 1875 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://ex.noerr.eu.org/t/1124121?p=1#reply78

    领导让我针对公司的某个数据库做一个 AI 问数平台,给上级领导和业务人员使用,开始上手之后,我发现这个事情第一部简单,但要保证输出的 SQL 与预想中的一样极难,对输出的内容也非常不自信。

    #问题: 核心问题:数据不涉及多表查询,但是数据的维度很大,有六个维度,这六个维度唯一确定一条记录,指标也有 14 个之多。

    当维度比较少的时候,比如一个时间维度+两个其他维度,这个时候输出的内容勉强可以接受,但是当维度进一步放大,比如一个时间维度+三个其他维度(比如产品类型、渠道类型、销售地区),此时,输出的 SQL 就很容易遗漏某个维度。

    其他问题:不了解用户会问什么问题,我调制的 prompt 只对我设想的问题工作,但其他人随便想一个问题,这些 prompt 就不起作用了;或者一些小词换一个问法,就出不了结果。

    #尝试过的技术方案:

    1. DIFY Workflow 2.SuperSonic (目前在用)

    #目前想到的解决方案: 1.精简数据表,把原来的六七个维度,精简到一个三个(一个时间维度+两个其他维度) 2.进一步寻找解决方案

    第 1 条附言  ·  53 天前
    我看很多朋友都说很简单,实际上是有六个维度,这六个维度唯一确定一条记录,每条记录又有 10 个指标,但是别人提问题的时候不会把这个六个维度全部提供给 AI ,所以还需要进行多轮问询,远远不是一个简单的 prompt 可以解决的。

    之前做过一个 DIFY 的方案,实际生成出来的 SQL 问题很多。
    23 条回复    2025-07-13 21:49:48 +08:00
    yb2313
        1
    yb2313  
       57 天前
    看来这是每个领导都会幻想的东西
    shyrock2026
        2
    shyrock2026  
       57 天前
    啥?单表查询应该很简单吧? DDL 都可以用 prompt 写清楚。

    我的困难是多表查询,因为 DDL 太大塞不进 prompt ,我没找到办法让 llm 搞清楚有哪些表和字段。。。
    krixaar
        3
    krixaar  
       57 天前
    我是直接给挡回去了,公司的数据库不允许外网使用,表结构算商业秘密,LLM 必须本地部署,然后参数少的又太傻,得上参数多的,就得加钱上设备,算起来不如直接让人导数据做报表。
    Suger828
        4
    Suger828  
       57 天前
    你这种很简单啊, 那种 先查 a 表的内容然后用 a 表内容查 b 表内容 各自分组的 才复杂
    yshan
        5
    yshan  
       57 天前
    直接做个 bi 报表不更简单吗
    xiaohuokevin
        6
    xiaohuokevin  
       57 天前
    可以试试不直接输出 sql, 而是在 prompt 里面告诉模型有哪些维度(每个维度给些示例维度值),指标,让模型输出结构化的数据比如 json, 根据用户的 query 让模型返回查询的维度,指标,时间范围,排序规则,筛选条件(维度:维度值)。 自己再根据这个 json 组装 sql
    sinnosong1
        7
    sinnosong1  
       57 天前
    看看 Prompt Engineering guide 呢,github 上的项目
    xjh1024
        8
    xjh1024  
       57 天前
    如果领导不在乎 生成 sql 的话,应该用接口 mcp 来实现
    接口里更好描述各个参数,描述可以怎样搭配查出来什么样的数据,然后在接口里去写好各类查询条件的排布
    多种格式的话,也可以是多个方法,让 ai 自动甄别使用哪个接口用哪些参数
    比直接丢个数据库 会 减少很多错误,就是需要人提前想好一些预设了,麻烦点,但是能满足领导的想象
    realJamespond
        9
    realJamespond  
       57 天前
    试试微调模型
    030
        10
    030  
       57 天前
    固定的表格结构,还是单表,算是非常简单的落地场景了
    sssjjjjj
        11
    sssjjjjj  
       56 天前
    @shyrock2026 表太宽还是表太多?可以试着把问题+所有的表名/comment 喂给 AI 先筛选几张表,然后在把 DDL+sample data 一起喂过去,我试过这么弄效果不错
    shm7
        12
    shm7  
       56 天前
    不涉及多表查询,就是单表啊,6 个 column ?
    1. 每种定义好范围和类型,让 LLM 分别分段提取每个 column 取值或范围
    2. 然后拼接 where 语句
    3. 最后再让 LLM 做 sql 检查

    感觉不会太难呐,甚至有一个 prompt 就完成的可能性。
    silyboy
        13
    silyboy  
       56 天前
    用 Vanna-ai 实现了一个, 查询很慢. 除非命中缓存. 然后只能查询简单语句. 最后还是放弃 Text2SQL, 把现有一些 api 包装为 mcp, 这样 ai 工具就能用了. 速度也有了很大的提升.
    snow0
        14
    snow0  
       56 天前
    换个推理模型试试,准确率应该能提高但是会变慢
    jones2000
        15
    jones2000  
       56 天前
    直接把整个库的内容都给本地 ai 读一遍, 然后直接问 ai 你要的内容, 这样 sql 也不用写了。
    NothingExist
        16
    NothingExist  
    OP
       53 天前
    @jones2000 数据量太大
    NothingExist
        17
    NothingExist  
    OP
       53 天前
    @silyboy 感谢提供思路,请问把什么 API 包装为 MCP 呢,有什么 API 能够实现 AI 问数这个需求吗
    NothingExist
        18
    NothingExist  
    OP
       53 天前
    @shm7 这是一个很好的思路,谢谢
    NothingExist
        19
    NothingExist  
    OP
       53 天前
    @shm7 但是涉及一个难点,用户不可能完整提供整个六个 column ,有时候只是简单地给一两个信息,而且还不能与数据库的数据对应,这种情况下我要求用户进行补全维度,涉及到多次问询,还没有找到很好的方案。
    NothingExist
        20
    NothingExist  
    OP
       53 天前
    @xiaohuokevin 好的 谢谢你提供的思路
    NothingExist
        21
    NothingExist  
    OP
       53 天前
    @yshan 也是个好主意 有什么好的工具推荐吗
    NothingExist
        22
    NothingExist  
    OP
       53 天前
    @sssjjjjj 表太宽,导致输出的时候 经常会遗漏信息
    silyboy
        23
    silyboy  
       46 天前
    @NothingExist 我用的 fastmcp, 把公司已有的金融数据 api 接口的 openapi 文档,转为 mcp 工具. 这样问 ai 股票信息, 就可以获取最新的数据.
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2754 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:51 · PVG 18:51 · LAX 03:51 · JFK 06:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.