PDFMathTranslate は、数式や図表を含む論文 PDF の翻訳において、レイアウトの維持に強みを持つツールとして注目を集めています。本記事ではローカル LLM である Ollama を用いた利用方法に焦点を当てて解説します。
PDFMathTranslate
PDFMathTranslateは、学術論文の翻訳における課題を解決するために開発されたツールです。主な特徴は以下のとおりです。
- 数式・図表の完全保持: 論文中の数式、グラフ、図表を元のレイアウトのまま保持します。目次や注釈も維持されるため、原文の構造を損なうことなく翻訳が可能
- 多言語対応: 複数の言語間の翻訳をサポート
- 各種 API 対応: OpenAI, Claude, Gemini, Ollama など、様々な LLM に対応
例:Transformer が発表された論文より
Ollama との連携
Ollamaは、ローカル環境で LLM を実行するためのツールです。あらかじめインストールしておいてください。
PDFMathTranslate で Ollama を使用することには、以下のメリットがあります。
- プライバシーの保護: 翻訳処理がローカル環境で完結するため、論文の内容が外部に送信されることはありません。
- コスト削減: クラウドベースの翻訳サービスと異なり、API利用料などを気にすることなく、何度でも翻訳を行うことができます。(ただし、電気代を考慮すると割高になる可能性もあります)
- オフライン環境での利用: インターネット接続がない環境でも翻訳が可能です。(事前にモデルがインストールされていることが前提です)
ローカル LLM のチャット以外の実用例としても注目に値します。開発者視点では LLM をツールに組み込む上でも参考になります。
インストール
本記事では Python 環境の管理ツールである uv を使った方法を説明します。
パッケージなどで uv をインストールしてください。Windows の場合は winget が利用できます。
winget install --id=astral-sh.uv -e
PDFMathTranslate の最新版を利用するため、GitHub リポジトリからの直接インストールを推奨します。
uv tool install --python 3.10 git+https://github.com/Byaidu/PDFMathTranslate.git
インストール後にアップデートするときは -U
を付けます。
uv tool install -U --python 3.10 git+https://github.com/Byaidu/PDFMathTranslate.git
実行方法
コマンド例を示します。
uvx --python 3.10 pdf2zh -li en -lo ja -t 1 -s "ollama:gemma2:2b-instruct-q4_K_M;aya-expanse" PDFファイル
ホームディレクトリの .local/bin に実行可能ファイルがインストールされるため、そこにパスを通して利用する方法もあります。その場合 uvx --python 3.10
は不要です。
主なオプション:
-
-li
: 翻訳元言語(例:en - 英語) -
-lo
: 翻訳先言語(例:ja - 日本語) -
-t 1
: 使用するスレッド数(通常、ローカル LLM の並列実行は困難) -
-s
: 翻訳エンジンとモデルの指定
モデルは環境変数 OLLAMA_MODEL
でも指定可能です。その場合のオプションは -s ollama
だけとなります。
環境変数を設定することで、別マシンの Ollama にアクセスすることも可能です。詳細は以下の記事を参照してください。
モデル指定
-s ollama:
に続くモデル名はセミコロンで区切って複数指定できます。Ollama での処理が無限ループに陥ることが一定確率で発生するため、自動的に次のモデルを試すフォールバック機能としての役割を果たします。動作を安定させるため、複数指定を推奨します。
推奨する組み合わせは gemma2:2b-instruct-q4_K_M;aya-expanse
です。ただし、aya-expanse
は商用利用不可ライセンスのため、商用利用の場合は gemma2:2b-instruct-q4_K_M;gemma2:9b-instruct-q4_K_M
の使用を推奨します。
利用するモデルはあらかじめ ollama に pull しておいてください。
ollama pull gemma2:2b-instruct-q4_K_M
ollama pull gemma2:9b-instruct-q4_K_M
ollama pull aya-expanse
3 つ指定することも可能です。その場合、指定した順にフォールバックされます。
無限ループを検出すると Response too long
と表示して次の LLM にフォールバックします。
万一、それが無限に続く場合、PDFMathTranslate を [Ctrl]+[C] で強制終了させてください。Windows の場合はショートカットキーが利かないため、タスクトレイから Ollama の常駐プロセスを終了させて、タスクマネージャーで Python のプロセスを強制終了させてください。
処理時間
処理時間はハードウェアに大きく依存します。GPU(例:Radeon RX 7600 XT)使用時は、gemma2:2b-instruct-q4_K_M で 1 ページあたり約 5〜10 秒、CPU 処理時はその 5〜20 倍程度かかります。
処理可能なページ数に制限はありませんが(400 ページでの正常動作を確認)、実用的には処理時間との兼ね合いとなります。CPU 処理では 20 ページ程度が実用限界と思われます。
GPU と CPU の実行速度については、以下の記事を参照してください。
キャッシュ
翻訳結果はキャッシュされます。仮に翻訳途中で落ちたとしても、続きから再開できます。
キャッシュは溜まる一方のため、定期的に削除することをお勧めします。
>>> import os, tempfile
>>> os.path.join(tempfile.gettempdir(), "cache")
'C:\\Users\\USERNAME\\AppData\\Local\\Temp\\cache'
実装箇所
cache_dir = os.path.join(tempfile.gettempdir(), "cache")
参考
複数モデルサポートのプルリクエストでは、作者様に柔軟に対応していただきました。