執行語意搜尋和檢索增強生成

在本教學課程中,您將使用遠端模型和 AI.GENERATE_EMBEDDING 函式,在 BigQuery 資料表中生成文字嵌入。接著,您會建立向量索引,為嵌入建立索引,提升搜尋效能。

您可以使用 VECTOR_SEARCH 函式和嵌入項目,搜尋相似文字。向量搜尋是一種技術,可使用嵌入來比較相似的物件。嵌入是高維度數值向量,代表特定實體,例如一段文字。

最後,您會使用 AI.GENERATE_TEXT 函式生成文字,執行檢索增強生成 (RAG)。RAG 是一種 AI 架構,結合資訊檢索系統 (如搜尋和資料庫) 的優勢,以及生成式大型語言模型 (LLM) 的功能。如果將您的資料和世界知識與 LLM 語言技術加以結合,根據基準生成的內容就會更為準確、符合現況,也更切合您的特定需求。

本教學課程使用 Google 專利研究公開資料集中的資料。

目標

  • 在 Gemini Enterprise Agent Platform 嵌入模型上,建立 BigQuery ML 遠端模型。
  • 使用遠端模型和 AI.GENERATE_EMBEDDING 函式,從 BigQuery 資料表中的文字生成嵌入。
  • 建立向量索引,為嵌入建立索引,提高搜尋效能。
  • 使用 VECTOR_SEARCH 函式和嵌入項目,搜尋相似文字。
  • 使用 AI.GENERATE_TEXT 函式生成文字,並運用向量搜尋結果強化提示輸入內容,提升結果品質,藉此執行 RAG。

費用

在本文件中,您將使用下列 Google Cloud計費元件:

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

您可以使用 Pricing Calculator,根據預測用量估算費用。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

詳情請參閱下列定價頁面:

事前準備

  1. 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
    • 建立專案:如要建立專案,您必須具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。

    前往專案選取器

  2. 確認 Google Cloud 專案已啟用計費功能。

  3. 啟用 BigQuery、Cloud Storage 和 Gemini Enterprise Agent Platform API (如有尚未啟用的 API)。

    啟用 API 所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過擁有者角色 (roles/owner) 取得這項權限。否則,您可以透過 Service Usage 管理員角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

必要的角色

如要取得完成本教學課程所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

建立資料集

如要建立 BigQuery 資料集,請選取下列其中一個選項:

控制台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 點選左側窗格中的 「Explorer」。

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。

  3. 在「Explorer」中展開專案,然後按一下「資料集」。

  4. 在「Datasets」(資料集) 頁面,按一下「Create dataset」(建立資料集)。

  5. 在「建立資料集」窗格中,執行下列操作:

    • 在「Dataset ID」(資料集 ID) 中輸入 bqml_tutorial。

    • 在「資料位置」部分,選取「US」。

    其餘預設設定則保持不變。

  6. 點選「建立資料集」。

bq

如要建立新的資料集,請使用 bq mk --dataset 指令。

  1. 建立名為 bqml_tutorial 的資料集,並將資料位置設為 US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. 確認資料集已建立:

    bq ls

API

使用定義的資料集資源呼叫 datasets.insert 方法:

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

建立遠端模型,用於生成文字嵌入

在本節中,您會建立遠端模型,代表託管的 Agent Platform 文字嵌入生成模型。建立模型時,您會使用 DEFAULT 連線呼叫 Text Embeddings API,透過 text-embedding-005 模型取得文字嵌入。如果沒有預設連線,CREATE MODEL 陳述式會為您建立一個。

如要建立文字嵌入模型,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 如要建立模型,請將這個指令貼到查詢編輯器,然後按一下「 執行」:

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

    查詢會在幾秒內完成,之後您就能透過「Explorer」(探索工具) 窗格存取 embedding_model 模型。

    您會收到類似以下的確認訊息:Successfully created model named embedding_model.

生成文字嵌入

使用 AI.GENERATE_EMBEDDING 函式,從專利摘要生成文字嵌入,然後寫入 BigQuery 資料表,以便搜尋。

使用 AI.GENERATE_EMBEDDING 函式生成嵌入時,可能會因 Agent Platform LLM 配額或服務無法使用而失敗。如果失敗,查詢結果的 status 欄會傳回錯誤詳細資料。

如要瞭解 BigQuery 中的其他文字嵌入生成方法,請參閱「使用預先訓練的 TensorFlow 模型嵌入文字」教學課程。

如要生成文字嵌入,請將下列指令貼到查詢編輯器,然後按一下「Run」(執行):

  CREATE OR REPLACE TABLE bqml_tutorial.embeddings AS
  SELECT * FROM AI.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(status) = 0;
  

這項查詢需要幾分鐘才能完成。您會收到類似下方的確認訊息:This statement created a new table named embeddings.

建立向量索引

如果您在嵌入資料欄建立向量索引,對該資料欄執行的向量搜尋會使用近似最鄰近搜尋技術。這項技術可提升向量搜尋效能,並傳回更近似的結果,但喚回度會降低。

如要建立向量索引,請使用 CREATE VECTOR INDEX 資料定義語言 (DDL) 陳述式。如要確認索引是否可用,請查詢 INFORMATION_SCHEMA.VECTOR_INDEXES 檢視表,確認 coverage_percentage 欄值大於 0,且 last_refresh_time 欄值不是 NULL。

如要建立及驗證向量索引,請按照下列步驟操作:

  1. 如要建立向量索引,請將下列指令貼到查詢編輯器,然後點選「Run」(執行):

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

    您會收到類似以下的確認訊息:The vector index creation on table bqml_tutorial.embeddings was initiated. Please query bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES to check the progress of the index.

    建立向量索引通常只需要幾秒鐘。向量索引會以非同步方式填入,這項作業需要兩到三分鐘。

  2. 如要確認索引已可使用,請將下列指令貼到查詢編輯器,然後點選「執行」圖示 :

    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。

    執行查詢後,如果結果中的 index_status 欄顯示索引為 ACTIVE,且 coverage_percentage 值為 100,則表示索引可用。

使用向量索引執行文字相似度搜尋

使用 VECTOR_SEARCH 函式,搜尋與文字查詢生成的嵌入相符的相關專利。

top_k 引數決定要傳回的比對結果數量,在本例中為五。fraction_lists_to_search 選項會決定要搜尋的向量索引清單百分比。您建立的向量索引有 500 個清單,因此 .01 的 fraction_lists_to_search 值表示這項向量搜尋會掃描其中五個清單。如這裡所示,fraction_lists_to_search 值越低,喚回度越低,效能越快。

如要進一步瞭解向量索引清單,請參閱 num_lists 向量索引選項。

在這項查詢中,您用來生成嵌入的模型,必須與用來生成比較資料表嵌入的模型相同,否則搜尋結果會不準確。

如要執行文字相似度搜尋,請將下列指令貼到查詢編輯器,然後點選「Run」(執行):

  SELECT query.query, base.publication_number, base.title, base.abstract
  FROM VECTOR_SEARCH(
    TABLE bqml_tutorial.embeddings, 'embedding',
    (
    SELECT embedding, content AS query
    FROM AI.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...       |
+-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+

建立文字生成遠端模型

如要建立遠端模型,代表託管的 Agent Platform 文字生成模型,請將下列指令貼到查詢編輯器,然後按一下「Run」(執行):

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

您會收到類似以下的確認訊息: Successfully created model named text_model.

生成文字,並以向量搜尋結果強化

將搜尋結果做為提示,使用 AI.GENERATE_TEXT 函式生成文字。

如要擴充向量搜尋結果,請將下列指令貼到查詢編輯器,然後點選「執行」圖示 :

  SELECT result AS generated, prompt
  FROM AI.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, 'embedding',
        (
          SELECT embedding, content AS query
          FROM AI.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));
  

輸出結果會與下列內容相似:

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

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 帳戶收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

或者,如要保留專案並刪除本教學課程中使用的資源,請按照下列步驟操作:

  1. 前往「BigQuery」頁面

    前往「BigQuery」

  2. 在左側窗格中展開專案,然後點選「資料集」。

  3. 在 bqml_tutorial 資料集,依序點按 「Open actions」(開啟動作) >「Delete」(刪除)。

  4. 在「刪除資料集」對話方塊中,點選「刪除」確認操作。

  5. 按一下左側窗格中的「連線」。

  6. 針對 __default_cloudresource_connection__ 連線,依序按一下 「Open actions」(開啟動作) > 「Delete」(刪除)。

  7. 在「Delete connection」(刪除連線) 對話方塊中輸入 delete,然後按一下「Delete」(刪除) 確認操作。

後續步驟