paint-brush
Tirer parti de MinIO et Apache Tika pour l’extraction et l’analyse automatisées de textepar@minio
8,084 lectures
8,084 lectures

Tirer parti de MinIO et Apache Tika pour l’extraction et l’analyse automatisées de texte

par MinIO7m2024/04/11
Read on Terminal Reader

Trop long; Pour lire

Dans cet article, nous utiliserons MinIO Bucket Notifications et Apache Tika pour l'extraction de texte de documents, qui est au cœur des tâches critiques en aval telles que la formation du Large Language Model (LLM) et la Retrieval Augmented Generation (RAG).
featured image - Tirer parti de MinIO et Apache Tika pour l’extraction et l’analyse automatisées de texte
MinIO HackerNoon profile picture
0-item
1-item


Dans cet article, nous utiliserons MinIO Bucket Notifications et Apache Tika pour l'extraction de texte de documents, qui est au cœur des tâches critiques en aval telles que la formation du Large Language Model ( LLM ) et la Retrieval Augmented Generation ( RAG ).


La prémisse

Disons que je souhaite construire un ensemble de données de texte que je peux ensuite utiliser pour affiner un LLM. Pour ce faire, nous devons d’abord assembler divers documents (qui peuvent avoir des formats différents en raison de leur source) et en extraire le texte. La sécurité et l'auditabilité des ensembles de données sont primordiales, c'est pourquoi ces documents non structurés doivent être stockés dans un magasin d'objets pour correspondre. MinIO est le magasin d'objets conçu pour ces situations et plus encore . D'autre part, Apache Tika est une boîte à outils qui « détecte et extrait les métadonnées et le texte de plus d'un millier de types de fichiers différents (tels que PPT, XLS et PDF) ». Ensemble, ils se réunissent pour former un système capable d’atteindre notre objectif.


Dans un article précédent , nous avons mis en place un serveur d'inférence de détection d'objets avec MinIO prêt à l'emploi et environ 30 lignes de code. Nous allons exploiter une fois de plus cette architecture hautement portable et reproductible, cette fois pour la tâche d'extraction de texte. Vous trouverez ci-dessous une représentation approximative du système que nous allons construire.




Configuration d'Apache Tika

Le moyen le plus simple de faire fonctionner Apache Tika consiste à utiliser le Image officielle de Docker . Vérifiez Docker Hub pour la version/balise de votre image Tika souhaitée.



Dans cet exemple, je lui permets d'utiliser et d'exposer le port par défaut, 9998.


 docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>


Utilisez docker ps ou Docker Desktop pour vérifier que le conteneur Tika est en cours d'exécution et a exposé le port 9998.


Construire le serveur d'extraction de texte

Maintenant que Tika est en cours d'exécution, nous devons construire un serveur capable d'effectuer par programme des requêtes d'extraction Tika pour de nouveaux objets. Ensuite, nous devons configurer des webhooks sur un bucket MinIO pour alerter ce serveur de l'arrivée de nouveaux objets (en d'autres termes, des événements PUT pour un bucket). Passons en revue étape par étape.


Pour garder les choses relativement simples et mettre en évidence la portabilité de cette approche, le serveur d'extraction de texte sera construit en Python, en utilisant le framework Flask populaire. Voici le code du serveur (également disponible dans le référentiel MinIO Blog Resources sous extraction_server.py ) qui effectue une extraction de texte sur les nouveaux documents ajoutés à un bucket avec l'utilisation de Tika (via Tika-Python ).


 """ This is a simple Flask text extraction server that functions as a webhook service endpoint for PUT events in a MinIO bucket. Apache Tika is used to extract the text from the new objects. """ from flask import Flask, request, abort, make_response import io import logging from tika import parser from minio import Minio # Make sure the following are populated with your MinIO details # (Best practice is to use environment variables!) MINIO_ENDPOINT = '' MINIO_ACCESS_KEY = '' MINIO_SECRET_KEY = '' # This depends on how you are deploying Tika (and this server): TIKA_SERVER_URL = 'http://localhost:9998/tika' client = Minio( MINIO_ENDPOINT, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, ) logger = logging.getLogger(__name__) app = Flask(__name__) @app.route('/', methods=['POST']) async def text_extraction_webhook(): """ This endpoint will be called when a new object is placed in the bucket """ if request.method == 'POST': # Get the request event from the 'POST' call event = request.json bucket = event['Records'][0]['s3']['bucket']['name'] obj_name = event['Records'][0]['s3']['object']['key'] obj_response = client.get_object(bucket, obj_name) obj_bytes = obj_response.read() file_like = io.BytesIO(obj_bytes) parsed_file = parser.from_buffer(file_like.read(), serverEndpoint=TIKA_SERVER_URL) text = parsed_file["content"] metadata = parsed_file["metadata"] logger.info(text) result = { "text": text, "metadata": metadata } resp = make_response(result, 200) return resp else: abort(400) if __name__ == '__main__': app.run()


Démarrons le serveur d'extraction :



Notez le nom d'hôte et le port sur lesquels l'application Flask est exécutée.


Configuration des notifications de compartiment

Il ne reste plus qu'à configurer le webhook pour le bucket sur le serveur MinIO afin que tout événement PUT (c'est-à-dire les nouveaux objets ajoutés) dans le bucket déclenche un appel au point de terminaison d'extraction. Avec l'outil mc , nous pouvons le faire en quelques commandes seulement.


Tout d’abord, nous devons définir quelques variables d’environnement pour signaler à votre serveur MinIO que vous activez l’appel d’un webhook et du point de terminaison correspondant. Remplacez <YOURFUNCTIONNAME> par un nom de fonction de votre choix. Pour plus de simplicité, j'ai opté pour « extraction ». Assurez-vous également que la variable d'environnement du point de terminaison est définie sur l'hôte et le port corrects pour votre serveur d'inférence. Dans ce cas, http://localhost:5000 est l'endroit où notre application Flask s'exécute.


 export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000


Une fois que vous avez défini ces variables d'environnement, démarrez le Serveur MinIO (ou s'il était déjà en cours d'exécution, redémarrez-le ). Dans les étapes suivantes, nous aurons besoin d'un « alias » pour le déploiement de votre serveur MinIO. Pour en savoir plus sur les alias et comment en définir un, consultez le Documentation . Nous utiliserons également mc , l'outil de ligne de commande MinIO Client, alors assurez-vous de l'avoir installée .


Ensuite, configurons la notification d'événement pour notre bucket et le type d'événement dont nous souhaitons être informés. Pour les besoins de ce projet, j'ai créé un tout nouveau bucket également nommé ' extraction '. Vous pouvez le faire soit via la console MinIO ou mc commandes Puisque nous voulons déclencher le webhook lors de l'ajout de nouveaux objets au compartiment « extraction » , les événements PUT sont notre priorité. Remplacez ALIAS par l' alias de votre déploiement de serveur MinIO et BUCKET par le bucket souhaité sur ce serveur. Comme auparavant, assurez-vous de remplacer <YOURFUNCTIONNAME> par la même valeur que celle que vous avez utilisée à l'étape précédente.


 mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put


Enfin, vous pouvez vérifier que vous avez configuré le type d'événement correct pour les notifications du compartiment en vérifiant si s3:ObjectCreated:* est généré lorsque vous exécutez cette commande :


 mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook


Si vous souhaitez en savoir plus sur la publication d'événements de bucket sur un webhook, consultez le doc umentation ainsi que ceci approfondir les notifications d'événements . Nous sommes maintenant prêts à tester notre serveur d'extraction de texte.


Essaye le

Voici un document dont je souhaite extraire du texte. C'est un PDF de la loi de 2000 sur la modernisation de l'avenir des matières premières , un texte législatif financier influent aux États-Unis.



J'ai mis ce PDF dans mon bucket « extraction » à l'aide de la console MinIO.



Cet événement PUT déclenche une notification de compartiment qui est ensuite publiée sur le point de terminaison du serveur d'extraction. En conséquence, le texte est extrait par Tika et imprimé sur la console.



Prochaines étapes


Bien que nous imprimions simplement le texte extrait pour l'instant, ce texte aurait pu être utilisé pour de nombreuses tâches en aval, comme l'indique The Premise. Par exemple:


  1. Création d'ensembles de données pour le réglage fin du LLM : Imaginez que vous souhaitiez affiner un grand modèle de langage sur une collection de documents d'entreprise qui existent dans une variété de formats de fichiers (c'est-à-dire PDF, DOCX, PPTX, Markdown, etc.). Pour créer l'ensemble de données textuelles compatible LLM pour cette tâche, vous pouvez collecter tous ces documents dans un compartiment MinIO configuré avec un webhook similaire et transmettre le texte extrait pour chaque document à une trame de données de l'ensemble de réglage fin/formation. De plus, en disposant des fichiers sources de votre ensemble de données sur MinIO, il devient beaucoup plus facile de gérer, d'auditer et de suivre la composition de vos ensembles de données.


  2. Retrieval Augmented Generation : RAG est un moyen permettant aux applications LLM d'utiliser un contexte précis et d'éviter les hallucinations. Un aspect central de cette approche est de garantir que le texte de vos documents peut être extrait puis intégré dans des vecteurs, permettant ainsi une recherche sémantique. De plus, il est généralement recommandé de stocker les documents sources réels de ces vecteurs dans un magasin d'objets (comme MinIO !). Avec l’approche décrite dans cet article, vous pouvez facilement réaliser les deux. Si vous souhaitez en savoir plus sur RAG et ses avantages, consultez ceci message précédent .


  3. Application LLM : Avec un moyen programmatique d'extraire instantanément le texte d'un document nouvellement stocké, les possibilités sont infinies, surtout si vous pouvez utiliser un LLM. Pensez à la détection de mots clés (c'est-à-dire l'invite : « Quels titres boursiers sont mentionnés ? »), à l'évaluation du contenu (c'est-à-dire l'invite : « Selon la rubrique, quel score cette soumission d'essai devrait-elle obtenir ?), ou à peu près tout type d'analyse basée sur le texte. (c'est-à-dire Invite : « Sur la base de cette sortie de journal, quand la première erreur s'est-elle produite ? »).


Au-delà de l'utilité des notifications de compartiment pour ces tâches, MinIO est conçu pour offrir une tolérance aux pannes et des performances de classe mondiale pour tout type et nombre d'objets, qu'il s'agisse de Powerpoints, d'images ou d'extraits de code.


Si vous avez des questions, rejoignez notre Chaîne Slack ou envoyez-nous un message à [email protected] . Nous sommes là pour vous aider.