PostgreSQL 驱动的NL-to-SQL系统:保留字处理、自修复循环失效、连接路径歧义及Schema链接噪声问题求助
PostgreSQL 驱动的NL-to-SQL系统:保留字处理、自修复循环失效、连接路径歧义及Schema链接噪声问题求助
我正在搭建一个自然语言转SQL的系统,核心能力如下:
- 可连接任意PostgreSQL数据库,通过
information_schema自动完成Schema自省 - 用NetworkX构建表关系图谱
- 借助sentence-transformers的嵌入模型,从自然语言查询中匹配关联表
- 结合语义相似度、关键词加权和覆盖度评分,对表连接路径进行打分
- 将最优路径传给Groq的Llama 3.3 70B模型生成SQL
- 内置自修复重试循环:如果SQL执行失败,会把错误返回给LLM修正后重试
技术栈: Python、PostgreSQL、NetworkX、sentence-transformers、Groq API、psycopg2,还计划加入FastAPI
当前遇到的问题:
问题1:保留字表名的处理方案
自动生成SQL时,遇到和SQL保留字同名的表该怎么处理?是应该重命名表,还是在给LLM的提示词里做特殊处理?
问题2:LLM自修复循环完全失效
我写了一个最多重试3次的循环逻辑:
for attempt in range(3): execute SQL if fails → send error to LLM → fix SQL → retry
但实际运行时,LLM连续3次返回的都是和之前一模一样的错误SQL,根本没做任何修正。想问问大家,用什么提示词工程技巧,能让LLM拿到错误信息后真的把SQL改对?
问题3:连接路径歧义与Schema链接噪声
连接路径歧义
同一个表之间存在多条合法的连接路径,但只有一条符合业务逻辑:
- patient → prescription → prescription_detail → drug ✅ 这是正确路径
- patient → controlled_drug_log → drug ✅ 语法合法但不符合当前查询的业务上下文
我目前用的路径评分规则是:
- 语义相似度(权重0.8)
- 路径长度(权重0.1)
- 外键可为空惩罚(权重0.1)
- 关键词匹配加分(每个匹配关键词加0.15)
- 关联表覆盖度加权(×0.8)
疑问1: 当正确路径依赖业务上下文时,怎么可靠地消除多条合法连接路径的歧义?
Schema链接噪声
系统现有23张表,用嵌入模型做表选择时,偶尔会选到无关表,干扰路径查找。目前用的是top_k=5加强制实体检测的方式。
疑问2: 针对20张表以上的NL-to-SQL系统,Schema链接有什么推荐的方案?
我已经尝试过的方法:
- 把完整Schema放进提示词:但23张表太多,LLM直接搞混了
- 基于图谱的路径查找,设置
cutoff=4:把路径数量从1437降到了6 - 仅用嵌入相似度:因为路径长度偏差,选到了错误路径
- 关键词加权:准确率提升明显
- 无关表惩罚:减少了路径查找的噪声
备注:内容来源于stack exchange,提问作者Joel Joy
相关产品推荐
相关产品推荐

