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 ).
Digamos que quiero construir un conjunto de datos de texto que luego puedo usar para
La forma más sencilla de poner en marcha Apache Tika es con el
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.
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
""" 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.
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 elmc
, la herramienta de línea de comandos del cliente MinIO, así que asegúrese de tenerla.
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 estomc
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
Aquí hay un documento del que quiero extraer texto. Es un
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.
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:
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.
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
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