执行语义搜索和检索增强生成

本教程将指导您完成创建和使用文本嵌入以进行语义搜索和检索增强生成 (RAG) 的端到端流程。

本教程介绍了以下任务:

本教程使用 BigQuery 公共表 patents-public-data.google_patents_research.publications

所需的角色

如需运行本教程,您需要拥有以下 Identity and Access Management (IAM) 角色:

  • 创建和使用 BigQuery 数据集、连接和模型:BigQuery Admin (roles/bigquery.admin)。
  • 向连接的服务账号授予权限:Project IAM Admin (roles/resourcemanager.projectIamAdmin)。

这些预定义角色包含执行本文档中的任务所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

  • 创建数据集:bigquery.datasets.create
  • 创建、委托和使用连接:bigquery.connections.*
  • 设置默认连接:bigquery.config.*
  • 设置服务账号权限:resourcemanager.projects.getIamPolicyresourcemanager.projects.setIamPolicy
  • 创建模型并运行推断:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

您也可以使用自定义角色或其他预定义角色来获取这些权限。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

如需根据您的预计使用量来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

如需详细了解 BigQuery 价格,请参阅 BigQuery 文档中的 BigQuery 价格

如需详细了解 Vertex AI 价格,请参阅 Vertex AI 价格页面。

准备工作

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

创建数据集

创建 BigQuery 数据集以存储机器学习模型。

控制台

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

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

  4. 创建数据集 页面上,执行以下操作:

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

    • 保持其余默认设置不变,然后点击创建数据集

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    该命令使用的不是 --dataset 标志,而是 -d 快捷方式。如果省略 -d--dataset,该命令会默认创建一个数据集。

  2. 确认已创建数据集:

    bq ls

API

使用已定义的数据集资源调用 datasets.insert 方法。

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

创建用于文本嵌入生成的远程模型

创建表示托管式 Vertex AI 文本嵌入生成模型的远程模型:

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    查询需要几秒钟才能完成,之后模型 embedding_model 会显示在探索器窗格的 bqml_tutorial 数据集中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

生成文本嵌入

使用 ML.GENERATE_EMBEDDING 函数根据专利摘要生成文本嵌入,然后将其写入 BigQuery 表以供搜索。

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT *, abstract AS content
        FROM `patents-public-data.google_patents_research.publications`
        WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
      )
    )
    WHERE LENGTH(ml_generate_embedding_status) = 0;

此查询大约需要 5 分钟才能完成。

由于 Vertex AI LLM 配额或服务不可用,使用 ML.GENERATE_EMBEDDING 函数生成嵌入可能会失败。错误详情会返回在 ml_generate_embedding_status 列中。如果 ml_generate_embedding_status 列为空,则表示成功生成了嵌入。

如需了解 BigQuery 中的替代文本嵌入生成方法,请参阅《使用预训练的 TensorFlow 模型嵌入文本》教程

创建矢量索引

如果您针对嵌入列创建向量索引,则对该列执行的向量搜索会使用近似最近邻搜索技术。此技术可提高向量搜索性能,但会降低召回率,因此可返回更接近的结果。

如需创建向量索引,请使用 CREATE VECTOR INDEX 数据定义语言 (DDL) 语句:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,运行以下 SQL 语句:

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(ml_generate_embedding_result)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}')

创建向量索引通常只需几秒钟。向量索引还需要再等待 2 到 3 分钟才能填充完毕并可供使用。

验证向量索引就绪情况

向量索引是异步填充的。如需检查索引是否可供使用,您可以查询 INFORMATION_SCHEMA.VECTOR_INDEXES 视图,并验证 coverage_percentage 列值是否大于 0last_refresh_time 列值不是 NULL

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,运行以下 SQL 语句:

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`

    PROJECT_ID 替换为您的项目 ID。

使用向量索引执行文本相似度搜索

使用 VECTOR_SEARCH 函数搜索与文本查询生成的嵌入匹配的相关专利。

top_k 参数决定要返回的匹配项数量,在本例中为 5。fraction_lists_to_search 选项决定要搜索的向量索引列表的百分比。您创建的向量索引包含 500 个列表,因此 fraction_lists_to_search 值为 .01 表示此向量搜索会扫描其中的 5 个列表。如此处所示,较低的 fraction_lists_to_search 值可提供较低的召回率和更快的性能。如需详细了解向量索引列表,请参阅 num_lists 向量索引选项

您在此查询中用于生成嵌入的模型必须与您在要比较的表中用于生成嵌入的模型相同,否则搜索结果将不准确。

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,运行以下 SQL 语句:

    SELECT query.query, base.publication_number, base.title, base.abstract
    FROM VECTOR_SEARCH(
      TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
      (
      SELECT ml_generate_embedding_result, content AS query
      FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT 'improving password security' AS content))
      ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')

    输出类似于以下内容:

    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    |            query            | publication_number |                       title                     |                      abstract                   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    | improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
    | improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
    | improving password security | SG-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
    | improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
    | improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

创建用于文本生成的远程模型

创建表示托管式 Vertex AI 文本生成模型的远程模型:

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    CREATE OR REPLACE MODEL `bqml_tutorial.text_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'gemini-2.0-flash-001');

    查询需要几秒钟才能完成,之后模型 text_model 会显示在探索器窗格的 bqml_tutorial 数据集中。由于查询使用 CREATE MODEL 语句来创建模型,因此没有查询结果。

生成由向量搜索结果增强的文本

将搜索结果作为提示,使用 ML.GENERATE_TEXT 函数生成文本

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

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句:

    SELECT ml_generate_text_llm_result AS generated, prompt
    FROM ML.GENERATE_TEXT(
      MODEL `bqml_tutorial.text_model`,
      (
        SELECT CONCAT(
          'Propose some project ideas to improve user password security using the context below: ',
          STRING_AGG(
            FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
            ',\n')
          ) AS prompt,
        FROM VECTOR_SEARCH(
          TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
          (
            SELECT ml_generate_embedding_result, content AS query
            FROM ML.GENERATE_EMBEDDING(
              MODEL `bqml_tutorial.embedding_model`,
             (SELECT 'improving password security' AS content)
            )
          ),
        top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
      ),
      STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));

    输出类似于以下内容:

    +------------------------------------------------+------------------------------------------------------------+
    |            generated                           | prompt                                                     |
    +------------------------------------------------+------------------------------------------------------------+
    | These patents suggest several project ideas to | Propose some project ideas to improve user password        |
    | improve user password security.  Here are      | security using the context below: patent title: Active     |
    | some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
    | upon:                                          | of adherence to password policy, patent abstract:          |
    |                                                | An active new password entry dialog provides a compact     |
    | **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
    | entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
    | adherence to password policy":**               | applicable password policies is included in the display    |
    |                                                | and updated as new password characters are being...        |
    +------------------------------------------------+------------------------------------------------------------+
     

清理

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

后续步骤