使用 Vertex AI Vector Search

本文档介绍了如何使用 Vertex AI Vector Search 通过 Vertex AI SDK for ABAP 执行向量相似度搜索。借助 Vector Search,您可以使用高维向量在大型数据集中查找语义相似的数据点。它在图片和文本检索等任务中表现出色,优先考虑的是含义,而不是完全匹配的关键字。

借助 Vector Search,您可以充分利用企业数据的强大功能,提高效率、提升客户体验并获得竞争优势。它可以为您的 SAP 环境带来巨大价值,并提供以下优势:

  • 增强搜索功能:提高搜索结果的准确性和相关性,涵盖大量 SAP 数据,包括分散在不同系统中的结构化和非结构化信息。这有助于更快、更高效地检索相关企业数据。

  • 从非结构化数据中发掘数据洞见:利用 Vector Search 从 SAP 系统中之前未开发的非结构化数据(例如产品数据、客户数据、客户评价、支持工单或内部文档)中提取有价值的洞见。

  • 提升客户体验:通过将 Vector Search 用于产品推荐、智能聊天机器人和其他面向客户的应用,与客户进行个性化和情境感知的互动。

  • 简化业务流程:使用 Vector Search 快速查找相关信息、识别模式并做出数据驱动型决策,从而优化内部流程。

  • 加快创新速度:将 Vector Search 与其他 Vertex AI 功能(例如生成式 AI)结合使用,开发能够推动业务增长的全新创新解决方案。

如何使用 Vertex AI Vector Search

使用 Vector Search 进行语义匹配可以简化为以下步骤:

  1. 生成企业数据的嵌入表示。
  2. 将嵌入上传到 Cloud Storage 存储桶。
  3. 创建向量索引,并将向量索引关联到包含嵌入数据的 Cloud Storage 存储桶。您可以创建两种类型的索引,具体取决于您计划使用最新数据更新索引的方式:

    • 批量索引:如果您要使用在设定的时间内存储的数据(例如每周或每月处理的数据)批量更新索引,则可以使用批量索引。
    • 流式索引:如果您希望在有新数据添加到数据存储区时更新索引数据,则可以使用流式索引。
  4. 创建索引端点并将向量索引部署到该端点,以运行查询来获取建议或结果。索引端点充当接受索引的查询请求的服务器实例。

  5. 使用实体 ID、搜索字符串或嵌入来查询索引端点。

Vertex AI SDK for ABAP 涵盖了 Vertex AI Vector Search 的所有这些方面,以便您在 ABAP 环境中构建 Vertex AI 驱动的 Vector Search 应用。

创建和管理向量索引

本部分介绍了如何使用 Vertex AI SDK for ABAP 创建和管理向量索引。

准备工作

请确保您或您的管理员已满足以下前提条件:

准备嵌入

您需要准备好嵌入。如需了解如何使用 Vertex AI SDK for ABAP 为企业数据生成嵌入,请参阅生成嵌入

将嵌入上传到 Cloud Storage

将嵌入上传到 Cloud Storage 存储桶,以便将嵌入与向量索引相关联。即使您是在 Google Cloud 之外生成嵌入文件,也可以将这些嵌入文件上传到 Cloud Storage 存储桶。

如需了解如何将使用 Vertex AI SDK for ABAP 生成的嵌入式数据发送到 Cloud Storage 存储桶,请参阅将嵌入式数据存储在 Cloud Storage 中

为向量索引实例化类

如需创建和管理向量索引,您可以实例化 /GOOG/CL_VECTOR_INDEX 类。您可以通过传递为身份验证配置的客户端密钥来实例化该类。

DATA(lo_vector_index) = NEW /goog/cl_vector_index( iv_key_name = 'CLIENT_KEY' ).

CLIENT_KEY 替换为为身份验证而配置的客户端密钥。

创建向量索引

如需创建向量索引,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 CREATE_TREE_AH_INDEX 方法。它会根据树 AH 算法创建索引。

lo_vector_index->create_tree_ah_index( iv_display_name                = 'INDEX_NAME'
                                       iv_description                 = 'INDEX_DESCRIPTION'
                                       iv_location_id                 = 'LOCATION_ID'
                                       iv_gcs_content_uri             = 'CONTENT_URI'
                                       iv_dimensions                  = 'DIMENSIONS'
                                       iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                       iv_index_update_method         = 'INDEX_UPDATE_METHOD'
                                       iv_distance_measure_type       = 'DISTANCE_MEASURE_TYPE'
                                       iv_shard_size                  = 'SHARD_SIZE'
                                       iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                       iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH'
                                       iv_etag                        = 'ETAG'
                                       iv_cloud_kms_encryption_key     = 'KEY_FOR_ENCRYPTION' ).

替换以下内容:

  • INDEX_NAME:索引的显示名称。
  • INDEX_DESCRIPTION:索引的说明。
  • LOCATION_ID:您要在其中存储索引的 Google Cloud 区域。如需了解可用位置,请参阅 Vertex AI 位置
  • CONTENT_URI:包含用于构建索引的嵌入数据的 Cloud Storage 存储桶的 URI。
  • DIMENSIONS:输入向量的维度数。
  • NEIGHBORS_COUNT:在执行重新排序之前通过近似搜索找到的相邻项的数量。
  • INDEX_UPDATE_METHOD:索引的更新模式:BATCH_UPDATESTREAM_UPDATE
  • DISTANCE_MEASURE_TYPE:确定用于计算数据点与查询向量之间的距离的算法。如需了解详情,请参阅距离测量类型
  • SHARD_SIZE:每个分片的大小。如果索引很大,系统会根据指定的碎片大小对其进行分片。在传送期间,每个分片都会在单独的节点上传送,并且可以独立扩缩。
  • LEAF_NODE_EMBEDDING_COUNT:每个叶节点上的嵌入数量。如果未设置,默认值为 1000
  • LEAF_NODE_TO_SEARCH:所有查询均可搜索的叶节点的默认百分比。必须在 1-100 之间(含 1 和 100)。 如果未设置,则默认值为 10(即 10%)。
  • ETAG:用于执行一致的读取-修改-写入更新的 ETag 值。
  • KEY_FOR_ENCRYPTION:客户管理的加密密钥的 Cloud KMS 资源标识符。

创建向量索引端点

如需创建向量索引端点,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 CREATE_INDEX_ENDPOINT 方法。

lo_vector_index->create_index_endpoint( iv_display_name             = 'INDEX_ENDPOINT_NAME'
                                        iv_description              = 'INDEX_ENDPOINT_DESCRIPTION'
                                        iv_location_id              = 'LOCATION_ID'
                                        iv_public_endpoint_enabled  = 'ENABLE_PUBLIC_ENDPOINT'
                                        iv_etag                     = 'ETAG'
                                        iv_cloud_kms_encryption_key = 'KEY_FOR_ENCRYPTION' ).

替换以下内容:

  • INDEX_ENDPOINT_NAME:索引端点的显示名称。
  • INDEX_ENDPOINT_DESCRIPTION:索引端点的说明。
  • LOCATION_ID:您要创建索引端点的 Google Cloud 区域。如需了解可用位置,请参阅 Vertex AI 位置
  • ENABLE_PUBLIC_ENDPOINT:如果可以通过公共端点访问已部署的索引,请将此参数值设置为 ABAP_TRUE
  • ETAG:用于执行一致的读取-修改-写入更新的 ETag 值。
  • KEY_FOR_ENCRYPTION:客户管理的加密密钥的 Cloud KMS 资源标识符。

将向量索引部署到索引端点

如需将向量索引部署到索引端点,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 DEPLOY_INDEX 方法。

lo_vector_index->deploy_index( iv_deployed_index_id     = 'DEPLOYMENT_ID'
                               iv_location_id           = 'LOCATION_ID'
                               iv_index_id              = 'INDEX_ID'
                               iv_index_endpoint_id     = 'INDEX_ENDPOINT_ID>'
                               iv_min_replica_count     = 'MIN_REPLICA_COUNT'
                               iv_max_replica_count     = 'MAX_REPLICA_COUNT'
                               iv_enable_access_logging = 'ENABLE_ACCESS_LOGGING'
                               iv_deployment_group      = 'DEPLOYMENT_GROUP' ).

替换以下内容:

  • DEPLOYMENT_ID:索引部署的 ID。
  • LOCATION_ID:您要部署索引的 Google Cloud 区域。如需了解可用位置,请参阅 Vertex AI 位置
  • INDEX_ID:索引的资源名称。
  • INDEX_ENDPOINT_ID:要部署到的索引端点的资源名称。
  • MIN_REPLICA_COUNT:已部署模型的机器副本数量下限。
  • MAX_REPLICA_COUNT:已部署模型的机器副本数量上限。
  • ENABLE_ACCESS_LOGGING:如需将专用端点的访问日志发送到 Cloud Logging,请将此参数值设置为 ABAP_TRUE
  • DEPLOYMENT_GROUP:部署组的名称,例如 testprod

更新和重建向量索引

为了为企业 AI 解决方案获得最准确的 Vector Search 结果,您还需要使用最新的企业数据更新索引。

更新批量索引

如需使用 Cloud Storage 存储桶中存在的更新信息更新批量索引,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 PATCH_TREE_AH_INDEX 方法。

lo_vector_index->patch_tree_ah_index( iv_index_id              = 'INDEX_ID'
                                      iv_gcs_content_uri       = 'CONTENT_URI'
                                      iv_location_id           = 'LOCATION_ID'
                                      iv_is_complete_overwrite = 'IS_COMPLETE_OVERWRITE' ).

替换以下内容:

  • INDEX_ID:索引的资源名称。
  • CONTENT_URI:包含最新企业数据的嵌入 Cloud Storage 存储桶的 URI。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • IS_COMPLETE_OVERWRITE:如需使用指定 Cloud Storage 存储桶中的数据完全覆盖索引,请将此参数值设置为 ABAP_TRUE

您可以使用以下示例架构流程,通过 SAP 数据更新批量索引:

  • 通过 SAP 后台作业,使用 /GOOG/CL_STORAGE_V1 类为 Cloud Storage 存储桶更新最新数据的嵌入。对于非 SAP 数据,也可以通过 SAP 以外的流程来完成此操作。
  • 通过 SAP 中的后台作业使用 /GOOG/CL_VECTOR_INDEX 类的 PATCH_TREE_AH_INDEX 方法触发批量索引更新,以一定的频率运行。

更新流索引

如需为流索引的数据点更新或插入信息,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 UPSERT_DATAPOINTS 方法。

lo_vector_index->upsert_datapoints( iv_index_id     = 'INDEX_ID'
                                    iv_location_id  = 'LOCATION_ID'
                                    iv_datapoint_id = 'ENTITY_ID'
                                    it_embeddings   = 'EMBEDDINGS' ).

替换以下内容:

  • INDEX_ID:索引的资源名称。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • ENTITY_ID:要进行插入/更新操作的实体 ID。
  • EMBEDDINGS:要为数据点进行插入/更新的嵌入。

如需从流式索引中移除数据点的信息,您可以使用 /GOOG/CL_VECTOR_INDEX 类的 REMOVE_DATAPOINTS 方法。

lo_vector_index->remove_datapoints( iv_index_id     = 'INDEX_ID'
                                    iv_location_id  = 'LOCATION_ID'
                                    iv_datapoint_id = 'ENTITY_ID' ).

替换以下内容:

  • INDEX_ID:索引的资源名称。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • ENTITY_ID:要移除的实体 ID。

系统会针对索引实时执行插入/更新/替换操作和移除操作。

您可以使用以下示例架构流程,通过 SAP 数据更新流索引:

  • 确定企业 SAP 解决方案中的占位符,例如 BADI、出口、增强功能和自定义 SAP 逻辑,这些都是 SAP 数据更改的要点。
  • 使用已标识的占位符中的 /GOOG/CL_VECTOR_INDEX 类的 UPSERT_DATAPOINTSREMOVE_DATAPOINTS 方法,从流索引中触发对 SAP 数据的插入/更新/删除操作。

获取向量索引操作的状态

Google Cloud 会执行以下长时间运行的操作:创建向量索引和索引端点、将索引部署到索引端点或更新向量批量索引。

为了确定长时间运行的操作 ID、Vertex AI 制品的资源 ID 和错误消息,SDK 提供了 /GOOG/CL_VECTORINDEX_RESPONSE 类。

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

获取长时间运行的操作 ID

如需获取每个Vector Search任务的长时间运行操作 ID,您可以使用 /GOOG/CL_VECTORINDEX_RESPONSE 类的 GET_LRO 方法。执行任务后,您可以使用同一实例调用 GET_LRO 方法,以获取相应的长时间运行操作 ID。

以下代码示例说明了如何获取批量索引更新任务的长时间运行操作 ID:

DATA(lv_patch_index_lro) = lo_vector_index->patch_tree_ah_index(
                                              iv_index_id              = 'INDEX_ID'
                                              iv_gcs_content_uri       = 'CONTENT_URI'
                                              iv_location_id           = 'LOCATION_ID'
                                              iv_is_complete_overwrite = 'IS_COMPLETE_OVERWRITE'
                                         )->get_lro( ).

替换以下内容:

  • INDEX_ID:索引的资源名称。
  • CONTENT_URI:包含最新企业数据的嵌入 Cloud Storage 存储桶的 URI。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • IS_COMPLETE_OVERWRITE:如需使用指定 Cloud Storage 存储桶中的数据完全覆盖索引,请将此参数值设置为 ABAP_TRUE

获取长时间运行的操作的状态

每个长时间运行的操作都有一个关联的状态。如需验证是否已成功调度作为长时间运行的操作的任务,您可以检查操作的状态。

如需确定或持续监控任何 Vertex AI 相关任务的长时间运行操作的状态,您可以使用 /GOOG/CL_VERTEX_AI_SDK_UTILITY 类的 GET_LRO_STATUS 方法。

/goog/cl_vertex_ai_sdk_utility=>get_lro_status(
    EXPORTING
        iv_key           = 'CLIENY_KEY'
        iv_operations_id = 'LONG_RUNNING_OPERATION_ID'
        iv_location_id   = 'LOCATION_ID'
    IMPORTING
        ev_is_done       = DATA(lv_is_done)          "Is the long-running operation complete
        ev_is_successful = DATA(lv_is_successful)    "Is the long-running operation successful
        ev_error_code    = DATA(lv_error_code)       "Error code in the long-running operation in case of errors
        ev_error_message = DATA(lv_error_message) ). "Error message in the long-running operation in case of errors

替换以下内容:

  • CLIENY_KEY:用于身份验证的客户端密钥。
  • LONG_RUNNING_OPERATION_ID:长时间运行的操作 ID。
  • LOCATION_ID:索引的 Google Cloud 区域。

获取 Vertex AI 制品的资源 ID

如需确定已创建索引的资源 ID、已创建索引端点、已部署索引、触发补丁的索引 ID,您可以使用 /GOOG/CL_VECTORINDEX_RESPONSE 类的 GET_ID 方法。

执行任务后,您可以使用同一实例调用 GET_ID 方法以获取相应的资源 ID。

以下代码示例说明了如何在调用 /GOOG/CL_VECTOR_INDEX 类的 CREATE_TREE_AH_INDEX 方法后获取所创建索引的 ID:

DATA(lv_id) = lo_vector_index->create_tree_ah_index(
                                 iv_display_name                = 'INDEX_NAME'
                                 iv_location_id                 = 'LOCATION_ID'
                                 iv_gcs_content_uri             = 'CONTENT_URI'
                                 iv_dimensions                  = 'DIMENSIONS'
                                 iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                 iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                 iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH'
                            )->get_id( ).

替换以下内容:

  • INDEX_NAME:索引的显示名称。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • CONTENT_URI:包含用于构建索引的嵌入数据的 Cloud Storage 存储桶的 URI。
  • DIMENSIONS:输入向量的维度数。
  • NEIGHBORS_COUNT:在执行重新排序之前通过近似搜索找到的相邻项。
  • LEAF_NODE_EMBEDDING_COUNT:每个叶节点上的嵌入数量。如果未设置,默认值为 1000
  • LEAF_NODE_TO_SEARCH:所有查询均可搜索的叶节点的默认百分比。必须在 1-100 之间(含 1 和 100)。 如果未设置,则默认值为 10(即 10%)。

获取错误代码和错误消息

通过 Vertex AI SDK for ABAP 触发向量索引任务时可能会出错。

如需在触发任务后分别获取错误代码和错误消息(如果有),您可以使用“/GOOG/CL_VECTORINDEX_RESPONSE”类的 GET_ERROR_CODEGET_ERROR_MESSAGE 方法。

执行任务后,您可以使用同一实例调用 GET_ERROR_CODEGET_ERROR_MESSAGE 方法,以获取相应的错误代码或错误消息。

以下代码示例演示了如何在索引创建失败时显示错误代码和错误消息:

DATA(lo_vectorindex_response) = lo_vector_index->create_tree_ah_index(
                                                   iv_display_name                = 'INDEX_NAME'
                                                   iv_location_id                 = 'LOCATION_ID'
                                                   iv_gcs_content_uri             = 'CONTENT_URI'
                                                   iv_dimensions                  = 'DIMENSIONS'
                                                   iv_approximate_neighbors_count = 'NEIGHBORS_COUNT'
                                                   iv_leaf_node_embedding_count   = 'LEAF_NODE_EMBEDDING_COUNT'
                                                   iv_leaf_nodes_to_search        = 'LEAF_NODE_TO_SEARCH' ).
IF lo_vectorindex_response->get_error_code( ) IS NOT INITIAL.
  cl_demo_output=>display( 'Error Code-' && lo_vectorindex_response->get_error_code( ) &&
                           'Error Message-' && lo_vectorindex_response->get_error_message( ) ).
ENDIF.

替换以下内容:

  • INDEX_NAME:索引的显示名称。
  • LOCATION_ID:索引的 Google Cloud 区域。
  • CONTENT_URI:包含用于构建索引的嵌入数据的 Cloud Storage 存储桶的 URI。
  • DIMENSIONS:输入向量的维度数。
  • NEIGHBORS_COUNT:在执行重新排序之前通过近似搜索找到的相邻项。
  • LEAF_NODE_EMBEDDING_COUNT:每个叶节点上的嵌入数量。如果未设置,默认值为 1000
  • LEAF_NODE_TO_SEARCH:所有查询均可搜索的叶节点的默认百分比。必须在 1-100 之间(含 1 和 100)。 如果未设置,则默认值为 10(即 10%)。

搜索最近邻

本部分介绍了如何使用 Vertex AI SDK for ABAP 搜索最近邻。

准备工作

请确保您或您的管理员已满足以下前提条件:

创建 RFC 目标

您需要为已部署索引的索引端点创建 RFC 目标,该索引包含以嵌入文件形式的企业数据。

  1. 检索索引端点的主机名:

    1. 在 SAP GUI 中,执行事务代码 /GOOG/SDK_IMG

      或者,执行事务代码 SPRO,然后点击 SAP Reference IMG

    2. 点击 ABAP SDK for Google Cloud > 实用程序 > Vertex AI SDK:获取 Feature Store 和 Vector Search 的 RFC 信息
    3. 选择获取 Vector Search 详细信息
    4. 从下列选项中选择一项:

      • 搜索键
      • 向量索引端点 ID
    5. 如果您选择了搜索键选项,请输入搜索键,该键在 Vector Search 参数中进行配置。

    6. 如果您选择了向量索引端点 ID 选项,请输入以下参数:

      • Google Cloud 密钥名称:用于向 Google Cloud 进行身份验证的客户端密钥。
      • 位置:索引端点所在的区域。
      • 索引端点 ID:索引端点的名称。
    7. 点击执行以查看详细信息。 记下对应的主机标签。

  2. 为索引端点创建 RFC 目标:

    1. 在 SAP GUI 中,执行事务代码 SM59

    2. 创建新的 RFC 目标。对于您创建的 RFC 目标,请确保按如下方式设置连接类型G - HTTP connection to external server

    3. 转到技术设置标签页,然后输入以下详细信息:

      • 目标主机:提供索引端点的主机名。

      • 服务编号:输入 443。 此端口号用于安全通信。

    4. 进入 Logon & Security(登录和安全)并确保 SSL Certificate(SSL 证书)字段设置了选项 DFAULT SSL Client (Standard)(默认 SSL 客户端[标准])。

    5. 保存更改。

  3. 为 Vertex AI API 配置服务映射表:

    1. 在 SAP GUI 中,执行事务代码 /GOOG/SDK_IMG

      或者,执行事务代码 SPRO,然后点击 SAP Reference IMG

    2. 点击 ABAP SDK for Google Cloud > 基本设置 > 配置服务映射

    3. 点击新建条目

    4. 为 Vertex AI API 指定 RFC 目标:

      名称 服务名称 RFC 目标
      用于身份验证的客户端密钥。 apiinvoker:v1 RFC 目标的名称。
    5. 保存新条目。

如需调用 Vector Search,您可以实例化 /GOOG/CL_VECTOR_SEARCH 类。您可以通过传递搜索键(在 Vector Search 参数中进行配置)来实例化该类。

DATA(lo_vector_search) = NEW /goog/cl_vector_search( iv_search_name = 'SEARCH_KEY' ).

SEARCH_KEY 替换为搜索键,该键在 Vector Search 参数中进行配置。

使用实体 ID 进行搜索

如需查询特定实体 ID 的向量索引,您可以使用 /GOOG/CL_VECTOR_SEARCH 类的 FIND_NEIGHBORS_BY_ENTITY_ID 方法。实体 ID 对应于存储在向量索引中的数据点。

lo_vector_search->find_neighbors_by_entity_id( iv_entity_id             = 'ENTITY_ID'
                                               iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                               iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).

替换以下内容:

  • ENTITY_ID:要搜索的实体 ID。
  • NEIGHBOR_COUNT:要为查询检索的最近邻的数量。
  • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE

使用搜索字符串进行搜索

如需针对搜索字符串查询向量索引,您可以使用 /GOOG/CL_VECTOR_SEARCH 类的 FIND_NEIGHBORS_BY_STRING 方法。

SDK 会先将搜索字符串转换为嵌入,然后检索查询的最近邻。

DATA(lo_response) = lo_vector_search->find_neighbors_by_string(
                                        iv_search_string         = 'SEARCH_STRING'
                                        iv_embeddings_model_key  = 'MODEL_KEY'
                                        iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                        iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).

替换以下内容:

  • SEARCH_STRING:输入搜索字符串。
  • MODEL_KEY:用于生成嵌入的模型键,在模型生成参数中进行配置。
  • NEIGHBOR_COUNT:要针对查询检索的最近邻的数量。
  • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE

使用嵌入进行搜索

如需查询与嵌入式对象相关的向量索引,您可以使用 /GOOG/CL_VECTOR_SEARCH 类的 FIND_NEIGHBORS_BY_EMBEDDING 方法。

DATA(lo_response) = lo_vector_search->find_neighbors_by_embeddings(
                                        iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                        iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                        it_embeddings            = 'EMBEDDINGS' ).

替换以下内容:

  • NEIGHBOR_COUNT:要针对查询检索的最近邻的数量。
  • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE
  • EMBEDDINGS:输入嵌入。

获取搜索响应

为了从模型接收经过处理的响应并以有意义的方式呈现这些响应,SDK 提供了 ABAP 类 /GOOG/CL_VECTORSEARCH_RESPONSE

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

获取搜索查询的最近邻项

如需确定针对执行的搜索查询找到的与数据点、搜索字符串或嵌入的最近邻,您可以使用类 /GOOG/CL_VECTORSEARCH_RESPONSEGET_NEAREST_NEIGHBORGET_NEAREST_NEIGHBORS 方法。

在执行搜索查询后,可以使用类 /GOOG/CL_VECTOR_SEARCH 的方法 FIND_NEIGHBORS_BY_STRINGFIND_NEIGHBORS_BY_EMBEDDINGFIND_NEIGHBORS_BY_ENTITY_ID 以链式方式调用这些方法。

  • 如需获取与搜索的数据点、字符串或嵌入最接近的最近邻,请调用 GET_NEAREST_NEIGHBOR 方法。此方法的响应会列出最近的数据点的 ID、与搜索查询的距离以及索引中与其关联的特征向量。

    以下代码示例展示了如何获取搜索字符串的最近邻:

    DATA(ls_nearest_neighbor) = lo_vector_search->find_neighbors_by_string(
                                                    iv_search_string         = 'SEARCH_STRING'
                                                    iv_embeddings_model_key  = 'MODEL_KEY'
                                                    iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                    iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                               )->get_nearest_neighbor( ).
    

    替换以下内容:

    • SEARCH_STRING:输入搜索字符串。
    • MODEL_KEY:用于生成嵌入的模型键,在模型生成参数中进行配置。
    • NEIGHBOR_COUNT:要为查询检索的最近邻的数量。
    • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE
  • 如需获取与搜索的数据点、字符串或嵌入最接近的一组最近邻,请调用 GET_NEAREST_NEIGHBORS 方法。此方法的响应是一个包含最近数据点的表格,其中列出了数据点 ID、与搜索查询的距离以及在索引中与其关联的特征向量。

    以下代码示例演示了如何获取搜索字符串的最近邻:

    DATA(lt_nearest_neighbors) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT'
                                                )->get_nearest_neighbors( ).
    

    替换以下内容:

    • SEARCH_STRING:输入搜索字符串。
    • MODEL_KEY:用于生成嵌入的模型键,在模型生成参数中进行配置。
    • NEIGHBOR_COUNT:要针对查询检索的最近邻的数量。
    • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE

获取提取的邻居的距离

如需确定提取的响应与搜索查询的距离,您可以使用 /GOOG/CL_VECTORSEARCH_RESPONSE 类的 GET_DATAPOINT_DISTANCE 方法。

搜索响应中的距离表示查询(字符串、嵌入或实体 ID)与检索结果向量之间的差异度。距离的具体含义取决于创建索引时使用的“距离衡量方式”。

距离值可帮助您了解每个搜索结果与您的查询的相关程度。距离较小的结果通常被认为更相似或更相关,而距离较大的结果则不太相似或不太相关。

以下代码示例演示了如何获取搜索字符串的最近邻距离:

DATA(lo_vectorsearch_response) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).
DATA(ls_nearest_neighbor) = lo_vectorsearch_response->get_nearest_neighbor( ).
DATA(lv_distance) = lo_vectorsearch_response->get_datapoint_distance( iv_datapoint_id = ls_nearest_neighbor-datapoint_id ).

替换以下内容:

  • SEARCH_STRING:输入搜索字符串。
  • MODEL_KEY:用于生成嵌入的模型键,在模型生成参数中进行配置。
  • NEIGHBOR_COUNT:要针对查询检索的最近邻的数量。
  • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE

获取提取的邻居的嵌入向量

如需确定从搜索查询中提取的响应的嵌入向量,您可以使用 /GOOG/CL_VECTORSEARCH_RESPONSE 类的 GET_DATAPOINT_FEATURE_VECTOR 方法。

如需获取嵌入向量,必须将 FIND_NEIGHBORS_BY_STRINGFIND_NEIGHBORS_BY_EMBEDDINGFIND_NEIGHBORS_BY_ENTITY_ID 方法的 IV_RETURN_FULL_DATAPOINT 参数设置为 ABAP_TRUE

以下代码示例演示了如何获取搜索字符串的最近邻的功能向量:

DATA(lo_vectorsearch_response) = lo_vector_search->find_neighbors_by_string(
                                                     iv_search_string         = 'SEARCH_STRING'
                                                     iv_embeddings_model_key  = 'MODEL_KEY'
                                                     iv_neighbor_count        = 'NEIGHBOR_COUNT'
                                                     iv_return_full_datapoint = 'RETURN_FULL_DATAPOINT' ).
DATA(ls_nearest_neighbor) = lo_vectorsearch_response->get_nearest_neighbor( ).
DATA(lt_feature_vector) = lo_vectorsearch_response->get_datapoint_feature_vector( iv_datapoint_id = ls_nearest_neighbor-datapoint_id ).

替换以下内容:

  • SEARCH_STRING:输入搜索字符串。
  • MODEL_KEY:用于生成嵌入的模型键,在模型生成参数中进行配置。
  • NEIGHBOR_COUNT:要针对查询检索的最近邻的数量。
  • RETURN_FULL_DATAPOINT:如需返回检索的数据点的向量嵌入,请将此参数值设置为 ABAP_TRUE

后续步骤