简介
项目地址:milvus-use: milvus-use教程 python
需求描述
参考vanna项目,获取数据库元数据和问题sql对,存入Milvus向量数据库,之后进行检索,返回相似的数据库表和问题对。本项目采用的嵌入模型为m3e-large。该该项目milvus版本较新,与vanna项目版本不同,大量api不兼容
功能介绍
DatabaseManager类对数据库连接持久化,具体的连接信息如host、用户名密码等在.env文件中。现支持mysql,milvus数据库连接;
MilvusVectorStore类封装对milvus数据库操作方法,如创建数据库元数据和问题sql对的collection(类似于mysql中的表),添加数据库元数据和问题对,和基于问题查询collections中最相似的数据。
另通过init_collections、delete_collections、add_db_metadata、add_qa_pairs、api_search文件对collections进行初始化、删除、添加数据库元数据、添加问题对、对输入的问题查询数据库
milvus介绍
milvus intro
一款专为向量数据设计的数据库,主要用于高效存储和检索大规模向量数据
FieldSchema
定义了字段的类型和属性,类似于 MySQL 中的列定义。Milvus 支持多种数据类型,包括标量(如 INT64
、VARCHAR
)和向量(如 FLOAT_VECTOR
)
CollectionSchema
是字段的集合,类似于 MySQL 中的表结构。它由多个 FieldSchema
组成,并包含集合的描述信息
Collection
是 Milvus 中存储数据的逻辑单元,类似于 MySQL 中的表。它基于 CollectionSchema
创建,并用于插入、查询和管理数据
create_index
用于为字段创建索引,以加速查询。Milvus 支持多种索引类型,如 IVF_FLAT
、HNSW
等,每种索引类型都有其适用场景
项目实施
.env文件配置数据库连接信息
# Milvus 连接参数
MILVUS_HOST=
MILVUS_PORT=19530
MILVUS_USER=root
MILVUS_PASSWORD=
# MySQL 连接参数
MYSQL_HOST=
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=
MYSQL_DB_NAME=
DatabaseManager
对外提供数据库连接关闭功能
从环境变量中获取连接信息,定义连接milvs,mysql的方法及返回实例,关闭连接
MilvusVectorStore
初始化
对外提供milvus的集合初始化,添加、删除操作
m3e嵌入模型从本地导入,连接milvus,指定嵌入模型和向量维度,m3e是1024
创建集合和索引
创建集合,通过FieldSchema指定字段信息,除最后一个vector存的向量信息,其余类似mysql表字段,存储字段名称、类型、是否主键等,vector要指定向量的维度。CollectionSchema定义集合中的字段、索引、分区、描述信息等,该项目只定义了字段和描述信息;Collection使用CollectionSchema定义的字段信息schema初始化集合,类似创建了一个表,多了一个字段汇总步骤CollectionSchema。
创建索引,通过上步创建集合的create_index方法创建,索引的配置参数有索引类型、度量类型和聚类中心数量,本项目统一分别采用IVF_FLAT基于倒排文件(Inverted File)的索引结构,I2欧几里得距离,128聚类中心。IVF(Inverted File,倒排文件),FLAT(平面索引/线性索引)
添加和查询数据
添加数据,以添加问题sql对为例
通过Collection("name")找到对应集合,将问题sql对分别转成问题列表和sql列表,通过self.embedding_function.encode(questions).tolist()将问题列表转换成向量。将问题列表、sql列表,转换后的向量组成类表,通过collection.insert方法插入数据库中。flush将数据刷新到磁盘。
查询数据,以查询问题sql对为例
将问题转成向量,设置搜索参数为l2距离度量,10探针数量;加载对应集合,通过collection.search方法进行搜索并返回结果,传入的参数有待搜索的向量数据即问题的向量表示,要搜索的向量字段名称,前一步配置的搜索参数、返回结果数量和返回结果需要输出的字段。对返回的结果进行遍历,构造对应的键值映射。返回类似json的实体对象数组映射
外部文件调用MilvusVectorStore中的方法
通过init_collections、delete_collections、add_db_metadata、add_qa_pairs、api_search文件对collections进行初始化、删除、添加数据库元数据、添加问题对、对输入的问题查询数据库
add_db_metadata需要先连接mysql数据库,获取元数据,通过cursor.execute("SHOW TABLES"):执行查询语句,cursor.fetchall():获取查询结果的所有行,返回一个表名列表tables,再遍历每个表名,执行cursor.execute(f"SHOW CREATE TABLE {table}")获取建表语句,拼接并返回元数据列表