主页 > 开源代码  > 

RAG组件:向量数据库(Milvus)

RAG组件:向量数据库(Milvus)

       在当前大模型盛行的时代,大模型的垂类微调、优化成为产业落地、行业应用的关键;RAG技术应运而生,主要解决大模型对专业知识、实效性知识欠缺的问题;

       RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保存为一个知识库,在用到该部分知识的时候,可以通过检索关键信息,将知识库內对应知识片段进行返回,再整合为一个结构化的prompt(提示词)输入给大模型,这样以来,大模型就可以结合这些知识片段和具体问题,整理汇总出客户想要的答案;

       那在对这些知识进行保存和检索的过程中,就需要数据库技术的支持,而在众多类型的数据库中,有一类向量数据库,对图片等非结构化类型数据的保存和检索起到关键性作用;常用的向量数据库主要有Milvus、Faiss、Chroma等,今天就简单介绍一下Milvus向量数据库的应用;

一、介绍

       Milvus 是一款开源的向量数据库,其高性能、分布式、专为 AI 和机器学习设计的向量数据库,广泛应用于推荐系统、图像检索、自然语言处理等领域;它支持多种数据类型(如图片、文本、音频等)的嵌入式表示,并提供快速的相似性搜索能力;

1.1 核心功能: 向量相似性搜索: 支持基于距离度量(如欧几里得距离、余弦相似度等)的高效查询。大规模数据处理: 能够轻松处理数十亿甚至上百亿的向量数据。分布式架构: 支持水平扩展,满足高性能和高并发需求。多模态数据支持: 可以处理图像、文本、音频等多种非结构化数据。插件式集成: 提供与主流大数据生态系统的无缝集成,例如 Kafka、Spark 和 Elasticsearch。 1.2 技术特点: 索引优化: 内置多种高效的向量索引算法(如 IVF、HNSW 等),提升查询性能。GPU 加速: 利用 GPU 的计算能力加速向量搜索。实时写入与查询: 支持低延迟的数据写入和查询操作。跨平台支持: 兼容多种操作系统和硬件环境。 1.3 应用场景: 推荐系统: 基于用户行为或内容特征进行个性化推荐。图像检索: 快速查找与目标图片最相似的图像。自然语言处理: 实现语义相似性搜索,如问答系统或文档检索。生物信息学: 分析基因序列或蛋白质结构数据。 1.4 优势: 开源社区活跃: Milvus 拥有庞大的开发者社区,持续迭代和改进。易用性: 提供丰富的 API 和 SDK,便于开发者快速上手。灵活性: 支持多种部署方式(本地、云端、容器化)。

1.5 整体流程图: 创建集合: 集合是 Milvus 中存储向量数据的基本单位;插入数据: 将向量数据插入到集合中;构建索引: 为向量字段构建搜索方式;执行查询:进行向量相似性搜索;

二、安装  2.1 安装 Milvus 客户端库

       首先需要安装 pymilvus 库,这是 Milvus 的官方 Python SDK;

# 使用以下命令安装: pip install pymilvus 2.2  安装 Milvus

       Milvus的安装采用Docker的形式进行:

# 拉取docker镜像 docker pull milvusdb/milvus:v2.3.0 # 后台运行Mlivus服务 docker run -d --name milvus_cpu -p 19530:19530 -p 8080:8080 milvusdb/milvus:v2.3.0 默认情况下,Milvus 的服务地址为 localhost,端口为 19530; 三、操作  3.1 连接到 Milvus

使用 pymilvus 连接到 Milvus 服务:

from pymilvus import connections # 连接到 Milvus 服务 connections.connect("default", host="localhost", port="19530") 3.2 创建集合

集合是 Milvus 中存储向量数据的基本单位。以下是创建集合的示例:

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType, utility # 定义字段 fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), # 主键字段 FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128) # 向量字段,维度为128 ] # 查询集合是否存在 has = utility.has_collection("example_collection") # 创建集合模式 schema = CollectionSchema(fields, "Example collection") # 创建集合 collection = Collection(name="example_collection", schema=schema)

FieldSchema: 定义集合中的字段,每个字段都有特定的数据类型、名称和其他属性。

字段 1: "id"

name="id": 字段的名称,这里是 "id"。dtype=DataType.INT64: 字段的数据类型为 64 位整数 (INT64)。is_primary=True: 将该字段设置为主键字段。主键用于唯一标识集合中的每条记录。auto_id=True: 表示主键值由 Milvus 自动生成。如果设置为 False,则需要手动提供主键值。

字段 2: "embedding"

name="embedding": 字段的名称,这里是 "embedding"。dtype=DataType.FLOAT_VECTOR: 字段的数据类型为浮点向量 (FLOAT_VECTOR)。dim=128: 向量的维度为 128。这意味着每条记录的 "embedding" 字段是一个长度为 128 的浮点数组; 

CollectionSchema: 定义集合的整体模式,包括字段列表和描述信息。

参数说明:

fields: 字段列表,即上一步中定义的 fields。"Example collection": 集合的描述信息,用于说明该集合的用途或内容。这是一个可选参数,可以为空字符串。

Collection: 创建一个具体的集合实例。

参数说明:

name="example_collection": 集合的名称,必须是唯一的。在这里,集合被命名为 "example_collection"。schema=schema: 集合的模式,即上一步中定义的 schema。 3.3 插入数据

将向量数据插入到集合中:

import random # 生成随机向量数据 data = [ [i for i in range(10)], # 主键(可选) [[random.random() for _ in range(128)] for _ in range(10)] # 10个128维向量 ] # 插入数据 collection.insert(data) 3.4 构建索引

为了加速相似性搜索,需要为向量字段构建索引:

# 定义索引参数 index_params = { "index_type": "IVF_FLAT", # 索引类型 "params": {"nlist": 128}, # 分区数量 "metric_type": "L2" # 距离度量(如欧氏距离) } # 构建索引 collection.create_index(field_name="embedding", index_params=index_params) 需要留意的一点是构建索引是针对字段进行的,前面创建了两个字段‘id’和‘embeding’,定义的索引需要作用到‘embeding’字段上,因为‘embeding’字段是向量数据,是数据样本的核心;更多索引类型请查看这篇博客; 3.5 执行查询

进行向量相似性搜索:

# 加载集合到内存 collection.load() # 定义查询参数 search_params = { "metric_type": "L2", "params": {"nprobe": 10} # 查询时的分区采样数量 } # 定义查询向量 query_vector = [[random.random() for _ in range(128)]] # 执行查询 results = collection.search( data=query_vector, anns_field="embedding", param=search_params, limit=5 # 返回前5个最相似的结果 ) # 输出结果 for result in results: print(result)

search_params: 定义搜索时使用的参数。

参数说明:

metric_type="L2": 指定距离度量方式为欧氏距离(L2 距离)。其他常见选项包括: "IP": 内积(Inner Product),用于余弦相似度计算。"COSINE": 余弦相似度(Cosine Similarity)。 params={"nprobe": 10}: 参数定义了向量相似度搜索的具体配置,通常与索引类型相关联;它的作用是调整查询算法的行为,以优化查询性能或结果精度; nprobe: 控制索引分组的数量(即访问的倒排列表数量)。值越大,搜索越精确,但性能开销也会增加。对于基于 IVF 的索引类型(如 IVF_FLAT、IVF_PQ),nprobe 是一个关键参数;例如:IVF_FLAT索引类型,它在保存数据时会通过聚类将数据划分为若干个蔟,在检索时选择最相似的蔟心的蔟进行筛选,提高检索速度;那当‘nprobe’为10时,就是在带检索向量距离最近的10个蔟心对应的蔟中进行相似度计算,所以数值越小,待检索的向量越少,速度越快,反之检索的越准确权威,但速度越慢;下面是不同检索类型对应的参数: 索引类型支持的参数IVF_FLATnprobeIVF_SQ8nprobeIVF_PQnprobe, mHNSWefANNOYsearch_k 四、总结

       当然也不是只要是使用RAG技术就一定要用向量数据库,主要还是看需要构建知识库的数据类型来决定;当需要构建的知识库信息是图像、PDF等非结构信息时,就可以通过主流的图像特征提取网络对图像进行特征提取,完成向量空间的数据转化,再将其保存至向量数据库,方便检索调用;如果知识库是比如法律条文的文本信息,如果不涉及复杂的语义信息的理解的话,可以直接将法律条文的文本不经过任何语义空间转化,直接将其切片保存在传统数据库也是可以的。

标签:

RAG组件:向量数据库(Milvus)由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“RAG组件:向量数据库(Milvus)