Embedding 嵌入知识入门

原文首发于博客文章Embedding 嵌入知识入门

文本嵌入是什么

向量是一个有方向和长度的量,可以用数学中的坐标来表示。例如,可以用二维坐标系中的向量表示一个平面上的点,也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。

而文本嵌入是一种将文本这种离散数据映射到连续向量空间的方法,嵌入技术可以将高维的离散数据降维到低维的连续空间中,并保留数据之间的语义关系,从而方便进行机器学习和深度学习的任务。

例如:

"机器学习"表示为 [1,2,3]
"深度学习"表示为[2,3,3]
"英雄联盟"表示为[9,1,3]

使用余弦相似度(余弦相似度是一种用于衡量向量之间相似度的指标,可以用于文本嵌入之间的相似度)在计算机中来判断文本之间的距离:

“机器学习”与“深度学习”的距离:

“机器学习”与“英雄联盟“的距离”:

“机器学习”与“深度学习”两个文本之间的余弦相似度更高,表示它们在语义上更相似。

文本嵌入算法

文本嵌入算法是指将文本数据转化为向量表示的具体算法,通常包括以下几个步骤:

  • 分词:将文本划分成一个个单词或短语。
  • 构建词汇表:将分词后的单词或短语建立词汇表,并为每个单词或短语赋予一个唯一的编号。
  • 计算词嵌入:使用预训练的模型或自行训练的模型,将每个单词或短语映射到向量空间中。
  • 计算文本嵌入:将文本中每个单词或短语的向量表示取平均或加权平均,得到整个文本的向量表示。

常见的文本嵌入算法包括 Word2Vec、GloVe、FastText 等。这些算法通过预训练或自行训练的方式,将单词或短语映射到低维向量空间中,从而能够在计算机中方便地处理文本数据。

文本嵌入用途

文本嵌入用于测量文本字符串的相关性,通常用于:

  • 搜索(结果按与查询字符串的相关性排序)
  • 聚类(其中文本字符串按相似性分组)
  • 推荐(推荐具有相关文本字符串的项目)
  • 异常检测(识别出相关性很小的异常值)
  • 多样性测量(分析相似性分布)
  • 分类(其中文本字符串按其最相似的标签分类)

使用文本嵌入模型

  • 可以使用 HuggingFace上能够处理文本嵌入的开源模型,例如:uer/sbert-base-chinese-nli

    python">from sentence_transformers import SentenceTransformer
    model = SentenceTransformer('uer/sbert-base-chinese-nli')
    sentences = ["机器学习","深度学习","英雄联盟",]
    sentence_embeddings = model.encode(sentences)
    
  • 使用之前介绍的 OpenAI 文本嵌入API 可以将文本转换为向量,OpenAI API提供了多个文本嵌入模型,这篇博客对它们的性能进行了比较,这里是性能最好的text-embedding-ada-002说明:

模型名称价格分词器最大输入 token输出
text-embedding-ada-002$0.000/1k tokenscl100k_base81911536

矢量数据库

  • 为了快速搜索多个矢量,建议使用矢量数据库,下面是一些可选的矢量数据库:
    • Pinecone,一个完全托管的矢量数据库
    • Weaviate,一个开源的矢量搜索引擎
    • Redis作为矢量数据库
    • Qdrant,一个矢量搜索引擎
    • Milvus,一个为可扩展的相似性搜索而构建的矢量数据库
    • Chroma,一个开源嵌入式商店
    • Typesense,快速的开源矢量搜索引擎
    • Zilliz,数据基础设施,由Milvus提供技术支持
    • FAISS 是Meta开源的用于高效搜索大规模矢量数据集的库

性能优化✍️:

和传统数据库一样,可以使用工程手段优化矢量数据库搜索性能,最直接的就是更新索引算法 ,对索引数据进行分区优化。

  1. 平面索引(FLAT):将向量简单地存储在一个平面结构中,最基本的向量索引方法。

    • 欧式距离(Euclidean Distance)
    • 余弦相似度(Cosine Similarity)
  2. 分区索引(IVF):将向量分配到不同的分区中,每个分区建立一个倒排索引结构,最终通过倒排索引实现相似度搜索。

    • 欧式距离(Euclidean Distance)
    • 余弦相似度(Cosine Similarity)
  3. 量化索引(PQ):将高维向量划分成若干子向量,将每个子向量量化为一个编码,最终将编码存储在倒排索引中,利用倒排索引进行相似度搜索。

    • 欧式距离(Euclidean Distance)
    • 汉明距离(Hamming Distance)
  4. HNSW (Hierarchical Navigable Small World):通过构建一棵层次化的图结构,从而实现高效的相似度搜索。

    • 内积(Inner Product)
    • 欧式距离(Euclidean Distance)
  5. NSG (Navigating Spreading-out Graph):通过构建一个分层的无向图来实现快速的相似度搜索。

    • 欧式距离(Euclidean Distance)
  6. Annoy (Approximate Nearest Neighbors Oh Yeah):通过将高维空间的向量映射到低维空间,并构建一棵二叉树来实现高效的近似最近邻搜索。

    • 欧式距离(Euclidean Distance)
    • 曼哈顿距离(Manhattan Distance)
  7. LSH (Locality-Sensitive Hashing):通过使用哈希函数将高维的向量映射到低维空间,并在低维空间中比较哈希桶之间的相似度,实现高效的相似度搜索。

    • 内积(Inner Product)
    • 欧式距离(Euclidean Distance)

参考资源

  1. 一个专门托管嵌入后数据的应用

http://www.niftyadmin.cn/n/462316.html

相关文章

行为型模式--状态模式

目录 举例 状态模式 定义 结构 代码实现 优缺点 优点: 缺点: 使用场景 举例 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一 种状态改变,都…

快速查询银行卡发卡省市和归属银行,了解自己的财务状况!

API接口是现代软件开发的基本组成部分。它们允许应用程序通过互联网连接到其他软件系统,并从这些系统中获取或传输数据。银行卡归属地查询API接口是为开发人员提供的一种工具,可以帮助他们轻松地查询银行卡的归属地信息。在本文中,我们将介绍…

JavaFX第四篇 Button按钮和事件处理

JavaFX第四篇 Button按钮和事件处理 1. 代码2. 讲解3. 代码仓库 上一篇我们讲解了Hello World演示,主要用到Label标签的功能, 这里我们要介绍的是最常用的控件之一:按钮 在现在的软件开发过程中还没发现没有用到按钮的应用, 基本上…

【面试】标准库相关题型(三)

文章目录 1. unordered_map底层实现原理1.1 散列表1.2 STL 中的 unordered_map 的实现1.3 unordered_map 2. 迭代器底层实现原理及种类2.1 主要作用2.2 底层原理2.3 迭代器类型属性 3. 迭代器失效3.1 容器类别3.2 失效情况3.3 C11容器类别 4. STL容器的线程安全4.1 背景知识4.2…

团体程序设计天梯赛-练习集L1篇⑨

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…

docker非root用户下取消sudo前缀

解决非root用户下执行docker命令提示权限不足,必须添加sudo的问题。 第一步:执行 sudo gpasswd aby docker 命令,将当前用户aby加入docker组中。 第二步:执行 sudo chmod arw /var/run/docker.sock 命令修改sock权限

Git工具【系统学习】

第一章 Git快速入门 1.1 Git概述 Git是一个免费的,开源的分布式版本控制系统,可以快速高效地处理从小型或大型的各种项目。Git易于学习,占用空间小,性能快得惊人。 1.2 SCM概述 SCM(Software Configuration Managem…

【chatgpt问答记录】权重衰减vs正则化

Q:权重衰减的概念是? A: 权重衰减(Weight Decay)是一种用于正则化神经网络模型的技术。它通过在损失函数中添加一个惩罚项来限制权重的大小,以减少过拟合现象。 在神经网络的优化过程中,除了最小化损失函…