paint-brush
Использование MinIO и Apache Tika для автоматического извлечения и анализа текстак@minio
8,084 чтения
8,084 чтения

Использование MinIO и Apache Tika для автоматического извлечения и анализа текста

к MinIO7m2024/04/11
Read on Terminal Reader

Слишком долго; Читать

В этом посте мы будем использовать уведомления о сегментах MinIO и Apache Tika для извлечения текста документа, что лежит в основе критически важных последующих задач, таких как обучение модели большого языка (LLM) и поисковая расширенная генерация (RAG).
featured image - Использование MinIO и Apache Tika для автоматического извлечения и анализа текста
MinIO HackerNoon profile picture
0-item
1-item


В этом посте мы будем использовать MinIO Bucket Notifications и Apache Tika для извлечения текста документа, что лежит в основе критически важных последующих задач, таких как обучение модели большого языка ( LLM ) и поисковая дополненная генерация ( RAG ).


Предпосылка

Допустим, я хочу создать набор текстовых данных, который затем смогу использовать для тонкая настройка LLM. Для этого нам сначала нужно собрать различные документы (которые могут иметь разные форм-факторы в зависимости от их источника) и извлечь из них текст. Безопасность и возможность аудита набора данных имеют первостепенное значение, поэтому эти неструктурированные документы необходимо хранить в хранилище объектов, чтобы они соответствовали друг другу. MinIO — это хранилище объектов, созданное для эти ситуации и многое другое . С другой стороны, Apache Tika — это набор инструментов, который «обнаруживает и извлекает метаданные и текст из более чем тысячи различных типов файлов (таких как PPT, XLS и PDF)». Вместе они объединяются, чтобы сформировать систему, которая может достичь нашей цели.


В предыдущем посте , мы собрали сервер вывода обнаружения объектов с MinIO прямо из коробки и примерно 30 строк кода. Мы собираемся снова использовать эту легко переносимую и повторяемую архитектуру, на этот раз для задачи извлечения текста. Ниже приведено примерное изображение системы, которую мы собираемся построить.




Настройка Apache Тика

Самый простой способ запустить Apache Tika — использовать официальный образ Docker . Проверьте Docker Hub на наличие нужной версии/тега образа Tika.



В этом примере я разрешаю ему использовать и выставлять порт по умолчанию — 9998.


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


Используйте docker ps или Docker Desktop, чтобы убедиться, что контейнер Tika запущен и открыт порт 9998.


Создание сервера извлечения текста

Теперь, когда Tika запущена, нам нужно создать сервер, который сможет программно выполнять запросы Tika на извлечение новых объектов. После этого нам нужно настроить веб-перехватчики в корзине MinIO, чтобы предупреждать этот сервер о прибытии новых объектов (другими словами, события PUT для корзины). Давайте пройдемся по нему шаг за шагом.


Чтобы упростить задачу и подчеркнуть переносимость этого подхода, сервер извлечения текста будет построен на Python с использованием популярной инфраструктуры Flask. Вот код сервера (также доступен в репозитории ресурсов блога MinIO в разделе добыча_server.py ), который выполняет извлечение текста из новых документов, добавленных в корзину с помощью Tika (через Тика-Питон ).


 """ 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()


Запустим сервер извлечения:



Запишите имя хоста и порт, на котором работает приложение Flask.


Настройка уведомлений сегмента

Теперь все, что осталось, — это настроить веб-перехватчик для корзины на сервере MinIO, чтобы любые события PUT (то есть добавленные новые объекты) в корзине инициировали вызов конечной точки извлечения. С помощью инструмента mc мы можем сделать это всего за несколько команд.


Во-первых, нам нужно установить несколько переменных среды, чтобы сигнализировать вашему серверу MinIO о том, что вы разрешаете веб-перехватчик и вызов соответствующей конечной точки. Замените <YOURFUNCTIONNAME> именем функции по вашему выбору. Для простоты я выбрал «извлечение». Кроме того, убедитесь, что для переменной среды конечной точки задан правильный хост и порт для вашего сервера вывода. В данном случае http://localhost:5000 — это место, где работает наше приложение Flask.


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


После установки этих переменных среды запустите МинИО-сервер (или, если он уже запущен, перезапусти его ). На следующих шагах нам понадобится «псевдоним» для развертывания вашего сервера MinIO. Чтобы узнать больше о псевдонимах и о том, как их установить, ознакомьтесь с документация . Мы также будем использовать mc , инструмент командной строки клиента MinIO, поэтому убедитесь, что он у вас есть. установлен .


Далее давайте настроим уведомление о событиях для нашей корзины и тип события, о котором мы хотим получать уведомления. Для целей этого проекта я создал совершенно новое ведро, также названное « извлечение ». Вы можете сделать это либо через консоль MinIO или mc команды Поскольку мы хотим активировать веб-перехватчик при добавлении новых объектов в корзину « извлечение» , в центре внимания находятся события PUT . Замените ALIAS псевдонимом вашего развертывания сервера MinIO , а BUCKET — желаемым сегментом на этом сервере. Как и раньше, обязательно замените <YOURFUNCTIONNAME> тем же значением, которое вы использовали на предыдущем шаге.


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


Наконец, вы можете проверить, что вы настроили правильный тип событий для уведомлений корзины, проверив, выводится ли s3:ObjectCreated:* при запуске этой команды:


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


Если вы хотите узнать больше о публикации событий корзины в веб-перехватчике, ознакомьтесь со статьей док упоминание , а также это глубокое погружение в уведомления о событиях . Теперь мы готовы опробовать наш сервер извлечения текста.


Попробуйте это

Вот документ, из которого я хочу извлечь текст. Это PDF Закона о будущей модернизации сырьевых товаров 2000 г. , влиятельный элемент финансового законодательства в Соединенных Штатах.



Я поместил этот PDF-файл в корзину для извлечения с помощью консоли MinIO.



Это событие PUT запускает уведомление сегмента, которое затем публикуется на конечной точке сервера извлечения. Соответственно, текст извлекается Тикой и выводится на консоль.



Следующие шаги


Хотя на данный момент мы просто распечатываем извлеченный текст, этот текст можно было бы использовать для многих последующих задач, как намекается в «Предпосылке». Например:


  1. Создание набора данных для тонкой настройки LLM . Представьте, что вы хотите точно настроить большую языковую модель для коллекции корпоративных документов, существующих в различных форматах файлов (например, PDF, DOCX, PPTX, Markdown и т. д.). Чтобы создать удобный для LLM текстовый набор данных для этой задачи, вы можете собрать все эти документы в корзину MinIO, настроенную с помощью аналогичного веб-перехватчика, и передать извлеченный текст для каждого документа в фрейм данных набора тонкой настройки/обучения. Более того, имея исходные файлы вашего набора данных на MinIO, становится намного проще управлять, проверять и отслеживать состав ваших наборов данных.


  2. Поисковая дополненная генерация : RAG — это способ, с помощью которого приложения LLM могут использовать точный контекст и избегать галлюцинаций. Центральным аспектом этого подхода является обеспечение возможности извлечения текста ваших документов и его последующего внедрения в векторы, что обеспечивает возможность семантического поиска. Кроме того, обычно рекомендуется хранить исходные документы этих векторов в хранилище объектов (например, MinIO!). Используя подход, изложенный в этом посте, вы можете легко достичь и того, и другого. Если вы хотите узнать больше о RAG и его преимуществах, ознакомьтесь с этим предыдущий пост .


  3. Приложение LLM : благодаря программному способу мгновенного извлечения текста из вновь сохраненного документа возможности безграничны, особенно если вы можете использовать LLM. Подумайте об обнаружении ключевых слов (например, подсказка: «Какие биржевые котеры упоминаются?»), оценке контента (т. е. подсказка: «Какую оценку должно получить это эссе по рубрике?)» или практически о любом текстовом анализе. (т. е. подсказка: «На основании этих данных журнала, когда произошла первая ошибка?»).


Помимо использования групповых уведомлений для этих задач, MinIO создан для обеспечения отказоустойчивости и производительности мирового класса для любого типа и количества объектов — будь то Powerpoints, изображения или фрагменты кода.


Если у вас есть вопросы, присоединяйтесь к нам Слабый канал или напишите нам по адресу привет@min.io . Мы здесь чтобы помочь вам.