在 BigQuery 中產生及管理嵌入

您可以使用 ABAP 適用的 BigQuery AI 和 ML SDK,在 BigQuery 中產生及管理企業資料的嵌入資料。

BigQuery 可做為具成本效益的向量資料庫,讓您使用向量搜尋功能,直接在資料倉儲中儲存及查詢嵌入資料 (資料的向量表示法),進而減少需要使用個別向量資料庫基礎架構的需求。您可以使用 BigQuery 函式 ML.GENERATE_EMBEDDING,為儲存在 BigQuery 資料集中的企業資料產生嵌入資料。

您可以在 BigQuery ML 中建立遠端模型 (代表 Vertex AI 模型的端點),藉此存取 Vertex AI 上的嵌入模型。在您針對要使用的 Vertex AI 模型建立遠端模型後,即可針對遠端模型執行 BigQuery ML 函式,以便存取該模型的功能。

透過 ABAP 版 BigQuery AI 和 ML SDK,您可以將嵌入模型用於以下用途:

  • 為文字資料產生並儲存嵌入項目
  • 為多模態資料產生及儲存嵌入項目
  • 將最新的企業資料更新至 BigQuery 向量資料庫

事前準備

在使用 ABAP 適用的 BigQuery AI 和 ML SDK 搭配嵌入模型前,請確認您或管理員已完成下列必要條件:

定價

我們提供免費的 ABAP 適用 BigQuery AI 和 ML SDK。不過,您必須負責支付 BigQuery 和 Vertex AI 平台的費用:

  • BigQuery ML:您會因在 BigQuery 中處理的資料而產生費用。
  • Vertex AI:您會因呼叫由遠端模型代表的 Vertex AI 服務而產生費用。

如要根據預測用量產生預估費用,請使用Pricing Calculator

如要進一步瞭解 BigQuery 的定價,請參閱 BigQuery 定價頁面。

如要進一步瞭解 Vertex AI 定價,請參閱 Vertex AI 定價頁面。

在 BigQuery 上產生嵌入

本節說明如何使用 ABAP 專用的 BigQuery AI 和 ML SDK,針對儲存在 BigQuery 中的企業資料,從 ABAP 應用程式邏輯產生嵌入資料。

將 BigQuery 嵌入呼叫器類別例項化

如要在 BigQuery 資料集上叫用嵌入式文字和多模態模型,請將 /GOOG/CL_BQ_GENERATIVE_MODEL 類別例項化。

TRY.
    DATA(lo_bqml_embeddings_model) = NEW /goog/cl_bq_embeddings_model( iv_key = 'CLIENT_KEY' ).
CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

請將 CLIENT_KEY 替換為您在驗證設定期間為驗證設定的用戶端金鑰。 Google Cloud

生成嵌入項目

如要執行查詢,並使用 BigQuery 函式 ML.GENERATE_EMBEDDING 為文字和多模態資料產生嵌入資料,請使用 /GOOG/CL_BQ_EMBEDDINGS_MODEL 類別的 GENERATE_EMBEDDINGS 方法。

使用查詢設定的 /GOOG/CL_BQ_QUERY 類別物件會做為輸入內容傳遞至方法。

lo_bqml_embeddings_model->generate_embeddings( io_query = lo_bq_query ).

LO_BQ_QUERY設定查詢後的 /GOOG/CL_BQ_QUERY 類別參照。

覆寫模型產生參數

您可以在 BigQuery 的已儲存查詢或傳遞的查詢文字中,定義嵌入模型產生參數。不過,如果您需要針對 ABAP 應用程式邏輯中的相同查詢覆寫參數,則可以使用 /GOOG/CL_BQ_EMBEDDINGS_MODEL 類別的 SET_GENERATION_CONFIG 方法。初始查詢中的產生參數會覆寫透過此方法傳遞的參數。

lo_bqml_embeddings_model->set_generation_config( iv_flatten_json_output   = 'IS_FLATTEN_JSON_OUTPUT'
                                 iv_task_type             = 'TASK_TYPE'
         iv_output_dimensionality = 'OUTPUT_DIMENSIONALITY' ).

更改下列內容:

  • IS_FLATTEN_JSON_OUTPUT:布林值,決定函式傳回的 JSON 內容是否會剖析為個別資料欄。
  • TASK_TYPE:指定預期的後端應用程式,以協助模型產生品質更優良的嵌入資料。如要查看 ML.GENERATE_EMBEDDING輸入語法,請參閱 task_type 引數的可能值。
  • OUTPUT_DIMENSIONALITY:這個值會指定產生嵌入資料時要使用的維度數量。如要查看 ML.GENERATE_EMBEDDING輸入語法,請參閱 output_dimensionality 引數的可能值。

取得用於產生嵌入的查詢查詢結果

為了接收 BigQuery ML 產生的回應,以便產生嵌入資料並以有意義的方式呈現,SDK 會在 /GOOG/CL_BQ_GENERATIVE_MODEL 類別中使用鏈結方法,讓您能夠在單一陳述式中直接存取回應,而不需要變數來儲存中間結果。

取得文字嵌入向量

如要取得 ABAP 應用程式邏輯中每個資料列的文字嵌入向量,請使用 GET_TEXT_EMBEDDING_VECTORS 方法。

DATA(lt_embeddings) = lo_bqml_embeddings_model->generate_embeddings( io_query = lo_bq_query
                                             )->get_text_embedding_vectors( ).

取得文字嵌入狀態

如要取得每個資料列的每個文字嵌入產生作業狀態,請使用 GET_TEXT_EMBEDDING_STATUS 方法。

如果作業成功,狀態會為空白。

DATA(lt_embeddings_status) = lo_bqml_embeddings_model->generate_embeddings( io_query = lo_bq_query
                                                    )->get_text_embedding_status( ).

取得查詢工作狀態

每項 BigQuery 查詢都會以查詢工作執行。

如要取得嵌入查詢工作的狀態,請使用 GET_QUERY_JOB_STATUS 方法。

lo_bqml_embeddings_model->generate_embeddings( io_query = lo_bq_query
                       )->get_query_job_status(
IMPORTING ev_job_complete          = DATA(lv_job_complete)
  ev_job_creation_reason   = DATA(lv_job_creation_reason)
  ev_job_id                = DATA(lv_job_id)
  ev_query_id              = DATA(lv_query_id)
  ev_total_bytes_processed = DATA(lv_total_bytes_processed)
  ev_total_rows            = DATA(lv_total_rows) ).

這個方法會傳回下列工作狀態指標:

  • 查詢是否已完成。
  • 建立工作的原因。
  • 用於執行查詢而建立的工作參照。
  • 系統自動產生的查詢 ID。
  • 這項查詢處理的位元組總數。
  • 完整查詢結果集的資料列總數。

取得查詢工作錯誤

如要擷取查詢工作錯誤 (如有),請使用 GET_QUERY_JOB_ERRORS 方法。

DATA(lt_query_job_errors) = lo_bqml_embeddings_model->execute_query( io_query = lo_bq_query
                                                   )->get_query_job_errors( ).

取得文字嵌入的整體回應

如要取得執行的文字嵌入查詢的整體回覆表格,請使用 GET_TEXT_EMBEDDING_RESPONSE 方法。

只有在查詢中將模型產生參數 FLATTEN_JSON_OUTPUT 設為 TRUE 時,才會填入回覆。

DATA(lt_text_embeddings_response) = lo_bqml_embeddings_model->execute_query( io_query = lo_bq_query
                                                           )->get_text_embedding_response( ).