Ricerca semantica in OpenSearch
OCI Search con OpenSearch supporta la ricerca semantica a partire da OpenSearch versione 2.11.
Con la ricerca semantica, i motori di ricerca utilizzano il contesto e il contenuto delle query di ricerca per comprendere meglio il significato di una query, rispetto alla ricerca per parola chiave, in cui i risultati di ricerca si basano su parole chiave di corrispondenza del contenuto in una query. OpenSearch implementa la ricerca semantica utilizzando la ricerca neurale, una tecnica che utilizza modelli di linguaggio di grandi dimensioni per comprendere le relazioni tra i termini. Per ulteriori informazioni sulla ricerca neurale in OpenSearch, vedere Esercitazione sulla ricerca neurale.
Utilizzo della ricerca neurale in OCI Search con OpenSearch
- Registra e distribuisci il modello scelto nel cluster.
- Creare un indice e impostare una pipeline di inclusione utilizzando il modello distribuito. Utilizzare la pipeline di inclusione per includere i documenti nell'indice.
- Eseguire query di ricerca semantica sull'indice utilizzando la ricerca ibrida o neurale.
Requisiti indispensabili
Per utilizzare la ricerca semantica, la versione OpenSearch del cluster deve essere 2.11 o successiva. Per impostazione predefinita, i nuovi cluster utilizzano la versione 2.11. Vedere Creazione di un cluster OpenSearch.
Per i cluster esistenti configurati per la versione 2.3, è possibile eseguire un upgrade in linea alla versione 2.11. Per ulteriori informazioni, vedere OpenSearch Cluster Software Upgrades.
Per aggiornare i cluster esistenti configurati per la versione 1.2.3 alla 2.11, è necessario utilizzare il processo di aggiornamento descritto in OpenSearch Aggiornamenti software del cluster.
Prima di avviare l'impostazione del modello per la ricerca semantica, è necessario completare i prerequisiti, tra cui specificare il criterio IAM applicabile, se necessario, e configurare le impostazioni cluster consigliate.
Criterio IAM per modelli personalizzati e connettori AI generativa
Se si utilizza uno dei modelli pre-addestrati ospitati in OCI Search con OpenSearch, non è necessario configurare le autorizzazioni, è possibile passare al prerequisito successivo, Impostazioni cluster per la ricerca semantica. Vedere anche Guida introduttiva a Semantic Search.
In caso contrario, è necessario creare un criterio per concedere l'accesso richiesto.
Per concedere l'accesso necessario, è necessario creare un criterio.
Se non si conoscono i criteri, vedere Guida introduttiva ai criteri e Criteri comuni.
Criterio IAM per modelli personalizzati
Se stai utilizzando un modello personalizzato, devi concedere l'accesso a OCI Search con OpenSearch per accedere al bucket di storage degli oggetti che contiene il modello.
L'esempio di criterio riportato di seguito include l'autorizzazione richiesta.
ALLOW ANY-USER to manage object-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_id>'}
Criterio IAM per connettori AI generativa
Se stai utilizzando un connettore AI generativa, devi concedere l'accesso a OCI Search con OpenSearch per accedere alle risorse di AI generativa.
L'esempio di criterio riportato di seguito include l'autorizzazione richiesta.
ALLOW ANY-USER to manage generative-ai-family in tenancy WHERE ALL {request.principal.type='opensearchcluster', request.resource.compartment.id='<cluster_compartment_id>'}
Aree per i connettori AI generativa
Per utilizzare OCI Generative AI, la tenancy deve essere sottoscritta all'area Midwest degli Stati Uniti (Chicago) o all'area centrale della Germania (Francoforte). Non è necessario creare il cluster in nessuna di queste aree, assicurarsi solo che la tenancy sia sottoscritta a una delle aree.
Impostazioni cluster per la ricerca semantica
Utilizzare l'operazione settings delle API cluster per configurare le impostazioni cluster consigliate per la ricerca semantica. L'esempio seguente include le impostazioni consigliate:
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
}
}
}
}
Impostazione di un modello
Il primo passo durante la configurazione della ricerca neurale consiste nell'impostazione del modello di linguaggio di grandi dimensioni che si desidera utilizzare. Il modello viene utilizzato per generare incorporamenti vettoriali da campi di testo.
Registra un gruppo di modelli
I gruppi di modelli consentono di gestire l'accesso a modelli specifici. La registrazione di un gruppo di modelli è facoltativa. Tuttavia, se non si registra un gruppo di modelli, ML Commons crea un nuovo gruppo di modelli per l'utente, pertanto è consigliabile registrarlo.
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": "new_model_group",
"description": "A model group for local models"
}
Prendere nota del model_group_id
restituito nella risposta:
{
"model_group_id": "<model_group_ID>",
"status": "CREATED"
}
Registra il modello nel gruppo di modelli
Registrare il modello utilizzando l'operazione di registrazione dalle API del modello. Il contenuto della richiesta POST all'operazione di registrazione dipende dal tipo di modello che si sta utilizzando.
- Opzione 1: modelli pre-addestrati OpenSearch integrati
Sono disponibili diversi modelli di trasformatore frase pre-addestrati per la registrazione diretta e la distribuzione in un cluster senza doverli scaricare e quindi caricarli manualmente in un bucket di storage privato, a differenza del processo richiesto per l'opzione dei modelli personalizzati. Con questa opzione, quando si registra un modello pre-addestrato, sono necessari solo i modelli
model_group_id
,name
,version
emodel_format
. Per informazioni sull'utilizzo di un modello pre-addestrato, vedere Utilizzo di un modello pre-addestrato OpenSearch. - Opzione 2: Modelli personalizzati
È necessario passare l'URL di storage degli oggetti nella sezione
actions
nell'operazione di registrazione, ad esempio:POST /_plugins/_ml/models/_register { ..... "actions": [ { "method": "GET", "action_type": "DOWNLOAD", "url": "<object_storage_URL_path>" } ] } }
Per un esempio completo di operazione di registrazione, vedere Modelli personalizzati - 2: Registrazione del modello.
- Opzione 3: Connettore AI generativa
È 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 deprecazione 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.Creare un connettore per il modello di incorporamento Cohere:
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" } ] }
L'esempio seguente mostra un payload per creare un connettore per il modello
cohere.embed-english-v3.0
: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" } ] }
Dopo aver effettuato la richiesta di registrazione, è possibile controllare lo stato dell'operazione, 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 registrazione, il valore status
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": [
"3qSqVfK2RvGJv1URKfS1bw"
],
"create_time": 1706829732915,
"last_update_time": 1706829780094,
"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
.
Dati di inclusione
Il primo passo durante la configurazione della ricerca neurale consiste nell'impostazione del modello di linguaggio di grandi dimensioni che si desidera utilizzare. Il modello viene utilizzato per generare incorporamenti vettoriali da campi di testo.
Includi dati nell'indice
Dopo aver creato un indice correttamente, è ora possibile includere i dati nell'indice come mostrato nell'esempio riportato di seguito.
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"
}
Utilizzare un GET per verificare che i documenti vengano inclusi correttamente e che le integrazioni vengano generate automaticamente durante l'inclusione:GET /test-index/_doc/3
Crea pipeline di inclusione
Utilizzando l'ID modello del modello distribuito, creare una pipeline di inclusione come mostrato nell'esempio riportato di seguito.
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"
}
}
}
]
}
La pipeline di inclusione definisce un processore e i mapping dei campi (in questo caso "passage_text" → "passage_embedding" ) Ciò significa che se si utilizza questa pipeline su un indice specifico per includere i dati, la pipeline trova automaticamente il campo "passage_text" e utilizza il modello di pipeline per generare le integrazioni corrispondenti, "passage_embedding", quindi esegue il mapping prima dell'indicizzazione.
Ricordare "passage_text" → "passage_embedding" sono definiti dall'utente e possono essere tutto ciò che si desidera. Assicurarsi di essere coerenti con la denominazione durante la creazione dell'indice in cui si prevede di utilizzare la pipeline. Il processore pipeline deve essere in grado di mappare i campi come descritto.
Crea un indice
Durante la creazione dell'indice, è possibile specificare la pipeline che si desidera utilizzare per includere i documenti nell'indice.
L'esempio di chiamata API riportato di seguito mostra come creare un indice utilizzando la pipeline test-nlp-pipeline creata nel passo precedente.
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"
}
}
}
}
Quando si crea l'indice, è inoltre necessario specificare l'implementazione della libreria del vicino più vicino (ANN) che si desidera utilizzare. OCI Search with OpenSearch supporta le librerie NMSLIB, Faiss e Lucene. Per ulteriori informazioni, vedere Motori di ricerca.
L'esempio seguente utilizza il motore 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
}
Includi dati nell'indice
Dopo aver creato un indice correttamente, è ora possibile includere i dati nell'indice come mostrato nell'esempio riportato di seguito.
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"
}
Utilizzare un GET per verificare che i documenti vengano inclusi correttamente e che le integrazioni vengano generate automaticamente durante l'inclusione:
GET /test-index/_doc/3