Milvus - 构建向量数据库并进行相似度查询

ops/2024/11/13 10:19:31/

向量相似度检索在大规模数据分析和机器学习应用中是一个非常关键的任务,特别是在处理文本、图像或其他嵌入向量时。Milvus 是一个高性能的开源向量数据库,专为存储和检索大规模向量数据设计。本文将介绍如何在 Docker 中安装 Milvus,并展示如何使用 Python 插入向量数据及进行向量相似度查询。

一、在 Docker 中安装并运行 Milvus

Milvus 提供了简便的安装方式,可以通过 Docker 快速启动 Milvus 实例。

1. 安装 Docker

确保你已在系统上安装了 Docker。如果未安装,可以访问 Docker 官方网站 获取安装指南。

2. 在 Docker 中安装 Milvus

通过以下步骤下载并启动 Milvus 实例。

# 下载 Milvus 安装脚本
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh# 启动 Milvus 容器
bash standalone_embed.sh start

运行该脚本后,一个名为 milvus-standalone 的 Docker 容器将启动,并在 19530 端口提供 Milvus 服务。嵌入式的 etcd 也将在同一容器中运行,使用 2379 端口进行服务。

3. 停止和删除 Milvus

你可以随时停止和删除 Milvus 容器及其数据:

# 停止 Milvus
bash standalone_embed.sh stop# 删除 Milvus 容器和数据
bash standalone_embed.sh delete

二、创建向量集合

在 Milvus 中,数据存储在集合(Collection)中,类似于传统数据库中的表。集合可以包含多个字段,包括嵌入向量字段。接下来,我们将通过 Python 创建一个存储文本及其对应向量的集合。

1. 连接 Milvus 并定义集合

首先,我们通过 Python 的 pymilvus 库连接 Milvus 并创建集合。

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection# 连接 Milvus
connections.connect("default", host="localhost", port="19530")# 定义集合 schema
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),FieldSchema(name="user_id", dtype=DataType.INT64),FieldSchema(name="file_id", dtype=DataType.INT64),FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384),  # 384维向量
]schema = CollectionSchema(fields, description="知识库向量数据")# 创建集合
collection = Collection("knowledge_vector_data", schema=schema)
2. 创建索引

为提高查询效率,Milvus 支持为向量字段创建索引。下面是为向量字段创建索引的示例:

# 创建索引
index_params = {"metric_type": "IP",  # 内积,用于向量相似度"index_type": "IVF_FLAT",  # 索引类型"params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
print("Index created.")

三、向量化、插入数据并进行相似度查询

在这个部分,我们将通过 Python 脚本,将测试句子向量化后插入 Milvus,并进行相似度查询。

1. 安装必要的 Python 库

首先,确保安装了 sentence-transformerspymilvus 库:

pip install sentence-transformers pymilvus numpy
2. 完整的 Python 脚本

以下是一个完整的 Python 脚本,包含了向量化句子、插入数据和相似度查询的功能。

import numpy as np
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
from sentence_transformers import SentenceTransformer# 连接 Milvus
connections.connect("default", host="localhost", port="19530")# 定义集合 schema
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),FieldSchema(name="user_id", dtype=DataType.INT64),FieldSchema(name="file_id", dtype=DataType.INT64),FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384),  # 384维向量
]schema = CollectionSchema(fields, description="知识库向量数据")# 创建集合
collection = Collection("knowledge_vector_data", schema=schema)# 向量化句子
def vectorize_sentences(sentences):model = SentenceTransformer('all-MiniLM-L6-v2')return model.encode(sentences)# 插入向量到 Milvus
def insert_vectors_to_milvus(sentences, vectors):data = [# [None] * len(sentences),  # ID 自动生成[1] * len(sentences),  # user_id[1] * len(sentences),  # file_idsentences,  # contentvectors.tolist()  # 向量]collection.insert(data)print(f"Inserted {len(sentences)} sentences into Milvus")# 创建索引以加速检索
def create_index():index_params = {"metric_type": "IP",  # 内积,用于向量相似度"index_type": "IVF_FLAT",  # 索引类型"params": {"nlist": 128}}collection.create_index(field_name="embedding", index_params=index_params)print("Index created.")# 查询相似句子
def query_similar_sentences(target_vector, top_k=5):collection.load()search_params = {"metric_type": "IP", "params": {"nprobe": 10}}# 执行查询results = collection.search(data=[target_vector],anns_field="embedding",param=search_params,limit=top_k,output_fields=["content"])for result in results[0]:print(f"Content: {result.entity.get('content')}, Similarity score: {result.score}")if __name__ == "__main__":# 测试句子sentences = ["This is a test sentence.","Another sentence for testing.","Milvus vector database integration."]# 向量化测试句子vectors = vectorize_sentences(sentences)# 插入向量到 Milvusinsert_vectors_to_milvus(sentences, vectors)# 创建索引create_index()# 目标句子,进行相似度查询target_sentence = "This is a test sentence."target_vector = vectorize_sentences([target_sentence])[0]# 查询与目标句子最相似的句子query_similar_sentences(target_vector)

四、总结

通过本文的步骤,我们学习了如何在 Docker 中安装 Milvus,并使用 Python 向量化文本数据、插入数据和执行相似度查询。Milvus 是处理大规模向量数据的理想工具,特别适合于多媒体数据的相似度搜索。


http://www.ppmy.cn/ops/113315.html

相关文章

GO主流开源框架

GO主流开源框架 Go 语言有着丰富的开源框架生态,涵盖了多种应用场景,如 Web 开发、数据库操作、微服务、日志处理等。以下是一些常见的 Go 框架及其典型作用场景: 1. Web 框架 Gin: 作用:一个高性能的轻量级 Web 框架&#xff…

今天不写项目,聊聊后端面试吧

首先感谢大家之前的观看呀~兄弟们~ 这边把我去过几家公司面试的题目都写一下哈,像我大二下,就是前两个月7-9进了公司进行后端实习,哎.....反正就是学学学..话不多说~ 1.Frist 1.HashMap实现原理 HashMap是基于哈希表的Map接口的非同步实现…

网站在线客服插件配置

使用工具:百度爱番番 下载地址: 百度爱番番—企业的一站式智能营销管家 一、下载百度爱番番APP,注册账号 二、 登录app 三、点击设置——站点设置——新建站点 四、设置站点名称——站点地址——PC站点——确定 五、点击配置好的站点的获取代…

leetcode73矩阵置零

思路 想到的就是需要一个数组来记录是不是这行或者这列是不是有零,然后最后再扫描一遍这个矩阵 题解 借助第0行第0列来记录这个行是不是有0,这个列是不是有0 另外,这个矩阵不大,所以可能有重复的置0应该也没事。 class Soluti…

力扣232:用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头…

签署《AI安全国际对话威尼斯共识》 智源持续推动人工智能安全发展

近日,由AI安全国际论坛(Safe AI Forum)和博古睿研究院(Berggruen Institute) 共同举办的第三届国际AI安全对话(International Dialogues on AI Safety)在威尼斯举办。图灵奖得主Yoshua Bengio、姚期智教授&…

一、编译原理(引论)

目录 【一】、引论 一、编译器 1、编译器 2、编译器与解释器 3、编译器结构 【一】、引论 一、编译器 1、编译器 (1)编译器:将人类易懂的 高级语言 翻译成 硬件可执行的目标机器语言 (2) 高级语言 ⚫ 直接面…

聊一聊测试用例的重要性

对于测试从业人员,测试用例术语应该不会陌生,在工作中用到的概率就像医生的药方,厨师心中的菜配方等等。 不过前者对项目组内人员都是公开的,后者的药方和配方大概率不会公开;前者项目内公开为了让测试用例覆盖率更高…