摘要:在当今数字化时代,企业中数据呈爆炸式增长,如何快速、准确地从海量数据中获取有价值的信息,成为了众多企业面临的关键问题。对于业务人员和数据分析师来说,每次查询数据都要编写复杂的 SQL 语句,不仅效率低下,还容易出错。这时,text-to-sql 技术应运而生,它允许用户通过自然语言提问,系统自动将其转换为 SQL 语句并执行,大大降低了数据查询的门槛,提高了工作效率。

text-to-sql 技术在数据分析、智能客服、数据可视化等领域都有着广泛的应用前景。例如,在企业的日常运营中,业务人员可以直接通过自然语言询问 “上个月各地区的销售额是多少”,而无需关心复杂的数据库表结构和 SQL 语法,就能快速获取所需数据。在智能客服场景中,当用户询问关于订单状态、产品信息等问题时,系统可以利用 text-to-sql 技术从数据库中查询相关信息并给出准确回答。

然而,传统的 text-to-sql 方案往往依赖大模型微调,这对于中小企业来说,不仅需要投入大量的时间和计算资源,还面临着数据隐私和安全等问题,应用成本极高。那么,有没有一种更简单、高效的方法来搭建 text-to-sql 系统呢?答案就是使用 RAGflow。接下来,就让我们一起探索如何在 2 个小时内使用 RAGflow 搭建一个 text-to-sql 的 AI 研发助手,开启自然语言与数据库交互的便捷之旅。

  • RAGflow 与 text-to-sql 的技术原理

  • 准备工作:搭建环境与收集数据

  • 实战环节:2 小时搭建 AI 研发助手

图片

01

RAGflow 与 text-to-sql 的技术原理

RAGflow 是什么

RAGflow 是一个基于深度文档理解的开源检索增强生成(RAG)引擎。它创新性地将预训练的大型语言模型(LLMs)与高效的检索技术相融合,为用户打造了一个强大的工具,用以处理各类复杂问题和场景。

RAGflow 具备诸多核心特点与优势,使其在众多 RAG 技术中脱颖而出。它采用多阶段处理方式,工作流涵盖多个精心设计的步骤,每个步骤都能依据前一步的结果进行动态调整。例如,在检索环节之后,模型能够智能判断是否需要补充更多信息,以确保回答的准确性和全面性。在处理 “查询某公司近一年各季度的销售利润情况” 这类复杂问题时,RAGflow 不仅会检索相关的销售数据文档,还会进一步检查是否有关于成本、价格调整等补充信息,以便更精准地计算利润。

智能任务分配也是 RAGflow 的一大亮点。它能根据查询的复杂性和类型,动态调用不同的检索器、模型或外部 API。当用户询问简单的事实性问题,如 “某产品的库存数量是多少” 时,RAGflow 会调用轻量级的检索器快速获取答案;而面对复杂的分析性问题,如 “分析某地区市场份额变化的原因”,它则会调动更强大的模型和相关的市场分析 API,整合多方信息给出全面深入的回答 。

此外,RAGflow 还拥有自动化反馈机制,系统能够在生成内容后对其进行质量检测。一旦发现不足,便会自动重复某些步骤,比如重新检索或调整生成参数。它具备并行处理能力,可以同时处理多个检索和生成任务,大大提高了效率,尤其适用于大规模企业应用场景,能够快速响应大量用户的查询请求。

text-to-sql 的实现原理

text-to-sql 的核心是将自然语言转换为 SQL 语句,这一过程涉及多个关键步骤。首先是自然语言理解,需要运用词法分析、句法分析和语义分析等多种自然语言处理(NLP)技术。词法分析将输入的文本分割成一个个单词或标记(token),并标注每个标记的词性。对于句子 “查询销售额大于 100 万的订单信息”,词法分析会把它分割为 “查询”“销售额”“大于”“100 万”“的”“订单”“信息” 等标记,并明确每个标记的词性。句法分析则是分析句子的语法结构,确定各个成分之间的关系,比如通过依存句法分析或成分句法分析构建出句子的语法树,帮助理解句子语义。语义分析是理解句子的实际含义,将自然语言表达的语义映射到数据库的概念和操作上,像识别出 “查询” 表示执行查询操作,“销售额大于 100 万” 表示筛选条件。

在理解自然语言文本的语义后,就要进行模式匹配与映射,即将自然语言中的语义与数据库的模式进行匹配。数据库模式包含表名、列名、数据类型等信息,系统需要依据自然语言文本中的关键词和语义,找到对应的数据库表和列。“订单信息” 可能对应数据库中的 “orders” 表,“销售额” 可能对应 “orders” 表中的 “sales_amount” 列。

最后一步是 SQL 生成,根据前面的分析和映射结果,结合 SQL 语言的语法规则和数据库的具体要求,生成对应的 SQL 语句。对于 “查询销售额大于 100 万的订单信息”,生成的 SQL 语句可能是 “SELECT * FROM orders WHERE sales_amount > 1000000;”。

然而,在实际应用中,数据库表的元数据往往非常庞大,直接将所有元数据提供给模型会导致输入过长,影响模型性能和生成 SQL 的准确性。这时,RAG 技术就发挥了重要作用。RAGflow 通过检索增强,从海量的数据库相关知识中找到与用户问题最相关的信息,而不是将所有元数据都提供给模型。它先将数据库的元数据、历史查询语句及对应的自然语言问题等信息进行向量化处理,存储到向量数据库中。当用户提出自然语言查询时,RAGflow 会在向量数据库中检索与问题相关的信息,将这些信息作为上下文提供给大语言模型,帮助模型生成更准确的 SQL 语句。如果用户询问 “查询上季度每个客户的购买总金额”,RAGflow 会从向量数据库中检索出与 “客户购买金额”“季度查询” 等相关的历史查询示例和数据库表结构信息,这些信息作为提示,引导大语言模型生成正确的 SQL 语句,如 “SELECT customer_id, SUM (purchase_amount) FROM orders WHERE quarter = ' 上季度 ' GROUP BY customer_id;” ,从而有效解决了数据库表元数据过多带来的问题,提高了 text-to-sql 的准确性和效率。

图片

02

准备工作:搭建环境与收集数据

环境搭建

在开始搭建 text-to-sql 的 AI 研发助手之前,我们需要确保系统环境满足一定的要求,以保证 RAGflow 能够稳定运行。硬件方面,建议使用 CPU 核心数≥4 核的处理器,这样能够在处理大量数据和复杂计算时提供足够的计算能力,避免出现卡顿现象。内存(RAM)需要≥16GB ,以存储运行过程中产生的各种数据和模型参数,确保系统运行流畅。磁盘空间要≥50GB ,用于存放 RAGflow 的代码、数据以及相关的依赖包等。

软件方面,Docker 版本需≥24.0.0,Docker 是一种容器化平台,能够将应用程序及其依赖项打包成一个可移植的容器,方便在不同环境中部署和运行。RAGflow 依赖 Docker 来创建和管理其运行环境。同时,Docker Compose 版本也要≥v2.26.1,Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具,它可以通过一个 YAML 文件来配置应用程序的服务、网络和卷等,使得 RAGflow 的部署更加简单和高效。

如果你的系统中尚未安装 Docker 和 Docker Compose,可以参考官方文档进行安装。安装完成后,我们就可以开始搭建 RAGflow 环境了。首先,打开终端,使用 git 命令克隆 RAGflow 仓库:

git clone https://github.com/infiniflow/ragflow.git

这一步会将 RAGflow 的源代码下载到本地指定目录。克隆完成后,进入 ragflow/docker 目录,利用提前编译好的 Docker 镜像启动服务器:

cd ragflow/docker

chmod +x ./entrypoint.sh

docker compose -f docker-compose-CN.yml up -d

其中,chmod +x ./entrypoint.sh 命令用于给 entrypoint.sh 脚本添加可执行权限,docker compose -f docker-compose-CN.yml up -d 命令会根据 docker-compose-CN.yml 文件的配置,启动 RAGflow 服务器,并在后台运行。在运行过程中,系统会自动下载 RAGflow 的开发版本 docker 镜像,这个镜像文件较大,可能需要一些时间,请耐心等待。

数据准备

搭建 text-to-sql 的 AI 研发助手,需要准备 3 类核心知识库数据,这些数据将为模型提供必要的信息,帮助其准确理解用户的自然语言查询,并生成正确的 SQL 语句。

第一类是 DDL(Data Definition Language)知识库,它主要提供数据库表结构信息,包括表名、列名、数据类型以及主键、外键等约束条件。例如,对于一个电商数据库,可能有如下的 DDL 语句定义用户信息表:

图片

通过这样的 DDL 语句,我们可以清晰地了解到用户表包含用户 ID、用户姓名、性别和年龄等字段。获取 DDL 知识库数据可以通过数据库管理工具导出数据库的表结构定义,或者直接从数据库的系统表中查询相关信息。

第二类是 DB Description 知识库,用于说明数据库中表和列的含义,这对于模型理解数据的语义非常重要。比如对于上述订单表中的字段,可以有如下的描述:

###用户信息表(medical_user)这个表描述了到医院就医的用户信息表,主要包含用户基本信息和医疗保险信息。详细的字段包含如下字段:

CARD_ID:ID号,表示用户的唯一性记录。

USER_NAME:用户姓名,表示就医的用户姓名

IDCARD_NUM:身份证号码。表示用户的身份证号码

SEX:表示用户的性别,性别主要是男或者女 ,1表示男,0 表示女

AGE:表示用户的年龄

ADDRESS:表示用户的地址信息,这里是用户的地址id信息,用于和客户地址表进行关联的信息

MARRY:是否结婚,1表示结婚,2表示未婚,3表示未知

PHONE_NUM:手机号码,表示用户的手机号码

INSURANCE_TYPE:表示用户的保险类型,1,表示,全额保险,2表示只有商业保险,3表示社会保险,0表示没有保险

第三类是 Q->SQL 知识库,它包含了大量的参考 SQL,即自然语言问题与对应的 SQL 语句示例。例如:

图片

这些语句主要是让大模型学习如何在有背景知识的情况下学会写SQL语句。这些叫做黄金语句,Golden statement,这些语句给的越多,大模型学习的越好,他能够回答的问题越有不会出错。正常情况下准备2000-5000个这样的SQL语句就可以了。

准备好这 3 类核心知识库数据后,我们就可以将其导入到 RAGflow 中,为后续搭建 text-to-sql 的 AI 研发助手做好充分准备。

图片

03

实战环节:2 小时搭建 AI 研发助手

配置知识库

准备好数据和环境后,我们就可以开始在 RAGflow 中配置知识库了。这一步是搭建 text-to-sql AI 研发助手的关键,知识库的质量直接影响到助手生成 SQL 语句的准确性。

首先,配置 DDL 知识库。在 RAGflow 界面中,点击 “知识库”,然后选择 “创建知识库”。在弹出的创建知识库页面,为知识库命名,比如 “统一元数据库” 。嵌入模型可以选择 RAGflow 自带的模型,分块方式选择 “General” ,点击 “保存” 完成基本设置。接下来,上传包含数据库表结构信息的 DDL 文件,文件格式可以是 txt 等文本格式。上传完成后,RAGflow 会自动解析文件,将其中的表结构信息提取出来,存储到向量数据库中,以便后续检索使用。

图片

接着,配置 DB Description 知识库。点击新建文件,我们将整理好的 DB Description 数据以 txt 文件形式上传到该知识库中,RAGflow 会对其进行解析,将这些语义信息转化为向量表示,与 DDL 知识库中的结构信息相互补充,帮助模型更好地理解数据库的语义。

最后,配置 Q->SQL 知识库。再次点击新建文件。由于 Q->SQL 知识库的数据一般是自然语言问题与对应 SQL 语句的示例对,通常整理成 Excel 表格形式更方便管理和查看。所以在创建这个知识库时,解析方式要选择 “Q&A” 。准备好包含大量自然语言问题和对应 SQL 语句的 Excel 文件(例如 “QA.xlsx” ),上传到该知识库。RAGflow 会按照 “Q&A” 的解析方式,将 Excel 中的每一对问题和答案进行解析,提取其中的关键信息并转化为向量存储起来,为模型生成 SQL 语句提供参考示例。

构建 TextToSQL 的 Agent

完成知识库的配置后,接下来就是构建 TextToSQL 的 Agent,它将负责接收用户的自然语言查询,并利用知识库中的信息生成相应的 SQL 语句。

在 RAGflow 界面中,找到 “Agent” 选项,点击 “Create agent”,然后选择 “Text To SQL” 。创建完成后,系统会默认生成一个 TextToSQL 的 Agent 模板。我们需要对这个模板进行一些配置,以使其能够正确地工作。

图片

然后,对各个组件进行详细配置。在 “DDL” 组件中,选择之前创建的统一元数据库知识库,这样 Agent 在生成 SQL 语句时,就可以从该知识库中获取数据库的表结构信息。在 “Q->SQL” 组件中,选择对应的统一元数据库知识库,以便 Agent 能够参考其中的自然语言问题与 SQL 语句示例对,提高生成 SQL 语句的准确性。“DB_Description” 组件则选择 统一元数据库知识库,为 Agent 提供数据库表和列的语义信息,帮助其更好地理解用户的问题。

对于 “GenSQL” 组件,它负责根据用户的自然语言问题和从知识库中检索到的信息,生成 SQL 语句。这里可以根据实际需求调整一些参数,比如生成 温度、Top P等。

图片

图片

经过以上步骤,我们就成功地在 RAGflow 中搭建了一个 text-to-sql 的 AI 研发助手。接下来,就可以使用这个助手进行自然语言到 SQL 的转换,快速查询数据库中的数据了。

效果展示与案例分析

问题1:用户信息表已婚且年龄小于等于40岁且购买了商业保险的用户总共有多少?

图片

回答:

嗯,我现在需要解决的问题是:用户信息表中已婚、年龄小于等于40岁并且购买了商业保险的用户总数是多少。让我仔细分析一下这个问题。

首先,我应该明确问题中的各个条件。已婚意味着MARRY字段的值是1。年龄小于等于40岁,所以AGE <= 40。此外,用户购买了商业保险,根据INSURANCE_TYPE字段,商业保险对应的是2。

接下来,我需要将这些条件组合起来写入SQL查询中。基本结构应该是SELECT COUNT(*) FROM medical_user WHERE 条件;其中条件部分包括MARRY=1、AGE<=40和INSURANCE_TYPE=2。

我需要确保每个条件都正确无误地写入SQL语句中。例如,Marry的值是1,所以写成MARRY = 1;年龄是小于等于40,所以AGE <= 40;保险类型是商业保险,对应的是2,所以INSURANCE_TYPE = 2。

然后,我应该检查是否有其他可能影响结果的因素。比如,是否存在同时满足这些条件的用户总数。如果这些条件正确无误地应用在WHERE子句中,那么查询结果应该是正确的。

最后,我需要确保SQL语句语法正确,没有拼写错误或者逻辑错误。例如,确保字段名拼写正确,运算符使用正确,并且WHERE子句的结构是正确的。

综上所述,我应该编写一个SELECT COUNT(*) FROM medical_user WHERE MARRY = 1 AND AGE <= 40 AND INSURANCE_TYPE = 2的SQL语句来解决这个问题。

 

SELECT COUNT(*) FROM medical_user WHERE MARRY = 1 AND AGE <= 40 AND INSURANCE_TYPE = 2;

问题2:用户信息表未婚的用户是哪些?

嗯,我现在需要解决的问题是:用户信息表中未婚的用户是哪些。首先,我得回顾一下之前的问题和答案,看看有没有什么线索。

之前的问题中,比如已婚用户的查询,使用的是MARRY = 1。而未婚的情况应该是MARRY = 2。所以,我应该在WHERE子句中使用MARRY = 2来筛选条件。

然后,我要确定表名是否正确。根据用户提供的文档,表名是medical_user,所以SELECT语句应该从这个表中选取记录。

接下来,我需要构造完整的SQL语句。基本结构应该是SELECT * FROM medical_user WHERE MARRY = 2;这样可以返回所有未婚用户的记录。

不过,我得确认一下MARRY字段的定义是否正确。文档中提到MARRY表示婚姻状况,1是已婚,2是未婚,3是未知。所以,使用MARRY = 2是正确的筛选条件。

最后,确保语法没有错误,比如表名和字段名是否正确无误,以及WHERE子句的位置是否正确。

SELECT * FROM medical_user WHERE MARRY = 2;

问题3:用户信息表已婚且年龄大于等于40岁且是男性购买了全额保险的用户是哪些?

嗯,我现在需要解决的问题是:从用户信息表中找出已婚、年龄大于等于40岁,并且是男性购买了全额保险的用户。让我仔细分析一下这个问题。

首先,我得明确需要用到哪些字段。根据问题描述,已婚用的是MARRY字段,值为1表示结婚;年龄大于等于40岁就是AGE >= 40。性别方面,男性对应的是SEX字段,值为1。购买了全额保险的话,INSURANCE_TYPE应该是1。

接下来,我需要把这些条件组合起来。SQL语句的基本结构是SELECT语句后面跟FROM关键字,然后是表名,接着是WHERE子句来限定条件。

所以,我会先写出基本的SELECT和FROM部分:SELECT * FROM medical_user。然后在WHERE子句中加入所有条件:

Marry = 1 表示已婚, Age >= 40 表示年龄大于等于40岁, Sex = 1 表示男性, Insurance_type = 1 表示购买了全额保险。

把这些条件用AND连接起来,确保每个条件都被满足。所以完整的WHERE子句就是:WHERE MARRY = 1 AND AGE >= 40 AND SEX = 1 AND INSURANCE_TYPE = 1。

最后,组合起来就是:

SELECT * FROM medical_user WHERE MARRY = 1 AND AGE >= 40 AND SEX = 1 AND INSURANCE_TYPE = 1;

这样,这个SQL语句应该能正确筛选出符合所有条件的用户。

 

SELECT * FROM medical_user WHERE MARRY = 1 AND AGE >= 40 AND SEX = 1 AND INSURANCE_TYPE = 1;

从测试的结果来来看,deepseek+ragflow 可以很好的完成sql语句的输出,但是前提条件是给它需要足够多的Golden statement,如果某个问题和
Golden statement差距太大,比如Golden statement中没有占比类型的语句,用户问它,它可能写出的语句是错误的,这个时候就需要人工矫正后,把正确的语句给它,后面它再写就可以写对了,所以这个ai研发助手还有一个重要的功能就是用户使用过程中产生好的句子,可以且用户验证是正确的,那么可以自动写入Golden statement中,这样,这个助手就会越用越好用了。

 

 

 如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。


👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。


1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐