向量嵌入解释:强大人工智能的初学者指南
向量嵌入是高维空间内数据点的数字表示。这种表示方式使得搜索文本、图像和视频等非结构化数据变得容易,为人工智能和机器学习 (ML) 应用开辟了许多可能性。专业矢量数据库(例如开源 Milvus 及其完全托管的云版本 Zilliz Cloud)用于存储和管理这些嵌入。这些数据库使用索引机制和高级算法根据给定查询执行高效的数据检索。
这些嵌入与向量数据库一起,为各种现代人工智能模型,特别是大型语言模型 (LLM) 提供支持,通过提供他们通过语义相似性搜索上下文信息来获得更准确和相关的响应。这种技术也称为检索增强生成(RAG),它将大语言模型的回答建立在事实数据的基础上。因此,它有助于减少人工智能模型产生不正确或无意义信息的幻觉,并提高人工智能生成内容的准确性和可靠性。
了解向量嵌入
向量嵌入的真正力量向量嵌入是它们捕获不同数据之间关系的能力。在向量嵌入的世界中,含义相似的数据最终在这个高维数字空间中更加接近。这使得向量嵌入对于需要以高级方式理解和比较数据的任务非常有用。
例如,想想国王、女王和皇家这些词。在精心制作的嵌入空间中,这些单词的数字列表(向量)将彼此接近,表明它们在含义上相关。另一方面,像自行车这样不相关的单词的向量会很远。
向量嵌入的类型
人工智能应用中通常使用不同类型的向量嵌入。这三种向量嵌入的主要类型有:
- 密集嵌入:这些是最常见的。在密集嵌入中,列表中的大多数数字都是非零的。它们擅长捕获数据点之间的详细关系,但它们会使用大量内存。Word2Vec、GloVe 和 BERT 等模型通常会创建密集嵌入。
- 稀疏嵌入:在稀疏嵌入中,列表中的大多数数字为零。它们使用较少的内存,并且可用于表示多维数据,例如单词在大型文档中出现的频率。TF-IDF 等技术通常会创建稀疏嵌入。
- 二进制嵌入:这些嵌入仅使用两个值(通常为 0 和 1)来表示数据。它们的精确度较低,但处理速度非常快,这在您需要快速检索数据时非常有用。
在这些类型之间进行选择时,您需要平衡准确性、存储需求和处理等因素速度。对于许多应用程序来说,密集嵌入总体效果最好,但重要的是要考虑您的具体项目需求。
创建向量嵌入
向量嵌入是使用高级深度学习模型和统计创建的学习输入数据中的模式和关系的技术。这些嵌入将数据点映射到 n 维空间,捕获在较低维度中难以表示的复杂特征和区别。
理解 N 维空间
n 维空间允许更丰富的数据表示,超出了典型的 3D 理解。高维嵌入可以捕获细粒度的细节,从而提高搜索、推荐和自然语言处理 (NLP) 等任务的准确性。例如,在基本的 2D 空间中,“疲倦”和“精疲力尽”等词可能看起来很相似,但在 n 维空间中,更容易捕获它们含义的差异(例如强度或上下文)。该空间中的向量表示为:
v = [v, v, ..., v]
生成嵌入的技术
创建这些嵌入有两种主要方法:
- 神经网络:这些是复杂的模型,可以通过调整互连节点层之间的权重来学习复杂的模式。例如,一种名为 BERT 的流行模型会查看上下文中的单词以创建详细的文本嵌入。神经网络是制作高质量嵌入的强大工具。
- 矩阵分解:这是一种更简单的技术,适用于某些任务,尤其是在推荐系统中。它可以有效地捕捉用户偏好和物品特征。它的工作原理是将大型矩阵(例如用户-项目交互矩阵)分解为较小的矩阵,为用户和项目创建嵌入。
创建嵌入后,将存储、索引和有效地查询它们变得至关重要。这就是像 Milvus 这样的专业向量数据库发挥作用的地方。
使用 Milvus 存储、索引和检索向量嵌入
Milvus 是一个开源向量数据库,专门为处理大规模向量而设计数据。就 GitHub 星数而言,它是最受欢迎的矢量数据库。
按照本指南在您的计算机上安装 Milvus,因为以下部分中的代码仅在 Milvus 已在本地运行时才有效。完整的代码可以在这里找到。
让我们逐步了解一下使用 Milvus 处理向量嵌入的过程。
设置 Milvus
首先,您需要安装 PyMilvus,Milvus Python 客户端将帮助您与 Milvus 数据库进行交互。以下命令将在您的环境中安装 pymilvus[model] 和 Milvus 客户端。使用此命令而不是直接安装 Milvus 客户端的命令,因为在本教程后面您将使用 Milvus 集成的嵌入模型来生成嵌入:
<表格><行><单元格>
1
单元格>
!pip install "pymilvus[model]" | 行>表>
PyMilvus 中的 pymilvus[model] 模块提供了使用 Milvus 集成的嵌入模型的功能。
导入依赖项并设置嵌入功能
然后,导入必要的模块并设置用于生成文本嵌入的嵌入模型。
from pymilvus import MilvusClient, DataType | |
从 pymilvus.model.hybrid 导入 BGEM3EmbeddingFunction | |
embedding_model = BGEM3EmbeddingFunction( | |
model_name='BAAI/bge-m3', device='cpu', use_fp16=False | |
) |
这个代码导入必要的模块和函数。然后它使用 BAAI/bge-m3 模型初始化 BGEM3EmbeddingFunction。这是您将用来生成文本嵌入的模型。
连接到 Milvus 并创建架构
初始化后,连接到 Milvus 开始执行数据库操作。建立连接后,定义将存储文本嵌入的集合的架构。
milvus_instance = MilvusClient( | |
uri="http://localhost:19530" | ) | |
new_schema = MilvusClient.create_schema( | auto_id=True, | |
enable_dynamic_field=True, | |
) | |
new_schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True) | |
new_schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535) | |
new_schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=1024) |
这使用统一资源标识符(URI)连接到本地运行的 Milvus 实例。然后,它定义了集合的结构,该结构具有三个字段:
- id:INT64 类型的主键字段。
- text:用于存储文本值的 VARCHAR 字段。这将存储您的文档。
- 嵌入:维度为 1024 的 FLOAT_VECTOR 字段,用于存储矢量嵌入。
创建集合并为其建立索引
下一步,使用您定义的架构创建一个集合。然后,应用索引以加快相似性搜索速度。
collection_name = "Sample_collection" | |
if milvus_instance.has_collection(collection_name): | |
milvus_instance.drop_collection(collection_name) | |
milvus_instance.create_collection( | |
collection_name="Sample_collection", | |
schema=new_schema, | |
description="文本集合" | |
) | |
index_config = [{ | |
"field_name": "嵌入", | |
"index_type":"IVF_FLAT", | |
"metric_type": "L2", | |
"params": {"nlist": 128} | |
}] | |
milvus_instance.create_index(collection_name, index_config) |
该代码检查集合是否包含指定的名称已存在;如果存在,则将其删除,并使用定义的模式创建一个新集合。之后,为嵌入字段定义索引配置。IVF_FLAT索引类型用于快速近似最近邻搜索,以L2(欧氏距离)作为衡量相似性的度量类型。参数 nlist=128 有助于配置向量如何分区以实现高效搜索。
使用嵌入插入数据
创建集合后的下一步是准备数据并将其插入到 Milvus 中。
texts = [ | |
"Zilliz 是一家高性能数据科学公司提供了一个基于 Milvus 构建的完全托管的矢量数据库。", | |
“Milvus 是一个开源矢量数据库,专为海量数据集的相似性搜索而设计。”, | |
“向量嵌入是捕获其语义关系和相似性的数据点的数字表示”, | |
“Las incrustaciones vectoriales sonrepresentaciones numricas de puntos de datos que capturan sus relaciones semnticas” | |
] | |
对于文本中的文本: | |
embedding = embedding_model.encode_documents([text])['dense'][0] | |
data_entity = { | |
“文本”:文本, | |
“嵌入”:embedding.tolist() | |
} | |
milvus_instance.insert(collection_name, [data_entity]) | |
milvus_instance.load_collection(collection_name) |
上面的代码创建了一个多语言数据列表。对于每个文本,使用 embedding_model.encode_documents() 方法生成嵌入,该方法输出表示文本语义的密集向量。然后调用 insert 方法将该文本嵌入和相应的文本插入到 Milvus 集合中。最后,load_collection 方法将集合加载到内存中,为搜索操作做好准备。
查询和搜索相似文本
最后一步是检索与 Milvus 中的查询相关的数据.
query_settings = { | |
"metric_type": "L2", | |
"params": {"nprobe": 10} | |
} | |
query_text = "什么是 Milvus?" | |
query_vector = embedding_model.encode_queries([query_text])['dense'][0] | |
search_results = milvus_instance.search( | |
collection_name=collection_name, | |
data=[query_vector], | |
limit=10, | |
output_fields=["text", "embedding"], | |
search_params=query_settings | ) | |
if search_results 和 len(search_results[0])
关于《向量嵌入解释:强大人工智能的初学者指南 - 新堆栈》的评论
暂无评论
发表评论
摘要
向量嵌入解释:强大的 AIVector 嵌入入门指南是高维空间内数据点的数字表示。这些嵌入与向量数据库一起,为各种现代人工智能模型,特别是大型语言模型(LLM)提供动力,通过语义相似性搜索为它们提供上下文信息,以获得更准确和相关的响应。这将存储您的文档。embedding:维度为 1024 的 FLOAT_VECTOR 字段,用于存储向量嵌入。使用嵌入插入数据创建集合后的下一步是准备数据并将其插入到 Milvus.texts = [“Zilliz 是一家高性能数据科学公司,提供基于 Milvus 构建的完全托管向量数据库。”)在上面的代码中,查询设置配置为使用 L2(欧氏距离)作为度量类型,nprobe 设置为 10,这决定了搜索期间将扫描数据的多少个分区。
| |