例如,在高维空间中表示低维向量

什么是向量?

我须要刷新我对矢量的影象,因此在这里添加这些注释,以便让任何有相同想法的人都能理解-

还记得标量吗?一个没有方向但代表大小的数值(比如温度这样的值),例如整数、常量等……

RAG技能研究什么是文本嵌入Text Embedding以及它们若何工作

矢量是标量的凑集,它既有大小(或长度),也有方向。
例如:力

图片作者:Canva 设计

上图中的红线代表一个矢量,它有长度(大小)并且还显示方向(箭头)。

由于这个向量从 (0,0) 开始,目前位于 (2,2),因此我们利用勾股定理得出向量的长度。
红线上的箭头表示方向。
这是二维空间中向量的一个例子。

利用勾股定理获取矢量的长度(幅度)

什么是文本嵌入?

“嵌入”一词借用了数学中向量空间中的嵌入观点。

例如,用户用大略的英语发送查询或提示,但打算机不理解文本。
因此,我们须要一个流程来以机器理解的措辞来表示文本和其他输入格式。

这个过程称为文本嵌入。

文本嵌入便是将原始文本数据表示在向量空间中。
它的官方阐明是这样的——“将文本数据表示在连续的高维向量空间中的过程”。

正如我们在之前的图中看到的,向量可以在二维空间中表示,在文本嵌入中也是如此,为了保留文本的含义和高下文,它们被表示在 n 维空间中,维度范围从数百到数千乃至更高。
这是一个高维空间。

文本嵌入的目标是捕捉句子、段落等大块文本的含义和高下文。

对付初学者来说,文本嵌入和词嵌入可能听起来是同一件事,但事实并非如此。

虽然我们现在知道什么是文本嵌入,但是词嵌入是一种表示形式,个中具有相似含义的词具有相似的表示形式。

天生词嵌入的常用技能包括Word2Vec,GloVe和FastText。

斯坦福的单词表示全局向量 (GloVe)是一个可下载的预演习向量数据库。
这些高维向量包含在 spaCy 中。

文本嵌入是利用循环神经网络 (RNN)、卷积神经网络 (CNN) 和 Transformer 等技能天生的。
例如,BERT、GPT 和 Universal Sentence Encoder 等预演习模型可以天生高质量的文本嵌入。

一些盛行的文本表示根本技能是独热编码和 BoW。

怎么运行的?

嵌入用于许多用例,如搜索、聚类推举、分类等。
它们用于查找文本字符串之间的相似性(干系性)。

由于文本字符串表示为向量,因此可以利用两个向量之间的间隔来打算不同字符串的干系性。

欧氏间隔和余弦间隔(或相似度)是用于丈量两个向量之间的间隔或相似度的不同方法。

余弦相似度是一种度量方法,通过打算两个向量之间的角度的余弦来确定它们的相似度。
余弦相似度的打算方法是将向量的点积除以两个向量幅度的乘积。

它是两个向量之间角度的余弦,用于丈量方向,而不是幅度。
余弦值越靠近 1,向量越相似。

余弦间隔源自余弦相似度。
其打算办法为 1 减去余弦相似度。
它用于衡量两个向量之间的差异,在向量的方向比其大小更主要时利用。
余弦间隔越靠近 0,向量越相似。

欧氏间隔打算两点之间的“直线”间隔。

我们没有欧几里得相似性的观点,由于在大多数情形下“相似性”不是通过间隔来定义的,而是通过角度来定义的。

OpenAI官方文档建议利用余弦相似间隔函数。

例子

在 OpenAI 的官方文档中,示例利用了 OpenAI 最新版本中不存在的 utils 包,因此我们可以选择利用 Numpy 或 Scipy Python 库来获取向量的余弦相似度。

Numpy 和 Scipy 都是用于数学和数值剖析的 Python 库。
Numpy(数值 Python)用于低级科学打算。
Scipy(科学 Python)扩展了 Numpy 的功能,并供应了更高等、用户友好的功能。

让我们探索一些超级大略的用例来理解嵌入的一些基本观点。

我们将利用 OpenAI 的嵌入 API 来获取我们作为输入通报的一些示例文本的嵌入。
得到嵌入后,我们将打算向量之间的余弦相似度和欧几里得间隔。

余弦相似度

作者图片

client = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-small")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-small")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-small")embedding3 = response3.data[0].embeddingcosine1 = np.dot(embedding1, embedding2) / (norm(embedding1) norm(embedding2))print(cosine1)cosine2 = np.dot(embedding1, embedding3) / (norm(embedding1) norm(embedding3))print(cosine2)

利用“text-embedding-3-small”模型的相应

from openai import OpenAIimport osimport numpy as npfrom numpy.linalg import normclient = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-large")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-large")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-large")embedding3 = response3.data[0].embeddingcosine1 = np.dot(embedding1, embedding2) / (norm(embedding1) norm(embedding2))print(cosine1)cosine2 = np.dot(embedding1, embedding3) / (norm(embedding1) norm(embedding3))print(cosine2)

利用“text-embedding-3-large”模型的相应

从余弦相似度的定义我们知道,余弦值越靠近1,向量越相似。

在上面两个回答中,我们可以看到句子 1 和句子 2 之间的余弦相似度比句子 1 和句子 3 之间的余弦相似度更靠近 1。

2.欧氏间隔

作者图片:欧氏间隔公式

from openai import OpenAIimport osimport numpy as npclient = OpenAI(api_key=os.environ.get("OPEN_AI_KEY"))response1 = client.embeddings.create( input="cat is a pet animal", model="text-embedding-3-large")embedding1 = response1.data[0].embeddingresponse2 = client.embeddings.create( input="cat drinks milk", model="text-embedding-3-large")embedding2 = response2.data[0].embeddingresponse3 = client.embeddings.create( input="rose is a flower", model="text-embedding-3-large")embedding3 = response3.data[0].embeddingprint("euclidean distance between 1 and 2")print(np.linalg.norm(np.array(embedding1) - np.array(embedding2)))print("euclidean distance between 1 and 3")print(np.linalg.norm(np.array(embedding1) - np.array(embedding3)))

句子间欧氏间隔的相应

在欧几里得间隔的背景下,值越小,表示它们所代表的向量(或嵌入)之间的相似性越高。
这是由于欧几里得间隔丈量的是空间中两点之间的“直线”间隔;点越近,它们就越相似。

给定两个欧氏间隔:

0.98485965872946831.1928713360751884

间隔越小,0.9848596587294683,表示文本相似度越高。

与上述示例类似,我们可以在各种用例中利用 Embeddings API,例如分类、聚类等。
请查看 OpenAI 官方页面上给出的示例。

参考:https://levelup.gitconnected.com/what-are-text-embeddings-and-how-do-they-work-6107bd52998b