問題の概要:Ollamaで長いテキストを処理するとエラーが発生する
Ollamaを使用して長いドキュメントの要約や長文との対話を試みた際、以下のようなエラーメッセージや問題に遭遇したことはありませんか?
Error: prompt is too long. The length of the prompt is 4500 tokens, but the model only supports 4096 tokens.
Please shorten your prompt or use a model with a larger context length.
あるいは、会話の途中でモデルが文脈を忘れてしまったり、長い入力の後半部分が無視されたりする経験をした方も多いでしょう。これは、使用しているモデルが処理できる最大トークン数、すなわち「コンテキスト長(Context Length)」の制限に引っかかっていることが原因です。本記事では、この制限を理解し、Ollamaでモデルのコンテキスト長を変更・拡張する具体的な方法を、初心者から中級者のエンジニア向けに詳しく解説します。
原因の解説:コンテキスト長とは何か?
コンテキスト長とは、大規模言語モデル(LLM)が一度の処理で考慮できる入力(プロンプト)と出力(レスポンス)を合わせた最大のトークン数のことです。トークンは単語やサブワードに相当するテキストの単位で、日本語ではおよそ1〜2文字が1トークンになります。
例えば、コンテキスト長が4096トークンのモデルは、ユーザーの質問(プロンプト)とモデル自身が生成する回答を足した全体が、4096トークンを超えてはいけません。この制限を超えると、前述のエラーが発生するか、モデルは古い部分の文脈を「忘れて」(切り捨てて)処理を続行します。多くのデフォルトモデル(`llama3.2`、`mistral`など)は、このコンテキスト長が2048や4096に設定されています。
主な原因は以下の2点です:
- モデルアーキテクチャの根本的な制約: トランスフォーマーアーキテクチャのAttentionメカニズムは、コンテキスト長が長くなるほど計算量が急増します。そのため、モデルは訓練時に特定の長さで最適化されています。
- Ollamaのデフォルト設定: Ollamaはモデルをダウンロード(プル)する際、モデル作成者が指定したデフォルトパラメータを使用します。ユーザーが明示的に変更しない限り、このデフォルトのコンテキスト長が適用されます。
解決方法:コンテキスト長を変更する3つのステップ
コンテキスト長の制限に対処する方法は主に2つあります。1つは、より長いコンテキスト長をサポートする別のモデルを使用する方法、もう1つは既存のモデルをベースにコンテキスト長のパラメータを変更したカスタムModelfileを作成する方法です。ここでは後者の、より汎用性の高いカスタムModelfile作成による方法をステップバイステップで説明します。
ステップ1: ベースとなるモデルを確認・プルする
まず、変更の元となるモデルがインストールされているか確認します。ターミナルで以下のコマンドを実行してください。
ollama list
使用したいモデル(例:`llama3.2:3b`)が表示されない場合は、先にプルしておきます。
ollama pull llama3.2:3b
ステップ2: Modelfileを作成する
Modelfileは、モデルの構成を定義する設定ファイルです。任意のテキストエディタ(VSCode, nano, vim等)で新規ファイルを作成します。ここでは`Modelfile.context`という名前で作成します。
# Modelfile.context の中身
FROM llama3.2:3b # ベースモデルを指定
# コンテキスト長を8192トークンに設定
PARAMETER num_ctx 8192
# 補足:必要に応じて他のパラメータも調整可能
# PARAMETER temperature 0.7
# SYSTEM "あなたは親切なアシスタントです。"
重要な点:`num_ctx`パラメータでコンテキスト長を設定します。値を8192、16384など希望する長さに変更できます。ただし、無闇に大きな値(例:10万)を設定すると、メモリ不足(OOM)エラーが発生したり、処理速度が極端に低下したりする可能性があります。モデルの元々の能力を超える大幅な拡張は機能しないことが多いです。
ステップ3: カスタムモデルを作成して実行する
作成したModelfileを使って、新しいモデルを作成(ビルド)します。以下のコマンドを実行してください。`my-llama-longctx`はお好みのモデル名に変更できます。
ollama create my-llama-longctx -f ./Modelfile.context
ビルドが成功すると、`ollama list`コマンドで`my-llama-longctx`がリストに追加されているのを確認できます。このモデルを通常通り実行します。
ollama run my-llama-longctx
実行中に、設定が反映されているか確認したい場合は、`/show`コマンドをプロンプトで実行します。
>> /show
# 出力例
model: my-llama-longctx
parameters:
num_ctx: 8192 # ここが変更した値になっている!
...(他のパラメータ)...
コード例・コマンド例:実践的なユースケース
長いコンテキストをサポートする既存モデルを直接使う
モデルによっては、最初から長いコンテキスト版が提供されている場合があります。例えば、`mistral-nemo`モデルや`qwen2.5:32b`などは比較的長いコンテキストをサポートしています。タグに`-longctx`やコンテキスト長が明記されているものを探してみましょう。
# 長いコンテキストが特徴のモデルを探してプルする
ollama pull mistral-nemo:latest
ollama pull qwen2.5:32b
Ollama APIでコンテキスト長を指定する(実行時のみ)
OllamaのAPI(RESTまたはライブラリ)を使用する場合、実行時にパラメータを渡すことでコンテキスト長を一時的に変更できます。以下はPythonの`requests`ライブラリを使った例です。
import requests
import json
url = "http://localhost:11434/api/generate"
payload = {
"model": "llama3.2:3b", # ベースモデル名
"prompt": "ここに非常に長いプロンプト...",
"options": { # 実行オプションで上書き
"num_ctx": 8192
},
"stream": False
}
response = requests.post(url, json=payload)
result = response.json()
print(result['response'])
この方法ではモデル自体の設定は変更されず、そのAPI呼び出しの間だけ指定した`num_ctx`が適用されます。
遭遇する可能性のあるエラーと対処法
コンテキスト長を大きくしすぎた場合、以下のエラーが発生することがあります。
Error: failed to load model: my-llama-longctx
...(中略)...
error: out of memory
対処法:
- コンテキスト長(`num_ctx`)の値を小さくして再試行する。
- Ollamaが利用できるGPUメモリを増やす(設定があれば)。
- パラメータ`num_gpu`を調整して、GPUにオフロードするレイヤー数を減らす(より多くの処理をCPUで行う)。
# メモリ問題に対処するためのModelfile例
FROM llama3.2:3b
PARAMETER num_ctx 4096 # 無理のない値に戻す
PARAMETER num_gpu 20 # GPUオフロードレイヤー数を減らす(値は環境により要調整)
まとめ・補足情報
Ollamaでモデルのコンテキスト長を変更する方法は、カスタムModelfileを作成して`num_ctx`パラメータを設定するのが基本です。これにより、長文処理や長い対話が必要なアプリケーション開発の可能性が広がります。
重要な注意点:
- コンテキスト長を拡張しても、モデルの「理解力」が元々訓練されていない範囲で自動的に向上するわけではありません。長い依存関係の理解は、モデルがその長さで訓練されているかどうかに大きく依存します。
- コンテキスト長を2倍にすると、推論に必要なメモリ使用量もほぼ2倍になります。システムリソース(特にVRAM)とパフォーマンスのトレードオフを常に考慮してください。
- より本格的に長いコンテキストを必要とする場合は、最初から`qwen2.5:32b`(コンテキスト長32768)や`llama3.2:1b-instruct-q8_0`(コンテキスト長131072)など、長いコンテキストで訓練・評価されたモデルを選択することを検討しましょう。
Ollamaは`ollama ps`コマンドで現在実行中のモデルとそのリソース使用量を確認できるので、コンテキスト長変更前後のメモリ消費量の違いを観察するのも良い学習になります。適切なコンテキスト長の設定は、アプリケーションの要求と利用可能なハードウェアリソースのバランスを見極めることが鍵となります。