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
- Registrieren Sie das ausgewählte Modell, und stellen Sie es im Cluster bereit.
- 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.
- 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
undmodel_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