OCIのセマンティック検索 OpenSearch

OpenSearchを使用したOCI検索では、OpenSearchバージョン2.11で始まるセマンティック検索がサポートされます。

セマンティック検索では、検索エンジンは検索クエリーのコンテキストとコンテンツを使用して、キーワード検索と比較してクエリーの意味をよりよく理解します。キーワード検索では、検索結果はクエリーのキーワードに一致するコンテンツに基づきます。OpenSearchは、ニューラル検索を使用してセマンティック検索を実装します。これは、用語間の関係を理解するために大規模な言語モデルを使用する手法です。OpenSearchでのニューラル検索の詳細は、ニューラル検索のチュートリアルを参照してください。

OpenSearchでのOCI検索でのニューラル検索の使用

OpenSearchを使用してOCI検索でセマンティック検索にニューラル検索を使用するには、次のことが必要です:

  1. 選択したモデルを登録し、クラスタにデプロイします。

  2. デプロイされたモデルを使用して、索引を作成し、取込みパイプラインを設定します。インデックスにドキュメントを取り込むには、取込みパイプラインを使用します。

  3. ハイブリッド検索またはニューラル検索を使用して、索引に対してセマンティク検索問合せを実行します。

前提条件

セマンティック検索を使用するには、クラスタのOpenSearchバージョンが2.11以降である必要があります。デフォルトでは、新しいクラスタはバージョン2.11を使用します。「OpenSearchクラスタの作成」を参照してください。

バージョン2.3用に構成された既存のクラスタでは、バージョン2.11へのインライン・アップグレードを実行できます。詳細は、OpenSearchクラスタのインライン・アップグレードを参照してください。

バージョン1.2.3用に構成された既存のクラスタを2.11にアップグレードするには、「OpenSearchクラスタのアップグレード」で説明されているアップグレード・プロセスを使用する必要があります。

セマンティック検索のモデルの設定を開始する前に、前提条件を完了する必要があります。前提条件には、必要に応じて該当するIAMポリシーを指定し、推奨されるクラスタ設定を構成することが含まれます。

カスタム・モデルおよび生成AIコネクタのIAMポリシー

OpenSearchでOCI Search内でホストされている事前トレーニング済モデルのいずれかを使用している場合、権限を構成する必要はありません。次の前提条件であるセマンティック検索のクラスタ設定にスキップできます。セマンティック検索ウォークスルーも参照してください。

それ以外の場合は、必要なアクセス権を付与するポリシーを作成する必要があります。

必要なアクセス権を付与するには、ポリシーを作成する必要があります。

ポリシーを初めて使用する場合は、ポリシーの開始および共通ポリシーを参照してください。

カスタム・モデルのIAMポリシー

カスタム・モデルを使用している場合は、OpenSearchを使用してOCI検索へのアクセス権を付与し、モデルを含むオブジェクト・ストレージ・バケットにアクセスできるようにする必要があります。

次のポリシーの例には、必要な権限が含まれています。

ALLOW ANY-USER to manage object-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_id>'}

生成AIコネクタのIAMポリシー

生成AIコネクタを使用している場合は、生成AIリソースにアクセスするには、OpenSearchを使用してOCI Searchへのアクセス権を付与する必要があります。

次のポリシーの例には、必要な権限が含まれています。

ALLOW ANY-USER to manage generative-ai-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_id>'}

生成AIコネクタのリージョン

OCI生成AIを使用するには、テナンシが米国中西部(シカゴ)リージョンまたはドイツ中央部(フランクフルト)リージョンにサブスクライブされている必要があります。どちらのリージョンにもクラスタを作成する必要はありません。テナンシがいずれかのリージョンにサブスクライブされていることを確認してください。

セマンティック検索のクラスタ設定

クラスタAPI設定操作を使用して、セマンティック検索の推奨クラスタ設定を構成します。次の例は、推奨設定を示しています。

PUT _cluster/settings
{
  "persistent": {
    "plugins": {
      "ml_commons": {
        "only_run_on_ml_node": "false",
        "model_access_control_enabled": "true",
        "native_memory_threshold": "99",
        "rag_pipeline_feature_enabled": "true",
        "memory_feature_enabled": "true",
        "allow_registering_model_via_local_file": "true",
        "allow_registering_model_via_url": "true",
        "model_auto_redeploy.enable":"true",
        "model_auto_redeploy.lifetime_retry_times": 10
      }
    }
  }
}

モデルの設定

ニューラル検索を構成する際の最初のステップは、使用する大規模な言語モデルを設定することです。このモデルは、テキスト・フィールドからベクトル埋込みを生成するために使用されます。

モデル・グループの登録

モデル・グループを使用すると、特定のモデルへのアクセスを管理できます。モデル・グループの登録は任意ですが、モデル・グループを登録しない場合、ML Commonsによって新しいモデル・グループが登録されるため、モデル・グループを登録することをお薦めします。

次の例に示すように、モデル・グループAPIregister操作を使用してモデル・グループを登録します。

POST /_plugins/_ml/model_groups/_register
{
  "name": "new_model_group",
  "description": "A model group for local models"
}

レスポンスで返されたmodel_group_idをノートにとります:

{
  "model_group_id": "<model_group_ID>",
  "status": "CREATED"
}

モデル・グループへのモデルの登録

モデルAPIから登録操作を使用してモデルを登録します。登録操作へのPOSTリクエストの内容は、使用しているモデルのタイプによって異なります。

  • オプション1: 組込みのOpenSearch事前トレーニング済モデル

    カスタム・モデル・オプションに必要なプロセスとは異なり、いくつかの事前トレーニング済センテンス・トランスフォーマ・モデルを使用して、クラスタに直接登録してデプロイできます。カスタム・モデル・オプションに必要なプロセスとは異なり、それらをダウンロードしてプライベート・ストレージ・バケットに手動でアップロードする必要はありません。このオプションでは、事前トレーニング済モデルを登録する場合、モデルのmodel_group_idnameversionおよびmodel_formatのみが必要です。事前トレーニング済モデルの使用方法については、OpenSearch事前トレーニング済モデルの使用を参照してください。

  • オプション2: カスタム・モデル

    次のように、レジスタ操作のactionsセクションでオブジェクト・ストレージURLを渡す必要があります:

    POST /_plugins/_ml/models/_register
    {
    .....
            "actions": [
                {
                    "method": "GET",
                    "action_type": "DOWNLOAD",
                    "url": "<Object_Storage_URL_Path>"
                }
            ]
        }
    }

    レジスタ操作の完全な例は、カスタム・モデル- 2: モデルの登録を参照してください。

  • オプション3: 生成AIコネクタ

    生成AIコネクタを使用してcohere.embed-english-v3.0モデルなどのリモート埋込みモデルを登録するには、次のステップを使用して、最初にコネクタを作成し、モデルを登録する必要があります。

    1. Cohere Embeddingモデルのコネクタを作成します。

      POST /_plugins/_ml/connectors/_create
      {
        "name": "OCI GenAI Chat Connector cohere-embed-v5",
        "description": "The connector to public Cohere model service for embed",
        "version": "2",
        "protocol": "oci_sigv1",
       
          "parameters": {
            "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
            "auth_type": "resource_principal", 
            "model": "cohere.embed-english-v3.0",
            "input_type":"search_document",
            "truncate": "END"
          },
       
           "credential": {
           },
           "actions": [
               {
                   "action_type": "predict",
                   "method":"POST",
                   "url": "https://${parameters.endpoint}/20231130/actions/embedText",
                   "request_body": "{ \"inputs\":[\"${parameters.passage_text}\"], \"truncate\": \"${parameters.truncate}\" ,\"compartmentId\": \"<compartment_ID>\", \"servingMode\": { \"modelId\": \"${parameters.model}\", \"servingType\": \"ON_DEMAND\" } }",
                   "pre_process_function": "return '{\"parameters\": {\"passage_text\": \"' + params.text_docs[0] + '\"}}';",
                    "post_process_function": "connector.post_process.cohere.embedding"
               }
           ]
       }

      レスポンス:

      {
        "connector_id": "<connector_ID>"
      }
    2. モデルを登録します。
      POST /_plugins/_ml/models/_register
      {
         "name": "oci-genai-embed-model",
         "function_name": "remote",
         "model_group_id": "<model_group_ID>",
         "description": "test semantic",
         "connector_id": "<connector_ID>"
       }

    専用の生成AIモデル・エンドポイントを使用するには、次の変更を使用してコネクタ・ペイロードを再構成します:

    1. modelIdのかわりにendpointIdを使用し、モデル名のかわりに専用モデル・エンドポイントのOCIDを指定します。たとえば:
      \"modelId\": \"${parameters.model}\"
      先:
      \"endpointId\":\"<dedicated_model_enpoint_OCID>\"
    2. servingTypeON_DEMANDからDEDICATEDに変更します。たとえば:

      \"servingType\":\"ON_DEMAND\"
      先:
      \"servingType\":\"DEDICATED\"
登録リクエストを行った後、操作のステータスを確認し、次の例に示すように、「タスクAPI」「取得」操作でtask_idを使用できます。
GET /_plugins/_ml/tasks/<task_ID>

レジスタ操作が完了すると、次の例に示すように、Get操作に対するレスポンスのstatus値はCOMPLETEDになります。

{
  "model_id": "<embedding_model_ID>",
  "task_type": "REGISTER_MODEL",
  "function_name": "TEXT_EMBEDDING",
  "state": "COMPLETED",
  "worker_node": [
    "3qSqVfK2RvGJv1URKfS1bw"
  ],
  "create_time": 1706829732915,
  "last_update_time": 1706829780094,
  "is_async": true
}

モデルのデプロイ時に使用するレスポンスで返されるmodel_id値をノートにとります。

モデルのデプロイ

モデルの登録操作が完了したら、次の例に示すように、モデルAPIのデプロイ操作を使用してモデルをクラスタにデプロイし、前のステップのGet操作レスポンスからmodel_idを渡すことができます。

POST /_plugins/_ml/models/<embedding_model_ID>/_deploy

レスポンスで返されたtask_idを書き留めます。task_idを使用して、操作のステータスを確認できます。

たとえば、次のレスポンスから:

{
  "task_id": "<task_ID>",
  "task_type": "DEPLOY_MODEL",
  "status": "CREATED"
}

登録操作のステータスを確認するには、次の例に示すように、「タスクAPI」「取得」操作でtask_idを使用します。

GET /_plugins/_ml/tasks/<task_ID>

デプロイ操作が完了すると、取得操作に対するレスポンスのstatus値はCOMPLETEDになります。

データの収集

ニューラル検索を構成する際の最初のステップは、使用する大規模な言語モデルを設定することです。このモデルは、テキスト・フィールドからベクトル埋込みを生成するために使用されます。

収集パイプラインの作成

デプロイされたモデルのモデルIDを使用して、次の例に示すように取込みパイプラインを作成します。

PUT _ingest/pipeline/test-nlp-pipeline
{
  "description": "An example neural search pipeline",
  "processors" : [
    {
      "text_embedding": {
        "model_id": "<model_ID>",
        "field_map": {
           "passage_text": "passage_embedding"
        }
      }
    }
  ]
}

取込みパイプラインは、プロセッサおよびフィールド・マッピングを定義します(この場合は"passage_text"→"passage_embedding")。つまり、このパイプラインを特定の索引で使用してデータを取り込む場合、パイプラインは自動的に"passage_text"フィールドを検索し、パイプライン・モデルを使用して対応する埋込み"passage_embedding"を生成し、索引付けの前にマップします。

"passage_text"→"passage_embedding"はユーザー定義であり、任意のものにすることができます。パイプラインを使用する索引の作成時に、ネーミングと一致していることを確認します。パイプライン・プロセッサは、説明に従ってフィールドをマップできる必要があります。

索引の作成

索引の作成中に、索引へのドキュメントの取込みに使用するパイプラインを指定できます。

次のAPIコールの例は、前のステップで作成したtest-nlp-pipelineパイプラインを使用して索引を作成する方法を示しています。

PUT /test-index
{
    "settings": {
        "index.knn": true,
        "default_pipeline": "test-nlp-pipeline"
    },
    "mappings": {
        "properties": {
            "passage_embedding": {
                "type": "knn_vector",
                "dimension": <model_dimension>,
                "method": {
                    "name":"hnsw",
                    "engine":"lucene",
                    "space_type": "l2",
                    "parameters":{
                        "m":512,
                        "ef_construction": 245
                    }
                }
            },
            "passage_text": {
                "type": "text"
            }
        }
    }
}

索引を作成するときは、使用する近接近傍(ANN)のライブラリ実装も指定する必要があります。OpenSearchを使用したOCI Searchでは、NMSLIB、FaissおよびLuceneライブラリがサポートされます。詳細は、検索エンジンを参照してください。

次の例では、Luceneエンジンを使用します。

{
  "model_id": "<model_ID>",
  "task_type": "REGISTER_MODEL",
  "function_name": "TEXT_EMBEDDING",
  "state": "COMPLETED",
  "worker_node": [
    "3qSqVfK2RvGJv1URKfS1bw"
  ],
  "create_time": 1706829732915,
  "last_update_time": 1706829780094,
  "is_async": true
}

索引へのデータの収集

索引を正常に作成した後、次の例に示すように、索引にデータを取り込むことができます。

POST /test-index/_doc/1
{
  "passage_text": "there are many sharks in the ocean"
}
 
POST /test-index/_doc/2
{
  "passage_text": "fishes must love swimming"
}
 
POST /test-index/_doc/3
{
  "passage_text": "summers are usually very hot"
}
 
POST /test-index/_doc/4
{
  "passage_text": "florida has a nice weather all year round"
}
GETを使用して、ドキュメントが正しく取り込まれており、取込み中に埋込みが自動生成されていることを確認します:
GET /test-index/_doc/3