在檢索增強生成管道中剖析 PDF
本教學課程會引導您逐步瞭解如何根據剖析的 PDF 內容,建立檢索增強生成 (RAG) 管道。
財務文件等 PDF 檔案的結構複雜,且包含文字、圖表和表格,因此在 RAG 管道中使用這些檔案可能會遇到困難。本教學課程將說明如何結合使用 BigQuery ML 功能和 Document AI 的版面配置剖析器,根據從 PDF 檔案擷取的重要資訊,建構 RAG 管道。
您也可以使用 Colab Enterprise 筆記本執行本教學課程。
目標
本教學課程涵蓋下列工作:
- 建立 Cloud Storage 值區並上傳 PDF 範例檔案。
- 建立 雲端資源連線,以便從 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
函式生成文字,並利用向量搜尋結果加強提示輸入內容,進而提升結果。
費用
在本文件中,您會使用 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.
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
詳情請參閱下列定價頁面:
事前準備
-
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 資料編輯器 (
roles/bigquery.dataEditor
),用於建立模型、資料表和索引。 - BigQuery 使用者 (
roles/bigquery.user
),用於執行 BigQuery 工作。
- BigQuery 資料編輯器 (
建立資料集
建立 BigQuery 資料集來儲存機器學習模型。
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,按一下專案名稱。
依序點選
「View actions」(查看動作) >「Create dataset」(建立資料集)。在「Create dataset」頁面上執行下列操作:
在「Dataset ID」(資料集 ID) 中輸入
bqml_tutorial
。在「位置類型」中選取「多區域」,然後選取「美國 (多個美國區域)」。
保留其餘預設設定,然後點選「Create dataset」(建立資料集)。
bq
如要建立新的資料集,請使用 bq mk
指令搭配 --location
旗標。如需可能參數的完整清單,請參閱 bq mk --dataset
指令參考資料。
建立名為
bqml_tutorial
的資料集,並將資料位置設為US
,說明為BigQuery ML tutorial dataset
:bq --location=US mk -d \ --description "BigQuery ML tutorial dataset." \ bqml_tutorial
這個指令採用
-d
捷徑,而不是使用--dataset
旗標。如果您省略-d
和--dataset
,該指令預設會建立資料集。確認資料集已建立:
bq ls
API
請呼叫 datasets.insert
方法,搭配已定義的資料集資源。
{ "datasetReference": { "datasetId": "bqml_tutorial" } }
BigQuery DataFrames
在嘗試這個範例之前,請先參閱 BigQuery 快速入門:使用 BigQuery DataFrames,按照 BigQuery DataFrames 設定說明進行操作。詳情請參閱 BigQuery DataFrames 參考資料說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「為本機開發環境設定 ADC」。
建立連線
建立 Cloud 資源連線,並取得連線的服務帳戶。在相同位置建立連線。
如果您已設定具備適當權限的預設連線,可以略過這個步驟。
為遠端模型建立Cloud 資源連線,並取得連線的服務帳戶。請在與您在上一個步驟中建立的資料集相同的位置建立連線。
選取下列選項之一:
主控台
前往「BigQuery」頁面
在「Explorer」窗格中,按一下
「新增資料」:「Add data」對話方塊隨即開啟。
在「Filter By」窗格中的「Data Source Type」部分,選取「Business Applications」。
或者,您也可以在「Search for data sources」欄位中輸入
Vertex AI
。在「精選資料來源」部分,按一下「Vertex AI」。
按一下「Vertex AI 模型: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 顯示「Apply complete!」(套用完成) 訊息。
- 開啟 Google Cloud 專案即可查看結果。在 Google Cloud 控制台中,前往 UI 中的資源,確認 Terraform 已建立或更新這些資源。
將存取權授予服務帳戶
選取下列選項之一:
主控台
前往「IAM & Admin」(IAM 與管理) 頁面。
按一下
「授予存取權」。系統會開啟「Add principals」對話方塊。
在「新增主體」欄位,輸入先前複製的服務帳戶 ID。
在「請選擇角色」欄位中,依序選取「Document AI」和「Document AI Viewer」。
按一下 [Add another role] (新增其他角色)。
在「Select a role」(請選擇角色) 欄位中,依序選取「Cloud Storage」和「Storage Object Viewer」(Storage 物件檢視者)。
按一下 [Add another role] (新增其他角色)。
在「請選擇角色」欄位中,依序選取「Vertex AI」和「Vertex AI 使用者」。
按一下 [儲存]。
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,請按照下列步驟操作:
- 請前往 https://www.federalreserve.gov/publications/files/scf23.pdf 並點選「下載」 ,即可下載
scf23.pdf
範例 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']
。
建立文件處理器
根據 us
多區域中的版面配置剖析器處理器,建立文件處理器。
為文件處理器建立遠端模型
建立遠端模型來存取 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-005');
更改下列內容:
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 內容嵌入內容比對。結果是與輸入內容最相似的前十個 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.