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.
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
oONNX
.
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,
Esecuzione della ricerca semantica
Questa sezione contiene esempi di diversi tipi di ricerche semantiche che è possibile eseguire.
Ricerca semantica con ricerca ibrida
Utilizzando l'ID modello di Registra e distribuisci modello, eseguire la ricerca semantica con la ricerca ibrida come indicato di seguito.
GET lucene-index/_search
{
"query": {
"bool" : {
"should" : [
{
"script_score": {
"query": {
"neural": {
"<embedding_field_name>": {
"query_text": "what are temperatures in miami like",
"model_id": "<embedding_model_ID>",
"k": 2
}
}
},
"script": {
"source": "_score * 1.5"
}
}
}
]
}
},
"fields": [
"<text_field_name>"
],
"_source": false
}
Risposta:
{
"took": 343,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.032253794,
"hits": [
{
"_index": "lucene-index",
"_id": "4",
"_score": 0.032253794,
"fields": {
"<text_field_name>": [
"florida has a nice weather all year round"
]
}
},
{
"_index": "lucene-index",
"_id": "3",
"_score": 0.031487543,
"fields": {
"<text_field_name>": [
"summers are usually very hot"
]
}
}
]
}
}
È possibile notare che la domanda della query non menziona Florida, tempo o estate, tuttavia il modello infonde il significato semantico di temperature e miami per restituire le risposte più pertinenti.
Ricerca semantica con ricerca neurale
Utilizzando l'ID modello di Registra e distribuisci modello, eseguire la ricerca semantica con la ricerca neurale come indicato di seguito.
GET /lucene-index/_search
{
"_source": {
"excludes": [
"<embedding_field_name>"
]
},
"query": {
"neural": {
"<embedding_field_name>": {
"query_text": "good climate",
"model_id": "<embedding_model_ID>",
"k": 5
}
}
}
}
Risposta:
{
"took": 36,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 0.012060728,
"hits": [
{
"_index": "lucene-index",
"_id": "4",
"_score": 0.012060728,
"_source": {
"passage_text": "florida has a nice weather all year round"
}
},
{
"_index": "lucene-index",
"_id": "1",
"_score": 0.010120423,
"_source": {
"passage_text": "there are many sharks in the ocean"
}
},
{
"_index": "lucene-index",
"_id": "3",
"_score": 0.00985171,
"_source": {
"passage_text": "summers are usually very hot"
}
},
{
"_index": "lucene-index",
"_id": "2",
"_score": 0.009575767,
"_source": {
"passage_text": "fishes must love swimming"
}
}
]
}
}