paint-brush
Aproveitando MinIO e Apache Tika para extração e análise automatizada de textopor@minio
7,922 leituras
7,922 leituras

Aproveitando MinIO e Apache Tika para extração e análise automatizada de texto

por MinIO7m2024/04/11
Read on Terminal Reader

Muito longo; Para ler

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).
featured image - Aproveitando MinIO e Apache Tika para extração e análise automatizada de texto
MinIO HackerNoon profile picture
0-item
1-item


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


A premissa

Digamos que eu queira construir um conjunto de dados de texto que possa usar para afinar um LLM. Para fazer isso, primeiro precisamos reunir vários documentos (que podem estar em formatos diferentes devido à sua fonte) e extrair o texto deles. A segurança e a auditabilidade do conjunto de dados são fundamentais, portanto, esses documentos não estruturados precisam ser armazenados em um armazenamento de objetos correspondente. MinIO é o armazenamento de objetos criado para essas situações e muito mais . Por outro lado, Apache Tika é um kit de ferramentas que “detecta e extrai metadados e texto de mais de mil tipos de arquivos diferentes (como PPT, XLS e PDF)”. Juntos, eles se unem para formar um sistema que pode atingir nosso objetivo.


Em uma postagem anterior , montamos um servidor de inferência de detecção de objetos com MinIO pronto para uso e aproximadamente 30 linhas de código. Vamos aproveitar mais uma vez essa arquitetura altamente portátil e repetível, desta vez para a tarefa de extração de texto. Abaixo está uma descrição aproximada do sistema que vamos construir.




Configurando o Apache Tika

A maneira mais simples de colocar o Apache Tika em funcionamento é com o imagem oficial do Docker . Verifique o Docker Hub para obter a versão/tag da imagem Tika desejada.



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.


Construindo o Servidor de Extração de Texto

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 extração_server.py ) que realiza a extração de texto em novos documentos adicionados a um bucket com o uso do Tika (via 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()


Vamos iniciar o servidor de extração:



Anote o nome do host e a porta em que o aplicativo Flask está sendo executado.


Configurando notificações de bucket

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 o Servidor MinIO (ou se já estava em execução, reinicie-o ). Nas etapas a seguir, precisaremos de um 'alias' para a implantação do servidor MinIO. Para saber mais sobre aliases e como defini-los, confira o documentação . Também usaremos mc , a ferramenta de linha de comando do MinIO Client, portanto, certifique-se de tê-la instalado .


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 isso por meio do console MinIO ou mc comandos Como queremos acionar o webhook na adição de novos objetos ao bucket de ' extração' , os eventos PUT são nosso foco. Substitua ALIAS pelo alias da implantação do servidor MinIO e BUCKET pelo bucket desejado nesse servidor. Assim como antes, certifique-se de substituir <YOURFUNCTIONNAME> pelo mesmo valor usado na etapa anterior.


 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 documento umentação, bem como este aprofunde-se nas notificações de eventos . Agora estamos prontos para testar nosso servidor de extração de texto.


Experimente

Aqui está um documento do qual desejo extrair texto. É um PDF da Lei de Modernização Futura de Commodities de 2000 , uma peça influente da legislação financeira nos Estados Unidos.



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.



Próximos passos


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:


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


  2. 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 postagem anterior .


  3. 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 Canal Slack ou deixe-nos uma nota em olá@min.io . Estamos aqui para ajudá-lo.