通过编程方式生成文本嵌入

使用嵌入模型和 watsonx.ai 中的文本嵌入API,创建以向量形式呈现的数值表示,这些表示能捕捉句子或段落的含义,供生成式人工智能应用使用。

所需许可权
要将文本矢量化,您必须在项目中拥有管理员编辑角色。
所需凭证
您必须生成凭据才能通过 watsonx.ai 的API进行身份验证。 详情请参阅生成持有人令牌

发展途径

您可以使用以下编程方法对文本进行矢量化,即把文本转换成称为嵌入的文本数字表示:

或者,您也可以使用 watsonx.ai 用户界面的图形工具,在聊天工作流中将文档矢量化,或创建矢量索引。 参见 《与文档和图像对话》 及《 添加矢量化文档》以获取基础模型提示的接地方法

您还可以使用以下第三方平台的 IBM 嵌入模型:

架构概述

将文本转换为文本嵌入或向量化文本有助于文档比较、问答以及检索增强生成(RAG)任务,在这些任务中,您需要快速检索相关内容。

文本嵌入是将句子或段落表示为实数向量的数值化形式。 通过将句子转换为数字向量,句子操作便更像数学方程,这是计算机能够快速且高效完成的任务。

当嵌入模型为句子创建向量表示时,该模型会分配能够捕捉句子语义含义的数值。 嵌入模型还会根据向量被赋予的值,将其定位于多维空间中。 维度空间的大小因模型而异,这意味着精确的向量值也会随之变化。 然而,所有模型都将向量定位为使含义相似的句子彼此更接近。

大多数嵌入模型生成的向量维度极高,从数百到数千维不等,因此无法可视化。 若嵌入模型生成一个三维向量,其形态可能如下所示。 请注意,图中显示的向量值均为虚构,但为帮助说明此假设情景而特意纳入。

一个三维立方体,包含三个数据点,这些数据点分别代表三个句子的嵌入向量

该图显示,具有共同关键词和共同主语的句子其向量值相似,因此在三维空间中彼此更接近。 以下句子根据其向量值进行排序:

  • 那幅德加的复制品挂在书房里
  • 简买了一幅画,画的是狗在玩纸牌。
  • 我带我的狗去散步了

关于艺术品的前两句与最后两句(共享关键词" 狗" )的关联度,比第一句和第三句(二者既无共同词汇也无共同含义)更为紧密。

您可以将生成的向量存储在向量数据库中。 当使用相同的嵌入模型将数据库中的所有句子进行转换时,向量存储库能够基于句子的向量值,利用句子间固有的分组和关联关系,快速返回相关的搜索结果。

与存储文本并依赖关键词检索信息的传统索引不同,向量存储支持语义搜索,能够检索出意义相近的信息。 例如,关键词搜索仅检查关键词是否存在,而语义搜索则会权衡关键词所处的上下文环境,通常能产生更优质的搜索结果。

支持的基金会模型

如需了解 watsonx.ai 中可用的嵌入式型号的详细信息,请参阅支持的编码器型号

要了解哪些嵌入模型可用于编程,请使用 watsonx.ai API 中的 List the available foundation models 方法。 指定 filters=function_embedding 参数,仅返回可用的嵌入模型。

curl -X GET \
  'https://<region>.<cloud-provider-domain>/ml/v1/foundation_model_specs?version=2024-07-25&filters=function_embedding'

REST API

使用 watsonx.ai REST API的文本嵌入方法对文本进行向量化处理。 详情请参阅 watsonx.ai API 参考文档

以下代码片段使用 slate-30m-english-rtrvr 模型将以下两行文本转换为文本嵌入:

  • 基础模型是一种大规模生成式人工智能模型,可适用于各种下游任务。
  • 生成式人工智能(Generative AI)是一类人工智能算法,可以生成各种类型的内容,包括文本、源代码、图像、音频和合成数据。

虽然本例中只提交了两行文本进行转换,但您最多可以指定 1,000 行。 您提交的每行都必须符合嵌入模型定义的最大输入令牌限制。

为了解决排队时间可能变长的情形, truncate_input_tokens 参数用于强制截断排队。 否则,请求可能会失败。 在此示例中,加入 input_text 参数是为了将原文添加到响应中,以便于将原文与每组嵌入值配对。

您可以在嵌入方法的负载中指定要使用的嵌入模型作为 model_id

curl -X POST \
  'https://<region>.<cloud-provider-domain>/ml/v1/text/embeddings?version=2024-05-02' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer eyJraWQiOi...' \
  --data-raw '{
  "inputs": [
    "A foundation model is a large-scale generative AI model that can be adapted to a wide range of downstream tasks.",
    "Generative AI a class of AI algorithms that can produce various types of content including text, source code, imagery, audio, and synthetic data."
  ],
  "parameters":{
    "truncate_input_tokens": 128,
    "return_options":{
      "input_text":true
    }
  },
  "model_id": "ibm/slate-30m-english-rtrvr",
  "project_id": "81966e98-c691-48a2-9bcc-e637a84db410"
}'

虽然在这个示例中,为了提高示例的可读性,每个嵌入值中的 384 个值被缩减为 6 个值,但响应看起来与下面类似:

{
  "model_id": "ibm/slate-30m-english-rtrvr",
  "created_at": "2024-05-02T16:21:56.771Z",
  "results": [
    {
      "embedding": [
        -0.023104044,
        0.05364946,
        0.062400896,
        ...
        0.008527246,
        -0.08910927,
        0.048190728
      ],
      "input": "A foundation model is a large-scale generative AI model that can be adapted to a wide range of downstream tasks."
    },
    {
      "embedding": [
        -0.024285838,
        0.03582272,
        0.008893765,
        ...
        0.0148864435,
        -0.051656704,
        0.012944954
      ],
      "input": "Generative AI a class of AI algorithms that can produce various types of content including text, source code, imagery, audio, and synthetic data."
    }
  ],
  "input_token_count": 57
}

Python

请参见 watsonx.ai Python 库的 Embeddings 类

以下代码片段演示了如何使用 slate-30m-english-rtrvr 模型将以下两行文本转换为文本嵌入:

  • 基础模型是一种大规模生成式人工智能模型,可适用于各种下游任务。
  • 生成式人工智能(Generative AI)是一类人工智能算法,可以生成各种类型的内容,包括文本、源代码、图像、音频和合成数据。
from ibm_watsonx_ai.foundation_models import Embeddings
from ibm_watsonx_ai.metanames import EmbedTextParamsMetaNames as EmbedParams

my_credentials = {
  "url": "https://<region>.ml.cloud.ibm.com",
  "apikey": <my-IBM-Cloud-API-key>,
}

client = APIClient(my_credentials)

model_id = client.foundation_models.EmbeddingModels.SLATE_30M_ENGLISH_RTRVR
gen_parms = None
project_id = <my-project-ID>
space_id = None
verify = False

# Set the truncate_input_tokens to a value that is equal to or less than the maximum allowed tokens for the embedding model that you are using. If you don't specify this value and the input has more tokens than the model can process, an error is generated.

embed_params = {
  EmbedParams.TRUNCATE_INPUT_TOKENS: 128,
  EmbedParams.RETURN_OPTIONS: {
    'input_text': True
  }
}

embedding = Embeddings(
  model_id=model_id,
  credentials=my_credentials,
  params=embed_params,
  project_id=project_id,
  space_id=space_id,
  verify=verify
)

q = [
  "A foundation model is a large-scale generative AI model that can be adapted to a wide range of downstream tasks.",
  "Generative AI a class of AI algorithms that can produce various types of content including text, source code, imagery, audio, and synthetic data."
]

embedding_vectors = embedding.embed_documents(texts=q)

print(embedding_vectors)

请将 {region}, {my-IBM-Cloud-API-key}, 和 {my-project-ID} 替换为适用于您环境的有效值。

样本输出

[
   [-0.0053823674,-0.018807093,0.009131943, ...-0.010469643,0.0010533642,0.020114796], 
   [-0.04075534,-0.041552857,0.04326911, ...0.017616473,-0.010064489,0.020788372]
]

成本

生成文本嵌入的成本以资源单位为计量单位。 费率取决于该型号的计费类别。 有关详细信息,请参阅生成式人工智能资产的计费详情