Amazon Kendra 自我管理的智慧排名 OpenSearch - Amazon Kendra

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon Kendra 自我管理的智慧排名 OpenSearch

您可以利用 Amazon Kendra語意搜尋功能來改善以 Apache 2.0 授權為基礎的自我管理開放原始碼搜尋服務的搜尋結果。OpenSearch Amazon Kendra 智能排名插件在語義上使用重新排名 OpenSearch的結果。 Amazon Kendra它透過使用預設 OpenSearch 搜尋結果中的特定欄位 (例如文件內文或標題) 瞭解搜尋查詢的意義和前後關聯來達成此目的。

以此查詢為例:「主要主題演講地址」。由於「地址」具有多種含義,因此 Amazon Kendra 可以推斷查詢背後的含義,以返回與預期含義一致的相關信息。在這種情況下,這是一個會議主題演講。例如,較簡單的搜尋服務可能無法將意圖列入考量,而且可能會傳回 Main Street 上街道地址的結果。

的智慧排名外掛程式 OpenSearch 適用於 OpenSearch (自我管理) 2.4.0 及更高版本。您可以使用快速啟動 Bash 腳本安裝插件,以構建一個新的 Docker 形象 OpenSearch 與智能排名插件包括在內。請參閱 設定智慧型搜尋外掛程式 — 這是一個讓您快速啟動和運行的設置示例。

智能搜索插件的工作原理

OpenSearch (自我管理)的智能排名插件的整體過程如下:

  1. OpenSearch 使用者發出查詢,並 OpenSearch 提供查詢回應或與查詢相關的文件清單。

  2. 智能排名插件獲取查詢響應並從文檔中提取信息。

  3. 智能排名插件調用 Amazon Kendra 智能排名的重分 API。

  4. Rescore API 從文檔中獲取提取的信息,並在語義上重新排名搜索結果。

  5. Rescore API 將重新排名的搜索結果發送回插件。該插件在搜索響應中重新排列搜 OpenSearch 索結果,以反映新的語義排名。

智能排名插件使用「正文」和「標題」字段重新排名結果。這些外掛程式欄位可以對應至 OpenSearch 索引中最符合文件內文和標題定義的欄位。例如,如果您的索引包含帶有「chapter_title」和「chapter_contents」等字段的書籍章節,則可以將前者對應到「標題」,而後者對應到「正文」以獲得最佳結果。

設定智慧型搜尋外掛程式

以下概述了如何使用智能排名插件快速設置 OpenSearch (自我管理)。

設置 OpenSearch (自我管理)與智能排名插件(快速設置)

如果您已經在使用 Docker 圖像opensearch:2.4.0,則可以使用此 Doc kerfile 使用智能排名插件構建 OpenSearch 2.4.0 的新圖像。您可以在碼頭工具組成 .yml 文件或打開搜索 .yml 文件中包含新圖像的容器。您還可以通過創建重新評分執行計劃以及您的區域和端點信息包含生成的重新評分執行計劃 ID,請參閱有關創建重新評分執行計劃的步驟 2。

如果您之前下載的 opensearch Docker 映像版本早於 2.4.0,則必須使用 Docker 映像opensearch:2.4.0或更高版本,並使用包含智能排名插件構建新圖像。

  1. 下載並安裝 Docker 桌面為您的操作系統。碼頭桌面包括碼頭構成和碼頭引擎。建議您檢查您的電腦是否符合 Docker 安裝詳細資料中提到的系統需求。

    您還可以在 Docker 桌面的設置中增加內存使用需求。除了 Docker 服務的免費使用限制以外,您必須對 Docker 的使用需求負責。請參閱泊塢視窗訂閱

    檢查碼頭桌面狀態是否「正在運行」。

  2. 提供 Amazon Kendra 智能排名和您的容量需求。佈建 Amazon Kendra 智慧排名後,系統會根據您設定的容量單位,每小時向您收費。請參閱免費方案和定價資訊

    您可以使用 CreateRescoreExecutionPlanAPI 來佈建Rescore API. 如果您不需要超過單一單位預設的容量單位,請不要新增更多單位,而且只提供重新評分執行計畫的名稱。您也可以使用 UpdateRescoreExecutionPlanAPI 更新容量需求。如需詳細資訊,請參閱以語意方式排名搜尋服務的結果

    或者,您可以在執行快速啟動 Bash 指令碼時,移至步驟 3 建立預設的重新分數執行計畫。

    請注意步驟 4 回應中包含的重新評分執行計畫 ID。

    CLI
    aws kendra-ranking create-rescore-execution-plan \ --name MyRescoreExecutionPlan \ --capacity-units '{"RescoreCapacityUnits":<integer number of additional capacity units>}' Response: { "Id": "<rescore execution plan ID>", "Arn": "arn:aws:kendra-ranking:<region>:<account-id>:rescore-execution-plan/<rescore-execution-plan-id>" }
    Python
    import boto3 from botocore.exceptions import ClientError import pprint import time kendra_ranking = boto3.client("kendra-ranking") print("Create a rescore execution plan.") # Provide a name for the rescore execution plan name = "MyRescoreExecutionPlan" # Set your required additional capacity units # Don't set capacity units if you don't require more than 1 unit given by default capacity_units = 1 try: rescore_execution_plan_response = kendra_ranking.create_rescore_execution_plan( Name = name, CapacityUnits = {"RescoreCapacityUnits":capacity_units} ) pprint.pprint(rescore_execution_plan_response) rescore_execution_plan_id = rescore_execution_plan_response["Id"] print("Wait for Amazon Kendra to create the rescore execution plan.") while True: # Get the details of the rescore execution plan, such as the status rescore_execution_plan_description = kendra_ranking.describe_rescore_execution_plan( Id = rescore_execution_plan_id ) # When status is not CREATING quit. status = rescore_execution_plan_description["Status"] print(" Creating rescore execution plan. Status: "+status) time.sleep(60) if status != "CREATING": break except ClientError as e: print("%s" % e) print("Program ends.")
  3. OpenSearch通過從主分支下拉列表中 GitHub 選擇版本分支,從您的版本下載快速啟動 Bash 腳本。

    此指令碼會使用您在指令碼 GitHub 存放庫中選取的版本來使用 Docker 映像 OpenSearch 和 OpenSearch 儀表板。它下載了智能排名插件的 zip 文件,並生成一Dockerfile個構建包括插件 OpenSearch 的新 Docker 圖像。它還創建了一個碼頭組成 .yml 文件,其中包括與智能排名插件和儀表板 OpenSearch 的容器。 OpenSearch 此指令碼會將您的重新評分執行計劃 ID、區域資訊和端點 (使用區域) 新增至停駐端工具組成 .yml 檔案。然後執行指令碼docker-compose up以啟動包 OpenSearch 含智慧排名和 OpenSearch 儀表板的容器。要停止容器而不刪除它們,請運行docker-compose stop。若要移除容器,請執行docker-compose down

  4. 打開終端,然後在 Bash 腳本的目錄中運行以下命令。

    bash search_processing_kendra_quickstart.sh -p <execution-plan-id> -r <region>

    當您執行此命令時,請提供您佈建 Amazon Kendra 智慧排名時在步驟 2 中記下的重新評分執行計畫 ID,以及您的區域資訊。或者,您可以使用--create-execution-plan選項來佈建「 Amazon Kendra 智慧排名」。這會建立具有預設名稱和預設容量的重新評分執行計畫。

    若要在移除預設暫時容器時不會遺失索引,您可以透過使用選項提供資料磁碟區名稱,讓索引在執行間持續存在。--volume-name如果您先前已建立索引,您可以在碼頭組成 .yml 或 opensearch.yml 檔案中指定磁碟區。要保持卷不變,請不要運行docker-compose down -v

    快速啟動 Bash 腳本在 OpenSearch 密鑰庫中配置您的 AWS 憑據以連接到 Amazon Kendra 智能排名。若要提供您的 AWS 認證給指令碼,請使用--profile選項來指定 AWS 設定檔。如果未指定該--profile選項,則快速啟動 Bash 腳本會嘗試從環境變量中讀取 AWS 憑據(訪問/秘密密鑰,可選會話令牌),然後從默認 AWS 配置文件中讀取憑據。如果未指定--profile選項且找不到認證,則指令碼不會將認證傳遞至 OpenSearch 金鑰儲存庫。如果 OpenSearch 金鑰儲存庫中未指定認證,外掛程式仍會檢查預設認證提供者鏈結中的認證,包括透過中 Amazon EC2 繼資料服務傳送的 Amazon ECS 容器認證或執行個體設定檔認證。

    請確定您已建立具有呼叫 Amazon Kendra 智慧排名所需權限的 IAM 角色。以下是授與將 Rescore API 用於特定重新評分執行計劃之權限的 IAM 政策範例:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kendra-ranking:Rescore", "Resource": "arn:aws:kendra-ranking:${Region}:${Account}:rescore-execution-plan/${RescoreExecutionPlanId}" } ] }

碼頭工具組成 .yml 的示例

使用 2.4.0 或更新版本搭配智慧排名外掛程式和儀表板 OpenSearch 2.4.0 或更新版本的碼頭工具組成 .yml 檔案範例。 OpenSearch

version: '3' networks: opensearch-net: volumes: <volume-name>: services: opensearch-node: image: <Docker image tag name of OpenSearch with Intelligent Ranking plugin> container_name: opensearch-node environment: - cluster.name=opensearch-cluster - node.name=opensearch-node - discovery.type=single-node - kendra_intelligent_ranking.service.endpoint=https://kendra-ranking.<region>.api.aws - kendra_intelligent_ranking.service.region=<region> - kendra_intelligent_ranking.service.execution_plan_id=<rescore-execution-plan-id> ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 ports: - 9200:9200 - 9600:9600 networks: - opensearch-net volumes: <docker-volume-name>:/usr/share/opensearch/data opensearch-dashboard: image: opensearchproject/opensearch-dashboards:<your-version> container_name: opensearch-dashboards ports: - 5601:5601 environment: OPENSEARCH_HOSTS: '["https://opensearch-node:9200"]' networks: - opensearch-net

碼頭文件和構建圖像的示例

使用 OpenSearch 2.4.0 或更新版本與智慧排名外掛程式的範例。Dockerfile

FROM opensearchproject/opensearch:<your-version> RUN /usr/share/opensearch/bin/opensearch-plugin install --batch https://github.com/opensearch-project/search-processor/releases/download/<your-version>/search-processor.zip

OpenSearch 使用智能排名插件構建 Docker 圖像。

docker build --tag=<Docker image tag name of OpenSearch with Intelligent Ranking plugin>

與智慧型搜尋外掛程式互動

使用智能排名插件設置 OpenSearch (自我管理)後,您可以使用 curl 命令或 OpenSearch 客戶端庫與插件進行交互。使用智能排名插件訪問 OpenSearch 的默認憑據是用戶名「管理員」和密碼「管理員」。

若要將智慧排名外掛程式設定套用至 OpenSearch 索引:

Curl
curl -XPUT "https://localhost:9200/<your-docs-index>/_settings" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d' { "index": { "plugin" : { "searchrelevance" : { "result_transformer" : { "kendra_intelligent_ranking": { "order": 1, "properties": { "title_field": "title_field_name_here", "body_field": "body_field_name_here" } } } } } } } '
Python
pip install opensearch-py from opensearchpy import OpenSearch host = 'localhost' port = 9200 auth = ('admin', 'admin') client = OpenSearch( hosts = [{'host': host, 'port': port}], http_compress = True, # enables gzip compression for request bodies http_auth = auth, # client_cert = client_cert_path, # client_key = client_key_path, use_ssl = True, verify_certs = False, ssl_assert_hostname = False, ssl_show_warn = False, ca_certs = ca_certs_path ) setting_body = { "index": { "plugin" : { "searchrelevance" : { "result_transformer" : { "kendra_intelligent_ranking": { "order": 1, "properties": { "title_field": "title_field_name_here", "body_field": "body_field_name_here" } } } } } } } response = client.indices.put_settings(index_name, body=setting_body)

您必須包含要用來重新排名的主要文字欄位的名稱,例如文件內文或文件內容欄位。您也可以包含其他文字欄位,例如文件標題或文件摘要。

現在,您可以發出任何查詢,並使用智能排名插件對結果進行排名。

Curl
curl -XGET "https://localhost:9200/<your-docs-index>/_search?pretty" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d' { "query" : { "match" : { "body_field_name_here": "intelligent systems" } } } '
Python
from opensearchpy import OpenSearch host = 'localhost' port = 9200 auth = ('admin', 'admin') client = OpenSearch( hosts = [{'host': host, 'port': port}], http_compress = True, # enables gzip compression for request bodies http_auth = auth, # client_cert = client_cert_path, # client_key = client_key_path, use_ssl = True, verify_certs = False, ssl_assert_hostname = False, ssl_show_warn = False, ca_certs = ca_certs_path ) query = { 'size': 10, "query" : { "match" : { "body_field_name_here": "intelligent systems" } } } response = client.search( body = query, index = index_name ) print('\nSearch results:') print(response)

若要移除索 OpenSearch 引的智慧排名外掛程式設定:

Curl
curl -XPUT "http://localhost:9200/<your-docs-index>/_settings" -H 'Content-Type: application/json' -d' { "index": { "plugin": { "searchrelevance": { "result_transformer": { "kendra_intelligent_ranking.*": null } } } } } '
Python
from opensearchpy import OpenSearch host = 'localhost' port = 9200 auth = ('admin', 'admin') client = OpenSearch( hosts = [{'host': host, 'port': port}], http_compress = True, # enables gzip compression for request bodies http_auth = auth, # client_cert = client_cert_path, # client_key = client_key_path, use_ssl = True, verify_certs = False, ssl_assert_hostname = False, ssl_show_warn = False, ca_certs = ca_certs_path ) setting_body = { "index": { "plugin": { "searchrelevance": { "result_transformer": { "kendra_intelligent_ranking.*": null } } } } } response = client.indices.put_settings(index_name, body=setting_body)

若要在特定查詢上測試智慧排名外掛程式,或測試某些內文和標題欄位:

Curl
curl -XGET "https://localhost:9200/<your-docs-index>/_search?pretty" -u 'admin:admin' --insecure -H 'Content-Type: application/json' -d' { "query": { "multi-match": { "query": "intelligent systems", "fields": ["body_field_name_here", "title_field_name_here"] } }, "size": 25, "ext": { "search_configuration": { "result_transformer": { "kendra_intelligent_ranking": { "order": 1, "properties": { "title_field": "title_field_name_here", "body_field": "body_field_name_here" } } } } } } '
Python
from opensearchpy import OpenSearch host = 'localhost' port = 9200 auth = ('admin', 'admin') client = OpenSearch( hosts = [{'host': host, 'port': port}], http_compress = True, # enables gzip compression for request bodies http_auth = auth, # client_cert = client_cert_path, # client_key = client_key_path, use_ssl = True, verify_certs = False, ssl_assert_hostname = False, ssl_show_warn = False, ca_certs = ca_certs_path ) # Index settings null for kendra_intelligent_ranking query = { "query": { "multi_match": { "query": "intelligent systems", "fields": ["body_field_name_here", "title_field_name_here"] } }, "size": 25, "ext": { "search_configuration": { "result_transformer": { "kendra_intelligent_ranking": { "order": 1, "properties": { "title_field": "title_field_name_here", "body_field": "body_field_name_here" } } } } } } response = client.search( body = query, index = index_name ) print('\nSearch results:') print(response)

比較 OpenSearch 結果與 Amazon Kendra 結果

您可以將 side-by-side OpenSearch (自我管理)排名結果與重新排名 Amazon Kendra的結果進行比較。 OpenSearch 儀表板 2.4.0 版及更高版本提供 side-by-side 結果,以便您可以比較文檔與如 OpenSearch 何 Amazon Kendra 或插件對搜索查詢文檔進行排名的排名。

在將排名結果與 Amazon Kendra 重新排名的結果進行比較 OpenSearch 之前,請確保您的 OpenSearch 儀表板由具有智慧排名外掛程式的 OpenSearch 伺服器提供支援。您可以使用 Docker 和快速啟動 Bash 腳本進行設置。請參閱設定智慧型搜尋外掛程式

以下概述了如何在 OpenSearch 儀表板中比較 OpenSearch 和 Amazon Kendra 搜尋結果。如需詳細資訊,請參閱OpenSearch文件

比較 OpenSearch 儀表板中的搜尋結果
  1. 開啟 http://localhost:5601 並登入 OpenSearch 儀表板。預設憑證為使用者名稱「admin」和密碼「管理員」。

  2. 從導覽選單中的 OpenSearch 外掛程式中選取 [搜尋相關性]。

  3. 在搜尋列中輸入搜尋文字。

  4. 選取查詢 1 的索引,然後在查詢 DSL 中輸入 OpenSearch 查詢。您可以使用%SearchText%變數來參照您在搜尋列中輸入的搜尋文字。如需此查詢的範例,請參閱OpenSearch 文件。此查詢返回的結 OpenSearch 果是不使用智能排名插件的結果。

  5. 查詢 2 選取相同的索引,然後在查詢 DSL 中輸入相同的 OpenSearch 查詢。此外,包括擴展名,kendra_intelligent_ranking並指定強制性body_field的排名。您也可以指定標題欄位,但是主體欄位是必填欄位。如需此查詢的範例,請參閱OpenSearch 文件。此查詢返回的結果是使用智能排名插件 Amazon Kendra 重新排名的結果。該插件最多排名 25 結果。

  6. 選取「搜尋」以傳回並比較結果。