Dans le chapitre précédent, vous avez vu comment étendre un index Elasticsearch avec un champ dense_vector qui est rempli avec des embeddings générés par un modèle d'apprentissage automatique. Le modèle a été installé localement sur votre ordinateur, et les embeddings ont été générés à partir du code Python et ajoutés aux documents avant qu'ils ne soient insérés dans l'index.
Dans ce chapitre, vous allez découvrir un autre type de vecteur, le sparse_vector, conçu pour stocker les inférences du modèle Elastic Learned Sparse EncodeR (ELSER). Les embeddings renvoyés par ce modèle sont une collection d'étiquettes (plus justement appelées caractéristiques), chacune ayant un poids attribué.
Dans ce chapitre, vous utiliserez également une méthode différente pour travailler avec des modèles de Machine Learning, dans laquelle le service Elasticsearch exécute lui-même le modèle et ajoute les embeddings résultants à l'index par le biais d'un pipeline.
Le champ
Comme le type de champ dense_vector que vous avez utilisé dans le chapitre précédent, le type sparse_vector peut stocker les inférences renvoyées par les modèles d'apprentissage automatique. Alors que les vecteurs denses contiennent un tableau de longueur fixe de nombres décrivant le texte source, un vecteur peu dense stocke une correspondance entre les caractéristiques et les poids.
Ajoutons un champ sparse_vector à l'index. Il s'agit d'un type qui doit être défini explicitement dans le mappage de l'index. Vous pouvez voir ci-dessous une version actualisée de la méthode create_index() avec un nouveau champ appelé elser_embedding avec ce type.
Déployer le modèle ELSER
Comme indiqué plus haut, dans cet exemple, Elasticsearch s'approprie le modèle et l'exécute automatiquement pour générer des embeddings, à la fois lors de l'insertion de documents et lors de la recherche.
Le client Elasticsearch expose un ensemble de points de terminaison API pour gérer les modèles d'apprentissage automatique et leurs pipelines. La méthode deploy_elser() suivante dans search.py suit quelques étapes pour télécharger et installer le modèle ELSER v2, et pour créer un pipeline qui l'utilise pour remplir le champ elser_embedding défini ci-dessus.
La configuration d'ELSER pour nous nécessite plusieurs étapes. Tout d'abord, la méthode ml.put_trained_model() d'Elasticsearch est utilisée pour télécharger ELSER. L'argument model_id identifie le modèle et la version à télécharger (ELSER v2 est disponible pour Elasticsearch 8.11 et plus). Le champ input correspond à la configuration requise par ce modèle.
Une fois le modèle téléchargé, il doit être déployé. Pour cela, la méthode ml.start_trained_model_deployment() est utilisée, avec seulement l'identifiant du modèle à déployer. Notez qu'il s'agit d'une opération asynchrone, le modèle sera donc disponible après un court laps de temps.
La dernière étape de la configuration de l'utilisation d'ELSER consiste à définir un pipeline. Un pipeline est utilisé pour indiquer à Elasticsearch comment le modèle doit être utilisé. Un pipeline reçoit un identifiant et une ou plusieurs tâches de traitement à effectuer. Le pipeline créé ci-dessus est appelé elser-ingest-pipeline et possède une seule tâche d'inférence, ce qui signifie qu'à chaque fois qu'un document est ajouté, le modèle va s'exécuter sur input_field, et le résultat sera ajouté au document sur output_field. Pour cet exemple, le champ summary est utilisé pour générer les encastrements, comme pour les encastrements de vecteurs denses du chapitre précédent. Les intégrations résultantes seront écrites dans le champ de vecteurs épars elser_embedding créé dans la section précédente.
Pour faciliter l'invocation de cette méthode, ajoutez une commande deploy-elser à l'application Flask dans app.py :
Vous pouvez maintenant déployer ELSER sur votre service Elasticsearch avec la commande suivante :
La dernière tâche de configuration consiste à relier l'index au pipeline, afin que le modèle soit automatiquement exécuté lorsque des documents sont insérés dans cet index. Cette opération est effectuée dans la configuration de l'index à l'aide de l'option settings. Voici une nouvelle mise à jour de la méthode create_index() pour créer ce lien :
Grâce à cette modification, vous pouvez désormais régénérer l'index en prenant pleinement en charge les inférences ELSER :
Précédemment
Recherche sémantiqueSuivant
Requêtes sémantiques