大家好,我是学生大使 Jambo。在我们前一篇文章中,我们介绍了 OpenAI 模型的调用。今天,我将为大家介绍 Embedding 的使用。
嵌入是什么
嵌入(Embedding )是一种将高维数据映射到低维空间的方法。嵌入可以将高维数据可视化,也可以用于聚类、分类等任务。嵌入可以是线性的,也可以是非线性的。在深度学习中,我们通常使用非线性嵌入。非线性嵌入通常使用神经网络实现。
上面这句话对于没接触过 NLP(自然语言处理)的同学来说可能有点抽象。你可以理解为通过嵌入,可以将文字信息压缩、编码成向量(或者不准确的称之为数组),而这个向量包含了这段文字的语义。我们可以将这个技术用于搜索引擎、推荐系统等等。
调用 Embedding 模型
与前篇一样,我们需要先部署模型。这里我们使用 text-embedding-ada-002
。
然后安装 openai
包。用以下命令安装,会将 numpy、pandas 等库一并安装。
pip install openai[datalib]
接下来导入 openai
,并做一些初始化工作。
import openai
openai.api_key = "REPLACE_WITH_YOUR_API_KEY_HERE" # Azure 的密钥
openai.api_base = "REPLACE_WITH_YOUR_ENDPOINT_HERE" # Azure 的终结点
openai.api_type = "azure"
openai.api_version = "2023-03-15-preview" # API 版本,未来可能会变
model = "text-embedding-ada-002" # 模型的部署名
embedding = openai.Embedding.create(
input="苹果", engine="text-embedding-ada-002"
)
print(embedding1)
{
"data": [
{
"embedding": [
0.011903401464223862,
-0.023080304265022278,
-0.0015027695335447788,
...
],
"index": 0,
"object": "embedding"
}
],
"model": "ada",
"object": "list",
"usage": {
"prompt_tokens": 3,
"total_tokens": 3
}
}
其中 embedding
就是 “苹果” 所对应的向量。
计算向量相似度
在我们将文字转换成向量之后,我们讨论两句话的相似度,其实就是问它们所对应向量的相似度。通常我们使用余弦相似度来衡量两个向量的相似度。
余弦相似度是计算两个向量夹角角度的 cos \cos cos 值,取值范围在 -1 和 1 之间。如果两个向量的方向完全一致,那么它们的余弦相似度为 1;如果两个向量的方向完全相反,那么它们的余弦相似度为 -1;如果两向量是垂直(正交)的,那么它们的余弦相似度为 0。其公式如下:
cos ( θ ) = A ⃗ ⋅ B ⃗ ∥ A ⃗ ∥ ∥ B ⃗ ∥ \cos(\theta) = \frac{\vec A \cdot \vec B}{\|\vec A\| \|\vec B\|} cos(θ)=∥A∥∥B∥A⋅B
A ⃗ \vec A A