paint-brush
Nutzung von MinIO und Apache Tika zur automatischen Textextraktion und -analysevon@minio
7,928 Lesungen
7,928 Lesungen

Nutzung von MinIO und Apache Tika zur automatischen Textextraktion und -analyse

von MinIO7m2024/04/11
Read on Terminal Reader

Zu lang; Lesen

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.
featured image - Nutzung von MinIO und Apache Tika zur automatischen Textextraktion und -analyse
MinIO HackerNoon profile picture
0-item
1-item


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.


Die Voraussetzung

Nehmen wir an, ich möchte einen Textdatensatz erstellen, den ich dann verwenden kann, um Feinabstimmung ein LLM. Dazu müssen wir zunächst verschiedene Dokumente zusammenstellen (die je nach Quelle unterschiedliche Formfaktoren haben können) und den Text daraus extrahieren. Die Sicherheit und Überprüfbarkeit von Datensätzen ist von größter Bedeutung, daher müssen diese unstrukturierten Dokumente in einem entsprechenden Objektspeicher gespeichert werden. MinIO ist der Objektspeicher, der für diese Situationen und mehr . Apache Tika hingegen ist ein Toolkit, das „Metadaten und Text aus über tausend verschiedenen Dateitypen (wie PPT, XLS und PDF) erkennt und extrahiert.“ Zusammen bilden sie ein System, mit dem wir unser Ziel erreichen können.


In einem früheren Beitrag haben wir einen sofort einsatzbereiten Objekterkennungs-Inferenzserver mit MinIO und etwa 30 Zeilen Code zusammengestellt. Wir werden diese hochgradig portable und wiederholbare Architektur erneut nutzen, dieses Mal für die Aufgabe der Textextraktion. Unten finden Sie eine grobe Darstellung des Systems, das wir bauen werden.




Einrichten von Apache Tika

Der einfachste Weg, Apache Tika zum Laufen zu bringen, ist mit dem offizielles Docker-Image . Suchen Sie im Docker Hub nach der gewünschten Tika-Image-Version/dem gewünschten Tika-Image-Tag.



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.


Erstellen des Textextraktionsservers

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 Extraktionsserver.py ), das mithilfe von Tika (über 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()


Starten wir den Extraktionsserver:



Notieren Sie sich den Hostnamen und den Port, auf dem die Flask-Anwendung ausgeführt wird.


Einrichten von Bucket-Benachrichtigungen

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 den MinIO-Server (oder wenn es bereits lief, starte es neu ). In den folgenden Schritten benötigen wir einen „Alias“ für Ihre MinIO-Serverbereitstellung. Weitere Informationen zu Aliasen und zum Festlegen eines Alias finden Sie im Dokumentation . Wir werden auch mc verwenden, das MinIO-Client-Befehlszeilentool. Stellen Sie also sicher, dass Sie es haben Eingerichtet .


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 tun über die MinIO-Konsole oder mc Befehle Da wir den Webhook beim Hinzufügen neuer Objekte zum Bucket „ Extraktion“ auslösen möchten, liegt unser Fokus auf PUT- Ereignissen. Ersetzen Sie ALIAS durch den Alias Ihrer MinIO-Serverbereitstellung und BUCKET durch den gewünschten Bucket auf diesem Server. Achten Sie wie zuvor darauf, <YOURFUNCTIONNAME> durch denselben Wert zu ersetzen, den Sie im vorherigen Schritt verwendet haben.


 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 Dokument umentation sowie diese tieferes Eintauchen in Ereignisbenachrichtigungen . Jetzt sind wir bereit, unseren Textextraktionsserver auszuprobieren.


Versuch es

Hier ist ein Dokument, aus dem ich Text extrahieren möchte. Es ist ein PDF des Commodities Future Modernization Act von 2000 , ein einflussreiches Finanzgesetz in den Vereinigten Staaten.



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.



Nächste Schritte


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:


  1. 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.


  2. 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 früherer Beitrag .


  3. 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 Slack-Kanal oder schreiben Sie uns eine Nachricht an [email protected] . Wir sind hier, um dir zu helfen.