嵌入(Embeddings)是文本字符串的数值表示,表示为浮点数向量。我们可以使用两个文本嵌入之间的距离(通常是余弦相似度)来衡量两个文本在多大程度上相关,距离越小,相关性越高。
比较字符串的相似性,或根据字符串之间的距离对字符串进行聚类,可以实现多种应用,包括搜索(在RAG架构中很常见)、推荐和异常检测。
如何使用Anthropic获取嵌入
Anthropic不提供自己的嵌入模型,但我们已与Voyage AI合作,作为我们首选的文本嵌入提供商。Voyage提供最先进的嵌入模型,甚至提供针对特定行业领域(如金融和医疗保健)定制的模型,以及可以针对贵公司进行微调的模型。
要访问Voyage嵌入,请首先在Voyage AI网站上注册,获取API密钥,并为方便起见将API密钥设置为环境变量:
export VOYAGE_API_KEY="<your secret key>"
您可以通过官方voyageai
Python包或如下所述的HTTP请求来获取嵌入。
Voyage Python包
可以使用以下命令安装voyageai
包:
pip install -U voyageai
然后,您可以创建一个客户端对象,并开始使用它来嵌入您的文本:
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个浮点数。运行上述代码后,两个嵌入将显示在屏幕上:
[0.02012746, 0.01957859, ...] # "Sample text 1"的嵌入
[0.01429677, 0.03077182, ...] # "Sample text 2"的嵌入
创建嵌入时,您可以向embed()
函数指定其他几个参数。这是规范:
voyageai.Client.embed(texts : List[str], model : str = "voyage-2", input_type : Optional[str] = None, truncation : Optional[bool] = None)
- texts (List[str]) - 文本列表,如
["I like cats", "I also like dogs"]
。目前,列表的最大长度为128,对于voyage-2
,列表中的总令牌数最多为320K,对于voyage-code-2
,最多为120K。 - model (str) - 模型名称。推荐选项:
voyage-2
(默认),voyage-code-2
。 -
input_type (str, optional, defaults to
None
) - 输入文本的类型。默认为None
。其他选项:query
、document
。- 当
input_type
设置为None
时,输入文本将直接由我们的嵌入模型进行编码。或者,当输入是文档或查询时,用户可以分别将input_type
指定为query
或document
。在这种情况下,Voyage将在将扩展后的输入发送到嵌入模型之前,在输入文本前添加一个特殊的提示。 - 对于检索/搜索用例,我们建议在编码查询或文档时指定此参数,以提高检索质量。使用和不使用
input_type
参数生成的嵌入是兼容的。
- 当
-
truncation (bool, optional, defaults to
None
) - 是否截断输入文本以适应上下文长度。- 如果为
True
,则会截断过长的输入文本以适应上下文长度,然后再由嵌入模型进行向量化。 - 如果为
False
,则如果任何给定文本超过上下文长度,将引发错误。 - 如果未指定(默认为
None
),Voyage将在将输入文本发送到嵌入模型之前,如果它略微超过上下文窗口长度,则会截断输入文本。如果它显著超过上下文窗口长度,将引发错误。
- 如果为
Voyage HTTP API
您也可以通过请求Voyage HTTP API来获取嵌入。例如,您可以在终端中使用curl
命令发送HTTP请求:
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对象:
{
"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-code-2
,最多为120K。 - model (str) - 模型名称。推荐选项:
voyage-2
(默认),voyage-code-2
。 - input_type (str, optional, defaults to
None
) - 输入文本的类型。默认为None
。其他选项:query
、document
。 - truncation (bool, optional, defaults to
None
) - 是否截断输入文本以适应上下文长度。- 如果为
True
,则会截断过长的输入文本以适应上下文长度,然后再由嵌入模型进行向量化。 - 如果为
False
,则如果任何给定文本超过上下文长度,将引发错误。 - 如果未指定(默认为
None
),Voyage将在将输入文本发送到嵌入模型之前,如果它略微超过上下文窗口长度,则会截断输入文本。如果它显著超过上下文窗口长度,将引发错误。
- 如果为
- encoding_format (str, optional, default to
None
) - 嵌入的编码格式。Voyage目前支持两种选项:- 如果未指定(默认为
None
):嵌入表示为浮点数列表; "base64"
:嵌入被压缩为Base64编码。
- 如果未指定(默认为
AWS Marketplace
Voyage嵌入可在AWS Marketplace上找到。以下是访问AWS上的Voyage的说明:
-
订阅模型包
- 导航到模型包列表页面,然后选择要部署的模型。
- 点击Continue to subscribe按钮。
- 在Subscribe to this software页面上,请仔细阅读详细信息。如果贵组织同意标准最终用户许可协议(EULA)、定价和支持条款,请点击“Accept Offer”。
- 选择Continue to configuration并选择区域后,您将看到一个Product Arn。这是使用Boto3创建可部署模型所需的模型包ARN。复制与您所选区域对应的ARN,并在后续单元格中使用它。
-
部署模型包
从现在开始,我们建议您继续使用我们提供的笔记本,在Sagemaker Studio中进行操作。请创建一个JupyterLab空间,上传我们的笔记本,然后从那里继续。
可用模型
Voyage建议使用以下嵌入模型:
| 模型 | 上下文长度 | 嵌入维度 | 描述 |
模型 | 上下文长度 | 嵌入维度 | 描述 |
---|---|---|---|
voyage-2 |
4000 | 1024 | 最新的基础(通才)嵌入模型,具有最佳的检索质量。有关详细信息,请参阅博客文章。 |
voyage-code-2 |
16000 | 1536 | 针对代码检索进行了优化(比替代方案好17%),并且在通用语料库上也是最先进的。有关详细信息,请参阅博客文章。 |
voyage-2
是一个通才嵌入模型,在各个领域都取得了最先进的性能,并保持了高效率。voyage-code-2
针对代码应用进行了优化,提供了4倍的上下文长度,使用更灵活,但延迟略高。
Voyage正在积极开发更先进和专业的模型,并可以为贵公司微调嵌入。请发送电子邮件至contact@voyageai.com获取试用访问权限或在您自己的数据上进行微调!
voyage-finance-2
:即将推出voyage-law-2
:即将推出voyage-multilingual-2
:即将推出voyage-healthcare-2
:即将推出
激励示例
既然我们知道了如何获取嵌入,让我们来看一个简短的激励示例。
假设我们有一个包含六个文档的小型语料库,用于检索
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将每个文档转换为嵌入向量
import voyageai
vo = voyageai.Client()
# 嵌入文档
doc_embds = vo.embed(
documents, model="voyage-2", input_type="document"
).embeddings
嵌入将使我们能够在向量空间中进行语义搜索/检索。给定一个示例查询,
query = "When is Apple's conference call scheduled?"
我们将其转换为嵌入,并进行最近邻搜索,以根据嵌入空间中的距离找到最相关的文档。
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"
来嵌入文档和查询。更多规范可以在此处找到。
输出将是第五个文档,这确实是与查询最相关的文档:
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.
如果您正在寻找关于如何使用嵌入进行RAG的详细烹饪书集,包括向量数据库,请查看我们的RAG烹饪书。
常见问题解答
如何计算两个嵌入向量之间的距离?
余弦相似度是一个流行的选择,但大多数距离函数都可以。Voyage嵌入已归一化为长度1,因此余弦相似度本质上与两个向量之间的点积相同。以下是一个可用于计算两个嵌入向量之间余弦相似度的代码片段。
import numpy
similarity = np.dot(embd1, embd2)
# Voyage嵌入已归一化为长度1,因此余弦相似度
# 与点积相同。
如果您想在大型语料库中查找K个最近的嵌入向量,我们建议使用大多数向量数据库内置的功能。
嵌入字符串之前可以计算其令牌数吗?
可以!您可以使用以下代码进行操作。
import voyageai
vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])
定价
定价信息可在Voyage网站的定价页面上找到,应在那里查看。