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)