Procedura guidata ricerca semantica

Scopri come eseguire una ricerca semantica dei dati utilizzando OCI Search con OpenSearch.

Requisiti indispensabili

Prima di iniziare, è necessario effettuare le operazioni riportate di seguito.

  • Selezionare uno dei modelli pre-addestrati supportati da OCI Search con OpenSearch

  • Verificare che la versione del cluster OpenSearch sia 2.11.

  • Aggiornare le impostazioni del cluster per eseguire la ricerca semantica. Il comando di esempio seguente aggiorna le impostazioni applicabili:

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

Registra il gruppo di modelli

Utilizzare i gruppi di modelli per raggruppare in modo logico i modelli e controllare chi può accedervi. Registrare un gruppo di modelli utilizzando l'operazione di registrazione nelle API del gruppo di modelli, come mostrato nell'esempio riportato di seguito.

POST /_plugins/_ml/model_groups/_register
{
  "name": "general pretrained models",
  "description": "A model group for pretrained models hosted by OCI Search with OpenSearch"
}

Prendere nota del model_group_id restituito nella risposta:

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

Registrazione e distribuzione del modello

Per la ricerca semantica sono disponibili le tre opzioni riportate di seguito.

  • Opzione 1: registrare e distribuire un modello pre-addestrato ospitato in OCI Search con OpenSearch utilizzando i passi descritti in Uso di un modello pre-addestrato OpenSearch. Questa opzione è la più semplice da usare, non è necessario configurare criteri IAM aggiuntivi e il payload non è complesso come il payload per l'opzione successiva.
  • Opzione 2: importare, registrare e distribuire un modello pre-addestrato OpenSearch utilizzando i passi descritti in Modelli personalizzati. Ciò include il caricamento del file modello in un bucket di storage degli oggetti, quindi la specifica dell'URL di storage degli oggetti del file modello quando si registra il modello.
  • Opzione 3: è inoltre possibile registrare e distribuire un modello di incorporamento GenAI remoto, ad esempio cohere.embed-english-v3.0, nel cluster utilizzando il connettore GenAI. È necessario prima creare un connettore, quindi registrare e distribuire il modello utilizzando l'ID connettore come descritto nei passi riportati di seguito.
    Nota

    Se si utilizza il modello ON-DEMAND, tenere aggiornate le notifiche di non validità del modello dal servizio GenAI e aggiornare il connettore quando necessario per evitare potenziali interruzioni del servizio. Fare riferimento alla sezione Modelli di base pre-addestrati nell'AI generativa per i modelli di incorporamento supportati per selezionare un modello di incorporamento dall'elenco dei modelli supportati.

    Se si utilizza il modello DEDICATED, modificare il parametro servingType nell'esempio di payload seguente da ON-DEMAND a DEDICATED.

Questa procedura guidata mostra come utilizzare l'opzione 1, un modello pre-addestrato.
Per registrare un modello pre-addestrato, è necessario quanto segue:
  • model_group_id: se si è completato il passo 1, questo è il valore di model_group_id per la richiesta _register.
  • name: il nome del modello per il modello preaddestrato che si desidera utilizzare.
  • version: il numero di versione del modello pre-addestrato che si desidera utilizzare.
  • model_format: il formato del modello, TORCH_SCRIPT o ONNX.

Registrare il modello utilizzando l'operazione di registrazione dalle API modello, come mostrato nell'esempio riportato di seguito.

POST /_plugins/_ml/models/_register
{
  "name": "huggingface/sentence-transformers/msmarco-distilbert-base-tas-b",
  "version": "1.0.2",
  "model_group_id": "<model_group_ID>",
  "model_format": "TORCH_SCRIPT"
}

Prendere nota del task_id restituito nella risposta, è possibile utilizzare il task_id per controllare lo stato dell'operazione.

Ad esempio, dalla risposta seguente:

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

per controllare lo stato dell'operazione di registrazione, utilizzare task_id con l'operazione Recupera delle API task, come mostrato nell'esempio riportato di seguito.

GET /_plugins/_ml/tasks/<task_ID>

Una volta completata l'operazione di registrazione, il valore state nella risposta all'operazione Get è COMPLETED, come mostrato nell'esempio seguente:

{
  "model_id": "<embedding_model_ID>",
  "task_type": "REGISTER_MODEL",
  "function_name": "TEXT_EMBEDDING",
  "state": "COMPLETED",
  "worker_node": [
    "f2b_8-mVRVyVqeKqsA7dcQ"
  ],
  "create_time": 1706831015570,
  "last_update_time": 1706831070740,
  "is_async": true
}

Prendere nota del valore model_ID restituito nella risposta da utilizzare quando si distribuisce il modello.

Distribuisci modello

Una volta completata l'operazione di registrazione per il modello, è possibile distribuire il modello nel cluster utilizzando l'operazione deploy delle API del modello, passando il valore model_ID dalla risposta dell'operazione Get nel passo precedente, come mostrato nell'esempio seguente:

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

Prendere nota del task_id restituito nella risposta, è possibile utilizzare il task_id per controllare lo stato dell'operazione.

Ad esempio, dalla risposta seguente:

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

per controllare lo stato dell'operazione di registrazione, utilizzare task_ID con l'operazione Recupera delle API dei task, come mostrato nell'esempio riportato di seguito.

GET /_plugins/_ml/tasks/<task_ID>

Una volta completata l'operazione di distribuzione, il valore status nella risposta all'operazione Get è COMPLETED.

Crea una pipeline di inclusione k-NN

Al termine dell'operazione di distribuzione, creare una pipeline di inclusione utilizzando il modello distribuito. La pipeline di inclusione utilizza il modello distribuito per generare automaticamente i vettori di incorporamento per ogni documento al momento dell'inclusione. Il processore gestisce tutto per l'incorporamento, quindi è sufficiente mappare in modo appropriato il campo di testo previsto nel documento da convertire in incorporamento. L'esempio riportato di seguito mostra la creazione di una pipeline di inclusione.

PUT _ingest/pipeline/<pipeline_name>
{
  "description": "An example neural search pipeline",
  "processors" : [
    {
      "text_embedding": {
        "model_id": "<embedding_model_ID>",
        "field_map": {
           "<text_field_name>": "<embedding_field_name>"
        }
      }
    }
  ]
}

Se la pipeline di inclusione è stata creata, viene restituita la risposta seguente:

{
  "acknowledged": true
}

Crea indice

Creare un indice utilizzando la pipeline di inclusione creata nel passo precedente. È possibile utilizzare uno qualsiasi dei motori ANN disponibili nell'indice. Nell'esempio seguente viene utilizzato il motore Lucene:

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

Il campo passage_text per l'indice di creazione corrisponde al campo passage_text nella pipeline di inclusione, pertanto la pipeline sa come creare incorporamenti e quindi mapparli ai documenti al momento dell'inclusione.

Per informazioni sulla scelta del motore da utilizzare e sui parametri di configurazione disponibili per tali motori, vedere indice k-NN e Ricerca approssimativa k-NN.

Di seguito è riportata una risposta di esempio per la creazione di un indice riuscita.

{
        "acknowledged": true,
        "shards_acknowledged": true,
        "index": "lucene-index"
}

Inserimento di documenti nell'indice

Includere i dati nell'indice come mostrato nell'esempio seguente:

POST /lucene-index/_doc/1
{
  "<text_field_name>": "there are many sharks in the ocean"
}
 
POST /lucene-index/_doc/2
{
  "<text_field_name>": "fishes must love swimming"
}
 
POST /lucene-index/_doc/3
{
  "<text_field_name>": "summers are usually very hot"
}
 
POST /lucene-index/_doc/4
{
  "<text_field_name>": "florida has a nice weather all year round"
}

Risposta:

# POST /lucene-index/_doc/1
{
  "_index": "lucene-index",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}
# POST /lucene-index/_doc/2
{
  "_index": "lucene-index",
  "_id": "2",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}
# POST /lucene-index/_doc/3
{
  "_index": "lucene-index",
  "_id": "3",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 1
}
# POST /lucene-index/_doc/4
{
  "_index": "lucene-index",
  "_id": "4",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}

Eseguire quanto segue per controllare uno dei documenti per assicurarsi che le integrazioni vengano generate correttamente:

GET /lucene-index/_doc/3

Risposta:

{
  "_index": "lucene-index",
  "_id": "3",
  "_version": 1,
  "_seq_no": 2,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "<embedding_field_list>": [
      -0.1254959,
      -0.3151774,
      0.03526799,
      0.39322096,
      -0.0475556,
      -0.12378334,
      -0.032554347,
      0.4033895,
      0.050718695,
      -0.3587931,
      0.097042784,
      0.11742551,
      -0.06573639,
      0.14252506,
      -0.466573,
      0.56093556,
      -0.2815812,
      -0.00016521096,
      -0.2858566,