Comment ingérer des données dans Elasticsearch via LlamaIndex

Une étape par étape sur la façon d'ingérer des données et de faire des recherches en utilisant RAG avec LlamaIndex.

Elasticsearch vous permet d’indexer des données rapidement et en toute flexibilité. Essayez-le gratuitement dans le cloud ou exécutez-le en local pour découvrir à quel point l’indexation peut être simple.

Dans cet article, nous allons mettre en place un moteur de recherche pour les FAQ en utilisant LlamaIndex pour indexer les données. Elasticsearch servira de base de données vectorielle, permettant une recherche vectorielle, tandis que RAG (Retrieval-Augmented Generation) enrichira le contexte, fournissant des réponses plus précises.

Qu'est-ce que le LlamaIndex ?

LlamaIndex est un cadre qui facilite la création d'agents et de flux de travail alimentés par de grands modèles linguistiques (LLM) pour interagir avec des données spécifiques ou privées. Il permet l'intégration de données provenant de diverses sources (API, PDF, bases de données) avec les LLM, permettant des tâches telles que la recherche, l'extraction d'informations et la génération de réponses contextualisées.

Concepts clés :

  • Agents : Assistants intelligents qui utilisent des LLM pour effectuer des tâches, allant de simples réponses à des actions complexes.
  • Flux de travail : Processus en plusieurs étapes qui combinent des agents, des connecteurs de données et des outils pour des tâches avancées.
  • Augmentation du contexte : Une technique qui enrichit le LLM avec des données externes, en surmontant ses limites de formation.

Intégration deLlamaIndex avec Elasticsearch :

Elasticsearch peut être utilisé de différentes manières avec LlamaIndex :

  • Source de données : Utilisez le lecteur Elasticsearch pour extraire les documents.
  • Modèle d'encastrement : Encoder les données en vecteurs pour les recherches sémantiques.
  • Stockage vectoriel : Utilisez Elasticsearch comme référentiel pour la recherche de documents vectorisés.
  • Stockage avancé : Configurez des structures telles que des résumés de documents ou des graphes de connaissances.

Utiliser LlamaIndex et Elasticsearch pour construire une recherche de FAQ

Préparation des données

Nous utiliserons la FAQ du service Elasticsearch comme exemple. Chaque question a été extraite du site web et enregistrée dans un fichier texte individuel. Vous pouvez utiliser n'importe quelle approche pour organiser les données ; dans cet exemple, nous avons choisi d'enregistrer les fichiers localement.

Exemple de fichier :

Après avoir enregistré toutes les questions, le répertoire ressemblera à ceci :

Installation des dépendances

Nous allons mettre en œuvre l'ingestion et la recherche en utilisant le langage Python, la version que j'ai utilisée étant la 3.9. Comme prérequis, il sera nécessaire d'installer les dépendances suivantes :

Elasticsearch et Kibana seront créés avec Docker, configurés via docker-compose.yml pour exécuter la version 8.16.2. Cela facilite la création de l'environnement local.

L'ingestion de documents à l'aide de LlamaIndex

Les documents seront indexés dans Elasticsearch à l'aide de LlamaIndex. Tout d'abord, nous chargeons les fichiers avec SimpleDirectoryReader, qui permet de charger des fichiers à partir d'un répertoire local. Après avoir chargé les documents, nous les indexons à l'aide du VectorStoreIndex.

Les magasins de vecteurs de LlamaIndex sont responsables du stockage et de la gestion des incorporations de documents. LlamaIndex supporte différents types de Vector Stores, et dans ce cas, nous utiliserons Elasticsearch. Dans le StorageContext, nous configurons l'instance Elasticsearch. Le contexte étant local, aucun paramètre supplémentaire n'a été requis. Pour les configurations dans d'autres environnements, se référer à la documentation pour vérifier les paramètres nécessaires : ElasticsearchStore Configuration.

Par défaut, LlamaIndex utilise le modèle OpenAI text-embedding-ada-002 pour générer des embeddings. Toutefois, dans cet exemple, nous utiliserons le modèle text-embedding-3-small. Il est important de noter qu'une clé API OpenAI sera nécessaire pour utiliser le modèle.

Vous trouverez ci-dessous le code complet pour l'ingestion de documents.

Après l'exécution, les documents seront indexés dans l'index faq comme indiqué ci-dessous :

Recherche avec RAG

Pour effectuer des recherches, nous configurons le client ElasticsearchStore, en définissant les champs index_name et es_url avec l'URL d'Elasticsearch. Dans retrieval_strategy, nous avons défini la stratégie AsyncDenseVectorStrategy pour les recherches vectorielles. D'autres stratégies, telles que AsyncBM25Strategy (recherche par mots-clés) et AsyncSparseVectorStrategy (vecteurs épars), sont également disponibles. Plus de détails peuvent être trouvés dans la documentation officielle.

Ensuite, un objet VectorStoreIndex sera créé, où nous configurerons le vector_store en utilisant l'objet ElasticsearchStore. Avec la méthode as_retriever, nous recherchons les documents les plus pertinents pour une requête, en fixant le nombre de résultats renvoyés à 5 par le biais du paramètre similarity_top_k.

L'étape suivante est le GCR. Les résultats de la recherche vectorielle sont incorporés dans une invite formatée pour le LLM, permettant une réponse contextualisée basée sur les informations récupérées.

Dans le PromptTemplate, nous définissons le format de l'invite, qui inclut :

  • Contexte ({context_str}) : documents récupérés par le chercheur.
  • Query ({query_str}) : la question de l'utilisateur.
  • Instructions : lignes directrices permettant au modèle de répondre en fonction du contexte, sans s'appuyer sur des connaissances externes.

Enfin, le LLM traite l'invite et renvoie une réponse précise et contextuelle.

Le code complet se trouve ci-dessous :

Nous pouvons maintenant effectuer notre recherche, par exemple, "Les services Elastic sont gratuits ?" et obtenir une réponse contextualisée basée sur les données de la FAQ elle-même.

Les documents suivants ont été utilisés pour élaborer cette réponse :

Conclusion

En utilisant LlamaIndex, nous avons démontré comment créer un système efficace de recherche de FAQ avec le support d'Elasticsearch comme base de données vectorielle. Les documents sont ingérés et indexés à l'aide d'enchâssements, ce qui permet d'effectuer des recherches vectorielles. Grâce à un PromptTemplate, les résultats de la recherche sont intégrés dans le contexte et envoyés au LLM, qui génère des réponses précises et contextualisées sur la base des documents récupérés.

Ce flux de travail intègre la recherche d'informations et la génération de réponses contextualisées afin de fournir des résultats précis et pertinents.

Références

https://www.elastic.co/guide/en/cloud/current/ec-faq-getting-started.html

https://docs.llamaindex.ai/en/stable/api_reference/readers/elasticsearch/

https://docs.llamaindex.ai/en/stable/module_guides/indexing/vector_store_index/

https://docs.llamaindex.ai/en/stable/examples/query_engine/custom_query_engine/

https://www.elastic.co/search-labs/integrations/llama-index

Questions fréquentes

Qu'est-ce que le LlamaIndex ?

LlamaIndex est un cadre qui facilite la création d'agents et de flux de travail alimentés par de grands modèles linguistiques (LLM) pour interagir avec des données spécifiques ou privées.

LlamaIndex peut-il être intégré à Elasticsearch ?

Oui, Elasticsearch peut être utilisé de différentes manières avec LlamaIndex, notamment comme source de données (en utilisant le lecteur Elasticsearch pour extraire des documents), comme modèle d'intégration (en encodant des données en vecteurs pour des recherches sémantiques), comme stockage vectoriel (en utilisant Elasticsearch comme référentiel pour la recherche de documents vectorisés), et pour le stockage avancé (en configurant des structures telles que des résumés de documents ou des graphes de connaissances).

Pour aller plus loin

Prêt à créer des expériences de recherche d'exception ?

Une recherche suffisamment avancée ne se fait pas avec les efforts d'une seule personne. Elasticsearch est alimenté par des data scientists, des ML ops, des ingénieurs et bien d'autres qui sont tout aussi passionnés par la recherche que vous. Mettons-nous en relation et travaillons ensemble pour construire l'expérience de recherche magique qui vous permettra d'obtenir les résultats que vous souhaitez.

Jugez-en par vous-même