在检索增强生成流水线中解析 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.

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

如需了解详情,请参阅以下价格页面:

准备工作

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

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, Vertex AI, Document AI, and Cloud Storage APIs.

    Enable the 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 数据集以存储您的机器学习模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery 页面

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

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

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

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

      创建数据集页面。

创建连接

创建 Cloud 资源连接并获取连接的服务账号。 在同一位置创建连接。

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 如需创建连接,请点击 添加,然后点击与外部数据源的连接

  3. 连接类型列表中,选择 Vertex AI 远程模型、远程函数和 BigLake(Cloud 资源)

  4. 连接 ID 字段中,输入连接的名称。

  5. 点击创建连接

  6. 点击转到连接

  7. 连接信息窗格中,复制服务账号 ID 以在后续步骤中使用。

bq

  1. 在命令行环境中,创建连接:

    bq mk --connection --location=REGION --project_id=PROJECT_ID \
        --connection_type=CLOUD_RESOURCE CONNECTION_ID

    --project_id 参数会替换默认项目。

    替换以下内容:

    • REGION:您的连接区域
    • PROJECT_ID:您的 Google Cloud 项目 ID
    • CONNECTION_ID:您的连接的 ID

    当您创建连接资源时,BigQuery 会创建一个唯一的系统服务账号,并将其与该连接相关联。

    问题排查:如果您收到以下连接错误,请更新 Google Cloud SDK

    Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
    
  2. 检索并复制服务账号 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 资源连接:


# This queries the provider for project information.
data "google_project" "default" {}

# This creates a cloud resource connection in the US region named my_cloud_resource_connection.
# Note: The cloud resource nested object has only one output field - serviceAccountId.
resource "google_bigquery_connection" "default" {
  connection_id = "my_cloud_resource_connection"
  project       = data.google_project.default.project_id
  location      = "US"
  cloud_resource {}
}

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

向服务账号授予访问权限

从下列选项中选择一项:

控制台

  1. 前往 IAM 和管理页面。

    转到“IAM 和管理”

  2. 点击 授予访问权限

    系统随即会打开添加主账号对话框。

  3. 新的主账号字段中,输入您之前复制的服务账号 ID。

  4. 选择角色字段中,选择 Document AI,然后选择 Document AI Viewer

  5. 点击添加其他角色

  6. 选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer

  7. 点击添加其他角色

  8. 选择角色字段中,选择 Vertex AI,然后选择 Vertex AI User

  9. 点击保存

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,请按以下步骤操作:

  1. 如需下载 scf23.pdf 示例 PDF 文件,请访问 https://www.federalreserve.gov/publications/files/scf23.pdf,然后点击“下载”
  2. 创建 Cloud Storage 存储桶
  3. scf23.pdf 文件上传到存储桶。

创建对象表

基于 Cloud Storage 中的 PDF 文件创建对象表:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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']

创建文档处理器

us 多区域中,基于布局解析器处理器创建文档处理器

为文档处理器创建远程模型

创建远程模型以访问 Document AI 处理器:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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');

    替换以下内容:

    • LOCATION:连接位置。
    • CONNECTION_ID:BigQuery 连接的 ID。

      当您在 Google Cloud 控制台中查看连接详情时,CONNECTION_ID连接 ID 中显示的完全限定连接 ID 的最后一部分中的值,例如 projects/myproject/locations/connection_location/connections/myconnection

    • PROCESSOR_ID:文档处理器 ID。 如需查找此值,请查看处理器详情,然后查看基本信息部分中的 ID 行。

将 PDF 文件解析为多个分块

将文档处理器与 ML.PROCESS_DOCUMENT 函数搭配使用,将 PDF 文件解析为多个分块,然后将这些内容写入表中。ML.PROCESS_DOCUMENT 函数会以 JSON 格式返回 PDF 分块。

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    CREATE or REPLACE TABLE bqml_tutorial.chunked_pdf AS (
      SELECT * FROM ML.PROCESS_DOCUMENT(
      MODEL bqml_tutorial.parser_model,
      TABLE bqml_tutorial.pdf,
      PROCESS_OPTIONS => (JSON '{"layout_config": {"chunking_config": {"chunk_size": 250}}}')
      )
    );

将 PDF 分块数据解析到单独的列中

ML.PROCESS_DOCUMENT 函数返回的 JSON 数据中提取 PDF 内容和元数据信息,然后将这些内容写入表格:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,运行以下语句以解析 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
    FROM bqml_tutorial.chunked_pdf, UNNEST(JSON_EXTRACT_ARRAY(ml_process_document_result.chunkedDocument.chunks, '$')) json
    );

  3. 在查询编辑器中,运行以下语句以查看解析的 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 文本嵌入生成模型的远程模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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 内容生成嵌入,然后将其写入表中:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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 数据块。

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,运行以下 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 文本生成模型的远程模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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 分块中的信息来回答有关过去十年家庭净资产变化的问题。

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

    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.                                                                    |
    +-------------------------------------------------------------------------------+
     

清理

  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.