Nesta postagem, usaremos MinIO Bucket Notifications e Apache Tika, para extração de texto de documentos, que está no centro de tarefas críticas de downstream, como treinamento de Large Language Model ( LLM ) e Retrieval Augmented Generation ( RAG ).
Digamos que eu queira construir um conjunto de dados de texto que possa usar para
A maneira mais simples de colocar o Apache Tika em funcionamento é com o
Neste exemplo, permito usar e expor a porta padrão, 9998.
docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>
Use docker ps
ou Docker Desktop para verificar se o contêiner Tika está em execução e expôs a porta 9998.
Agora que o Tika está em execução, precisamos construir um servidor que possa fazer solicitações de extração Tika programaticamente para novos objetos. Em seguida, precisamos configurar webhooks em um bucket MinIO para alertar este servidor sobre a chegada de novos objetos (em outras palavras, eventos PUT para um bucket). Vamos examinar isso passo a passo.
Para manter as coisas relativamente simples e destacar a portabilidade desta abordagem, o servidor de extração de texto será construído em Python, usando o popular framework Flask. Aqui está o código do servidor (também disponível no repositório MinIO Blog Resources em
""" 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()
Vamos iniciar o servidor de extração:
Anote o nome do host e a porta em que o aplicativo Flask está sendo executado.
Agora, tudo o que resta é configurar o webhook para o bucket no servidor MinIO para que quaisquer eventos PUT (também conhecidos como novos objetos adicionados) no bucket acionem uma chamada para o endpoint de extração. Com a ferramenta mc
, podemos fazer isso com apenas alguns comandos.
Primeiro, precisamos definir algumas variáveis de ambiente para sinalizar ao seu servidor MinIO que você está habilitando um webhook e o endpoint correspondente a ser chamado. Substitua <YOURFUNCTIONNAME> por um nome de função de sua escolha. Para simplificar, optei por 'extração'. Além disso, certifique-se de que a variável de ambiente do terminal esteja configurada para o host e a porta corretos para seu servidor de inferência. Nesse caso, http://localhost:5000 é onde nosso aplicativo Flask está sendo executado.
export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000
Depois de definir essas variáveis de ambiente, inicie omc
, a ferramenta de linha de comando do MinIO Client, portanto, certifique-se de tê-la
A seguir, vamos configurar a notificação de eventos para nosso bucket e o tipo de evento sobre o qual queremos ser notificados. Para os fins deste projeto, criei um balde totalmente novo, também denominado ' extração '. Você também pode fazer issomc
mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put
Por fim, você pode verificar se configurou o tipo de evento correto para as notificações de bucket verificando se s3:ObjectCreated:*
é gerado quando você executa este comando:
mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook
Se você quiser saber mais sobre como publicar eventos de bucket em um webhook, confira o
Aqui está um documento do qual desejo extrair texto. É um
Coloquei este PDF no meu bucket de ' extração ' usando o console MinIO.
Este evento PUT aciona uma notificação de bucket que é publicada no endpoint do servidor de extração. Assim, o texto é extraído pelo Tika e impresso no console.
Embora estejamos apenas imprimindo o texto extraído por enquanto, este texto poderia ter sido usado para muitas tarefas posteriores, conforme sugerido em The Premise. Por exemplo:
Criação de conjunto de dados para ajuste fino de LLM : Imagine que você deseja ajustar um grande modelo de linguagem em uma coleção de documentos corporativos que existem em uma variedade de formatos de arquivo (ou seja, PDF, DOCX, PPTX, Markdown, etc.). Para criar o conjunto de dados de texto compatível com LLM para esta tarefa, você pode coletar todos esses documentos em um bucket MinIO configurado com um webhook semelhante e passar o texto extraído de cada documento para um dataframe do conjunto de ajuste fino/treinamento. Além disso, ao ter os arquivos de origem do seu conjunto de dados no MinIO, fica muito mais fácil gerenciar, auditar e rastrear a composição dos seus conjuntos de dados.
Geração Aumentada de Recuperação : RAG é uma maneira pela qual os aplicativos LLM podem fazer uso de contexto preciso e evitar alucinações. Um aspecto central desta abordagem é garantir que o texto dos seus documentos possa ser extraído e depois incorporado em vetores, permitindo assim a pesquisa semântica. Além disso, geralmente é uma prática recomendada armazenar os documentos de origem reais desses vetores em um armazenamento de objetos (como MinIO!). Com a abordagem descrita nesta postagem, você pode facilmente conseguir ambos. Se você quiser saber mais sobre o RAG e seus benefícios, confira este
Aplicação LLM : Com uma forma programática de extrair instantaneamente o texto de um documento recém-armazenado, as possibilidades são infinitas, especialmente se você puder utilizar um LLM. Pense na detecção de palavras-chave (ou seja, Prompt: “Quais cotações da bolsa são mencionadas?”), avaliação de conteúdo (ou seja, Prompt: “De acordo com a rubrica, qual pontuação este envio de ensaio deve obter?) Ou praticamente qualquer tipo de análise baseada em texto (ou seja, Prompt: “Com base nesta saída de log, quando ocorreu o primeiro erro?”).
Além da utilidade das Notificações de Bucket para essas tarefas, o MinIO foi desenvolvido para oferecer tolerância a falhas e desempenho de classe mundial para qualquer tipo e número de objetos – sejam eles Powerpoints, imagens ou trechos de código.
Se você tiver alguma dúvida entre em nosso