В этом посте мы будем использовать 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, изображения или фрагменты кода.
Если у вас есть вопросы, присоединяйтесь к нам