MindSQL 是一个文本到 SQL 生成的 Python 包,开源、且支持 RAG,能帮助我们构建 Chat2SQL 的相关应用。
除了常规一些开源软件的特点:
-
开源 软件包及其不同的前端集成均免费供任何人使用。
-
隐私 它旨在让您控制公司的数据,无需外部监控。
-
掌控之中 您可以按照自己想要的任何方式构建它,并将所有业务数据连接并集成起来。
MindSQL 还解决了企业应用两大难点:准确率不高和不能支持高并发的问题:
高度准确
使用 MindsSQL 实现高精度取决于所提供的训练数据的质量,更多的训练数据可提高高精度。
高并发
MindSQL 的强大架构可自动扩展以每分钟处理数千个请求。
工作原理
MindSQL 是一个 Python 库,它使用 RAG(检索增强生成) 在大型语言模型的帮助下创建适合您的数据库的精确 SQL 查询。
MindSQL 遵循简单的两步程序来简化您的数据库交互:
-
首先,它将数据库的具体信息索引到向量存储中,从而创建适合您数据的 RAG“模型”。
-
随后,它会根据您的查询制定 SQL 查询,从而实现在数据库上的无缝执行。
为了充分利用 MindSQL 的功能,您主要需要与两个关键功能进行交互:
-
minds.index(...)
:此功能在初始步骤中起着关键作用,允许您将特定于数据库的详细信息索引到向量存储中。此信息可作为后续 SQL 查询生成的基础语料库。 -
minds.ask_db(...)
:此功能有助于直接与数据库通信。它允许您提出问题,并利用存储在向量存储中的上下文来构建 SQL 查询,以准确解决您的问题。
MindSQL 由三个基础组件组成,每个组件都继承并实现了 MindSQLCore 类提供的 API:
-
数据库:此组件专用于管理与数据库相关的功能。
-
向量存储:向量存储包专注于存储和组织索引数据库上下文,作为查询生成的重要参考语料库。
-
LLMs:LLMs 包负责将大型语言模型集成到 MindSQL 框架中,增强该库理解和生成上下文相关的 SQL 查询的能力。
安装使用
MindSQL的使用非常简单,首先安装 python 包:
pip install mindsql
然后环境变量设置,可以通过命令行或者 .env
文件来设置:
-
API_KEY: 用于使用 OpenAI、Gemini、LLAMA 等 LLM 进行身份验证的 API 密钥
-
DB_URL: 数据库的 URL 或连接字符串
-
EXAMPLE_PATH: 您可能想要用于批量索引的任何示例 JSON 文件或数据的路径
常见数据库 DB_URL 和格式如下:
-
mysql://username:password@host:port/database
-
postgresql://username:password@host:port/database
-
mongodb://username:password@host:port/database
程序很简单,先引入相关包:
from mindsql.core import MindSQLCore from mindsql.databases import Sqlite from mindsql.llms import GoogleGenAi from mindsql.vectorstores import ChromaDB
传入LLM配置,和向量数据库,指定数据库类型即可创建 MindSQLCore
实例。
# Choose the Vector Store. LLM and DB You Want to Work With And # Create MindSQLCore Instance With Configured Llm, Vectorstore, And Database minds = MindSQLCore( llm=GoogleGenAi(config={"api_key": "YOUR-API-KEY"}), vectorstore=ChromaDB(), database=Sqlite() )
使用数据库连接字符串连接数据库:
connection = minds.database.create_connection(url="YOUR_DATABASE_CONNECTION_URL")
把所有的数据结构都进行索引,存入向量数据库:
minds.index_all_ddls(connection=connection, db_name='NAME_OF_THE_DB')
从指定的示例路径批量索引问题(RAG知识库),如果没有示例问题也可以不执行此步骤:
minds.index(bulk=True, path="your-qsn-sql-example.json")
然后就可以向数据库提出问题了,
response = minds.ask_db( question="YOUR_QUESTION", connection=connection, visualize=True )
在Python中还可以从响应中提取并显示图表,
chart = response["chart"] chart.show()
最后别忘了关闭数据库连接:
connection.close()
完整的程序如下:
from mindsql.core import MindSQLCore from mindsql.databases import Sqlite from mindsql.llms import GoogleGenAi from mindsql.vectorstores import ChromaDB config = {"api_key": "YOUR-API-KEY"} minds = MindSQLCore( llm=GoogleGenAi(config=config), vectorstore=ChromaDB(), database=Sqlite() ) connection = minds.database.create_connection(url="YOUR_DATABASE_CONNECTION_URL") minds.index_all_ddls(connection=connection, db_name='NAME_OF_THE_DB') minds.index(bulk=True, path="your-qsn-sql-example.json") response = minds.ask_db( question="YOUR_QUESTION", connection=connection, visualize=True ) chart = response["chart"] chart.show() connection.close()
查询数据
ask_db(...)
方法作为查询系统和从底层数据中获取见解的主要接口,其结构如下:
result = ask_db( question = "员工的平均工资是多少", connection = my_connection, table_names = ["employees"], visualize = False )
table_names
参数是可选的, 可用于在需要时指定相关表。 如果提供了 table_names
, MindSQL 将不会从向量数据库中检索相关表, 而是使用提供的表名来获取相关DDL。
将 visualize
参数设置为 True, 用户可以请求使用 plotly 图表对查询结果进行可视化(除了做Demo,这个参数一般是关闭的)。
手动构建索引知识库
前面提到了使用示例文件来构建索引知识库,我们还可以在任意时候使用代码来构建。
构建索引有如下多种方式:
问答对
添加问题-SQL 对时,您可以直接指示系统如何解释特定的用户查询。 这是通过将问题与其对应的 SQL 查询关联起来来实现的, 从而使系统能够理解用户的意图并准确检索相关数据。
index( question = "平均工资是多少?" , sql = "SELECT AVG(工资) FROM 员工" )
添加 DDL 语句
添加数据定义语言 (DDL) 语句, 也就是定义数据库对象的结构,例如表、列和数据类型。 通过将 DDL 语句合并到系统的知识库中,您可以提供必要的架构信息, 从而增强系统有效解释和响应数据库相关查询的能力。
index(ddl="CREATE TABLE employees (id INT, name VARCHAR(50), salary FLOAT)")
添加文档字符串
添加文档字符串涉及提供对于系统理解其所运行的领域至关重要的特定上下文信息。 此文档可以包括有关业务逻辑、 行业特定术语或准确解释用户查询所需的任何其他相关信息的详细信息。
index(documentation="员工工资以美元($)计算")
批量数据添加
为了高效地集成来自外部源的多个问题 SQL 对,请使用带有 bulk=True 标志的索引方法并指定 JSON 文件 (data.json) 的路径。 这样可以快速提取数据并将其集成到系统的知识库中。
index(bulk=True, path="data.json")
JSON文件的数据结构:
[ { "Question": "员工的平均工资是多少?", "SQLQuery": "SELECT AVG(salary) FROM employees" }, ]
最后
测试下来在400多张表的情况下,简单查询基本都可以,但是在相近字段和相近表的选择上有时候会出错。
此时指定表的查询效果比较好,不过在实际使用中需要上层应用的支持,比如先用 AI 进行表选择。
但是实际生产中靠的还是私有训练数据,大多数实际客户的Chat2BI场景有限,这部分的准确率可以逼近 100%。
Github 的源码地址,大家感兴趣的话可以对其进行二开:
- https://github.com/Mindinventory/MindSQL/[1]
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。