使用自定义嵌入

如果您已为自己的数据创建了自定义向量嵌入,则可以将其上传到 Vertex AI Search,并在使用 Vertex AI Search 进行查询时使用这些嵌入。

此功能适用于包含通用结构化数据或包含元数据的非结构化数据的数据存储区。此功能不适用于媒体和医疗保健搜索。

默认情况下,Vertex AI Search 会自动生成向量嵌入,无需任何配置。如果您不熟悉如何创建嵌入,Google 建议您让 Vertex AI Search 为您创建和使用嵌入。不过,如果您已为数据创建了自己的嵌入,则可能更愿意使用它们,而不是使用 Vertex AI Search 生成的嵌入,尤其是当您的自定义嵌入包含可丰富搜索检索和排名的其他上下文时。例如:

  • 您的嵌入基于自定义字词进行训练,例如仅在私密文档中显示的组织专用术语,这些术语的语义相似性无法通过使用公开数据进行训练来捕获。
  • 您已为用户个人资料创建嵌入,并希望使用这些嵌入创建个性化且与语义相关的文档排名。您可以使用自己的嵌入来实现基于个性化的排名,这可以增强 Google 的文档嵌入,以实现基于相关性的排名。

如需使用您自己的嵌入,请执行以下操作:

  1. 开始前须知:检查您的嵌入是否符合所有要求
  2. 提取包含嵌入的数据:提取文档及其嵌入
  3. 更新架构:使用关键媒体资源字段和维度规范更新架构
  4. 指定嵌入:全局指定嵌入,或按搜索请求指定嵌入。

准备工作

在开始之前,请确保您的嵌入满足以下要求:

  • 结构化数据和包含元数据的非结构化数据支持嵌入
  • 嵌入必须以一维数组的形式提供
  • 嵌入维度必须介于 1 到 768 之间(包括这两个数值)
  • 系统支持文本和图片嵌入。不支持视频
  • 最多可以将两个字段标记为嵌入键属性字段。对于嵌入的 A/B 测试等用例,您可以使用两个字段
  • 嵌入字段键属性指定目前在设置后无法移除

提取包含嵌入的数据

您可以在文档注入期间,将文档的嵌入数据注入到文档数据或元数据中的一个或两个字段中。

如需注入包含嵌入的数据,请执行以下操作:

  1. 根据数据类型准备数据以进行提取:

    • 结构化数据:准备数据时,请将每个文档的嵌入作为一维数组添加到文档中的一个或两个字段中。您最多可以提供两个嵌入(例如,如果要在嵌入之间进行 A/B 测试)。每个嵌入都必须在文档中提供自己的字段,例如:"example_embedding_vector": [0.1, 0.2, 0.3 ...]

      请按照准备数据以便提取文档中有关准备结构化数据的指南操作。

    • 包含元数据的非结构化数据:准备数据时,请将每个文档的嵌入作为一维数组添加到文档元数据中的字段中。您最多可以提供两个嵌入(例如,在嵌入之间进行 A/B 测试时)。每个嵌入都必须在文档元数据中提供自己的字段,例如:"example_embedding_vector": [0.1, 0.2, 0.3 ...]

      请参阅准备数据以供提取文档,按照其中的说明为您的提取方法(Cloud Storage 或 BigQuery)准备包含元数据的非结构化数据。

  2. 按照使用 Vertex AI Search 创建引擎并注入数据中针对您的数据类型的说明,注入包含嵌入的文档。

接下来,更新架构以使用正确的嵌入字段。

更新架构

使用 Google Cloud 控制台或 API 为嵌入字段更新架构,添加键值对和维度。

控制台

如需使用 Google Cloud 控制台更新架构,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 在导航菜单中,点击数据存储区

  3. 名称列中,点击包含要更新的架构的数据存储区。

  4. 点击 Schema 标签页可查看数据的架构。

  5. 点击修改按钮。

  6. 在架构中找到您的嵌入字段,然后在键属性列中,选择 embedding_vector 作为该字段的键属性。

    如果您有第二个嵌入字段,请对该字段重复此步骤。

  7. 维度列中,输入该嵌入字段的维度数量。

    如果您有第二个嵌入字段,请对该字段重复此步骤。

  8. 点击保存以应用架构更改。

    更新架构后,重新编制索引最长可能需要 24 小时,具体取决于数据存储区的大小。

REST

如需使用 API 更新架构,请按以下步骤操作:

  1. 按照更新架构中的 REST 说明,为每个嵌入字段指定键值对映射和维度数:

    • "keyPropertyMapping": "embedding_vector"
    • "dimension": NUMBER_OF_DIMENSIONS

    例如,下面是一个格式化的 JSON 架构,其中字段 example_embedding_vector 有 768 个维度:

      {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "example_embedding_vector": {
            "type": "array",
            "keyPropertyMapping": 'embedding_vector',
            "dimension": 768,
            "items": {
              "type": "number"
            }
          }
        }
      }
    

    在更新架构请求中,上述格式的 JSON 将作为 JSON 字符串包含在内:

      "jsonSchema": "{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"type\":\"object\",\"properties\":{\"example_embedding_vector\":{\"type\":\"array\",\"keyPropertyMapping\":\"embedding_vector\",\"dimension\":768,\"items\":{\"type\":\"number\"}}}}"
    

    更新架构后,重新编制索引最长可能需要 24 小时,具体取决于数据存储区的大小。

接下来,指定嵌入。

指定嵌入

架构更新的索引编制完成后,您可以发送包含嵌入规范的搜索请求。

您可以通过以下两种方式指定嵌入:

  • 全局指定嵌入:如需为所有搜索请求指定相同的嵌入,请使用 Google Cloud 控制台或 API 更新您的投放设置,以添加嵌入规范。
  • 为每个搜索请求指定嵌入:使用 API 在每个搜索请求中发送 embeddingSpec。这会覆盖全局设置(如果已设置)。

全局指定嵌入

您可以使用 Google Cloud 控制台或 API 为所有搜索请求指定相同的嵌入。

控制台

如需向所有搜索请求提供相同的嵌入规范,请使用嵌入规范更新您的广告投放设置。

  1. 在 Google Cloud 控制台中,前往 Agent Builder 页面。

    Agent Builder

  2. 点击要更新架构的数据存储区对应的查看

  3. 前往配置页面,然后点击投放标签页。

  4. 对于嵌入字段路径,请输入您已映射到嵌入键属性的字段的名称。

  5. 对于排名表达式,输入一个或多个函数来控制结果的排名。系统会根据您输入的表达式对变量进行权重。排名表达式是单个函数或多个函数,以 function, { " + ", function } 格式由 + 连接。

    支持的函数包括:

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    接受以下变量:

    • relevance_score:Vertex AI Search 提供的预定义变量,用于衡量文档的相关性。得分范围为 0 到 1.0(包括这两个数值)。
    • dotProduct():Vertex AI Search 提供的预定义函数。您必须为此函数提供与 embeddingVector.fieldPath 相同的字段名称。

    例如:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)

REST

如需为所有搜索请求提供相同的嵌入规范,请使用 embeddingConfig 更新 servingConfig

  1. 使用要更新的字段修补 servingConfig 实体。使用 updateMask 指定要更新的字段。

    在以下示例中,embeddingConfig 使用字段 example_embedding_field 中的嵌入,并为 relevance_score 分配权重 0.5。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d '{
          "name": "projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search",
          "embeddingConfig": {
            "fieldPath": "example_embedding_field"
          },
          "ranking_expression": "0.5 * relevance_score"
        }' \
    'https://discoveryengine.googleapis.com/v1alpha/projects/PROJECT_ID/locations/LOCATION/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search?updateMask=embeddingConfig,rankingExpression'
    
    • fieldPath:您已映射到嵌入键属性的字段的名称。
    • ranking_expression:控制结果的排名。系统会根据您输入的表达式对变量进行权重。排名表达式是单个函数或多个函数,这些函数采用 function, { " + ", function } 格式并通过 + 联接。

    支持的函数包括:

    • DOUBLE * relevance_score
    • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

    接受以下变量:

    • relevance_score:Vertex AI Search 提供的预定义变量。
    • dotProduct():Vertex AI Search 提供的预定义函数。点积经过标准化处理。您必须为此函数提供与 embeddingVector.fieldPath 相同的字段名称。

    例如:

    • 0.3 * relevance_score
    • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. 发送搜索请求时,系统会自动添加 servingConfig.embeddingConfig

    如果您发送的搜索请求明确包含其他 embeddingSpec,则会替换 servingConfig.embeddingConfig。如需了解如何为单个搜索请求提供嵌入规范,请参阅按请求部分中的说明。

为每个搜索请求指定一个嵌入

您可以使用 API 为单个搜索请求提供嵌入规范。按请求嵌入规范会替换任何全局嵌入规范。

  1. 发送包含 embeddingSpec 的搜索请求。

    以下 embeddingSpec 示例使用字段 example_embedding_field 中的嵌入,将“示例查询”指定为输入矢量,并在计算排名时为 relevance_score 分配权重 0.5,为 example_embedding_field 分配权重 0.3。

      "embeddingSpec": {
        "embeddingVectors": [{
          "fieldPath": "example_embedding_field",
          "vector": [
            0.96241474,
            -0.45999944,
            0.108588696
          ]
        }]
      },
      "ranking_expression": "0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)"
    
    • fieldPath:您已映射到嵌入键属性的字段的名称。
    • vector:作为数组提供的输入矢量。
    • ranking_expression:控制结果的排名。系统会根据您输入的表达式对变量进行权重。排名表达式是单个函数或多个函数,以 function, { " + ", function } 格式由 + 连接。

      支持的函数包括:

      • DOUBLE * relevance_score
      • DOUBLE * dotProduct(EMBEDDING_FIELD_PATH)

      接受以下变量:

      • relevance_score:Vertex AI Search 提供的预定义变量,用于衡量文档的相关性。得分范围为 0 到 1.0(包括这两个数值)。
      • dotProduct():Vertex AI Search 提供的预定义函数。您必须为此函数提供与 embeddingVector.fieldPath 相同的字段名称。

      例如:

      • 0.3 * relevance_score
      • 0.5 * relevance_score + 0.3 * dotProduct(example_embedding_field)
  2. 获取搜索响应中的结果。每个搜索结果都包含其相关性得分和点积积分值。例如:

    "modelScores": {
      "dotProduct(example_embedding_field)": [0.02150772698223591],
      "relevance_score": [ 0.8828125 ]
    }
    
    • dotProduct():搜索结果文档的计算点积。
    • relevance_score:搜索结果文档的计算相关性得分。

后续步骤