使用自定义嵌入

如果您已为自己的数据创建了自定义向量嵌入,则可以将其上传到 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. 按照使用 Vertex AI Search 创建引擎并提取数据中针对您的数据类型的说明,提取包含嵌入的文档。

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

更新架构

使用嵌入的键属性映射和维度更新架构 字段。

控制台

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

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

    Agent Builder

  2. 在导航菜单中,点击 Data Stores

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

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

  5. 点击修改按钮。

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

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

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

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

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

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

REST

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

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

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

    例如,以下是一个采用一定格式的 JSON 架构,其中包含 768 个维度 example_embedding_vector:

      {
        "$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,并将其权重设为 0.5 至 relevance_score

    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,指定“示例查询”作为输入矢量, 并将权重值设为 0.5 至 relevance_scoreexample_embedding_field

      "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:搜索结果文档的计算相关性得分。

后续步骤