In diesem Beitrag verwenden wir MinIO Bucket Notifications und Apache Tika zur Dokumenttextextraktion, die das Herzstück kritischer nachgelagerter Aufgaben wie dem Training von Large Language Models ( LLM ) und Retrieval Augmented Generation ( RAG ) bildet.
Nehmen wir an, ich möchte einen Textdatensatz erstellen, den ich dann verwenden kann, um
Der einfachste Weg, Apache Tika zum Laufen zu bringen, ist mit dem
In diesem Beispiel erlaube ich die Verwendung und Anzeige des Standardports 9998.
docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>
Verwenden Sie docker ps
oder Docker Desktop, um zu überprüfen, ob der Tika-Container ausgeführt wird und Port 9998 freigegeben ist.
Nachdem Tika nun läuft, müssen wir einen Server erstellen, der programmgesteuert Tika-Extraktionsanfragen für neue Objekte stellen kann. Anschließend müssen wir Webhooks auf einem MinIO-Bucket konfigurieren, um diesen Server über das Eintreffen neuer Objekte zu informieren (mit anderen Worten PUT-Ereignisse für einen Bucket). Gehen wir das Ganze Schritt für Schritt durch.
Um die Dinge relativ einfach zu halten und die Portabilität dieses Ansatzes hervorzuheben, wird der Textextraktionsserver in Python erstellt, unter Verwendung des beliebten Flask-Frameworks. Hier ist der Code für den Server (auch verfügbar im MinIO Blog Resources-Repository unter
""" 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()
Starten wir den Extraktionsserver:
Notieren Sie sich den Hostnamen und den Port, auf dem die Flask-Anwendung ausgeführt wird.
Jetzt müssen wir nur noch den Webhook für den Bucket auf dem MinIO-Server konfigurieren, damit alle PUT-Ereignisse (also neu hinzugefügte Objekte) im Bucket einen Aufruf des Extraktionsendpunkts auslösen. Mit dem mc
Tool können wir dies mit nur wenigen Befehlen erledigen.
Zuerst müssen wir einige Umgebungsvariablen festlegen, um Ihrem MinIO-Server zu signalisieren, dass Sie einen Webhook und den Aufruf des entsprechenden Endpunkts aktivieren. Ersetzen Sie <IHRFUNKTIONSNAME> durch einen Funktionsnamen Ihrer Wahl. Der Einfachheit halber habe ich mich für „Extraktion“ entschieden. Stellen Sie außerdem sicher, dass die Umgebungsvariable des Endpunkts auf den richtigen Host und Port für Ihren Inferenzserver eingestellt ist. In diesem Fall wird unsere Flask-Anwendung unter http://localhost:5000 ausgeführt.
export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000
Nachdem Sie diese Umgebungsvariablen festgelegt haben, starten Sie denmc
verwenden, das MinIO-Client-Befehlszeilentool. Stellen Sie also sicher, dass Sie es haben
Als nächstes konfigurieren wir die Ereignisbenachrichtigung für unseren Bucket und den Ereignistyp, über den wir benachrichtigt werden möchten. Für die Zwecke dieses Projekts habe ich einen brandneuen Bucket mit dem Namen „ Extraktion “ erstellt. Sie können dies entweder tunmc
mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put
Abschließend können Sie prüfen, ob Sie den richtigen Ereignistyp für die Bucket-Benachrichtigungen konfiguriert haben. Überprüfen Sie dazu, ob beim Ausführen des folgenden Befehls s3:ObjectCreated:*
ausgegeben wird:
mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook
Wenn Sie mehr über das Veröffentlichen von Bucket-Ereignissen in einem Webhook erfahren möchten, lesen Sie den
Hier ist ein Dokument, aus dem ich Text extrahieren möchte. Es ist ein
Ich habe dieses PDF mithilfe der MinIO-Konsole in meinen „ Extraktions “-Bucket gelegt.
Dieses PUT-Ereignis löst eine Bucket-Benachrichtigung aus, die dann am Endpunkt des Extraktionsservers veröffentlicht wird. Dementsprechend wird der Text von Tika extrahiert und auf der Konsole ausgegeben.
Obwohl wir jetzt nur den extrahierten Text ausdrucken, hätte dieser Text für viele nachgelagerte Aufgaben verwendet werden können, wie in The Premise angedeutet. Zum Beispiel:
Datensatzerstellung für LLM-Feinabstimmung : Stellen Sie sich vor, Sie möchten ein großes Sprachmodell für eine Sammlung von Unternehmensdokumenten feinabstimmen, die in verschiedenen Dateiformaten vorliegen (z. B. PDF, DOCX, PPTX, Markdown usw.). Um den LLM-freundlichen Textdatensatz für diese Aufgabe zu erstellen, könnten Sie alle diese Dokumente in einem MinIO-Bucket sammeln, der mit einem ähnlichen Webhook konfiguriert ist, und den extrahierten Text für jedes Dokument an einen Datenrahmen des Feinabstimmungs-/Trainingssatzes übergeben. Darüber hinaus wird es viel einfacher, die Zusammensetzung Ihrer Datensätze zu verwalten, zu prüfen und zu verfolgen, wenn die Quelldateien Ihres Datensatzes auf MinIO gespeichert sind.
Retrieval Augmented Generation : RAG ist eine Möglichkeit für LLM-Anwendungen, präzise Kontexte zu nutzen und Halluzinationen zu vermeiden. Ein zentraler Aspekt dieses Ansatzes besteht darin, sicherzustellen, dass der Text Ihrer Dokumente extrahiert und dann in Vektoren eingebettet werden kann, wodurch eine semantische Suche ermöglicht wird. Darüber hinaus ist es im Allgemeinen eine bewährte Methode, die eigentlichen Quelldokumente dieser Vektoren in einem Objektspeicher (wie MinIO!) zu speichern. Mit dem in diesem Beitrag beschriebenen Ansatz können Sie beides problemlos erreichen. Wenn Sie mehr über RAG und seine Vorteile erfahren möchten, lesen Sie dies
LLM-Anwendung : Mit einer programmgesteuerten Methode zum sofortigen Extrahieren des Textes aus einem neu gespeicherten Dokument sind die Möglichkeiten endlos, insbesondere wenn Sie ein LLM verwenden können. Denken Sie an die Schlüsselworterkennung (z. B. Eingabeaufforderung: „Welche Börsenticker werden erwähnt?“), die Inhaltsbewertung (z. B. Eingabeaufforderung: „Welche Punktzahl sollte dieser Aufsatz gemäß der Rubrik erhalten?“) oder praktisch jede Art textbasierter Analyse (z. B. Eingabeaufforderung: „Wann ist basierend auf dieser Protokollausgabe der erste Fehler aufgetreten?“).
Über den Nutzen von Bucket-Benachrichtigungen für diese Aufgaben hinaus ist MinIO so konzipiert, dass es erstklassige Fehlertoleranz und Leistung für jede Art und Anzahl von Objekten bietet – egal, ob es sich um Powerpoints, Bilder oder Codeausschnitte handelt.
Wenn Sie Fragen haben, kontaktieren Sie uns