この投稿では、大規模言語モデル ( LLM ) トレーニングや検索拡張生成 ( RAG ) などの重要な下流タスクの中核となるドキュメント テキスト抽出に MinIO Bucket Notifications と Apache Tika を使用します。
例えば、テキストのデータセットを構築して、それを使って
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 バケットで webhook を構成して、このサーバーに新しいオブジェクトの到着 (つまり、バケットの PUT イベント) を通知する必要があります。手順を追って説明しましょう。
物事を比較的シンプルに保ち、このアプローチの移植性を強調するために、テキスト抽出サーバーは人気のFlaskフレームワークを使用してPythonで構築されます。サーバーのコードは次のとおりです(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 アプリケーションが実行されているホスト名とポートをメモします。
これで、残っているのは、バケット内の PUT イベント (つまり、新しいオブジェクトが追加された場合) によって抽出エンドポイントへの呼び出しがmc
されるように、MinIO サーバー上のバケットの Webhook を構成することだけです。mc ツールを使用すると、わずか数コマンドでこれを実行できます。
まず、Webhook を有効にして対応するエンドポイントを呼び出すことを MinIO サーバーに通知するために、いくつかの環境変数を設定する必要があります。<YOURFUNCTIONNAME> を任意の関数名に置き換えます。簡単にするために、ここでは「extraction」としました。また、エンドポイント環境変数が推論サーバーの正しいホストとポートに設定されていることを確認してください。この場合、Flask アプリケーションが実行されているのは http://localhost:5000 です。
export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000
これらの環境変数を設定したら、mc
も使用しますので、必ずインストールしておいてください。
次に、バケットのイベント通知と通知したいイベントの種類を設定しましょう。このプロジェクトのために、私は「抽出」という名前の新しいバケットを作成しました。これは、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
バケットイベントをウェブフックに公開する方法について詳しく知りたい場合は、
ここにテキストを抽出したい文書があります。
MinIO コンソールを使用して、この PDF を「抽出」バケットに入れました。
この PUT イベントはバケット通知をトリガーし、抽出サーバーのエンドポイントに公開されます。それに応じて、テキストが Tika によって抽出され、コンソールに出力されます。
今のところは抽出したテキストを印刷するだけですが、このテキストは「前提」で示唆されているように、多くの下流のタスクに使用できます。たとえば、次のようになります。
LLM 微調整用のデータセット作成: さまざまなファイル形式 (PDF、DOCX、PPTX、Markdown など) で存在する企業ドキュメントのコレクションに対して、大規模な言語モデルを微調整したいとします。このタスク用の LLM 対応のテキスト データセットを作成するには、同様の Webhook で構成された MinIO バケットにこれらすべてのドキュメントを収集し、各ドキュメントから抽出したテキストを微調整/トレーニング セットのデータフレームに渡します。さらに、データセットのソース ファイルを MinIO に置くことで、データセットの構成の管理、監査、追跡がはるかに簡単になります。
検索拡張生成: RAG は、LLM アプリケーションが正確なコンテキストを利用し、幻覚を回避する方法です。このアプローチの中心的な側面は、ドキュメントのテキストを抽出してベクトルに埋め込み、セマンティック検索を可能にすることです。さらに、これらのベクトルの実際のソース ドキュメントをオブジェクト ストア (MinIO など) に保存するのが一般的にベスト プラクティスです。この記事で概説したアプローチを使用すると、両方を簡単に実現できます。RAG とその利点について詳しく知りたい場合は、こちらをご覧ください。
LLM アプリケーション: 新しく保存されたドキュメントからテキストを瞬時に抽出するプログラム的な方法により、特に LLM を利用できる場合は、可能性は無限です。キーワード検出 (例: プロンプト: 「どの株価ティッカーが言及されていますか?」)、コンテンツ評価 (例: プロンプト: 「ルーブリックによると、このエッセイ提出物にはどのくらいのスコアが必要ですか?」)、またはほぼあらゆる種類のテキストベースの分析 (例: プロンプト: 「このログ出力に基づくと、最初のエラーはいつ発生しましたか?」) を考えてみましょう。
これらのタスクに対するバケット通知の有用性を超えて、MinIO は、Powerpoint、画像、コード スニペットなど、あらゆる種類と数のオブジェクトに対して世界クラスのフォールト トレランスとパフォーマンスを提供できるように構築されています。
ご質問がある場合は、