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 ).
Disons que je souhaite construire un ensemble de données de texte que je peux ensuite utiliser pour
Le moyen le plus simple de faire fonctionner Apache Tika consiste à utiliser le
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.
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
""" 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.
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 lemc
, l'outil de ligne de commande MinIO Client, alors assurez-vous de l'avoir
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 soitmc
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
Voici un document dont je souhaite extraire du texte. C'est un
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.
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:
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.
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
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