跳至主要内容

探索 Text-Embedding-3-Large:全新 OpenAI 嵌入模型的全面指南

在本指南中探索 OpenAI 的 text-embedding-3-large 与 -small 模型,帮助开发者与研究人员用前沿的 AI 嵌入提升 NLP 任务表现。
· 13分钟 阅读

使用 AI 探索

机器学习与自然语言处理(NLP)的版图在不断演进,而 OpenAI 也持续引领创新方向。

其推出的 text-embedding-3-large 与 text-embedding-3-small 模型为该领域开启新纪元,有望改变开发者与 AI 从业者处理文本分析与嵌入任务的方式。

在复杂的人工智能世界中,嵌入对于将繁复的人类语言转化为机器可理解和处理的形式至关重要。OpenAI 的这款新模型,为开发者和有志于数据实践的人士带来了重要进步。

本文旨在解析 text-embedding-3-large 与 text-embedding-3-small 模型,介绍其核心功能、多样应用场景,以及如何高效上手使用。

通过回顾文本嵌入的基础并重点讲解模型的新特性与实践用法,本文希望为读者提供在项目中使用这一先进工具所需的关键信息。

此外,文章还将介绍如何入门、分享提升嵌入任务效果的技巧,并讨论这一技术进步对 NLP 领域的深远影响。

理解文本嵌入

在深入新模型的细节之前,先简要回顾文本嵌入的概念有助于更好地理解。

文本嵌入是文本的数值化表示,用于捕捉词语、短语或整篇文档的语义(即“含义”)。它是诸多 NLP 任务(如情感分析、文本分类等)的基础。

我们的《使用 OpenAI API 介绍文本嵌入》提供了完整指南,讲解如何用 OpenAI API 创建文本嵌入,并探索其在文本分类、信息检索与语义相似度检测中的应用。

下面用一个嵌入模型进行示意:

  • 左侧为待表示的文档
  • 中间是嵌入模型,
  • 右侧是各文档对应的嵌入向量

Text embeddings illustration

文本嵌入示意图

如果您刚接触这一概念,建议学习我们的课程《使用 OpenAI API 入门嵌入》。课程讲解如何通过 OpenAI API 从文本数据创建嵌入,并开始构建真实世界应用。

全新 OpenAI 嵌入模型一览

这两款模型于 2024 年 1 月 25 日发布,是最新且最强大的嵌入模型,旨在在高维空间中表示文本,从而更好地理解文本。

text-embedding-3-small 针对延迟与存储进行了优化。另一方面,text-embedding-3-large 适合追求更高准确率的场景,同时我们还能利用全新的 dimensions 参数,将嵌入维度保持在 1536(而非原生的 3072)且不影响整体性能。

基准评测分析

在发布之前,text-embedding-ada-2 一直是过往 OpenAI 嵌入模型的榜首。下表给出了这三款模型的基准对比概览。

Model

Dimension

Max token

Knowledge cutoff

Pricing ($/1k tokens)

MIRACL average

MTEB average

ada v2

1536

8191

September 2021

0.0001

31.4

61.0

text-embedding-3-small

0.00002

44.0

62.3

text-embedding-3-large

3072

0.00013

54.9

64.6

从上述指标可见,无论在 MIRACL 还是 MTEB 基准上,text-embedding-3-large 的表现均较 ada v2(text-embedding-ada-002)有所提升。这表明拥有更多维度(3072)的 text-embedding-3-large 能提供更高质量的嵌入,从而直接提升基准分数。

从 text-embedding-ada-002 与 text-embedding-3-small(均为 1536 维)提升到 text-embedding-3-large(3072 维),意味着模型更复杂,能在嵌入中捕捉更丰富的特征。然而,这也伴随着更高的每千 token 价格,体现了性能与成本之间的权衡。

根据具体任务需求(如是否需要多语种能力、文本复杂度、预算约束等),您可选择不同的模型。

对于需要在多语言和多任务中获得高质量嵌入的场景,尽管成本更高,text-embedding-3-large 可能更佳。相反,对于预算更紧或对极致精度要求不高的应用,text-embedding-ada-002 或 text-embedding-3-small 可能更合适。

Text-Embedding-3-Large 的应用

嵌入技术已对诸多现代自然语言处理与理解应用大有裨益。在更强大的 text-embedding-3-large 与更经济的 text-embedding-3-small 之间取舍,将影响 NLP 应用的性能与成本效益。

下面给出两款模型的三类用例示意,展示其在真实场景中的多样性与影响。

text-embedding-3-large 的应用

Applications of text-embedding-3-large (images generated using GPT-4)

text-embedding-3-large 的应用(图片由 GPT-4 生成)

多语言客户支持自动化

凭借对 18 种语言的优异理解与处理能力,text-embedding-3-large 可为全球企业的客户支持聊天机器人与自动应答系统提供动力,在多元语言背景下提供准确、具备上下文感知的支持。

高级语义搜索引擎

借助其高维嵌入,text-embedding-3-large 能增强搜索算法,更好理解查询意图的细微差别,返回更相关且契合语境的结果,尤其适用于法律或医学研究等专业领域。

跨语种内容推荐系统

对于承载多语种内容的平台(如流媒体或资讯聚合),text-embedding-3-large 能分析用户偏好与多语言内容,为用户推荐高度相关的内容,突破语言壁垒。

text-embedding-3-small 的应用

Applications of text-embedding-3-small (Image generated using GPT-4)

text-embedding-3-small 的应用(图片由 GPT-4 生成)

高性价比的情感分析

对于希望通过社交媒体监测或反馈分析来理解客户情绪的初创与中型企业,text-embedding-3-small 提供了经济实惠而有效的方案,可衡量公众观点与客户满意度。

可扩展的内容分类

对拥有海量数据的内容平台(如博客或电商),text-embedding-3-small 可用于自动对内容或商品进行分类。其高效与低成本特性使其能在不牺牲准确性的情况下处理庞大数据集。

高效的语言学习工具

需要可扩展且具成本效益方案的教育类应用(如词义匹配、语法检查等练习)可从 text-embedding-3-small 中受益。其性能与成本的平衡,支持开发交互式、面向语言学习的教育内容。

这些应用示例展示了如何在不同行业中优化部署 text-embedding-3-large 与 text-embedding-3-small,并将其优势与具体需求相匹配,以提升性能、用户体验与成本效率。

使用全新 OpenAI 嵌入的分步指南

我们已具备实现 text-embedding-3-large、text-embedding-3-small 与 ada-v2 的全部工具,以下以文档相似度为例进行演示。

本文全部代码可在 DataLab 工作簿中获得。复制该工作簿即可运行代码,无需在本地安装任何依赖。

关于数据

  • 本示例使用 CORD-19 数据集,包含逾 59,000 篇学术文章,其中超过 48,000 篇为全文,主题涵盖 COVID-19、SARS-CoV-2 及相关冠状病毒。
  • 该数据由白宫与多家领先研究机构联合免费提供,旨在支持全球研究,为抗击该传染病提供见解。
  • 可从 Kaggle 上的此页面下载。
  • 更多数据集详情可在该页面查看。

在继续之前,请务必安装并导入以下库,以确保项目顺利进行。

借助 %%bash 语句,我们无需使用感叹号(!)即可一次安装多个库。

%%bash
pip -q install tiktoken
pip -q install openai

现在按如下方式导入库:

import os
import tiktoken
import numpy as np
import pandas as pd
from openai import OpenAI
from sklearn.metrics.pairwise import cosine_similarity

我们来了解各库的作用:

  • os:提供与操作系统交互的能力,如读写文件系统。
  • tiktoken:处理针对科学文档的分词任务。
  • numpy(np):支持大型多维数组与矩阵,并提供丰富的高阶数学函数,是科学计算的关键。
  • pandas(pd):提供用于处理数值表格与时间序列的数据结构与操作,对科学数据集管理至关重要。
  • openai.OpenAI:作为 OpenAI API 的接口,用于与模型交互,例如为科学文本生成嵌入。
  • sklearn.metrics.pairwise.cosine_similarity:计算向量间的余弦相似度,适用于科学文档相似度分析。

数据探索

原始数据框超过 1GB,此处仅随机抽样 1000 条记录以便演示。

scientific_docs = pd.read_parquet("./data/cord19_df_sample.parquet")

使用 .head() 函数可查看前两行数据,结果见下方动图。

scientific_docs.head(2)

数据前两行

科学文档的正文、标题与摘要通常足以代表该文档。我们将这三项拼接为每个文档的单一文本表示。

在此之前,先查看这三列的缺失值占比:

percent_missing = scientific_docs.isnull().sum() * 100 / len(scientific_docs)
percent_missing

Percentage of missing data in the  targeted columns

目标列的缺失占比

如上图所示,标题与摘要存在缺失,分别为 10.5% 与 12.4%。因此在拼接前先将缺失值填为空字符串,以避免信息丢失。

填充缺失并拼接列的过程可通过下列函数实现。

def concatenate_columns_with_null_handling(df, body_text_column,
                                       	abstract_column,
                                       	title_column,
                                       	new_col_name):
    
	df[new_col_name] = df[body_text_column].fillna('') + df[abstract_column].fillna('') + df[title_column].fillna('')
    
	return df

在原数据上运行拼接函数并查看前 3 行,可见拼接已成功。

new_scientific_docs = concatenate_columns_with_null_handling(scientific_docs,
                                                         	"body_text",
                                                         	"abstract",
                                                         	"title",
                                                         	"concatenated_text")
new_scientific_docs.head(3)

新增列名为 concatenated_text。

包含新增列的前三行

下一步是在新列上应用本文提到的不同嵌入模型。但在此之前,先看看 token 长度的分布。

此分析旨在将模型的最大 token 限制与各文档的实际 token 数进行对照。

首先需统计每个文档的 token 总数,这可借助辅助函数 num_tokens_from_text 与 cl100k_base 编码器实现。

def num_tokens_from_text(text: str, encoding_name="cl100k_base"):
    	"""
    	Returns the number of tokens in a text string.
    	"""
    	encoding = tiktoken.get_encoding(encoding_name)
    	num_tokens = len(encoding.encode(text))
    	return num_tokens

在应用到整体数据集之前,先在如下文本上试验:This article is about new OpenAI Embeddings.

text = "This article is about new OpenAI Embeddings"
num_tokens = num_tokens_from_text(text)
print(f"Number of tokens: {num_tokens}")

成功执行后可见该文本包含 10 个 token。

Number of tokens in the text

文本的 token 数

确认无误后,即可用 lambda 表达式将函数应用于数据框中的整列文本:

new_scientific_docs['num_tokens'] = new_scientific_docs["concatenated_text"].apply(lambda x: num_tokens_from_text(x))

我们可统计 token 数超过 8191 的文档数量:通过筛选 token 数并判断哪些超过 8191 的上限。

smaller_tokens_docs = new_scientific_docs[new_scientific_docs['num_tokens'] <= 8191]
len(smaller_tokens_docs)

⇒ 输出:764

这意味着在 1000 篇文档中,有 764 篇满足最大 token 限制。出于演示简化,我们将使用这些文档。

对于超过 8191 token 的其余文档,可采用更高级的处理技巧。

一种方法是对单个文档所有片段的嵌入取平均。另一种方法是截取文档的前 8191 个 token。但后者可能造成信息丢失,效率并不高。

最后,将数据框索引重置为从零开始:

smaller_tokens_docs_reset = smaller_tokens_docs.reset_index(drop=True)

执行嵌入

准备工作就绪,接下来为所有文档生成嵌入表示,并对每种嵌入模型分别进行。

第一步是获取 OpenAI 凭据并按如下方式配置客户端:

os.environ["OPENAI_API_KEY"] = "YOUR KEY"
client = OpenAI()

随后,通过以下辅助函数,指定嵌入模型与待嵌入文本,即可生成嵌入:

def get_embedding(text_to_embbed, model_ID):
    
	text = text_to_embbed.replace("\n", " ")
	return client.embeddings.create(input = [text_to_embbed],
                                	model=model_ID).data[0].embedding

现在创建一个新的数据框,加入三列对应三种模型的嵌入:

  • text-embedding-3-small
  • text-embedding-3-large
  • text-embedding-ada-002
smaller_tokens_docs_reset['text-embedding-3-small'] = smaller_tokens_docs_reset["concatenated_text"].apply(lambda x: get_embedding(x, "text-embedding-3-small"))

smaller_tokens_docs_reset['text-embedding-3-large'] = smaller_tokens_docs_reset["concatenated_text"].apply(lambda x: get_embedding(x, "text-embedding-3-large"))

smaller_tokens_docs_reset['text-embedding-ada-002'] = smaller_tokens_docs_reset["concatenated_text"].apply(lambda x: get_embedding(x, "text-embedding-ada-002"))

成功运行后,即可看到相关的嵌入列已添加。

smaller_tokens_docs_reset.head(1)

image4.gif

包含嵌入列的新数据框

相似度搜索

本节将对上述每种嵌入方式使用余弦相似度,查找与指定文档最相似的前三篇文档。

下列辅助函数接收四个主要参数:

  • 当前数据框
  • 目标文本的索引(我们要找与其最相似的文档)
  • 所用的具体嵌入列
  • 返回最相似文档的数量,默认为 3
def find_top_N_similar_documents(df, chosen_index,
                             	embedding_column_name,
                             	top_N=3):
    
	chosen_document_embedding = np.array(df.iloc[chosen_index][embedding_column_name]).reshape(1, -1)
	embedding_matrix = np.vstack(df[embedding_column_name])
	similarity_scores = cosine_similarity(chosen_document_embedding, embedding_matrix)[0]
    
	df_temp = df.copy()
	df_temp['similarity_to_chosen'] = similarity_scores
	similar_documents = df_temp.drop(index=chosen_index).sort_values(by='similarity_to_chosen', ascending=False)
	top_N_similar = similar_documents.head(top_N)
    
	return top_N_similar[[concatenated_text, 'similarity_to_chosen']]

接下来,我们以第一篇文档(index=0)为目标,查找与其最相似的文档。

该文档(拼接版本)如下:

chosen_index = 0

first_document_data = smaller_tokens_docs_reset.iloc[0]["concatenated_text"]
print(first_document_data)

image5.gif

第一篇文档的内容(拼接后)

相似度搜索函数可按如下方式运行:

top_3_similar_3_small = find_top_N_similar_documents(smaller_tokens_docs_reset,
                                                 	chosen_index,
                                                 	"text-embedding-3-small")

top_3_similar_3_large= find_top_N_similar_documents(smaller_tokens_docs_reset,
                                                 	chosen_index,
                                                 	"text-embedding-3-large")

top_3_similar_ada_002 = find_top_N_similar_documents(smaller_tokens_docs_reset,
                                                 	chosen_index,
                                                 	"text-embedding-ada-002")

完成相似度计算后,可如下展示结果:

print("Top 3 Similar Documents with :")
print("--> text-embedding-3-small")
print(top_3_similar_3_small)
print("\n")

print("--> text-embedding-3-large")
print(top_3_similar_3_large)
print("\n")

print("--> text-embedding-ada-002")
print(top_3_similar_ada_002)
print("\n")

Top 3 most similar documents using each embedding model

各嵌入模型下最相似的前三篇文档

结果观察

“text-embedding-3-small” 模型的相似度得分约在 0.54 左右,属于中等水平;“text-embedding-3-large” 得分略高,表明其对相似性的捕捉更好。

“text-embedding-ada-002” 模型的相似度显著更高,最高接近 0.85,提示与目标文档的高度相似。

然而,文档 372 在所有模型中均位列最相似结果,表明其与查询在不同模型下均具一致相关性。不同模型间分数差异也凸显了模型选择对相似度结果的影响。

结语

总而言之,OpenAI 全新的 text-embedding-3-large 与 text-embedding-3-small 模型在自然语言处理领域实现了重要跃迁,提供了更细腻且高维的文本数据表示。

如本文所示,在文档相似度、情感分析与多语言支持系统等任务中,不同模型的选择会显著影响结果。text-embedding-3-large 因更高维度而具备更高准确性;而 text-embedding-3-small 则在注重成本的应用中实现效率与性能的平衡。

基准评测显示,text-embedding-3-large 的表现优于前代模型,树立了新的标杆。这些模型的实际应用十分广泛,从强化客户支持到驱动复杂的搜索引擎与内容推荐系统,皆可受益。

借助本文的详细指南,从业者可根据任务复杂度、预算约束与多语言需求,做出更明智的模型选型。

最终,模型选择应与项目的具体需求相契合:高保真任务可利用 text-embedding-3-large 的优势,更通用的场景可考虑 text-embedding-3-small。两款模型的面世,彰显了 OpenAI 推动 AI 技术前行的承诺,也映射出机器学习工具的持续演进。

接下来去哪?

我们发布的文章 《Python 中的 OpenAI API》 是一份速查表,帮助您快速掌握如何利用目前最强大的 AI API 之一——OpenAI API。

我们的代码共学课程 《使用 OpenAI API 微调 GPT3.5》 提供了使用 OpenAI API 与 Python 开始微调 GPT3.5 的指导,帮助您了解何时值得微调大型语言模型、如何使用 OpenAI API 中的微调工具,并理解微调的完整流程。

Zoumana Keita

作者

Zoumana Keita

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

主题