技术干货

向量嵌入简介:它们是什么以及如何使用它们

2024-07-26

By Haziqa Sajid

向量嵌入简介:它们是什么以及如何使用它们

24.webp 24.webp

理解向量嵌入以及何时以及如何使用它们。探索使用Milvus和Zilliz Cloud向量数据库的现实世界应用。

向量嵌入是数据点的数值表示,使非结构化数据更容易搜索。这些嵌入存储在像Milvus和Zilliz Cloud(完全托管的Milvus)这样的专业数据库中,这些数据库利用先进的算法和索引技术进行快速数据检索。

现代人工智能(AI)模型,如大型语言模型(LLMs),使用文本向量嵌入来理解自然语言并生成相关响应。此外,LLMs的高级版本使用检索增强生成(RAG)从外部向量存储中检索信息,用于特定任务的应用。

在这篇博客文章中,我们将理解向量嵌入的概念,并探索其应用、最佳实践以及处理嵌入的工具。

什么是向量嵌入?

向量嵌入是一系列数值数据点的列表,每个数字代表一个数据特征。这些嵌入是通过分析数据集中的连接获得的。彼此更接近的数据点被识别为语义上相似。

这些嵌入是使用深度学习模型制定的,这些模型被训练将数据映射到高维向量空间。流行的嵌入模型如BERT和Data2Vec构成了许多现代深度学习应用的基础。

此外,由于其效率,向量嵌入在自然语言处理(NLP)和计算机视觉(CV)应用中非常流行。

向量嵌入的类型

根据它们的维度,主要有两种类型的嵌入:密集、稀疏和二进制嵌入。以下是它们在特征和用途上的区别:

  1. 密集嵌入 表示数据点的向量嵌入,其中大部分元素非零,称为密集嵌入。它们捕捉更精细的细节,因为它们存储所有数据,包括零值,这使它们在存储效率上较低。

    Word2Vec、GloVe、CLIP和BERT是从输入数据生成密集向量嵌入的模型。

  2. 稀疏嵌入 稀疏向量嵌入是具有大部分零向量元素的高维向量。稀疏嵌入中的非零值表示语料库中数据点的相对重要性。稀疏嵌入需要较少的内存和存储,适合像词频这样的高维稀疏数据。

    TF-IDF和SPLADE是生成稀疏向量嵌入的流行方法。

  3. 二进制嵌入 二进制嵌入仅以2位(1和0)存储信息。这种存储形式比32位浮点整数更有效,并提高了数据检索效率。然而,它确实导致了信息的丢失,因为我们在数据精度上做了折衷。

    尽管如此,在某些用例中,二进制嵌入因其速度而受到欢迎,尽管牺牲了一定的准确性。

如何创建向量嵌入?

复杂的深度学习模型和统计方法有助于创建向量嵌入。这些模型识别输入数据中的模式和连接,以学习数据点之间的差异。模型根据它们对底层连接的理解,在n维空间中生成向量嵌入。

n维空间超出了我们3维思维的范围,并从多个角度捕获数据。高维向量嵌入允许从数据点捕获更精细的细节,从而产生准确的输出。

例如,在文本数据中,高维空间允许捕获单词含义的微妙差异。在2维空间中操作将会把“tired”和“exhausted”这样的词组合在一起。n维空间将它们投影到不同的维度,捕捉情感的差异。数学上,以下向量是n维空间中的向量v:

[ v = [v_1, v_2, \ldots, v_n] ]

创建向量嵌入的两种流行技术是:

  • 神经网络 像卷积神经网络(CNNs)或循环神经网络(RNNs)这样的神经网络擅长学习数据复杂性。例如,BERT分析一个词的邻近术语以理解其含义并生成嵌入。

  • 矩阵分解 与神经网络不同,矩阵分解是一种更简单的嵌入模型。它将训练数据作为矩阵,其中每一行和每一列代表一个数据记录。然后模型将数据点分解为低秩矩阵。矩阵分解在推荐系统中很受欢迎,其中输入矩阵是用户评分矩阵,行代表用户,列代表项目(例如电影)。将用户嵌入矩阵与项目嵌入矩阵的转置相乘,生成一个近似原始矩阵的矩阵。

各种工具和库简化了从输入数据生成嵌入的过程。最受欢迎的库包括TensorFlow、PyTorch和Hugging Face。这些开源库和工具提供了创建嵌入模型的用户友好文档。

以下表格列出了不同的嵌入模型、它们的描述和官方文档链接:

ModelDescriptionLink
Neural NetworksNeural Networks like CNNs and RNNs effectively identify data patterns, which is useful for generating vector embeddings. For example, Word2Vec.Neural Networks
Matrix FactorizationMatrix Factorization is suitable for filtering tasks like recommendation systems. It captures user preferences by manipulating input matrices.Matrix Factorization
GloVeGloVe is a uni-directional embedding model. It generates a single-word embedding for a single word.GloVe
BERTBERT (Bidirectional Encoder Representations from Transformers) is a pre-trained model that analyzes textual data bidirectionaly.BERT
ColBERTA token-level embedding and ranking modelColBERT
SPLADEAn advanced embedding model for generating sparse embeddings.SPLADE
BGE-M3BGE-M3 is an advanced machine-learning model that extends BERT's capabilities.BGE-M3

向量嵌入的用途是什么?

向量嵌入在各种现代搜索和AI任务中被广泛使用。其中一些任务包括:

  • 相似性搜索:相似性搜索是一种在高维空间中查找相似数据点的技术。这是通过使用欧几里得距离或Jaccard相似性等相似性度量来测量向量嵌入之间的距离来完成的。现代搜索引擎使用相似性搜索来根据用户搜索检索相关网页。

  • 推荐系统:推荐系统依赖向量化数据来聚类相似项目。来自同一聚类的元素然后用作用户的推荐。系统在不同级别上创建聚类,例如基于人口统计和偏好的用户组和产品组。所有这些信息都作为向量嵌入存储,以便在运行时进行高效和准确的检索。

  • 检索增强生成(RAG):RAG是一种流行的技术,用于减轻大型语言模型的幻觉问题并为其提供额外的知识。嵌入模型将外部知识和用户查询转换为向量嵌入。向量数据库存储嵌入并进行相似性搜索,以获取与用户查询最相关的结果。LLM基于检索到的上下文信息生成最终答案。

使用Milvus存储、索引和检索向量嵌入

Milvus提供了一个内置库,用于存储、索引和搜索向量嵌入。以下是使用PyMilvus库进行操作的逐步方法:

  1. 安装库并设置Milvus数据库 安装pymilvus和gensim,其中Pymilvus是Milvus的Python SDK,gensim是用于NLP的Python库。运行以下命令安装库:

    !pip install -U pymilvus gensim
    

    本教程中,我们使用docker连接Milvus,因此请确保您的系统中安装了docker。在终端中运行以下命令安装Milvus:

    > wget -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh  > bash standalone_embed.sh start
    

    现在Milvus服务已启动,您可以使用Milvus数据库。要设置本地Milvus向量数据库,请创建一个MilvusClient实例,并指定一个文件名,如milvus_demo.db,以存储所有数据。

    from pymilvus import MilvusClient
    
    client = MilvusClient("milvus_demo.db")
    
  2. 生成向量嵌入 以下代码创建一个集合来存储嵌入,从gensim加载预训练模型,并为像ice和water这样的简单单词生成嵌入:

  3. 存储向量嵌入 将上一步生成的向量嵌入存储到我们之前创建的demo_milvus集合中。

  4. 在条目上创建索引 索引使向量搜索更快。以下代码使用IVF_FLAT索引、L2(欧几里得距离)度量和128参数创建索引。

  5. 搜索向量嵌入 要搜索向量嵌入,使用.load()方法将Milvus集合加载到内存中,并执行向量相似性搜索。

使用向量嵌入的最佳实践

要获得向量嵌入的最佳结果,需要仔细使用嵌入模型。使用向量嵌入的最佳实践包括:

  1. 选择正确的嵌入模型 不同的嵌入模型适用于不同的任务。例如,CLIP设计用于多模态任务,而GloVe设计用于NLP任务。根据数据需求和计算限制选择嵌入模型,可以获得更好的输出。

  2. 优化嵌入性能 像BERT和CLIP这样的预训练模型提供了一个很好的起点。然而,这些模型可以针对提高性能进行优化。

    超参数调整也有助于找到最佳性能的特征组合。数据增强是另一种提高嵌入模型性能的方法。它人为地增加了数据的大小和复杂性,使其适合数据有限的任务。

  3. 监控嵌入模型 持续监控嵌入模型可以测试它们随时间的性能。这提供了模型退化的见解,允许微调它们以获得准确的结果。

  4. 考虑不断变化的需求 不断变化的数据需求,如数据增长或格式变化,可能会降低准确性。根据数据需求重新训练和微调模型,确保模型性能的精确性。

常见陷阱及避免方法

  • 模型架构变化 微调和超参数调整可以修改底层模型架构。由于模型生成向量嵌入,重大变化可能导致不同的向量嵌入。

    为了避免完全改变模型,避免完全调整模型参数。相反,针对特定任务微调预训练模型,如Word2Vec和BERT。

  • 数据漂移 数据漂移发生在数据从模型训练时发生改变时。这可能导致不准确的向量嵌入。持续监控数据以确保其与模型要求保持一致。

  • 误导性评估指标 并非所有评估指标都适用于不同任务。随机选择评估指标可能导致误导性分析,隐藏模型的真实性能。

    仔细选择适合你任务的评估指标。例如,语义差异的余弦相似度和翻译任务的BLEU分数。

进一步资源

通过观看相关资源、实践和与行业专业人士互动,可以更深入地理解向量嵌入。以下是你可以深入探索向量嵌入的方式:

社区参与

加入我们的Discord社区,与来自不同行业的GenAI开发者建立联系,讨论与向量嵌入、向量数据库和AI相关的一切。在Stack Overflow、Reddit和GitHub上关注相关讨论,了解在处理嵌入时可能遇到的潜在问题,并提高你的调试技能。

保持与资源的最新状态和社区的互动,确保你的技能随着技术的进步而增长,这为你在AI行业中提供了竞争优势。

  • Haziqa Sajid

    Haziqa Sajid

    Freelance Technical Writer

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud