狂自私

导航

搭建一个text to SQL的AI智能体

备注

本来我最开始想的是借助RAG知识库来搞这个,但是我发现,向量模型的匹配真的是难顶.几乎不可用.也应该是我经验不足\材料没有准备好,最后无奈,我直接通过dify的流程来实现 text2SQL.

环境准备

dify:参考官方部署就行

模型运行框架:llama.cpp

Embedding模型\Reranker模型:我使用的是qwen全家桶,在gguf上面下载就行,但是需要注意Reranker模型,有一个是有问题的,它不会给评分,建议从这里下载:https://huggingface.co/Voodisss/Qwen3-Reranker-8B-GGUF-llama_cpp

LLM模型:qwen3.6 35B 64K上下文.

最后就是关于数据库表和业务的说明准备了.

数据库表和业务的说明

这个是很重要的.这个不做好,效果很差劲.

首先,text2sql,要根据业务来,不能说把整个数据库表都纳入进去,一来检索效果不好,二来噪音也很大,三来上下文会撑爆.

我是根据业务,把相关的表说明\字段说明\字段连表信息各自写成一个json文件:

image

 

{
    "field_key": "r_device_monitor.tower_id",
    "field_name": "tower_id",
    "table_name": "r_device_monitor",
    "table_comment": "物理装置表(伪),一对多的关系,仅使用此表无法正确完成统计",
    "field_comment": "被监测对象id",
    "data_type": "VARCHAR",
    "is_unique": false,
    "value_comment": [],
    "connection": [{
        "target_table": "r_device_tower",
        "target_field": "obj_code",
        "additional_conditions": null
    }]
},
{
    "field_key": "r_device_monitor.line_device_type",
    "field_name": "line_device_type",
    "table_name": "r_device_monitor",
    "table_comment": "物理装置表(伪),一对多的关系,仅使用此表无法正确完成统计",
    "field_comment": "被监测对象的台账类型",
    "data_type": "VARCHAR",
    "is_unique": false,
    "value_comment": {"0301":"主变压器","0303":"所用变","0305":"断路器","0306":"隔离开关","0311":"母线","0312":"电抗器","0313":"电流互感器","0314":"电压互感器","0316":"电力电容器","0318":"避雷器","0321":"组合电器","0322":"开关柜","0328":"套管","101":"自动功率曲线系统","102":"交流场监控主机","103":"杆塔","105":"极阀控制系统","106":"极端阀组水冷控制主机系统","107":"极端阀组外水冷控制单元","108":"站用电控制主机","2":"保护装置系统","201":"极极保护系统","3":"直流控制保护系统","305":"蓄电池","309":"换流变压器","341":"控制箱","346":"气室","601":"电缆头","602":"智能井盖","603":"接地箱","604":"接地线","701":"气象站","901":"其它"},
    "connection": [{
        "target_table": "c_dictionary",
        "target_field": "dic_code",
        "additional_conditions": "c_dictionary.dict_flag='tzlx'"
    }]
},

这样,写表的每一个重要字段,如果表的列数小,可以写全,如果是个大宽表,那么就写和业务最相关的字段信息就行.

然后还有业务约束和查询示例;

业务约束就是指,业务上常用的黑话\俗语\条件等,比如:

业务上的装置台账指的是逻辑装置表和物理装置表连表之后的结果,从不单独指物理装置表或者逻辑装置表

装置台账是由r_device_monitor表和r_device_monitor_point表共同组成的,绝非单个表可以支撑.
没有明确说明所需要的装置投运状态时,就只统计在运状态的装置:

配网:指电压等级在35kv及以下的站线
主网:指电压等级大于35kV的站线
输电:指监测类型以01开头的装置
变电:指监测类型以02开头的但是不以027开头的装置
直流:指监测类型以027开头的装置

但是变电在我们业务查询上一般是模糊的,查询变电的含义往往是同时包含变电\直流

查询xx地市时候,没有明确说是运维地市还是资产地市时,一般都是指运维地市.

 然后就是查询示例,这个好理解嘛.

搭建流程

image

 

image

 有些臃肿了,但是能用:

image

image

流程细节

image

image

 

posted on 2026-06-08 16:48  狂自私  阅读(12)  评论(0)    收藏  举报