详解基于 RAG 的 txt2sql 全过程

前文

本文使用通义千问大模型和 ChromaDB 向量数据库来实现一个完整的 text2sql 的项目,并基于实际的业务进行效果的展示。

准备

在进行项目之前需要准备下面主要的内容:

  • python 环境
  • 通义千问 qwen-max 模型的 api-key
  • ChromaDB 向量数据库
  • acge_text_embedding 嵌入模型

RAG

首先在进行主要内容之前要先回顾一下基础知识,市面上 的 text2sql 项目的基本框架就是下图中展示的 RAG 框架图,也就是常说的检索增强生成技术。结合我们的 text2sql 业务数据,我们按照图中的 1 + 3 个步骤分别介绍。“1” 指的是要进行 RAG 的预先准备工作,“3” 是 RAG 的三个步骤。

  1. 使用我们准备好的 acge_text_embedding 嵌入模型 将相关的数据库表结构信息字段使用方法、供大模型参考的question-sql 对等信息都进行向量化,然后将向量存入ChromaDB 向量数据库
  2. 用户提出针对数据库的问题 query ,然后通过同样的 acge_text_embedding 嵌入模型query 转化成向量,通过相关性计算算法,从ChromaDB 向量数据库中召回和 query 最相关的文本作为上下文 context ,这里的 context 理想状态下肯定是和问题相关的表结构、字段信息,或者相似的 question-sql 对 ,这些信息会在后面输入进 LLM 中,供 LLM 理解。
  3. 将用户的 querycontext 拼接成一个完整的 prompt ,此时的 prompt 中既有供 LLM 参考的问题相关的可用信息,又有用户的问题 。
  4. promptLLM ,让其输出合理的结果,我们这里的结果其实就是预先想要得到的 sql

所以到现在我们应该能体会出来,RAG 的框架最核心的只有两个部分:

  1. 第一就是能从向量数据库中召回最相关的上下文供 LLM 理解问题相关的上下文:
  2. 第二就是大模型的理解能力,是否能在给出充足上下的情况下将问题解决。

在这里插入图片描述

RAG 疑问

有的人可能会说为什么不跳过第一步,把数据库所有的信息都输入给大模型,理论上也是可以的。但是具体实施会有困难,原因如下:

  1. 目前大模型输入 token 都有明确的限制,比如 qwen-max 模型只有 8K (尽管这些限制在逐渐消失,现在很多大模型的输入 token 都已经过百万 token 了)。
  2. 另外就是考虑到成本,发送大量 token 是非常昂贵的操作,如果模型理解能力有限,更是毫无意义。
  3. 最后就是从实际的研究,仅发送少量的但是质量较高的相关信息给大模型更有助于生成好的答案。

详细过程

数据准备

ddl.txt:这里面存放的都是业务范围内容的表结构。如下:

sql
复制代码
CREATE TABLE ai_prj_plan ( duty_party character varying(255) , pipeline_type character varying(255) , ... );
CREATE TABLE dtqjln (  xmbh character varying(100), jgsj integer, ...}

documentations.txt : 这里存放的是每个字段的详细说明或者注意事项。如下:

bash
复制代码
ai_prj_plan 表中的字段 id 表示工程计划的主键 id 。
ai_prj_plan 表中的字段 create_time 表示工程计划的创建时间。
...
dtqjln 表中的字段 jsdw 表示地铁线路或者地铁区间的建设单位名称。
dtqjln 表中的字段 sjdw 表示地铁线路或者地铁区间的设计单位名称。

question-sql.txt : 这里存放的是一些代表性的业务可能涉及到的问题-sql 对样本,如下:

sql
复制代码
已经投运的管线工程计划总长###select SUM(length::numeric) from ai_prj_plan where current_progress=5 and plan_type in (1,2,3)
查10条计划单独施工的工程名字###select project_name as "ai_prj_plan.project_name"  from ai_prj_plan where plan_type=1 limit 10
...

导入向量数据库

这里的三个文件,每一行都作为一个 doc ,然后将每一行使用预先准备的 acge_text_embedding 嵌入模型 转化成 1024 向量,也就是三个文件一共有多少行,就会有多少个 1024 的向量,然后都存入ChromaDB 向量数据库

用户提问

用户提问“2023年入廊管线中前期项目的计划有多少”,会使用预先准备的 acge_text_embedding 嵌入模型,将问题转化为一个 1024 向量,将其与ChromaDB 向量数据库 中的所有 1024 向量进行相似性召回,分别从三个文件中找出最相关的内容,至于召回策略可以自己定义。根据我的自定义召回策略,然后将召回的内容和问题进行拼接组成下面的完整的 prompt ,从完整的 prompt 我们可以看到召回了将要使用的表结构 ai_prj_plan 以及相关字段 plan_type 、annual_aim_json 、plan_category 的使用说明,最后找出了两个可能对模型有用的 question-sql 对供模型参考。所以下面的内容是提供了足够完成用户提问的相关信息,最终模型也给我们生成了符合要求的 SQL ,说明我们的整体项目实现了既定的目标。

python
复制代码
[{'role': 'system', 'content': '您是一名精通 SQL 的专家,用户会提出业务相关的问题,请根据相关信息回答合适的 SQL ,您将仅使用 SQL 代码进行回答,不进行任何解释。您可以使用以下展示出的表结构作为参考:\n\nCREATE TABLE ai_prj_plan\n(\n    id character varying(64)  NOT NULL,\n    create_time timestamp(6) without time zone,\n    update_time timestamp(6) without time zone,\n    remark character varying(255) ,\n    plan_type integer,\n    duty_party character varying(255) ,\n    pipeline_type character varying(255) ,\n    project_name character varying(255) ,\n    dlmc character varying(255) ,\n    start_end_point character varying(255) ,\n    ssqx character varying(100) ,\n    total_invest real,\n    length real,\n    plan_code character varying(255) ,\n    plan_category integer,\n    version integer,\n    accept integer,\n    verify_status integer,\n    refuse_reason character varying(255) ,\n    geom geometry(Geometry,4326), -- 几何使用 4326 坐标系\n    years character varying(255) ,\n    current_progress integer,\n    annual_aim_json text ,\n)\n\n您可以使用以下展示出的 documentation 作为参考,每个 documentation 解释了每个表的字段的名字和用法,使用他们以指导您有效准确地回答用户的问题,请务必遵循每个字段的使用方法和注意事项:\n\nai_prj_plan 表中的字段 plan_type 表示工程计划中涵盖的工程类型,我们规定只能枚举整数 1 、 2 、 3 、 4 、 5 ,整数 1 表示单独施工管线计划,整数 2 表示随道路施工管线工程计划,整数 3 表示入廊管线工程计划,整数 4 表示管廊工程计划,整数 5 表示互联互通工程计划,其中将整数 1 、 2 、 3 代表的三种工程计划合并起来统称为“管线工程计划”或者"管线计划"。\n\nai_prj_plan 表中的字段 plan_category 表示工程计划的计划分类,我们规定只能枚举整数 1 和 2 ,整数 1 表示工程计划在计划内,整数 2 表示工程计划在计划外。\n\nai_prj_plan 表中的字段 annual_aim_json 表示工程计划的每年详细计划列表,虽然该字段是字符串内容,但是存储格式是 json 列表。每个 json 中有三个字段 year、planProgress、 planInvest,表示打算计划在某年(year)给该项目一定的投资(planInvest),要将该项目推进到计划的进度(planProgress)。}, {'role': 'user', 'content': '2024年入廊管线中前期项目的计划有多少'}, {'role': 'assistant', 'content': "SELECT COUNT(*) FROM ai_prj_plan, jsonb_array_elements(annual_aim_json::jsonb) AS aim  WHERE (aim->>'planProgress')::integer = 1 AND plan_category = 1 AND plan_type = 3 AND (aim->>'year')::integer = 2024;"}, {'role': 'user', 'content': '2024年入廊管线中已完成的前期项目有多少'}, {'role': 'assistant', 'content': "SELECT COUNT(1) AS cnt FROM ai_prj_plan, jsonb_array_elements(annual_aim_json::jsonb) AS aim WHERE (aim->>'year')::int = 2024  and (aim->>'planProgress')::int <= current_progress and (aim->>'planProgress') is not null  and plan_type  = 3 and current_progress = 1    and plan_category = 1"}, {'role': 'user', 'content': '2023年入廊管线中前期项目的计划有多少'}]

大模型结果输出:

sql
复制代码
Sql:SELECT COUNT(*) FROM ai_prj_plan, jsonb_array_elements(annual_aim_json::jsonb) AS aim  WHERE (aim->>'planProgress')::integer = 1 AND plan_category = 1 AND plan_type = 3 AND (aim->>'year')::integer = 2023;

完结撒花,希望上面的内容能给大家解释清楚相关的技术原理和细节。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-笔记 uboot修改设备树

1. FDT介绍 扁平设备树&#xff08;Flattened Device Tree&#xff0c;FDT&#xff09;&#xff0c;也叫平坦设备树&#xff0c;是设备树的一种二进制表示形式&#xff0c;提高了在嵌入式系统中的传输和解析效率&#xff1b; 2. 在U-Boot中使用FDT 2.1. 进入U-Boot 开发板上…

OpenCV 入门(四)—— 车牌号识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

【论文阅读】VMamba: Visual State Space Model

VMamba:视觉状态空间模型 code&#xff1a;https://github.com/MzeroMiko/VMamba Background ​ CNN拥有线性复杂度因而可以处理高分辨率的图像&#xff0c;而ViT在拟合能力方面超过了CNN&#xff0c;但ViT是二次复杂度&#xff0c;在处理高分辨率图像时计算开销较大。ViT通过…

Wappalyzer指纹识别下载安装使用教程,图文教程(超详细)

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…

钉钉开放平台创建企业内部H5微应用或者小程序

前言&#xff1a; 在当今企业数字化转型的浪潮中&#xff0c;创建企业内部H5微应用或小程序已成为提升工作效率和促进内部沟通的重要举措。发话不多说本文将介绍如何利用钉钉平台快速创建这些应用&#xff0c;让企业内部的工作更加便捷高效。 步骤 1.在浏览器打开链接…

【解决】Android APK文件安装时 已包含数字签名相同APP问题

引言 在开发Android程序过程中&#xff0c;编译好的APK文件&#xff0c;安装至Android手机时&#xff0c;有时会报 包含数字签名相同的APP 然后无法安装的问题&#xff0c;这可能是之前安装过同签名的APP&#xff0c;但是如果不知道哪个是&#xff0c;无法有效卸载&#xff0c;…

ESD静电问题 | 更换接口芯片

【转发微信公众号&#xff1a;EMC容冠电磁】

VMare Workstation安装ubuntu虚拟机异常问题处理

安装方法 ubuntu官网下载插件 异常处理 开启时报错"unable to proceed without a log file" 遇到此问题的都有一个共同点&#xff0c;工作目录路径上都带了数字&#xff0c;比如"Ubuntu 64位 01"&#xff0c;解决方法为&#xff1a; 选中"Ubuntu 64位…

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…

C++ 继承篇

面向对象语言的三大特性&#xff1a;封装&#xff0c;继承和多态 根据目前学到的知识&#xff0c;对于封装的理解&#xff0c;大致有两层&#xff1a; 将数据和方法封装&#xff0c;不想让外面看到用private/protected修饰&#xff0c;想让外面看到用public修饰类型的行为不满…

[嵌入式系统-71]:RT-Thread-组件:日志管理系统ulog,让运行过程可追溯

目录 ulog 日志 1. ulog 简介 ulog 架构 配置选项 日志级别 日志标签 2. 日志初始化 初始化 去初始化 3. 日志输出 API 4. 日志使用示例 使用示例 在中断 ISR 中使用 同步模式&#xff08;Synchronous Mode&#xff09; 异步模式&#xff08;Asynchronous Mode&…

蓝桥杯EDA客观题

目录 前言 一、PCB类知识点和题目分析 1.电阻 2.电容 3.封装类 4.单位转换类 5.电路板结构类 6.PCB绘制规则 7.立创软件 8.PCB硬件 线性电源和开关电源 二、数电知识点和题目分析 1.门电路 2.逻辑代数 3.组合逻辑电路 4.触发器 5.时序逻辑电路 6.其他 三、模…

vue3+ts之el-tooltip换行显示内容

<el-tooltip placement"top-end"><div slot"content" class"tips"><el-button type"primary" click"exportData">导出</el-button></div><template #content><span class"cont…

【项目实战】使用Yolov8 + tesseract 实现身份证信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于实验,毕业设计参考等。整体效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录 一 数据集制作

C语言--带环链表问题

继续学习 一、判断链表是否带环 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用快慢指针&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;当慢指针走一半快指针进到环里 当慢指针进环&#xff0c;快指针已经在环中转了一会儿了 | |…

关于Java selenium使用前浏览器驱动的下载和环境变量的配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vue+ant-design+formBuiler表单构建器——技能提升——form design——亲测有效

最近看到后端同事在弄一个后台管理系统&#xff0c;额&#xff0c;前端真的是夹缝中生存啊&#xff0c;AI抢饭碗&#xff0c;后端也想干前端的活儿。。。 他用到了表单构建器&#xff0c;具体效果如下: 网上有很多适用于ElementUi和ant-design的form design插件&#xff0c;下…

武汉星起航:精准市场定位引领跨境电商新潮流,创造辉煌业绩

在跨境电商领域&#xff0c;市场定位的准确性直接关系到企业的成败。武汉星起航电子商务有限公司&#xff0c;凭借其自运营团队的深厚经验和精准洞察力&#xff0c;成功在亚马逊平台开设多家自营店铺&#xff0c;并取得了显著成绩。这一成绩的取得&#xff0c;离不开公司对市场…

设计模式——行为型模式——策略模式(含实际业务使用示例、可拷贝直接运行)

目录 策略模式 定义 组成和UML图 代码示例 实际业务场景下策略模式的使用 策略模式优缺点 使用场景 JDK中使用策略模式示例 参考文档 策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化…