跳至主要内容

使用 OpenAI API 入门文本嵌入

阅读我们的指南,了解如何使用 OpenAI API 创建文本嵌入。探索其在文本分类、信息检索和语义相似度检测中的应用。
· 7分钟 阅读

使用 AI 探索

文本嵌入是自然语言处理(NLP)领域的一项关键工具。它将文本表示为数值形式,其中每个词或短语都用实数的稠密向量表示。

这类嵌入的显著优势在于,它们能够捕捉词语或短语之间的语义含义与关系,从而使机器能够更高效地理解和处理人类语言。

文本嵌入在文本分类、信息检索和语义相似度检测等场景至关重要。

OpenAI 以其在人工智能领域的卓越贡献而闻名,目前推荐使用 Ada V2 模型来创建文本嵌入。该模型源自 GPT 系列,经过训练,能够更好地捕捉文本中的上下文含义和关联。

如果您尚不熟悉 OpenAI 的 API 或 openai Python 包,建议在继续之前阅读在 Python 中通过 OpenAI API 使用 GPT-3.5 和 GPT-4。该指南将帮助您设置账户并了解使用 API 的好处。

本教程还会使用聚类这一机器学习技术,用于将相似的样本归为一组。如果您对聚类,尤其是 k-Means 聚类不熟悉,建议阅读使用 scikit-learn 在 Python 中入门 k-Means 聚类。

文本嵌入可以用于哪些场景?

文本嵌入可应用于多种用例,包括但不限于:

  • 文本分类。 文本嵌入有助于构建情感分析或主题识别等任务的高精度模型。
  • 信息检索。 可用于检索与特定查询相关的信息,类似于搜索引擎的功能。
  • 语义相似度检测。 嵌入可以识别并量化文本片段之间的语义相似性。
  • 推荐系统。 通过基于用户与文本数据的交互来理解其偏好,从而提升推荐质量。
  • 文本生成。 嵌入用于生成更连贯且上下文相关的文本。
  • 机器翻译。 文本嵌入能够跨语言捕捉语义含义,从而提升机器翻译的质量。

环境准备

处理文本嵌入需要几个 Python 包,如下所示:

  • os: 与操作系统交互的 Python 内置库。
  • openai: 与 OpenAI API 交互的 Python 客户端。
  • scipy.spatial.distance: 提供计算不同数据点间距离的函数。
  • sklean.cluster.KMeans:用于计算 KMeans 聚类。
  • umap.UMAP:一种用于降低高维数据维度的技术。

在使用它们之前,请通过以下命令安装 openai、scipy、plotly sklearn 和 umap。完整代码可在此 DataLab 工作簿中获取。

pip install -U openai, scipy, plotly-express, scikit-learn, umap-learn

成功执行上述命令后,可按如下方式导入所有库:

import os
import openai
from scipy.spatial import distance
import plotly.express as px
from sklearn.cluster import KMeans
from umap import UMAP

现在我们可以按如下方式设置 OpenAI API 密钥:

openai.api_key = "<YOUR_API_KEY_HERE>"

注意:您需要自行设置 API KEY。源代码中的密钥不可用,仅供个人使用。

通过 API 调用 GPT 的代码模式

以下辅助函数可用于通过 OpenAI API 对一行文本进行嵌入。在代码中,我们使用现有的 ada 版本 2 来生成嵌入。

def get_embedding(text_to_embed):
	# Embed a line of text
	response = openai.Embedding.create(
    	model= "text-embedding-ada-002",
    	input=[text_to_embed]
	)
	# Extract the AI output embedding as a list of floats
	embedding = response["data"][0]["embedding"]
    
	return embedding

关于数据集

本节将使用 Kaggle 上免费提供的亚马逊乐器评论数据。您也可以从我的 Github 账户按如下方式下载:

import pandas as pd

data_URL =  "https://raw.githubusercontent.com/keitazoumana/Experimentation-Data/main/Musical_instruments_reviews.csv"

review_df = pd.read_csv(data_URL)
review_df.head()

image4.gif

在所有列中,我们只关心 reviewText 列。

review_df = review_df[['reviewText']]
print("Data shape: {}".format(review_df.shape))
display(review_df.head())
Data shape: (10261, 1)

数据集中包含许多评论。出于成本优化的目的,我们仅使用随机选取的 100 行。

image3.png

现在,我们可以通过使用 lambda 表达式调用前面的函数,为整个数据集中每一行生成嵌入:

review_df = review_df.sample(100)
review_df["embedding"] = review_df["reviewText"].astype(str).apply(get_embedding)

# Make the index start from 0
review_df.reset_index(drop=True)

review_df.head(10)

image2.png

前 10 行评论及其嵌入

理解文本相似性

为展示语义相似性的概念,我们来看两条可能表达相似情感的评论:

“This product is fantastic!”

“It really exceeded my expectations!”

使用 scipy.spatial.distance 中的 pdist(),我们可以计算它们嵌入之间的欧几里得距离。

欧几里得距离对应于两组嵌入之差平方和的平方根,示意图如下:

Illustration of the euclidean distance (source)

欧几里得距离示意图(来源)

如果这些评论确实相似,那么该距离应相对较小。

接下来,再看两条不同的评论:

“This product is fantastic!"

"I'm not satisfied with the item."

这两条评论的嵌入之间的距离将显著大于相似评论之间的距离。

案例研究:用文本嵌入进行聚类分析

我们生成的文本嵌入可用于执行聚类分析,从而将彼此更相似的乐器评论分组在一起。

可用的聚类算法有多种,例如 K-Means、DBSCAN、层次聚类和高斯混合模型。在本用例中,我们将使用 KMeans 聚类。不过,我们的Python 层次聚类入门提供了理解层次聚类原理及其在 Python 中实现的良好框架。

对文本数据进行聚类

使用 K-means 聚类需要预先定义聚类数量,我们将通过 n_clusters 参数将该数值设为 3,如下所示:

kmeans = KMeans(n_clusters=3)
kmeans.fit(review_df["embedding"].tolist())

降低嵌入文本数据的维度

人类通常最多只能可视化三维空间。本节将使用 UMAP,这是一种相对快速且可扩展的降维工具。

首先,我们定义一个 UMAP 类的实例,并将 fit_transform 函数应用于嵌入,从而生成可绘制的二维表示。

reducer = UMAP()
embeddings_2d = reducer.fit_transform(review_df["embedding"].tolist())

可视化聚类

最后,创建二维嵌入的散点图。x 和 y 坐标分别取自 embeddings_2d[: , 0] 和 embeddings_2d[: , 1]

聚类将会在视觉上彼此区分:

fig = px.scatter(x=embeddings_2d[:, 0], y=embeddings_2d[:, 1], color=kmeans.labels_)
fig.show()

Clusters visulaization

聚类可视化

总体上有三大簇,颜色各不相同。图中每条评论的颜色由 K-Means 模型为其分配的聚类标签/编号决定。此外,每个点的位置直观地展示了某条评论与其他评论之间的相似程度。

进一步提升

为加深您对文本嵌入和 OpenAI API 的理解,可参考 DataCamp 的以下资料:使用 OpenAI API 和 Python 微调 GPT-3以及The OpenAI API in Python 速查表。这些资料将帮助您通过微调释放 GPT-3 的全部潜力,并展示如何使用 OpenAI API 和 Python 针对您的特定用例改进这一先进的神经网络模型。

Zoumana Keita

作者

Zoumana Keita

一位多才多艺、乐于分享知识并回馈他人的数据科学家。Zoumana 是 YouTube 内容创作者,也是 Medium 上的顶尖科技写作者。他热爱演讲、编程与教学。Zoumana 拥有两个硕士学位:其一是在法国巴黎获得的计算机科学硕士,专注于机器学习;其二是在美国德州理工大学获得的数据科学硕士。他的职业生涯始于法国 Groupe OPEN 的软件开发工程师,随后加入 IBM 担任机器学习顾问,为保险公司构建端到端的 AI 解决方案。之后,Zoumana 加入了 Axionable——一家总部位于巴黎与蒙特利尔的首家“可持续 AI”初创公司。在那里,他担任数据科学家,为来自法国、蒙特利尔、新加坡和瑞士的客户交付 AI 产品,主要聚焦 NLP 场景。此外,他将 5% 的时间投入到研发工作。目前,他在 IFC(世界银行集团)担任高级数据科学家。

主题