MinIO is a high-performance, cloud-native object store that runs anywhere (public cloud, private cloud, colo, onprem).
Walkthroughs, tutorials, guides, and tips. This story will teach you how to do something new or how to do something better.
This writer has a vested interest be it monetary, business, or otherwise, with 1 or more of the products or companies mentioned within.
В этом посте мы будем использовать MinIO Bucket Notifications и Apache Tika для извлечения текста документа, что лежит в основе критически важных последующих задач, таких как обучение модели большого языка ( LLM ) и поисковая дополненная генерация ( RAG ).
Допустим, я хочу создать набор текстовых данных, который затем смогу использовать для
Самый простой способ запустить Apache 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 в разделе
""" 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
После установки этих переменных среды запуститеmc
, инструмент командной строки клиента MinIO, поэтому убедитесь, что он у вас есть.
Далее давайте настроим уведомление о событиях для нашей корзины и тип события, о котором мы хотим получать уведомления. Для целей этого проекта я создал совершенно новое ведро, также названное « извлечение ». Вы можете сделать это либоmc
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-файл в корзину для извлечения с помощью консоли MinIO.
Это событие PUT запускает уведомление сегмента, которое затем публикуется на конечной точке сервера извлечения. Соответственно, текст извлекается Тикой и выводится на консоль.
Хотя на данный момент мы просто распечатываем извлеченный текст, этот текст можно было бы использовать для многих последующих задач, как намекается в «Предпосылке». Например:
Создание набора данных для тонкой настройки LLM . Представьте, что вы хотите точно настроить большую языковую модель для коллекции корпоративных документов, существующих в различных форматах файлов (например, PDF, DOCX, PPTX, Markdown и т. д.). Чтобы создать удобный для LLM текстовый набор данных для этой задачи, вы можете собрать все эти документы в корзину MinIO, настроенную с помощью аналогичного веб-перехватчика, и передать извлеченный текст для каждого документа в фрейм данных набора тонкой настройки/обучения. Более того, имея исходные файлы вашего набора данных на MinIO, становится намного проще управлять, проверять и отслеживать состав ваших наборов данных.
Поисковая дополненная генерация : RAG — это способ, с помощью которого приложения LLM могут использовать точный контекст и избегать галлюцинаций. Центральным аспектом этого подхода является обеспечение возможности извлечения текста ваших документов и его последующего внедрения в векторы, что обеспечивает возможность семантического поиска. Кроме того, обычно рекомендуется хранить исходные документы этих векторов в хранилище объектов (например, MinIO!). Используя подход, изложенный в этом посте, вы можете легко достичь и того, и другого. Если вы хотите узнать больше о RAG и его преимуществах, ознакомьтесь с этим
Приложение LLM : благодаря программному способу мгновенного извлечения текста из вновь сохраненного документа возможности безграничны, особенно если вы можете использовать LLM. Подумайте об обнаружении ключевых слов (например, подсказка: «Какие биржевые котеры упоминаются?»), оценке контента (т. е. подсказка: «Какую оценку должно получить это эссе по рубрике?)» или практически о любом текстовом анализе. (т. е. подсказка: «На основании этих данных журнала, когда произошла первая ошибка?»).
Помимо использования групповых уведомлений для этих задач, MinIO создан для обеспечения отказоустойчивости и производительности мирового класса для любого типа и количества объектов — будь то Powerpoints, изображения или фрагменты кода.
Если у вас есть вопросы, присоединяйтесь к нам
Использование MinIO и Apache Tika для автоматического извлечения и анализа текста | HackerNoon