問題の概要:Ollamaで長いテキストを処理するとエラーが発生する
Ollamaを使用して長いドキュメントの要約や長文との対話を試みた際、以下のようなエラーメッセージや問題に遭遇したことはありませんか?
Error: prompt is too long. The length of the prompt tokens (8500) exceeds the context window size (4096).
あるいは、会話の途中でモデルが以前のコンテキストを「忘れて」しまい、一貫性のない応答を返すようになることもあります。これらの問題は、使用しているモデルのコンテキスト長(コンテキストウィンドウ)が、処理したいテキストや会話の長さに対して不足していることが主な原因です。本記事では、Ollamaでモデルのコンテキスト長を変更・拡張する方法と、関連するエラーの解決策を詳しく解説します。
原因の解説:コンテキスト長とは?
コンテキスト長(Context Length)とは、大規模言語モデル(LLM)が一度の処理で考慮できるトークン(単語やサブワードの単位)の最大数のことです。これはモデルの「短期記憶」の容量と考えることができます。例えば、コンテキスト長が4096トークンのモデルは、プロンプト(指示文)と生成する応答を合わせて、最大4096トークン分の情報を保持しながら処理します。
Ollamaでは、各モデル(例:`llama3.2`、`mistral`、`qwen2.5`)はあらかじめ定義されたデフォルトのコンテキスト長を持っています。この値はモデルアーキテクチャと学習方法によって決まっています。ユーザーがこの制限を超える長さのプロンプトを送信したり、長いチャット履歴を蓄積したりすると、上記のエラーが発生するか、モデルが古いコンテキストを切り捨て始めます(これは「コンテキストのスライディングウィンドウ」や「LLMの忘却」と呼ばれる現象です)。
重要なのは、コンテキスト長を単に設定ファイルで大きな数値に変更すれば良いというわけではない点です。無理に長く設定すると、以下の問題が発生する可能性があります。
- メモリ(RAM/VRAM)消費量の急増によるOut of Memory (OOM) エラー
- 処理速度の大幅な低下
- モデルの出力品質の劣化(特に、長いコンテキストに対して適切に学習されていないモデル)
解決方法:コンテキスト長を変更するステップバイステップガイド
Ollamaでモデルのコンテキスト長を変更するには、主に2つの方法があります。1つは既存モデルの設定を上書きするModelfileを作成する方法、もう1つはコマンドラインで直接パラメータを指定する方法です。
ステップ1:ベースとなるモデルをプルする
まず、カスタマイズの元となるモデルを用意します。すでにプルしている場合はこのステップはスキップできます。
ollama pull llama3.2:3b
# 使用したいモデル名とタグを指定(例: mistral, qwen2.5:7b, gemma2:2b)
ステップ2:Modelfileを作成してコンテキスト長を設定する
Modelfileは、ベースモデルに変更を加えて新しいモデルを作成するためのレシピです。テキストエディタで新しいファイル(例:`Modelfile.context`)を作成し、以下の内容を記述します。
# ベースとなるモデルを指定
FROM llama3.2:3b
# コンテキスト長のパラメータを設定(単位はトークン)
PARAMETER num_ctx 8192
# 必要に応じて他のパラメータも調整可能
# PARAMETER temperature 0.7
# PARAMETER num_predict 2048
num_ctxがコンテキスト長を設定するパラメータです。この例ではデフォルトの4096から8192に倍増しています。モデルによってはnum_ctx以外のパラメータ名(例:`max_position_embeddings`に関連する設定)が必要な場合がありますが、Ollamaの標準インターフェースではnum_ctxが共通して使用されます。
ステップ3:Modelfileから新しいモデルを作成する
ollama createコマンドを使用して、Modelfileの設定を適用した新しいモデルを作成します。最後の引数は作成する新しいモデルの名前です(例:`llama3.2-8k`)。
ollama create llama3.2-8k -f ./Modelfile.context
コマンドが成功すると、`ollama list`で新しいモデルが確認できます。
ステップ4:作成したモデルを実行して確認する
通常のモデルと同じように、作成したモデルを実行します。
ollama run llama3.2-8k
>>> これから長いコンテキストを扱うテストを始めます。
モデルの情報を詳細に確認したい場合は、以下のコマンドでパラメータが正しく設定されているかチェックできます。
ollama show llama3.2-8k --modelfile
(別解)ステップ2b:コマンドラインで直接実行時にパラメータを指定する
一時的にコンテキスト長を変えて試したい場合、Modelfileを作成せずにollama runコマンドにオプションを渡す方法もあります。
ollama run llama3.2:3b --options num_ctx 8192
この方法では変更が永続化されないため、毎回オプションを指定する必要があります。
コード例・コマンド例:よくあるエラーとその解決策
エラー例1:メモリ不足(OOM)エラー
コンテキスト長を大きくしすぎると、モデルの実行に必要なメモリが増加し、以下のエラーが発生することがあります。
Error: failed to load model: open blade... not enough memory
解決策:
- コンテキスト長(`num_ctx`)の値を小さくする(16384 → 8192など)。
- よりパラメータ数の少ない小さなモデルを使用する(例:7Bモデルから3Bモデルへ変更)。
- Ollamaの実行時にGPUオフロードのレイヤー数を調整する(
OLLAMA_NUM_GPU=100など環境変数で設定)。
エラー例2:無効なパラメータエラー
Error: invalid parameter 'num_ctx' for model 'llama3.2:3b'
解決策: 使用しているモデルが`num_ctx`パラメータをサポートしていない可能性があります。モデルのドキュメントを確認するか、サポートされているパラメータを以下のコマンドで確認します。
ollama run [モデル名] --help
# または、モデルの詳細情報から推測
実践例:長いドキュメントの要約を実行するPythonスクリプト
以下は、カスタムコンテキスト長モデルを使用して長いテキストを要約する簡単なPythonスクリプトの例です。
import requests
import json
# Ollamaサーバーのエンドポイント
url = "http://localhost:11434/api/generate"
# プロンプトの準備
long_document = "..." # ここに長いテキストを挿入
prompt = f"""以下はあるドキュメントの全文です。このドキュメントの要点を箇条書きで5点まとめてください。
ドキュメント:
{long_document}
"""
# リクエストデータ
payload = {
"model": "llama3.2-8k", # カスタムで作成したコンテキスト長拡張モデル
"prompt": prompt,
"stream": False,
"options": {
"num_ctx": 8192, # 念のためここでも指定(モデル定義と一致させる)
"temperature": 0.3
}
}
# リクエスト送信
try:
response = requests.post(url, json=payload)
response.raise_for_status()
result = response.json()
print("要約結果:")
print(result['response'])
except requests.exceptions.RequestException as e:
print(f"エラーが発生しました: {e}")
if response.status_code == 400:
print("プロンプトが長すぎる可能性があります。コンテキスト長を確認してください。")
まとめ・補足情報
Ollamaでモデルのコンテキスト長を変更する方法は、Modelfileを作成して新しいモデルをビルドする方法が最も確実で永続的です。これにより、長文処理や長い対話が必要なアプリケーション開発が可能になります。
重要な補足事項:
- モデルの限界を理解する: コンテキスト長を技術的に拡張しても、モデルがその長い依存関係を本当に「理解」できるかは別問題です。長いコンテキストに対して特別に学習・調整されたモデル(例:`mistral`、`qwen2.5`の長コンテキスト版)の使用を検討してください。
- パフォーマンストレードオフ: コンテキスト長を2倍にすると、推論に必要なメモリと計算時間はほぼ線形に増加します。アプリケーションの要求とハードウェアリソースのバランスを考慮してください。
- 代替アプローチ: どうしてもデフォルトのコンテキスト長内で収めたい場合は、長いテキストをチャンク(断片)に分割して要約を繰り返す「マップリデュース」方式や、ベクトルデータベースを用いた検索拡張生成(RAG)の導入を検討するのも有効な解決策です。
OllamaはローカルLLM実行環境として非常に柔軟です。コンテキスト長の調整はその柔軟性を活かす一例に過ぎません。実際にモデルを作成し、エラーを観察しながら最適な設定を見つけていくプロセスが、LLMアプリケーション開発の理解を深めることにつながります。