在 BigQuery 中执行向量搜索

借助适用于 ABAP 的 BigQuery AI 和 ML SDK,您可以通过基于自然语言的搜索字符串对 BigQuery 中的向量化企业数据执行向量搜索,并从基于 ABAP 的代理或应用返回结果。

借助 BigQuery 向量搜索,您可以使用 GoogleSQL 使用向量索引执行语义搜索,以获取近似结果。借助向量搜索,您可以使用高维向量或嵌入在大型数据集中查找语义相似的数据点。您可以将向量嵌入存储在 BigQuery 中,将 BigQuery 用作向量数据库,并使用 BigQuery 函数 VECTOR_SEARCH 对其进行向量相似性搜索。

准备工作

在将适用于 ABAP 的 BigQuery AI 和 ML SDK 与 Gemini 模型搭配使用之前,请确保您或您的管理员已满足以下前提条件:

价格

适用于 ABAP 的 BigQuery AI 和 ML SDK 可免费使用。不过,您需要为使用 BigQuery 计算价格的 CREATE VECTOR INDEX 语句和 VECTOR_SEARCH 函数支付费用。

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

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

在 BigQuery 上执行向量搜索

本部分介绍了如何使用适用于 ABAP 的 BigQuery AI 和 ML SDK 对 ABAP 应用中存储在 BigQuery 中的企业数据执行向量语义搜索。

实例化 BigQuery 向量搜索调用程序类

如需使用搜索字符串执行向量搜索,您可以实例化类 /GOOG/CL_BQ_VECTOR_SEARCH

TRY.
    DATA(lo_bq_vector_search) = NEW /goog/cl_bq_vector_search( 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 函数 VECTOR_SEARCH 执行向量搜索,请使用类 /GOOG/CL_BQ_VECTOR_SEARCH 的方法 FIND_NEAREST_NEIGHBORS

使用查询设置的类 /GOOG/CL_BQ_QUERY 的对象会作为输入传递给该方法。

lo_bq_vector_search->find_nearest_neighbors( io_query = lo_bq_query ).

LO_BQ_QUERY设置查询后类 /GOOG/CL_BQ_QUERY 的引用。您可以从查询文本中传递搜索字符串。

替换向量搜索参数

您可以在 BigQuery 上保存的查询或传递的查询文本中定义向量搜索参数(在 VECTOR_SEARCH 函数定义下)。但是,如果您需要从 ABAP 应用逻辑替换同一查询的参数,可以使用类 /GOOG/CL_BQ_VECTOR_SEARCHSET_SEARCH_PARAMETERS 方法来执行此操作。初始查询中的搜索参数会完全替换为通过此方法传递的参数。

lo_bq_vector_search->set_search_parameters( iv_top_k            = TOP_K
    iv_distance_type            = DISTANCE_TYPE
    iv_fraction_lists_to_search = 'FRACTION_LISTS_TO_SEARCH' ).

替换以下内容:

  • TOP_KINT64 值,用于指定要返回的最近邻项的数量。
  • DISTANCE_TYPE:一个字符串值,用于指定用于计算两个向量之间距离的指标类型,请从 VECTOR_SEARCH 函数的定义下的 DISTANCE_TYPE 参数中查找可能的值。
  • FRACTION_LISTS_TO_SEARCH:一个字符串值,用于指定要搜索的列表的百分比,在 VECTOR_SEARCH 函数的定义选项下从 FRACTION_LISTS_TO_SEARCH 参数中查找可能的值。

获取向量搜索回答

如需接收 BigQuery ML 对向量搜索查询的处理后的回答,并以有意义的方式进行呈现,请使用类 /GOOG/CL_BQ_SEARCH_RESPONSE

/GOOG/CL_BQ_SEARCH_RESPONSE 类捕获的响应会链接到通过 /GOOG/CL_BQ_VECTOR_SEARCH 类的方法发出的请求,以便您可以在单个语句中直接访问响应,而无需使用变量来存储中间结果。

获取搜索字符串的最近邻项

如需获取搜索字符串的最近邻项,请使用 GET_NEAREST_NEIGHBORS 方法。 返回的邻居项数量取决于在调用的查询中函数 VECTOR_SEARCHTOP_K 参数中指定或设置的值。

DATA(lt_search_response) = lo_bq_vector_search->find_nearest_neighbors( io_query = lo_bq_query
                                             )->get_nearest_neighbors( ).

LT_SEARCH_RESPONSE 还包含搜索响应项与搜索字符串的距离,以指示相似度。

获取搜索字符串的最近邻项

如需获取搜索字符串的最近邻项,请使用 GET_NEAREST_NEIGHBOR 方法。 这样一来,系统只会根据搜索字符串提取最近邻项,而不管在调用的查询中函数 VECTOR_SEARCHTOP_K 参数中指定或设置的值是什么。

DATA(ls_search_response) = lo_bq_vector_search->find_nearest_neighbors( io_query = lo_bq_query
                                             )->get_nearest_neighbor( ).

LS_SEARCH_RESPONSE 还包含搜索响应与搜索字符串的距离,以指示相似度。