在检索增强生成流水线中解析 PDF 文件
本教程将指导您完成基于解析的 PDF 内容创建检索增强生成 (RAG) 流水线的过程。
由于 PDF 文件(例如财务文档)的结构复杂,并且包含文本、图表和表格,因此在 RAG 流水线中使用 PDF 文件可能很困难。本教程介绍了如何将 BigQuery ML 功能与 Document AI 的布局解析器结合使用,根据从 PDF 文件中提取的关键信息构建 RAG 流水线。
或者,您也可以使用 Colab Enterprise 笔记本来完成本教程。
目标
本教程介绍了以下任务:
- 创建 Cloud Storage 存储桶并上传示例 PDF 文件。
- 创建 Cloud 资源连接,以便您从 BigQuery 连接到 Cloud Storage 和 Vertex AI。
- 基于 PDF 文件创建对象表,以便在 BigQuery 中使用该 PDF 文件。
- 创建 Document AI 处理器,以便用于解析 PDF 文件。
- 创建远程模型,以便您使用 Document AI API 从 BigQuery 访问文档处理器。
- 将远程模型与
ML.PROCESS_DOCUMENT
函数结合使用,将 PDF 内容解析为多个分块,然后将这些内容写入 BigQuery 表。 - 从
ML.PROCESS_DOCUMENT
函数返回的 JSON 数据中提取 PDF 内容,然后将该内容写入 BigQuery 表。 - 创建远程模型,以便您从 BigQuery 使用 Vertex AI
text-embedding-004
嵌入生成模型。 - 将远程模型与
ML.GENERATE_EMBEDDING
函数结合使用,以根据解析的 PDF 内容生成嵌入,然后将这些嵌入写入 BigQuery 表。嵌入是 PDF 内容的数值表示法,可让您对 PDF 内容执行语义搜索和检索。 - 对嵌入使用
VECTOR_SEARCH
函数来识别语义上相似的 PDF 内容。 - 创建远程模型,以便您在 BigQuery 中使用 Vertex AI
gemini-1.5-flash
文本生成模型。 - 通过将远程模型与
ML.GENERATE_TEXT
函数结合使用来生成文本,并使用向量搜索结果增强提示输入和改善结果,从而执行检索增强生成 (RAG)。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- BigQuery: You incur costs for the data that you process in BigQuery.
- Vertex AI: You incur costs for calls to Vertex AI models.
- Document AI: You incur costs for calls to the Document AI API.
- Cloud Storage: You incur costs for object storage in Cloud Storage.
您可使用价格计算器根据您的预计使用情况来估算费用。
如需了解详情,请参阅以下价格页面:
准备工作
-
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, Vertex AI, Document AI, and Cloud Storage APIs.
所需的角色
如需创建 Cloud Storage 存储分区和对象,您需要拥有
roles/storage.storageAdmin
角色的成员资格。如需创建 Document AI 处理器,您需要拥有
roles/documentai.editor
角色的成员资格。如需创建关联,您需要拥有
roles/bigquery.connectionAdmin
角色的成员资格。如需向关联的服务账号授予权限,您需要加入
roles/resourcemanager.projectIamAdmin
角色。以下两个角色提供本教程中的其余 BigQuery 操作所需的 IAM 权限:
- BigQuery Data Editor (
roles/bigquery.dataEditor
),用于创建模型、表和索引。 - BigQuery User (
roles/bigquery.user
),用于运行 BigQuery 作业。
- BigQuery Data Editor (
创建数据集
创建 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 已创建或更新它们。
向服务账号授予访问权限
从下列选项中选择一项:
控制台
前往 IAM 和管理页面。
点击
授予访问权限。系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Document AI,然后选择 Document AI Viewer。
点击添加其他角色。
在选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer。
点击添加其他角色。
在选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User。
点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令:
gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/documentai.viewer' --condition=None gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/storage.objectViewer' --condition=None gcloud projects add-iam-policy-binding 'PROJECT_NUMBER' --member='serviceAccount:MEMBER' --role='roles/aiplatform.user' --condition=None
替换以下内容:
PROJECT_NUMBER
:您的项目编号。MEMBER
:您之前复制的服务账号 ID。
将示例 PDF 文件上传到 Cloud Storage
如需将示例 PDF 文件上传到 Cloud Storage,请按以下步骤操作:
- 如需下载
scf23.pdf
示例 PDF 文件,请访问 https://www.federalreserve.gov/publications/files/scf23.pdf,然后点击“下载” 。 - 创建 Cloud Storage 存储桶。
- 将
scf23.pdf
文件上传到存储桶。
创建对象表
基于 Cloud Storage 中的 PDF 文件创建对象表:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE OR REPLACE EXTERNAL TABLE `bqml_tutorial.pdf` WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://BUCKET/scf23.pdf']);
替换以下内容:
LOCATION
:连接位置。CONNECTION_ID
:BigQuery 连接的 ID。当您在 Google Cloud 控制台中查看连接详情时,
CONNECTION_ID
是连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如projects/myproject/locations/connection_location/connections/myconnection
。BUCKET
:包含scf23.pdf
文件的 Cloud Storage 存储桶。完整的uri
选项值应类似于['gs://mybucket/scf23.pdf']
。
创建文档处理器
为文档处理器创建远程模型
创建远程模型以访问 Document AI 处理器:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE OR REPLACE MODEL `bqml_tutorial.parser_model` REMOTE WITH CONNECTION `LOCATION.CONNECTION_ID` OPTIONS(remote_service_type = 'CLOUD_AI_DOCUMENT_V1', document_processor = 'PROCESSOR_ID');
替换以下内容:
将 PDF 文件解析为多个分块
将文档处理器与 ML.PROCESS_DOCUMENT
函数搭配使用,将 PDF 文件解析为多个分块,然后将这些内容写入表中。ML.PROCESS_DOCUMENT
函数会以 JSON 格式返回 PDF 分块。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE or REPLACE TABLE
bqml_tutorial.chunked_pdf
AS ( SELECT * FROM ML.PROCESS_DOCUMENT( MODELbqml_tutorial.parser_model
, TABLEbqml_tutorial.pdf
, PROCESS_OPTIONS => (JSON '{"layout_config": {"chunking_config": {"chunk_size": 250}}}') ) );
将 PDF 分块数据解析到单独的列中
从 ML.PROCESS_DOCUMENT
函数返回的 JSON 数据中提取 PDF 内容和元数据信息,然后将这些内容写入表格:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句以解析 PDF 内容:
CREATE OR REPLACE TABLE
bqml_tutorial.parsed_pdf
AS ( SELECT uri, JSON_EXTRACT_SCALAR(json , '$.chunkId') AS id, JSON_EXTRACT_SCALAR(json , '$.content') AS content, JSON_EXTRACT_SCALAR(json , '$.pageFooters[0].text') AS page_footers_text, JSON_EXTRACT_SCALAR(json , '$.pageSpan.pageStart') AS page_span_start, JSON_EXTRACT_SCALAR(json , '$.pageSpan.pageEnd') AS page_span_end FROMbqml_tutorial.chunked_pdf
, UNNEST(JSON_EXTRACT_ARRAY(ml_process_document_result.chunkedDocument.chunks, '$')) json );在查询编辑器中,运行以下语句以查看解析的 PDF 内容的一部分:
SELECT * FROM `bqml_tutorial.parsed_pdf` ORDER BY id LIMIT 5;
输出类似于以下内容:
+-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+ | uri | id | content | page_footers_text | page_span_start | page_span_end | +-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+ | gs://mybucket/scf23.pdf | c1 | •BOARD OF OF FEDERAL GOVERN NOR RESERVE SYSTEM RESEARCH & ANALYSIS | NULL | 1 | 1 | | gs://mybucket/scf23.pdf | c10 | • In 2022, 20 percent of all families, 14 percent of families in the bottom half of the usual ... | NULL | 8 | 9 | | gs://mybucket/scf23.pdf | c100 | The SCF asks multiple questions intended to capture whether families are credit constrained, ... | NULL | 48 | 48 | | gs://mybucket/scf23.pdf | c101 | Bankruptcy behavior over the past five years is based on a series of retrospective questions ... | NULL | 48 | 48 | | gs://mybucket/scf23.pdf | c102 | # Percentiles of the Distributions of Income and Net Worth | NULL | 48 | 49 | +-----------------------------------+------+------------------------------------------------------------------------------------------------------+-------------------+-----------------+---------------+
创建用于生成嵌入的远程模型
创建表示托管式 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
。
生成嵌入
为解析的 PDF 内容生成嵌入,然后将其写入表中:
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS SELECT * FROM ML.GENERATE_EMBEDDING( MODEL `bqml_tutorial.embedding_model`, TABLE `bqml_tutorial.parsed_pdf` );
运行向量搜索
对解析的 PDF 内容运行向量搜索。
以下查询会接受文本输入,使用 ML.GENERATE_EMBEDDING
函数为该输入创建嵌入,然后使用 VECTOR_SEARCH
函数将输入嵌入与最相似的 PDF 内容嵌入进行匹配。结果是与输入内容在语义上最相似的前 10 个 PDF 数据块。
转到 BigQuery 页面。
在查询编辑器中,运行以下 SQL 语句:
SELECT query.query, base.id AS pdf_chunk_id, base.content, distance 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 'Did the typical family net worth increase? If so, by how much?' AS content) ) ), top_k => 10, OPTIONS => '{"fraction_lists_to_search": 0.01}') ORDER BY distance DESC;
输出类似于以下内容:
+-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | query | pdf_chunk_id | content | distance | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c9 | ## Assets | 0.31113668174119469 | | | | | | | | | The homeownership rate increased slightly between 2019 and 2022, to 66.1 percent. For ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c50 | # Box 3. Net Housing Wealth and Housing Affordability | 0.30973592073929113 | | | | | | | | | For families that own their primary residence ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+ | Did the typical family net worth increase? ,... | c50 | 3 In the 2019 SCF, a small portion of the data collection overlapped with early months of | 0.29270064592817646 | | | | the COVID- ... | | +-------------------------------------------------+--------------+------------------------------------------------------------------------------------------------------+---------------------+
创建用于文本生成的远程模型
创建表示托管式 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
。
生成由矢量搜索结果增强的文本
对嵌入执行向量搜索,以识别在语义上相似的 PDF 内容,然后将 ML.GENERATE_TEXT
函数与向量搜索结果结合使用,以增强提示输入并改进文本生成结果。在本例中,查询会使用 PDF 分块中的信息来回答有关过去十年家庭净资产变化的问题。
在 Google Cloud 控制台中,转到 BigQuery 页面。
在查询编辑器中,运行以下语句:
SELECT ml_generate_text_llm_result AS generated FROM ML.GENERATE_TEXT( MODEL `bqml_tutorial.text_model`, ( SELECT CONCAT( 'Did the typical family net worth change? How does this compare the SCF survey a decade earlier? Be concise and use the following context:', STRING_AGG(FORMAT("context: %s and reference: %s", base.content, base.uri), ',\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 'Did the typical family net worth change? How does this compare the SCF survey a decade earlier?' AS content ) ) ), top_k => 10, OPTIONS => '{"fraction_lists_to_search": 0.01}') ), STRUCT(512 AS max_output_tokens, TRUE AS flatten_json_output) );
输出类似于以下内容:
+-------------------------------------------------------------------------------+ | generated | +-------------------------------------------------------------------------------+ | Between the 2019 and 2022 Survey of Consumer Finances (SCF), real median | | family net worth surged 37 percent to $192,900, and real mean net worth | | increased 23 percent to $1,063,700. This represents the largest three-year | | increase in median net worth in the history of the modern SCF, exceeding the | | next largest by more than double. In contrast, between 2010 and 2013, real | | median net worth decreased 2 percent, and real mean net worth remained | | unchanged. | +-------------------------------------------------------------------------------+
清理
- 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.