在 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 服务会产生费用。

您可使用价格计算器根据您的预计使用量来估算费用。

如需详细了解 BigQuery 价格,请参阅 BigQuery 价格页面。

如需详细了解 Vertex AI 价格,请参阅 Vertex AI 价格页面。

在 BigQuery 上生成嵌入

本部分介绍了如何使用适用于 ABAP 的 BigQuery AI 和 ML SDK 为 ABAP 应用逻辑中存储在 BigQuery 中的企业数据生成嵌入。

实例化 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( ).