記事一覧
Dify ボットUI を探そう - 1(Open WebUI 導入)
Dify ボットUI を探そう - 2(dify2openai 導入)
Dify ボットUI を探そう - 3(Apache Tika 導入)
------------------------------------------------
Open WebUI の「ファイルのアップロード」では、各種文書・画像ファイルをメッセージに添付することができます。
画像ファイルの場合は BASE64形式 に変換された文字列が、その他のファイルに関しては抽出したテキストデータが LLM へ渡されます。
この動きは RAG という技術を利用したもので、その中でも「ドキュメントの分割と埋め込み(Embedding)」という作業が、回答内容の精度や品質に大きな影響を与えます。
本記事では Apache Tika を導入し、「ドキュメントの分割と埋め込み(Embedding)」の作業品質の向上を図ります。
インストール手順
日本語 OCR 機能を組み込んだ Apache Tika を、Docker 環境に導入します。
1. フォルダ構成
my-tika-ocr/ プロジェクトのルートフォルダ
├── docker-compose.yml Docker Compose の設定ファイル
├── Dockerfile Docker イメージの定義ファイル
└── config/ Tika の設定ファイルを格納するフォルダ
| └── tika-config.xml Tika の設定ファイル (OCR 設定などを記述)
└── data/ Tika のデータフォルダ
2. Dockerfile の作成
Tika の Docker イメージをビルドするための Dockerfile を作成します。
この Dockerfile では、公式の Tika イメージをベースに 日本語 OCR に必要なパッケージ をインストールします。
FROM apache/tika:latest
# この行以降のコマンドを root ユーザーとして実行
USER root
# 日本語 OCR に必要なパッケージをインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
tesseract-ocr \
tesseract-ocr-jpn \
libtesseract-dev \
libleptonica-dev \
poppler-utils \
&& rm -rf /var/lib/apt/lists/*
3. tika-config.xml の作成
Tika の設定ファイル tika-config.xml を config フォルダに作成します。
このファイルでは、日本語OCR 動作に関する設定を記述します。
<properties>
<parsers>
<!-- PDFParserの設定 -->
<parser class="org.apache.tika.parser.pdf.PDFParser">
<params>
<!-- PDF内に埋め込まれた画像を抽出するかどうかを指定する(true: 抽出する)-->
<param name="extractInlineImages" type="boolean">true</param>
<!-- テキスト抽出とOCRを両方試みる -->
<param name="ocrStrategy" type="string">OCR_AND_TEXT_EXTRACTION</param>
<!-- <param name="ocrStrategy" type="string">NO_OCR</param> -->
<!-- <param name="ocrStrategy" type="string">OCR_ONLY</param> -->
</params>
</parser>
<!-- TesseractOCRParserの設定(OCRを使用する場合のみ) -->
<parser class="org.apache.tika.parser.ocr.TesseractOCRParser">
<params>
<!-- OCRの言語設定(日本語の場合) -->
<param name="language" type="string">jpn</param>
<param name="tesseractPath" type="string">/usr/bin/tesseract</param>
<param name="tessdataPath" type="string">/usr/share/tesseract-ocr/tessdata</param>
<!-- 画像前処理を有効にする(精度が向上する)-->
<param name="enableImageProcessing" type="boolean">true</param>
<!-- 画像の自動回転補正を有効にする -->
<param name="applyRotation" type="boolean">true</param>
<!-- OCRのタイムアウト設定(ミリ秒) -->
<param name="timeout" type="int">60000</param>
</params>
</parser>
</parsers>
</properties>
PDFParserの設定
| 名称 | 説明 |
|---|---|
| extractInlineImages | PDF内に埋め込まれた画像を抽出するかどうかを指定する。 (true: 抽出する) |
| ocrStrategy | OCRの動作を指定する。 NO_OCR (OCRを使用しない) OCR_ONLY(OCRのみ使用する) OCR_AND_TEXT_EXTRACTION(OCRと共にテキストも抽出) |
TesseractOCRParserの設定(OCRを使用する場合のみ)
| 名称 | 説明 |
|---|---|
| language | 日本語(jpn)を指定。 |
| tesseractPath |
/usr/bin/tesseract Tesseract 実行ファイルのパス ※ コンテナ内のパスなので無変更で良い。 |
| tessdataPath |
/usr/share/tesseract-ocr/tessdata Tesseract の言語データ (tessdata) フォルダのパス ※ コンテナ内のパスなので無変更で良い。 |
| enableImageProcessing | ノイズ除去などの前処理を実施するときは true。 精度が向上する代わりに、実行速度は低下する。 |
| applyRotation | 画像の傾きを自動的に補正するときは true。 精度が向上する代わりに、実行速度は低下する。 |
| timeout | OCR機能のタイムアウト時間(ミリ秒)を指定する。 大きな値を指定すると、複雑な画像に遭遇した際の処理時間が大幅に遅延する可能性あり。 |
4. docker-compose.yml の作成
Docker Compose の設定ファイル docker-compose.yml を作成します。
services:
tika:
build: .
ports:
- "19998:9998"
volumes:
- ./config/tika-config.xml:/opt/tika/config/tika-config.xml
- ./data:/opt/tika/data
restart: unless-stopped
-
ports:
ホストのポート 19998 をコンテナのポート 9998 にマッピングする。 -
volumes:
ホストの実フォルダをコンテナ内にマウントする。-
config/tika-config.xmlを/opt/tika/config/tika-config.xmlにマウント。 -
dataフォルダを/opt/tika/dataフォルダにマウント。
-
-
restart: unless-stopped
エラーなどでコンテナが終了した場合でも、自動的に再起動する。
Tika コンテナの起動と停止
コンテナの起動
docker-compose.yml があるディレクトリで、次のコマンドを実行して Tika コンテナを起動します。
docker compose up -d
コンテナの停止
docker-compose.yml があるディレクトリで、次のコマンドを実行して Tika コンテナを停止します。
docker compose down
Open WebUI との連携
① 管理者パネル を開き、[設定]-[ドキュメント] を選択します。
② Content Extraction Engine の選択値を「Tika」に変更します。
③ Tika へアクセスする URL を入力します。
ここではホストPCへ割り当てられたIPアドレス(192.168.0.200)を使用していますが、別名が割り当て済みの時はそれを用いても構いません。
locakhost は指定しないでください。
本連載記事では Open WebUI を Dockerコンテナ として動かしています。
localhost という指定は Open WebUI 用コンテナ自身を指しており、Tika が動作するコンテナへ接続することはできません。
④ [保存]ボタンをクリックします。
画面右下の [保存] ボタンをクリックし、変更内容を保存してください。
終わりに
Apache Tika(日本語OCR付き)を導入後、PDFファイル の読み込み精度が向上しましたが、その分だけ回答速度も遅くなった気がします。
厳密に測定してはいませんが、これは Intel N150 という非力な CPU を使用しているためかもしれません。
なお、「画像ファイルを正しく認識してくれない」という問題は解決していません。
API プロキシサーバー dify2openai が BASE64形式に変換されたファイルデータを読み捨てている ためです。
この点については、dify2openai への「ある程度の作り込み」は不可避と思われます。