paint-brush
Aprovechando MinIO y Apache Tika para la extracción y el análisis de texto automatizadospor@minio
8,089 lecturas
8,089 lecturas

Aprovechando MinIO y Apache Tika para la extracción y el análisis de texto automatizados

por MinIO7m2024/04/11
Read on Terminal Reader

Demasiado Largo; Para Leer

En esta publicación, usaremos MinIO Bucket Notifications y Apache Tika para la extracción de texto de documentos, que es el núcleo de tareas posteriores críticas como la capacitación del modelo de lenguaje grande (LLM) y la generación aumentada de recuperación (RAG).
featured image - Aprovechando MinIO y Apache Tika para la extracción y el análisis de texto automatizados
MinIO HackerNoon profile picture
0-item
1-item


En esta publicación, usaremos MinIO Bucket Notifications y Apache Tika para la extracción de texto de documentos, que es el núcleo de tareas posteriores críticas como la capacitación en modelos de lenguaje grande ( LLM ) y la generación aumentada de recuperación ( RAG ).


La premisa

Digamos que quiero construir un conjunto de datos de texto que luego puedo usar para afinar un LLM. Para hacer esto, primero necesitamos reunir varios documentos (que pueden tener diferentes factores de forma debido a su fuente) y extraer el texto de ellos. La seguridad y la auditabilidad del conjunto de datos son primordiales, por lo que estos documentos no estructurados deben almacenarse en un almacén de objetos para que coincida. MinIO es el almacén de objetos creado para estas situaciones y más . Por otro lado, Apache Tika es un conjunto de herramientas que "detecta y extrae metadatos y texto de más de mil tipos de archivos diferentes (como PPT, XLS y PDF)". Juntos, se unen para formar un sistema que puede lograr nuestro objetivo.


En una publicación anterior , armamos un servidor de inferencia de detección de objetos con MinIO listo para usar y aproximadamente 30 líneas de código. Vamos a aprovechar esa arquitectura altamente portátil y repetible una vez más, esta vez para la tarea de extracción de texto. A continuación se muestra una descripción aproximada del sistema que vamos a construir.




Configurando Apache Tika

La forma más sencilla de poner en marcha Apache Tika es con el imagen oficial de Docker . Consulte Docker Hub para ver la versión/etiqueta de imagen Tika que desee.



En este ejemplo, le permito usar y exponer el puerto predeterminado, 9998.


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


Utilice docker ps o Docker Desktop para verificar que el contenedor Tika se esté ejecutando y haya expuesto el puerto 9998.


Construyendo el servidor de extracción de texto

Ahora que Tika se está ejecutando, necesitamos construir un servidor que pueda realizar mediante programación solicitudes de extracción de Tika para nuevos objetos. Después de eso, necesitamos configurar webhooks en un depósito MinIO para alertar a este servidor sobre la llegada de nuevos objetos (en otras palabras, eventos PUT para un depósito). Repasemos esto paso a paso.


Para mantener las cosas relativamente simples y resaltar la portabilidad de este enfoque, el servidor de extracción de texto se construirá en Python, utilizando el popular marco Flask. Aquí está el código para el servidor (también disponible en el repositorio de recursos del blog de MinIO en servidor_extracción.py ) que realiza la extracción de texto en nuevos documentos agregados a un depósito con el uso de Tika (a través de 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()


Iniciemos el servidor de extracción:



Tome nota del nombre de host y el puerto en el que se ejecuta la aplicación Flask.


Configurar notificaciones de depósito

Ahora, todo lo que queda es configurar el webhook para el depósito en el servidor MinIO para que cualquier evento PUT (también conocido como nuevos objetos agregados) en el depósito active una llamada al punto final de extracción. Con la herramienta mc , podemos hacer esto con solo unos pocos comandos.


Primero, necesitamos configurar algunas variables de entorno para indicarle a su servidor MinIO que está habilitando un webhook y el punto final correspondiente para ser llamado. Reemplace <YOURFUNCTIONNAME> con un nombre de función de su elección. Para simplificar, opté por "extracción". Además, asegúrese de que la variable de entorno del punto final esté configurada en el host y puerto correctos para su servidor de inferencia. En este caso, http://localhost:5000 es donde se ejecuta nuestra aplicación Flask.


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


Una vez que haya configurado estas variables de entorno, inicie el Servidor MinIO (o si ya estaba ejecutándose, reiniciarlo ). En los siguientes pasos, necesitaremos un 'alias' para la implementación de su servidor MinIO. Para obtener más información sobre los alias y cómo configurar uno, consulte la documentación . También usaremos mc , la herramienta de línea de comandos del cliente MinIO, así que asegúrese de tenerla. instalado .


A continuación, configuremos la notificación de eventos para nuestro depósito y el tipo de evento sobre el que queremos recibir notificaciones. Para los propósitos de este proyecto, creé un depósito nuevo también llamado " extracción ". Puedes hacer esto a través de la consola MinIO o mc comandos Dado que queremos activar el webhook al agregar nuevos objetos al depósito de " extracción" , nuestro enfoque son los eventos PUT . Reemplace ALIAS con el alias de la implementación de su servidor MinIO y BUCKET con el depósito deseado en ese servidor. Al igual que antes, asegúrese de reemplazar <YOURFUNCTIONNAME> con el mismo valor que utilizó en el paso anterior.


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


Finalmente, puede verificar que haya configurado el tipo de evento correcto para las notificaciones del depósito verificando si se s3:ObjectCreated:* cuando ejecuta este comando:


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


Si desea obtener más información sobre la publicación de eventos de depósito en un webhook, consulte la doc umentación así como esto profundizar en las notificaciones de eventos . Ahora estamos listos para probar nuestro servidor de extracción de texto.


Pruébalo

Aquí hay un documento del que quiero extraer texto. Es un PDF de la Ley de Modernización Futura de los Productos Básicos de 2000 , una influyente pieza de legislación financiera en los Estados Unidos.



Puse este PDF en mi depósito de ' extracción ' usando la consola MinIO.



Este evento PUT activa una notificación de depósito que luego se publica en el punto final del servidor de extracción. En consecuencia, Tika extrae el texto y lo imprime en la consola.



Próximos pasos


Aunque por ahora solo estamos imprimiendo el texto extraído, este texto podría haberse utilizado para muchas tareas posteriores, como se insinúa en The Premise. Por ejemplo:


  1. Creación de conjuntos de datos para el ajuste fino de LLM : imagine que desea ajustar un modelo de lenguaje grande en una colección de documentos corporativos que existen en una variedad de formatos de archivo (es decir, PDF, DOCX, PPTX, Markdown, etc.). Para crear el conjunto de datos de texto compatible con LLM para esta tarea, puede recopilar todos estos documentos en un depósito MinIO configurado con un webhook similar y pasar el texto extraído de cada documento a un marco de datos del conjunto de ajuste/entrenamiento. Además, al tener los archivos fuente de su conjunto de datos en MinIO, resulta mucho más fácil administrar, auditar y rastrear la composición de sus conjuntos de datos.


  2. Recuperación de generación aumentada : RAG es una forma en que las aplicaciones LLM pueden hacer uso de un contexto preciso y evitar alucinaciones. Un aspecto central de este enfoque es garantizar que el texto de sus documentos pueda extraerse y luego incrustarse en vectores, permitiendo así la búsqueda semántica. Además, generalmente es una buena práctica almacenar los documentos fuente reales de estos vectores en un almacén de objetos (¡como MinIO!). Con el enfoque descrito en esta publicación, puedes lograr ambas cosas fácilmente. Si quieres conocer más sobre RAG y sus beneficios, consulta esto publicación anterior .


  3. Aplicación LLM : con una forma programática de extraer instantáneamente el texto de un documento recién almacenado, las posibilidades son infinitas, especialmente si puede utilizar un LLM. Piense en la detección de palabras clave (es decir, Pregunta: “¿Qué cotizaciones bursátiles se mencionan?”), evaluación de contenido (es decir, Pregunta: “Según la rúbrica, ¿qué puntuación debería obtener este ensayo?) o prácticamente cualquier tipo de análisis basado en texto. (es decir, mensaje: "Según este resultado de registro, ¿cuándo ocurrió el primer error?").


Más allá de la utilidad de las notificaciones de depósito para estas tareas, MinIO está diseñado para ofrecer tolerancia a fallas y rendimiento de primer nivel para cualquier tipo y cantidad de objetos, ya sean Powerpoints, imágenes o fragmentos de código.


Si tienes alguna pregunta únete a nuestro Canal flojo o envíanos una nota a [email protected] . Estamos aquí para ayudarte.