嵌入概述

文本嵌入是文本字符串的数值表示,表示为浮点数向量。你可以使用两个嵌入文本片段(无论是单词、短语还是句子)之间的距离来衡量这些文本片段之间的相关性。一种流行的度量方法是余弦相似度,但你也可以通过其他距离函数(如欧几里得距离或点积)来衡量相似度(见下面的常见问题)。总的来说,距离越小,预测文本之间在语义或句法关系上的相关性越高

通过比较字符串的相似度,或通过字符串之间的距离对其进行聚类,可以实现广泛的应用,包括搜索(在RAG架构中很流行)、推荐异常检测


如何通过Anthropic获得嵌入

在选择嵌入提供商时,根据你的需求和偏好,可以考虑几个因素:

  • 数据集大小和领域特异性: 模型训练数据集的大小及其与你要嵌入的领域的相关性。更大或更具领域特异性的数据通常会产生更好的领域内嵌入
  • 模型架构: 模型设计和复杂性。更现代的技术和架构(如Transformer)往往能学习并产生更高质量的嵌入
  • 推理性能: 嵌入查找速度和端到端延迟。这对于大规模生产部署尤其重要
  • 定制化: 在私有数据上继续训练或针对非常特定的领域专门化模型的选项。这可以提高在独特词汇上的性能

Anthropic不提供自己的嵌入模型。一个在上述四个考虑因素方面都有广泛选择和能力的嵌入提供商是Voyage AI。Voyage AI制作最先进的嵌入模型,并为金融和医疗保健等特定行业领域提供定制模型,或为个别客户提供定制的微调模型。

本指南的其余部分是针对Voyage AI的,但我们鼓励你评估各种嵌入供应商,以找到最适合你特定用例的供应商。


Voyage AI入门

查看我们的嵌入notebook,了解Voyage AI实现示例。

要访问Voyage嵌入:

  1. Voyage AI网站上注册
  2. 获取API密钥
  3. 为方便起见,将API密钥设置为环境变量:
Python
export VOYAGE_API_KEY="<your secret key>"

你可以通过使用官方的voyageai Python包或HTTP请求来运行嵌入,如下所述。

Voyage Python包

可以使用以下命令安装voyageai包:

Python
pip install -U voyageai  

然后,你可以创建一个客户端对象,并开始使用它来嵌入你的文本:

Python
import voyageai

vo = voyageai.Client()
# 这将自动使用环境变量VOYAGE_API_KEY。
# 或者,你可以使用vo = voyageai.Client(api_key="<your secret key>")

texts = ["Sample text 1", "Sample text 2"]

result = vo.embed(texts, model="voyage-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddings将是两个嵌入向量的列表,每个向量包含1024个浮点数。

运行上述代码后,两个嵌入将打印在屏幕上:

Python
[0.02012746, 0.01957859, ...]  # "Sample text 1"的嵌入
[0.01429677, 0.03077182, ...]  # "Sample text 2"的嵌入

在创建嵌入时,你可以为embed()函数指定一些其他参数。以下是规范:

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - 作为字符串列表的文本列表,例如["I like cats", "I also like dogs"]。目前,列表的最大长度为128,对于voyage-2,列表中的总令牌数最多为320K,对于voyage-large-2/voyage-code-2,最多为120K。
  • model (str) - 模型名称。推荐选项:voyage-2voyage-large-2voyage-code-2
  • input_type (str, 可选,默认为None) - 输入文本的类型。默认为None。其他选项:querydocument
    • 当input_type设置为None时,输入文本将直接由Voyage的嵌入模型编码。或者,当输入是文档或查询时,用户可以将input_type指定为querydocument。在这种情况下,Voyage将在输入文本前面加上一个特殊的提示,并将扩展的输入发送到嵌入模型
    • 对于检索/搜索用例,我们建议在编码查询或文档时指定此参数,以提高检索质量。使用input_type参数和不使用input_type参数生成的嵌入是兼容的
  • truncation (bool, 可选,默认为None) - 是否截断输入文本以适应上下文长度。
    • 如果为True,超长的输入文本将被截断以适应上下文长度,然后由嵌入模型进行向量化
    • 如果为False,如果任何给定的文本超过上下文长度,将引发错误
    • 如果未指定(默认为None),如果输入文本略微超过上下文窗口长度,Voyage将在将其发送到嵌入模型之前截断输入文本。如果它显著超过上下文窗口长度,将引发错误

Voyage HTTP API

你也可以通过请求Voyage HTTP API来获取嵌入。例如,你可以在终端中通过curl命令发送HTTP请求:

Shell
curl https://api.voyageai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $VOYAGE_API_KEY" \
  -d '{
    "input": ["Sample text 1", "Sample text 2"],
    "model": "voyage-2"
  }'

你得到的响应是一个JSON对象,包含嵌入和令牌使用情况:

Shell
{
  "object": "list",
  "data": [
    {
      "embedding": [0.02012746, 0.01957859, ...],
      "index": 0
    },
    {
      "embedding": [0.01429677, 0.03077182, ...],
      "index": 1
    }
  ],
  "model": "voyage-2",
  "usage": {
    "total_tokens": 10
  }
}

Voyage AI的嵌入端点是https://api.voyageai.com/v1/embeddings(POST)。请求头必须包含API密钥。请求体是一个JSON对象,包含以下参数:

  • input (str, List[str]) - 单个文本字符串,或作为字符串列表的文本列表。目前,列表的最大长度为128,对于voyage-2,列表中的总令牌数最多为320K,对于voyage-large-2/voyage-code-2,最多为120K。
  • model (str) - 模型名称。推荐选项:voyage-2voyage-large-2voyage-code-2
  • input_type (str, 可选,默认为None) - 输入文本的类型。默认为None。其他选项:querydocument
  • truncation (bool, 可选,默认为None) - 是否截断输入文本以适应上下文长度
    • 如果为True,超长的输入文本将在被嵌入模型向量化之前被截断以适应上下文长度
    • 如果为False,如果任何给定的文本超过上下文长度,将引发错误
    • 如果未指定(默认为None),如果输入文本略微超过上下文窗口长度,Voyage将在将其发送到嵌入模型之前截断输入文本。如果它显著超过上下文窗口长度,将引发错误
  • encoding_format (str, 可选,默认为None) - 嵌入的编码格式。Voyage目前支持两个选项:
    • 如果未指定(默认为None):嵌入表示为浮点数列表
    • "base64":嵌入被压缩为Base64编码

Voyage嵌入示例

现在我们知道了如何使用Voyage获得嵌入,让我们通过一个简单的例子来看看它的实际应用。

假设我们有一个由六个文档组成的小语料库,用于检索

Python
documents = [
    "The Mediterranean diet emphasizes fish, olive oil, and vegetables, believed to reduce chronic diseases.",
    "Photosynthesis in plants converts light energy into glucose and produces essential oxygen.",
    "20th-century innovations, from radios to smartphones, centered on electronic advancements.",
    "Rivers provide water, irrigation, and habitat for aquatic species, vital for ecosystems.",
    "Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.",
    "Shakespeare's works, like 'Hamlet' and 'A Midsummer Night's Dream,' endure in literature."
]

我们首先使用Voyage将每个文档转换为嵌入向量

Python
import voyageai

vo = voyageai.Client()

# 嵌入文档
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

嵌入将允许我们在向量空间中进行语义搜索/检索。然后,我们可以将一个示例查询,

Python
query = "When is Apple's conference call scheduled?"

转换为嵌入,然后进行最近邻搜索,根据嵌入空间中的距离找到最相关的文档。

Python
import numpy as np

# 嵌入查询
query_embd = vo.embed(
    [query], model="voyage-2", input_type="query"
).embeddings[0]

# 计算相似度
# Voyage嵌入被归一化为长度1,因此点积和余弦相似度是相同的。
similarities = np.dot(doc_embds, query_embd)

retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])

请注意,我们分别使用input_type="document"input_type="query"来嵌入文档和查询。更多规范可以在这里找到。

输出将是第5个文档,它确实与查询最相关:

Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.

可用的Voyage模型

Voyage推荐使用以下嵌入模型:

模型上下文长度嵌入维度描述
voyage-large-2160001536Voyage AI最强大的通用嵌入模型。
voyage-code-2160001536针对代码检索进行了优化(比其他方法好17%),在通用语料库上也是SoTA。有关详细信息,请参阅Voyage的博客文章
voyage-240001024基础通用嵌入模型,在延迟和质量方面都进行了优化。
voyage-lite-02-instruct40001024针对分类、聚类和句子文本相似度任务进行了指令调优,这是该模型唯一推荐的用例。

voyage-2voyage-large-2是通用嵌入模型,在各个领域都实现了最先进的性能,并保持了高效率。voyage-code-2针对代码领域进行了优化,提供4倍的上下文长度,可以更灵活地使用,尽管延迟相对较高。

Voyage正在积极开发更先进、更专业的模型,并提供微调服务,为个别客户定制模型。有关定制模型的更多信息,请发送电子邮件给你的Anthropic客户经理或联系Anthropic支持。

  • voyage-finance-2:即将推出
  • voyage-law-2:即将推出
  • voyage-multilingual-2:即将推出
  • voyage-healthcare-2:即将推出

AWS Marketplace上的Voyage

Voyage嵌入也可在AWS Marketplace上获得。以下是在AWS上访问Voyage的说明:

  1. 订阅模型包
    1. 导航到模型包列表页面并选择要部署的模型
    2. 单击Continue to subscribe按钮
    3. 仔细查看Subscribe to this software页面上的详细信息。如果你同意标准的最终用户许可协议(EULA)、定价和支持条款,请单击”Accept Offer”
    4. 在选择Continue to configuration并选择区域后,你将看到一个Product Arn。这是使用Boto3创建可部署模型所需的模型包ARN
      1. 复制与你选择的区域对应的ARN,并在后续单元格中使用它
  2. 部署模型包

从这里开始,在Sagemaker Studio中创建一个JupyterLab空间,上传Voyage的notebook,并按照其中的说明进行操作。


常见问题

如何计算两个嵌入向量之间的距离?

余弦相似度是一个流行的选择,但大多数距离函数都可以。Voyage嵌入被归一化为长度1,因此余弦相似度本质上与两个向量之间的点积相同。这里是一个代码片段,你可以用它来计算两个嵌入向量之间的余弦相似度。

Python
import numpy

similarity = np.dot(embd1, embd2)
# Voyage嵌入被归一化为长度1,因此余弦相似度与点积相同。

如果你想在大型语料库中找到K个最近的嵌入向量,我们建议使用大多数向量数据库中内置的功能。

我可以在嵌入字符串之前计算其中的令牌数吗?

可以!你可以使用以下代码来实现。

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])

定价

访问Voyage的定价页面以获取最新的定价详情。