paint-brush
MinIO と Apache Tika を活用した自動テキスト抽出と分析@minio
7,838 測定値
7,838 測定値

MinIO と Apache Tika を活用した自動テキスト抽出と分析

MinIO7m2024/04/11
Read on Terminal Reader

長すぎる; 読むには

この投稿では、大規模言語モデル (LLM) トレーニングや検索拡張生成 (RAG) などの重要な下流タスクの中核となるドキュメント テキスト抽出に MinIO バケット通知と Apache Tika を使用します。
featured image - MinIO と Apache Tika を活用した自動テキスト抽出と分析
MinIO HackerNoon profile picture
0-item
1-item


この投稿では、大規模言語モデル ( LLM ) トレーニングや検索拡張生成 ( RAG ) などの重要な下流タスクの中核となるドキュメント テキスト抽出に MinIO Bucket Notifications と Apache Tika を使用します。


前提

例えば、テキストのデータセットを構築して、それを使って微調整LLMです。これを行うには、まずさまざまなドキュメント(ソースによってフォームファクタが異なる可能性があります)を組み立てて、そこからテキストを抽出する必要があります。データセットのセキュリティと監査可能性は最優先事項であるため、これらの非構造化ドキュメントは、それに合わせてオブジェクトストアに保存する必要があります。MinIOは、これらの状況など一方、Apache Tika は、「1,000 種類を超えるさまざまなファイル タイプ (PPT、XLS、PDF など) からメタデータとテキストを検出して抽出する」ツールキットです。これらを組み合わせることで、目的を達成できるシステムが形成されます。


以前の投稿、私たちはすぐに使える MinIO と約 30 行のコードでオブジェクト検出推論サーバーを組み立てました。この移植性と繰り返し性に優れたアーキテクチャを、今度はテキスト抽出のタスクに再び活用します。以下は、これから構築するシステムの大まかな概要です。




Apache Tika の設定

Apache Tikaを起動して実行する最も簡単な方法は、公式Dockerイメージ必要な Tika イメージのバージョン/タグについては、Docker Hub で確認してください。



この例では、デフォルト ポート 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ブログリソースリポジトリの抽出サーバー.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 アプリケーションが実行されているホスト名とポートをメモします。


バケット通知の設定

これで、残っているのは、バケット内の 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


これらの環境変数を設定したら、 MinIO サーバー(またはすでに実行中の場合は、 再起動する)。次の手順では、MinIOサーバーの展開に「エイリアス」が必要になります。エイリアスの詳細と設定方法については、ドキュメンテーションまた、MinIOクライアントのコマンドラインツールであるmcも使用しますので、必ずインストールしておいてください。インストール済み


次に、バケットのイベント通知と通知したいイベントの種類を設定しましょう。このプロジェクトのために、私は「抽出」という名前の新しいバケットを作成しました。これは、 MinIOコンソール経由またはmcコマンド抽出」バケットに新しいオブジェクトが追加されたときに Webhook をトリガーしたいので、 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


バケットイベントをウェブフックに公開する方法について詳しく知りたい場合は、 ドキュメント評論とこれイベント通知の詳細これで、テキスト抽出サーバーを試す準備が整いました。


やってみて

ここにテキストを抽出したい文書があります。 2000 年商品先物近代化法の PDF 、米国における金融法案の中で影響力のあるもの。



MinIO コンソールを使用して、この PDF を「抽出」バケットに入れました。



この PUT イベントはバケット通知をトリガーし、抽出サーバーのエンドポイントに公開されます。それに応じて、テキストが Tika によって抽出され、コンソールに出力されます。



次のステップ


今のところは抽出したテキストを印刷するだけですが、このテキストは「前提」で示唆されているように、多くの下流のタスクに使用できます。たとえば、次のようになります。


  1. LLM 微調整用のデータセット作成: さまざまなファイル形式 (PDF、DOCX、PPTX、Markdown など) で存在する企業ドキュメントのコレクションに対して、大規模な言語モデルを微調整したいとします。このタスク用の LLM 対応のテキスト データセットを作成するには、同様の Webhook で構成された MinIO バケットにこれらすべてのドキュメントを収集し、各ドキュメントから抽出したテキストを微調整/トレーニング セットのデータフレームに渡します。さらに、データセットのソース ファイルを MinIO に置くことで、データセットの構成の管理、監査、追跡がはるかに簡単になります。


  2. 検索拡張生成: RAG は、LLM アプリケーションが正確なコンテキストを利用し、幻覚を回避する方法です。このアプローチの中心的な側面は、ドキュメントのテキストを抽出してベクトルに埋め込み、セマンティック検索を可能にすることです。さらに、これらのベクトルの実際のソース ドキュメントをオブジェクト ストア (MinIO など) に保存するのが一般的にベスト プラクティスです。この記事で概説したアプローチを使用すると、両方を簡単に実現できます。RAG とその利点について詳しく知りたい場合は、こちらをご覧ください。 以前の投稿


  3. LLM アプリケーション: 新しく保存されたドキュメントからテキストを瞬時に抽出するプログラム的な方法により、特に LLM を利用できる場合は、可能性は無限です。キーワード検出 (例: プロンプト: 「どの株価ティッカーが言及されていますか?」)、コンテンツ評価 (例: プロンプト: 「ルーブリックによると、このエッセイ提出物にはどのくらいのスコアが必要ですか?」)、またはほぼあらゆる種類のテキストベースの分析 (例: プロンプト: 「このログ出力に基づくと、最初のエラーはいつ発生しましたか?」) を考えてみましょう。


これらのタスクに対するバケット通知の有用性を超えて、MinIO は、Powerpoint、画像、コード スニペットなど、あらゆる種類と数のオブジェクトに対して世界クラスのフォールト トレランスとパフォーマンスを提供できるように構築されています。


ご質問がある場合は、 Slackチャンネルまたは、こんにちは. 私たちはあなたを助けるためにここにいます。