• 请不要在回答技术问题时复制粘贴 AI 生成的内容
NothingExist
V2EX  ›  程序员

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

  •  
  •   NothingExist · Jul 3, 2025 · 3950 views
    This topic created in 489 days ago, the information mentioned may be changed or developed.

    https://v2ex.com/t/1124121?p=1#reply78

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

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

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

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

    #尝试过的技术方案:

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

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

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

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

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

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