Semantische Suche in OpenSearch

OCI Search mit OpenSearch unterstützt die semantische Suche ab OpenSearch Version 2.11.

Bei der semantischen Suche verwenden Suchmaschinen den Kontext und den Inhalt von Suchanfragen, um die Bedeutung einer Abfrage besser zu verstehen, im Vergleich zur Stichwortsuche, bei der Suchergebnisse auf Inhalten basieren, die mit Stichwörtern in einer Abfrage übereinstimmen. OpenSearch implementiert die semantische Suche mit der neuronalen Suche. Diese Methode verwendet große Sprachmodelle, um die Beziehungen zwischen Begriffen zu verstehen. Weitere Informationen zur neuronalen Suche in OpenSearch finden Sie unter Tutorial zur neuronalen Suche.

Neuronale Suche in OCI Search mit OpenSearch verwenden

Um die neuronale Suche nach semantischer Suche in OCI Search mit OpenSearch zu verwenden, müssen Sie:
  1. Registrieren Sie das ausgewählte Modell, und stellen Sie es im Cluster bereit.
  2. Erstellen Sie einen Index, und richten Sie eine Aufnahmepipeline mit dem bereitgestellten Modell ein. Mit der Aufnahmepipeline können Sie Dokumente in den Index aufnehmen.
  3. Führen Sie semantische Suchabfragen für den Index mit einer hybriden oder neuronalen Suche aus.

Voraussetzungen

Um die semantische Suche zu verwenden, muss die OpenSearch-Version für das Cluster 2.11 oder höher sein. Standardmäßig verwenden neue Cluster Version 2.11. Siehe OpenSearch-Cluster erstellen.

Für vorhandene Cluster, die für Version 2.3 konfiguriert sind, können Sie ein Inlineupgrade auf Version 2.11 ausführen. Weitere Informationen finden Sie unter OpenSearch Clustersoftwareupgrades.

Um ein Upgrade vorhandener Cluster auszuführen, die für Version 1.2.3 auf 2.11 konfiguriert sind, müssen Sie den unter OpenSearch Clustersoftwareupgrades beschriebenen Upgradeprozess verwenden.

Bevor Sie mit der Einrichtung des Modells für die semantische Suche beginnen, müssen Sie die Voraussetzungen erfüllen. Dazu gehören bei Bedarf die Angabe der entsprechenden IAM-Policy und die Konfiguration der empfohlenen Clustereinstellungen.

IAM-Policy für benutzerdefinierte Modelle und generative KI-Connectors

Wenn Sie eines der vorgeschulten Modelle verwenden, die in OCI Search mit OpenSearch gehostet werden, müssen Sie keine Berechtigungen konfigurieren, können Sie zur nächsten Voraussetzung Clustereinstellungen für die semantische Suche springen. Siehe auch Schritt-für-Schritt-Anleitung für semantische Suche.

Andernfalls müssen Sie eine Policy erstellen, um den erforderlichen Zugriff zu erteilen.

Sie müssen eine Policy erstellen, um den erforderlichen Zugriff zu erteilen.

Wenn Sie mit Policys nicht vertraut sind, finden Sie weitere Informationen unter Erste Schritte mit Policys und Allgemeine Policys.

IAM-Policy für benutzerdefinierte Modelle

Wenn Sie ein benutzerdefiniertes Modell verwenden, müssen Sie Zugriff für OCI Search mit OpenSearch erteilen, um auf den Objektspeicher-Bucket zuzugreifen, der das Modell enthält.

Das folgende Policy-Beispiel enthält die erforderliche Berechtigung:

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

IAM-Policy für Konnektoren mit generativer KI

Wenn Sie einen Connector für generative KI verwenden, müssen Sie Zugriff für OCI Search mit OpenSearch erteilen, um auf generative KI-Ressourcen zuzugreifen.

Das folgende Policy-Beispiel enthält die erforderliche Berechtigung:

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

Regionen für generative KI-Connectors

Um OCI Generative AI verwenden zu können, muss Ihr Mandant die Region "US Midwest (Chicago)" oder die Region "Germany Central (Frankfurt)" abonniert haben. Sie müssen das Cluster nicht in einer dieser Regionen erstellen. Stellen Sie einfach sicher, dass Ihr Mandant eine der Regionen abonniert hat.

Clustereinstellungen für semantische Suche

Verwenden Sie den Vorgang Einstellungen der Cluster-APIs, um die empfohlenen Clustereinstellungen für die semantische Suche zu konfigurieren. Das folgende Beispiel enthält die empfohlenen Einstellungen:

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
      }
    }
  }
}

Modelle einrichten

Der erste Schritt beim Konfigurieren der neuronalen Suche ist das Einrichten des großen Sprachmodells, das Sie verwenden möchten. Das Modell wird verwendet, um Vektoreinbettungen aus Textfeldern zu generieren.

Modellgruppen registrieren

Mit Modellgruppen können Sie den Zugriff auf bestimmte Modelle verwalten. Die Registrierung einer Modellgruppe ist optional. Wenn Sie jedoch keine Modellgruppe registrieren, erstellt ML Commons eine neue Modellgruppe für Sie. Daher empfehlen wir Ihnen, die Modellgruppe zu registrieren.

Registrieren Sie eine Modellgruppe mit dem Vorgang registrieren in den Modellgruppen-APIs, wie im folgenden Beispiel dargestellt:

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

Notieren Sie sich die in der Antwort zurückgegebene model_group_id:

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

Modell in der Modellgruppe registrieren

Registrieren Sie das Modell mit dem Vorgang registrieren über die Modell-APIs. Der Inhalt der POST-Anforderung an den Registrierungsvorgang hängt von dem Modelltyp ab, den Sie verwenden.

  • Option 1: Integrierte vortrainierte OpenSearch-Modelle

    Im Gegensatz zu dem für die Option "Benutzerdefinierte Modelle" erforderlichen Prozess sind mehrere vorgeschulte Satztransformatormodelle verfügbar, mit denen Sie sich direkt registrieren und in einem Cluster bereitstellen können, ohne sie herunterladen und dann manuell in einen privaten Speicher-Bucket hochladen zu müssen. Wenn Sie mit dieser Option ein vortrainiertes Modell registrieren, benötigen Sie nur die Modelle model_group_id, name, version und model_format. Informationen zur Verwendung eines vortrainierten Modells finden Sie unter Vorgeschultes Modell OpenSearch verwenden.

  • Option 2: Benutzerdefinierte Modelle

    Sie müssen die Object Storage-URL im Abschnitt actions im Registrierungsvorgang übergeben. Beispiel:

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

    Ein vollständiges Beispiel für einen Kassenvorgang finden Sie unter Benutzerdefinierte Modelle - 2: Modell registrieren.

  • Option 3: Generativer AI-Connector

    Sie können auch ein Remote-Einbettungsmodell GenAI wie das cohere.embed-english-v3.0 in Ihrem Cluster mit unserem GenAI Connector registrieren und bereitstellen. Sie müssen zuerst einen Connector erstellen und dann das Modell mit der Connector-ID registrieren und bereitstellen, wie in den folgenden Schritten beschrieben.

    Hinweis

    Wenn Sie das ON-DEMAND-Modell verwenden, bleiben Sie mit den Modellverfallsbenachrichtigungen vom GenAI-Service auf dem neuesten Stand, und aktualisieren Sie den Connector bei Bedarf, um potenzielle Serviceunterbrechungen zu vermeiden. Unter Pretrained Foundational Models in Generative AI finden Sie die unterstützten Einbettungsmodelle, um ein Einbettungsmodell aus der Liste der unterstützten Modelle auszuwählen.

    Wenn Sie das Modell DEDICATED verwenden, ändern Sie den Parameter servingType im folgenden Payload-Beispiel von ON-DEMAND in DEDICATED.

    Erstellen Sie einen Connector zum Cohere Embedding-Modell:

    POST /_plugins/_ml/connectors/_create
    {
      "name": "<connector_name>",
      "description": "<connector_description>",
      "version": "2",
      "protocol": "oci_sigv1",
      
        "parameters": {
          "endpoint": "inference.generativeai.us-chicago-1.oci.oraclecloud.com",
          "auth_type": "resource_principal",
          "model": "<embedding_model>",
          "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_ocid>\", \"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"
             }
         ]
     }

    Das folgende Beispiel zeigt eine Payload, mit der ein Connector für das Modell cohere.embed-english-v3.0 erstellt wird:

    POST /_plugins/_ml/connectors/_create
    {
      "name": "OCI GenAI Chat Connector to cohere.embed-english-v3 model",
      "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\": \"ocid1.compartment.oc1..aaaaaaaa..........5bynxlkea\", \"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"
             }
         ]
     }

Nachdem Sie die Kassenanforderung erstellt haben, können Sie den Status des Vorgangs prüfen. Verwenden Sie task_id mit dem Vorgang Abrufen der Aufgaben-APIs, wie im folgenden Beispiel dargestellt:

GET /_plugins/_ml/tasks/<task_ID>

Wenn der Kassenvorgang abgeschlossen ist, lautet der Wert status in der Antwort auf den Get-Vorgang COMPLETED, wie im folgenden Beispiel dargestellt:

{
  "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
}

Notieren Sie sich den in der Antwort zurückgegebenen Wert model_id, der beim Deployment des Modells verwendet werden soll.

Modell bereitstellen

Nachdem der Registrierungsvorgang für das Modell abgeschlossen ist, können Sie das Modell mit dem Deployment-Vorgang der Modell-APIs im Cluster bereitstellen und die model_id aus der Antwort des Get-Vorgangs im vorherigen Schritt übergeben, wie im folgenden Beispiel dargestellt:

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

Notieren Sie sich die in der Antwort zurückgegebene task_id. Mit der task_id können Sie den Status des Vorgangs prüfen.

Beispiel: Von der folgenden Antwort:

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

Um den Status des Registervorgangs zu prüfen, verwenden Sie task_id mit dem Vorgang Get der Aufgaben-APIs, wie im folgenden Beispiel dargestellt:

GET /_plugins/_ml/tasks/<task_ID>

Wenn der Deployment-Vorgang abgeschlossen ist, lautet der Wert status in der Antwort auf den Get-Vorgang COMPLETED.

Daten aufnehmen

Der erste Schritt beim Konfigurieren der neuronalen Suche ist das Einrichten des großen Sprachmodells, das Sie verwenden möchten. Das Modell wird verwendet, um Vektoreinbettungen aus Textfeldern zu generieren.

Daten in Index aufnehmen

Nachdem Sie einen Index erfolgreich erstellt haben, können Sie nun Daten in den Index aufnehmen, wie im folgenden Beispiel dargestellt:

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"
}
Mit einem GET können Sie prüfen, ob die Dokumente korrekt aufgenommen werden und Einbettungen während der Aufnahme automatisch generiert werden:
GET /test-index/_doc/3

Aufnahmepipeline erstellen

Erstellen Sie mit der Modell-ID des bereitgestellten Modells eine Aufnahmepipeline, wie im folgenden Beispiel dargestellt:

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"
        }
      }
    }
  ]
}

Die Aufnahmepipeline definiert einen Prozessor und die Feldmappings (in diesem Fall "passage_text" → "passage_embedding"). Wenn Sie diese Pipeline für einen bestimmten Index zum Erfassen von Daten verwenden, ermittelt die Pipeline automatisch das Feld "passage_text", und generieren Sie mit dem Pipelinemodell die entsprechenden Einbettungen, "passage_embedding", und ordnet sie dann vor der Indexierung zu.

Denken Sie daran, dass "passage_text" → "passage_embedding" benutzerdefiniert sind und beliebig sein können. Stellen Sie sicher, dass Sie mit der Benennung konsistent sind, während Sie den Index erstellen, in dem Sie die Pipeline verwenden möchten. Der Pipelineprozessor muss in der Lage sein, die Felder wie beschrieben zuzuordnen.

Index erstellen

Während der Indexerstellung können Sie die Pipeline angeben, mit der Sie Dokumente in den Index aufnehmen möchten.

Das folgende API-Aufrufbeispiel zeigt, wie Sie einen Index mit der Pipeline test-nlp-pipeline erstellen, die im vorherigen Schritt erstellt wurde.

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"
            }
        }
    }
}

Beim Erstellen des Index müssen Sie auch angeben, welche Library-Implementierung von Approximate Nearest Neighbor (ANN) Sie verwenden möchten. OCI Search mit OpenSearch unterstützt NMSLIB-, Faiss- und Lucene-Bibliotheken. Weitere Informationen finden Sie unter Such-Engines.

Im folgenden Beispiel wird die Lucene-Engine verwendet:

{
  "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
}

Daten in Index aufnehmen

Nachdem Sie einen Index erfolgreich erstellt haben, können Sie nun Daten in den Index aufnehmen, wie im folgenden Beispiel dargestellt:

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"
}

Mit einem GET können Sie prüfen, ob die Dokumente korrekt aufgenommen werden und Einbettungen während der Aufnahme automatisch generiert werden:

GET /test-index/_doc/3