OpenAI 利用 Embeddings API 计算文本相似度
### Embeddings API 接口
通过这个接口,可以获取给定输入的矢量表示。
主要用于将自然语言文本转换为向量表示,以便计算机可以更轻松地对文本进行处理和分析。
这些向量表示可以捕捉到文本中的语义和语法信息。使用这些嵌入向量,可以进行词汇相似性比较、文本分类、情感分析、命名实体识别、机器翻译等各种NLP任务。
在实际应用中,OpenAI的Embeddings接口可以用于各种场景,如智能客服、智能搜索、广告推荐、社交媒体分析等。
在这些场景下,文本数据是非常丰富和复杂的,使用嵌入向量可以使得计算机更好地理解和处理这些文本数据。
### 计算两个向量之间的距离,距离大小表示相似度
```
import openai
import numpy as np
# 首先需要设置OpenAI的API密钥
openai.api_key = "YOUR_API_KEY"
# 定义要比较的两段文本
text1 = "The cat jumped over the lazy dog."
text2 = "The quick brown fox jumps over the lazy dog."
# 使用GPT-2模型对两段文本进行嵌入表示
embedding1 = openai.Embedding.create(model="text-embedding-ada-002", document=text1).vector
embedding2 = openai.Embedding.create(model="text-embedding-ada-002", document=text2).vector
# 计算两个向量的余弦相似度
cosine_sim = np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))
# 输出相似度
print("相似度为:", cosine_sim)
```
这个例子中,我们使用numpy库中的dot()函数计算两个向量的点积,并使用numpy库中的norm()函数计算向量的范数(即长度),最终计算余弦相似度。
OpenAI的embeddings被规范化为长度 1,这意味着:
* 余弦相似性的计算速度快,只需使用点积即可,上面的计算可以少一部分。
* 余弦相似性(Cosine similarity)和欧几里得距离(Euclidean distance)将导致相同的排名。
### 当需要检测距离当前向量最近的向量的时候,可以使用向量数据库。
为了快速搜索多个向量,建议使用向量数据库。
您可以在[https://github.com/openai/openai-cookbook/tree/main/examples/vector\_databases](https://github.com/openai/openai-cookbook/tree/main/examples/vector_databases)找到使用向量数据库和 OpenAI API 的示例。
##### 向量数据库 Milvus
来自国人(上海赜睿信息科技有限公司(Zilliz))的专门设计用于处理输入向量查询的数据库。在[https://www.modb.pro/dbRank](https://www.modb.pro/dbRank)向量数据库排行榜列第一。
网站:[https://milvus.io/](https://milvus.io/)
源码:
* [https://github.com/milvus-io/milvus](https://github.com/milvus-io/milvus)
* [https://gitee.com/milvus-io/milvus](https://gitee.com/milvus-io/milvus)
技术文档:[https://milvus.io/docs/](https://milvus.io/docs/)
##### 向量数据库 Pinecone
Pinecone 是一个托管、闭源的向量数据库,使用 Kafka 进行流处理,使用 Kubernetes 集群实现高可用性以及Blob存储。
网站:[https://www.pinecone.io/](https://www.pinecone.io/)
##### 向量数据库 Qdrant
用Rust编写的开源的,托管/自托管向量搜索引擎和数据库。
网站:[https://qdrant.tech/](https://qdrant.tech/)
源码:[https://github.com/qdrant/qdrant](https://github.com/qdrant/qdrant)