执行语义搜索和检索增强生成
本教程将指导您完成创建和使用文本嵌入的端到端流程,包括使用向量索引改善搜索效果。
本教程介绍了以下任务:
- 基于 Vertex AI 嵌入模型创建 BigQuery ML 远程模型。
- 将远程模型与
ML.GENERATE_EMBEDDING
函数结合使用,以根据文本在 BigQuery 表中生成嵌入。 - 创建向量索引以将嵌入编入索引。
- 将
VECTOR_SEARCH
函数与嵌入搭配使用,以搜索类似文本。 - 通过使用
ML.GENERATE_TEXT
函数生成文本,并使用向量搜索结果增强提示输入和改善结果,从而执行检索增强生成 (RAG)。
本教程使用 BigQuery 公共表 patents-public-data.google_patents_research.publications
。
所需的角色和权限
如需创建连接,您需要拥有以下 Identity and Access Management (IAM) 角色的成员资格:
roles/bigquery.connectionAdmin
如需向连接的服务账号授予权限,您需要以下权限:
resourcemanager.projects.setIamPolicy
以下两个角色提供本教程中的其余 BigQuery 操作所需的 IAM 权限:
- BigQuery Data Editor (
roles/bigquery.dataEditor
),用于创建模型、表和索引。 - BigQuery User (
roles/bigquery.user
),用于运行 BigQuery 作业。
- BigQuery Data Editor (
费用
在本文档中,您将使用 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.
您可使用价格计算器根据您的预计使用情况来估算费用。
如需详细了解 BigQuery 价格,请参阅 BigQuery 文档中的 BigQuery 价格。
如需详细了解 Vertex AI 价格,请参阅 Vertex AI 价格页面。
准备工作
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.
创建数据集
创建 BigQuery 数据集以存储您的机器学习模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器窗格中,点击您的项目名称。
点击
查看操作 > 创建数据集。在创建数据集页面上,执行以下操作:
在数据集 ID 部分,输入
bqml_tutorial
。在位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。
公共数据集存储在
US
多区域中。为简单起见,请将数据集存储在同一位置。保持其余默认设置不变,然后点击创建数据集。
创建连接
创建 Cloud 资源连接并获取连接的服务账号。 在与上一步中创建的数据集相同的位置创建连接。
从下列选项中选择一项:
控制台
转到 BigQuery 页面。
如需创建连接,请点击
添加,然后点击与外部数据源的连接。在连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)。
在连接 ID 字段中,输入连接的名称。
点击创建连接。
点击转到连接。
在连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。
bq
在命令行环境中,创建连接:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
--project_id
参数会替换默认项目。替换以下内容:
REGION
:您的连接区域PROJECT_ID
:您的 Google Cloud 项目 IDCONNECTION_ID
:您的连接的 ID
当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。
问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
检索并复制服务账号 ID 以在后续步骤中使用:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
输出类似于以下内容:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
使用 google_bigquery_connection
资源。
如需向 BigQuery 进行身份验证,请设置应用默认凭据。如需了解详情,请参阅为客户端库设置身份验证。
以下示例会在 US
区域中创建一个名为 my_cloud_resource_connection
的 Cloud 资源连接:
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
为服务账号授予访问权限
向连接的服务账号授予 Vertex AI User 角色。您必须在您在准备工作部分创建或选择的项目中授予此角色。在其他项目中授予此角色会导致错误 bqcx-1234567890-xxxx@gcp-sa-bigquery-condel.iam.gserviceaccount.com does not have the permission to access resource
。
如需授予该角色,请按以下步骤操作:
前往 IAM 和管理页面。
点击
授予访问权限。在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User 角色。
点击保存。
创建用于文本嵌入生成的远程模型
创建表示托管式 Vertex AI 文本嵌入生成模型的远程模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'text-embedding-004');
替换以下内容:
LOCATION
:连接位置CONNECTION_ID
:BigQuery 连接的 ID当您在 Google Cloud 控制台中查看连接详情时,
CONNECTION_ID
是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如projects/myproject/locations/connection_location/connections/myconnection
查询需要几秒钟才能完成,之后模型
embedding_model
会显示在探索器窗格的bqml_tutorial
数据集中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
生成文本嵌入
使用 ML.GENERATE_EMBEDDING
函数根据专利摘要生成文本嵌入,然后将其写入 BigQuery 表以供搜索。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
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;
由于 Vertex AI LLM 配额或服务不可用,使用 ML.GENERATE_EMBEDDING
函数生成嵌入可能会失败。错误详情会在 ml_generate_embedding_status
列中返回。ml_generate_embedding_status
列为空表示嵌入生成成功。
如需了解 BigQuery 中的其他文本嵌入生成方法,请参阅“使用预训练的 TensorFlow 模型嵌入文本”教程。
创建矢量索引
如需创建向量索引,请使用 CREATE VECTOR INDEX
数据定义语言 (DDL) 语句:
转到 BigQuery 页面。
在查询编辑器中,运行以下 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}')
验证向量索引创建
向量索引是异步填充的。如需检查索引是否可供使用,您可以查询 INFORMATION_SCHEMA.VECTOR_INDEXES
视图,并验证 coverage_percentage
列值是否大于 0
且 last_refresh_time
列值不是 NULL
。
转到 BigQuery 页面。
在查询编辑器中,运行以下 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
函数搜索与文本查询生成的嵌入匹配的前 5 项相关专利。您在此查询中用于生成嵌入的模型必须与您在要比较的表中用于生成嵌入的模型相同,否则搜索结果将不准确。
转到 BigQuery 页面。
在查询编辑器中,运行以下 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 文本生成模型的远程模型:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE OR REPLACE MODEL `bqml_tutorial.text_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS (ENDPOINT = 'gemini-1.5-flash-002');
替换以下内容:
LOCATION
:连接位置CONNECTION_ID
:BigQuery 连接的 ID当您在 Google Cloud 控制台中查看连接详情时,
CONNECTION_ID
是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如projects/myproject/locations/connection_location/connections/myconnection
查询需要几秒钟才能完成,之后模型
text_model
会显示在探索器窗格的bqml_tutorial
数据集中。由于查询使用CREATE MODEL
语句来创建模型,因此没有查询结果。
生成由矢量搜索结果增强的文本
将搜索结果作为提示提供给 ML.GENERATE_TEXT
函数,以生成文本
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
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... | +------------------------------------------------+------------------------------------------------------------+
清理
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 请尝试学习在检索增强生成流水线中解析 PDF 文件教程,了解如何根据解析的 PDF 内容创建 RAG 流水线。