概要
年度が変わり新生活がスタートしました。それに伴い、次々と手紙や書類が届きます。
ひとつひとつを読むのは大変なので、生成AIを使って必要な情報だけを抽出・整理できないかと考えました。
とはいえ、書類を外部サービスにアップロードすることはできません。
そこで、ローカル環境で動作するLLMを調べたところ、Ollama という仕組みにたどり着きました。
この記事では、Ollamaの環境構築から、実際に書類を要約させた結果までをまとめています。
Ollamaとは
Ollamaはローカル環境でLLMを簡単に動かすためのランタイムです。
- モデルのダウンロード・管理が非常に簡単
- CPU でも動作可能(GPU があれば高速)
- Open-WebUI と組み合わせると ChatGPT のようなUIで使える
- モデルの切り替えが1コマンドで完了
- 完全ローカルで動作するためデータが外部に漏れない
Ollama環境構築
今回は以下の構成で環境を構築しました。
- ホストOS:Windows 11
- コンテナ管理:Docker Desktop
- LLMランタイム:Ollama
- UI:Open-WebUI
また、Ollamaを実行するためにPCを少しだけ増強しました。
Ollamaの公式ドキュメントでGPU 推論に必要な条件が公開されています。
- NVIDIA GPUのCompute Capabilityが5.0以上
- NVIDIA Driver 531以上
- CUDA backendが利用可能であること
NVIDIAでCompute Capability 5.0以上のGPUとしてGTX 750 Tiがあり、現在のGeForce GTX650 Ti 1GBからGTX750 Tiに交換しました。
1.docker-compose.yml を作成
「docker‑compose.yml」はDockerコンテナをまとめて起動・管理するための設定ファイルです。
以下の内容で「docker-compose.yml」を作成します。
version: "3.8"
services:
ollama:
image: ollama/ollama:0.9.0
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
volumes:
- open_webui_data:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- ollama
restart: always
volumes:
ollama_data:
open_webui_data:
2.Ollamaコンテナ起動
起動するときは上記のymlファイルがあるディレクトリで以下のコマンドで起動します。
docker-compose up -d
コンテナが起動するとhttp://localhost:3000でアクセスすることが可能です。
3.LLMの取得と実行
コンテナを起動してからLLMを取得します。以下のコマンドでLLMを取得できます。
docker exec -it ollama ollama pull phi3.5:3.8b
今回はMicrosoftが開発した軽量で性能が良いとされるPhi-3.5系列のLLMを使用しました。
上記モデルはGTX 750 Ti / 2GB VRAMでもGPUオフロードが成功しました。
33層の内、7層をGPU上で処理 load_tensors: offloading 7 repeating layers to GPU
load_tensors: offloaded 7/33 layers to GPU
4.ナレッジベースの作成とモデルへの適用
ナレッジベースは、AIが参照できる専用のデータベースです。
OllamaではPDF等の要約したいファイルをナレッジベースに置くことで要約することがきます。
ナレッジベースは「ワークスペース」-「ナレッジベース」より作成できます。

ナレッジベースを作成後、モデルに適用します。

ここまでで「ナレッジベースにあるファイルの内容を要約して」といったようなプロンプトを実行できるようになります。
要約させてみた結果
今回は表や写真等を含んだお便り(PDFファイル2つ、4ページ程度)を要約させてみました。処理は1~2分程度かかりました。
出力結果は、おおむねファイルに記載されている内容が含まれていましたが、ところどころ内容が間違っているものや、日本語として不自然な部分がありました。
また、やり取りを続けていると、突然関係のない内容(いきなりスターウォーズの話)が始まる「コンテキスト腐敗」が見られました。
「書類を要約する」という目的に対してはまだまだ課題が残っているので、今後改善していきたいと思います。