使用自定义嵌入

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

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

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

  • 您的嵌入模型已针对自定义字词进行训练,例如内部术语(如果仅使用公开数据进行训练,则无法捕获这些术语的语义相似性),例如仅出现在私密文档中的组织专用术语。
  • 您已为用户个人资料创建了嵌入,并希望使用这些嵌入来创建个性化且在语义上相关的文档排名。您可以使用自己的嵌入内容来获得基于个性化设置的排名,从而增强 Google 的文档嵌入功能,实现基于相关性的排名。

如需自带嵌入,请执行以下操作:

  1. 准备工作:检查您的嵌入内容是否满足所有要求
  2. 注入包含嵌入的数据:注入包含嵌入的文档
  3. 更新架构:使用关键媒体资源字段和维度规范更新架构
  4. 指定嵌入:您可以全局指定嵌入,也可以按搜索请求指定嵌入。

准备工作

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

  • 支持为结构化数据和包含元数据的非结构化数据生成嵌入内容
  • 嵌入必须以一维数组的形式提供
  • 嵌入维度必须介于 1 到 768 之间(含 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. 按照创建搜索数据存储区中的数据类型说明,注入包含嵌入内容的文档。

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

更新架构

使用 Google Cloud 控制台或 API,通过关键属性映射和维度更新嵌入字段的架构。

控制台

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

  1. 在 Google Cloud 控制台中,前往 AI Applications 页面。

    AI Applications

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

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

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

  5. 点击修改按钮。

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

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

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

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

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

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

REST

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

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

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

    例如,以下是字段 example_embedding_vector 的格式化 JSON 架构,其中包含 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 控制台中,前往 AI Applications 页面。

    AI Applications

  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_scoreexample_embedding_field 分别赋予 0.5 和 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:搜索结果文档的计算相关性得分。

后续步骤