Utiliser ELSER, le modèle de traitement du langage naturel d'Elastic
Elastic Appris Sparse EncodeR(ELSER) est un modèle de traitement automatique du langage naturel (NLP) entraîné par Elastic qui vous permet d'effectuer une recherche sémantique à l'aide d'une représentation vectorielle éparse. Au lieu de la correspondance littérale sur les termes de recherche, la recherche sémantique extrait les résultats en fonction de l'intention et de la signification contextuelle d'une requête de recherche.
Dans ce tutoriel, vous allez mettre à disposition une instance de Databases for Elasticsearch Platinum et appliquer le modèle ELSER à un corps de texte et voir comment il améliore la qualité des résultats de la recherche.
Il s'agit du deuxième des trois tutoriels explorant les fonctionnalités d' Elasticsearch autour de Machine learning. Machine Learning est une branche de l'intelligence artificielle (IA) et de l'informatique qui se concentre sur l'utilisation de données et d'algorithmes pour imiter la manière dont les humains apprennent, améliorant progressivement sa précision. En utilisant des méthodes statistiques, les algorithmes sont formés pour effectuer des classifications ou des prévisions et pour découvrir des informations clés dans les projets d'exploration de données.
Consultez les autres tutoriels de cette série d'apprentissage automatique Elasticsearch:
- Utilisation des fonctions de recherche vectorielle Elasticsearch
- Utilisation de modèles d'apprentissage automatique avec Elasticsearch pour baliser le contenu
Databases for Elasticsearch est un service payant. Par conséquent, le fait de suivre ce tutoriel entraîne des frais.
Avant de commencer
Pour commencer le processus de mise à disposition, installez des outils indispensables:
- Compte IBM Cloud
- Terraform-Pour codifier et mettre à disposition l'infrastructure.
- Python
- jq-Permet de traiter les fichiers de configuration.
Obtenir une clé d'API pour déployer l'infrastructure sur votre compte
Créez une IBM Cloud qui permet à Terraform de mettre à disposition une infrastructure dans votre compte. Vous pouvez créer jusqu'à 20 clés d'API.
Pour des raisons de sécurité, la clé d'API ne peut être copiée ou téléchargée qu'au moment de sa création. Si la clé d'API est perdue, vous devez en créer une autre.
Cloner le projet
Clonez le projet à partir du référentielGitHub.
git clone https://github.com/IBM/elasticsearch-ml-elser-tutorial.git
Installez le cluster Elasticsearch
-
Accédez au dossier terraform du projet cloné.
cd elasticsearch-ml-elser-tutorial/terraform
-
Sur votre machine, créez un document nommé
terraform.tfvars
, avec les zones suivantes:ibmcloud_api_key = "<your_api_key_from_step_1>" region = "<your_region>" elastic_password = "<make-up-a-password>"
Le document
terraform.tfvars
contient des variables que vous pouvez souhaiter conserver secrètes. Il est donc exclu du référentiel Github public. -
Installez l'infrastructure à l'aide de la commande suivante :
terraform init terraform apply --auto-approve
Enfin, exportez l' URL accès à la base de données vers votre environnement terminal (elle sera nécessaire pour les étapes suivantes)
terraform output --json
export ES="<the url value obtained from the output>"
cd ..
Installer le modèle ELSER
Le modèle ELSER doit être installé et démarré pour que vous puissiez l'utiliser. Installez-le à l'aide d'une commande telle que la suivante:
curl -kX PUT "$ES/_ml/trained_models/.elser_model_1?pretty" -H 'Content-Type: application/json' -d'
{
"input": {
"field_names": ["text_field"]
}
}
'
Ensuite, démarrez-le en tapant:
curl -kX POST "$ES/_ml/trained_models/.elser_model_1/deployment/_start?deployment_id=for_search&pretty"
Vous devrez peut-être attendre quelques minutes pour que l'installation du modèle se termine avant que la commande de démarrage puisse s'exécuter.
Créez un index et des mappages pour vos données
Vous devez vous trouver à la racine de votre dossier de projet. Dans le terminal, utilisez une commande telle que:
curl -kXPUT -H"Content-Type: application/json" -d@mapping.json $ES/test_data
Cela crée un index appelé test_data
dans votre instance ES. Il crée également des mappages explicites. C'est ainsi qu'Elastic a défini comment
un document, et les zones qu'il contient, sont stockés et indexés. La définition de mappage est stockée dans le fichier mapping.json
. Il définit un champ appelé ml.tokens
qui sera utilisé pour stocker toutes les données
supplémentaires (jetons) qui seront créées dans l'algorithme d'apprentissage automatique lorsqu'il analyse les données que vous téléchargez. Ces données seront contenues dans une zone appelée text
, qui est également explicitement
définie dans le document de mappage.
Créez un pipeline d'ingestion pour l'analyse de vos données
Le modèle ELSER est préinstallé dans tous les déploiements Platinum de Databases for Elasticsearch. Il vous suffit de créer un pipeline qui l'utilise pour analyser vos données entrantes.
curl -kX PUT -H"Content-Type: application/json" -d@pipeline.json $ES/_ingest/pipeline/elser-v1-test
Le document pipeline.json
contient la définition de pipeline. Il décrit le traitement qui sera effectué sur les documents lorsqu'ils seront téléchargés. Dans ce cas, il définit l'utilisation du modèle ELSER et demande à ES de placer
les données résultantes dans la zone ml.tokens
de l'index.
Il s'agit d'un pipeline très simple. Par exemple, il ne traite pas les erreurs d'ingestion, il les supprime simplement. Mais elle est suffisante pour les besoins de cette démo.
Importation de vos données
Le document import.json
contient des données provenant de l'ensemble de données msmarco-passagetest2019-top1000
, qui est un sous-ensemble de l'ensemble de données MS MARCO Passage Ranking. Il se compose de 200 requêtes, chacune étant accompagnée d'une liste de passages de texte pertinents. Tous les passages uniques, ainsi que leurs ID, ont été extraits de cet ensemble de données et sont prêts pour le téléchargement en bloc dans Elasticsearch.
Dans cette étape, vous téléchargez les données dans Elasticsearch et vous les transmettez via l'analyseur ELSER lors de leur téléchargement.
L'analyse du traitement automatique du langage naturel est gourmande en calcul, de sorte que ce processus prendra plusieurs heures (jusqu'à 12 heures). Nous allons effectuer le téléchargement en bloc par lots de 100 entrées pour nous assurer que la mémoire tampon du pipeline n'est pas dépassée.
Par conséquent, divisez d'abord le document import.json
en plus petits documents de 100 entrées chacun (chaque entrée correspond à deux lignes du document):
split -l 200 -a 4 import.json
Cela crée plusieurs centaines de petits documents. Importez-les en exécutant le script upload.sh
:
./upload.sh
Pour chaque document téléchargé, le modèle ELSER tente de déduire ce qu'est le texte et génère un groupe de mots qu'il juge pertinents, ainsi qu'un score de pertinence. Voici un exemple de document ingéré:
{
"_index": "test_data",
"_id": "1",
"_version": 3,
"_seq_no": 1310,
"_primary_term": 1,
"found": true,
"_source": {
"text": "This is the definition of RNA along with examples of types of RNA molecules. This is the definition of RNA along with examples of types of RNA molecules. RNA Definition",
"ml": {
"tokens": {
"molecules": 0.9468944,
"cell": 0.31727117,
"type": 0.1881346,
"lab": 0.14050934,
"example": 0.27423903,
"strand": 0.11950072,
"dna": 0.82435495,
"protein": 0.25066674,
"term": 0.5622088,
"definition": 0.21340553,
"nuclear": 0.03731725,
"different": 0.026590228,
"element": 0.42168307,
"genetic": 0.36145726,
"types": 0.7244048,
"characteristics": 0.24549837,
"adam": 0.15298073,
"rna": 1.949169,
"organism": 0.27345642,
"gene": 0.57350045,
"substance": 0.006454099,
"mrna": 1.002312,
"bond": 0.096653655,
"structure": 0.1670035,
"genome": 0.24130683,
"sequence": 0.21949387,
"q": 0.028950738,
"unit": 0.1926791,
"examples": 1.0590855,
"material": 0.034060754,
"chemical": 0.454947,
"science": 0.20523745,
"biological": 0.47201967,
"molecule": 0.92732555,
"atom": 0.021480415,
"word": 0.2971402
},
"model_id": ".elser_model_1"
}
}
}
Vous pouvez voir qu'il a créé des relations au-delà des mots réels sur le texte. Par exemple, il a inféré que ce fragment concerne science
, genes
et dna
.
Asseyez-vous et détendez-vous. Votre importation prendra un peu de temps.
Recherchez votre jeu de données et comparez les résultats
Une fois votre jeu de données téléchargé, vous êtes prêt à le tester, en particulier la différence que le processeur ELSER NLP peut apporter à la qualité de vos résultats de recherche. La requête de recherche suivante utilise les jetons générés pour renvoyer les résultats qui semblent les plus pertinents:
curl -k -H"Content-Type: application/json" -d@elserquery.json $ES/test_data/_search | jq .
Comparez cela avec une requête qui n'utilise PAS les jetons et qui effectue simplement une recherche sur le texte d'origine:
curl -k -H"Content-Type: application/json" -d@query.json $ES/test_data/_search | jq .
Vous pouvez essayer d'autres requêtes en modifiant le texte dans les fichiers query.json
et elserquery.json
. Essayez des choses telles que:
what is the best exercise for stiff limbs?
ou
explain how the US president is elected
Dans tous ces cas, les résultats améliorés par ELSER sont beaucoup plus pertinents.
Bien sûr, cela ne s'applique pas à toutes les recherches. Une recherche de taylor swift
, par exemple, produira des résultats similaires sur les deux. Tout dépend donc du type de recherche et des données de votre index. Mais vous
pouvez voir que de nombreuses recherches peuvent être considérablement améliorées en appliquant le modèle ELSER ML.
Démontez votre infrastructure
Votre Databases for Elasticsearch comporte des frais. Une fois ce tutoriel terminé, vous pouvez supprimer toute l'infrastructure en accédant au répertoire terraform
du projet et en utilisant la commande:
terraform destroy
Prêt pour plus?
ELSER n'est qu'un seul modèle ML. Il y en a beaucoup d'autres et avec le plan Platinum Databases for Elasticsearch, vous pouvez facilement en déployer d'autres et analyser vos données à la place. Nous avons mis au point un tutoriel qui vous montre comment effectuer cette tâche