問題の概要:コンテキスト長超過エラーとその影響
Ollamaを使用して大規模言語モデル(LLM)と対話している際、長い会話の履歴を扱ったり、大きなドキュメントをプロンプトとして入力したりすると、以下のようなエラーメッセージに遭遇することがあります。
Error: prompt is too long. The length of the prompt tokens (8500) exceeds the context window size (8192).
Please try again with a shorter prompt.
あるいは
Error: context length exceeded
このエラーは、使用しているモデルが処理できる最大のトークン数(コンテキスト長、コンテキストウィンドウ)を、ユーザーの入力(プロンプト)が超えてしまったことを意味します。コンテキスト長は、モデルが一度の処理で考慮できるテキスト(プロンプト+生成される応答)の最大量を決定します。この制限を超えると、モデルは入力全体を正しく理解できず、エラーが発生するか、重要な前半部分の情報を「忘れて」しまうことになります。
特に、コードベースの分析、長文の要約、長いチャット履歴の維持など、実用的なAIアプリケーションを構築する際には、この制限が大きな障壁となります。
原因の解説:なぜコンテキスト長に制限があるのか?
コンテキスト長の制限は、主に以下の2つの技術的要因に起因しています。
1. モデルアーキテクチャの根本的制約
Transformerアーキテクチャをベースとする現代のLLM(Llama 2, Mistral, Gemmaなど)は、その注意力(Attention)メカニズムの計算量がコンテキスト長の2乗(O(n²))に比例して増加します。つまり、コンテキスト長を2倍にすると、必要な計算リソースとメモリは約4倍になります。このため、モデルの学習時および推論時の実用性とコストのバランスから、あらかじめ最大長が設定されています。
2. モデルファイル(Modelfile)のデフォルト設定
Ollamaは、各モデルを実行するための設定を「Modelfile」というファイルで管理しています。このファイル内の PARAMETER num_ctx の値が、そのモデルのコンテキスト長を決定します。ユーザーが ollama run llama2 のようにシンプルにモデルをプルして実行した場合、Ollamaは公式のデフォルトModelfileを使用するため、内蔵された num_ctx 値(例:Llama 2では4096)が適用されます。これが、多くのユーザーが直面するデフォルトの制限の正体です。
エラーメッセージにある「context window size (8192)」などの数字は、まさにこの num_ctx パラメータの値そのものを指しています。
解決方法:カスタムModelfileを作成してコンテキスト長を変更する
Ollamaの強力な機能の一つは、既存のモデルをベースにパラメータをカスタマイズした新たなモデルを作成できることです。コンテキスト長を拡張するには、この機能を利用します。
ステップ1: ベースとなるモデルの確認とプル
まず、カスタマイズの元となるモデルがローカルに存在するか確認します。
ollama list
もし使いたいモデル(例:`llama2:13b`)がなければ、先にプルしておきます。
ollama pull llama2:13b
ステップ2: Modelfileの作成
任意のテキストエディタを使用して、新しいModelfileを作成します。ここでは、コンテキスト長(`num_ctx`)を8192に拡張した`llama2-13b-longctx`というモデルを作成する例を示します。
# Modelfile (例: llama2-longctx.Modelfile という名前で保存)
FROM llama2:13b
# コンテキスト長を8192トークンに設定(デフォルトは4096)
PARAMETER num_ctx 8192
# 必要に応じて他のパラメータも調整可能
# PARAMETER temperature 0.7
# PARAMETER num_predict 2048
# システムプロンプトをカスタマイズ(オプション)
SYSTEM """
あなたは親切で丁寧なアシスタントです。常に詳細かつ正確に回答してください。
"""
重要な注意点: コンテキスト長を無闇に大きく(例:32768など)設定すると、推論に必要なGPU/CPUメモリが急増し、Ollamaの起動に失敗したり、極端にレスポンスが遅くなったり、メモリ不足エラーが発生する可能性があります。ご自身のシステムリソース(特にVRAM)とモデルのサイズに応じて、現実的な値(4096, 8192, 16384など)から試すことをお勧めします。
ステップ3: カスタムモデルの作成(Build)
ollama create コマンドで、Modelfileから新しいモデルを作成します。
ollama create llama2-13b-longctx -f ./llama2-longctx.Modelfile
コマンドが成功すると、`ollama list`を実行した際に、`llama2:13b`とは別に`llama2-13b-longctx`というモデルがリストに表示されます。
ステップ4: カスタムモデルの実行と検証
作成したモデルを実行し、コンテキスト長が変更されているか確認します。
ollama run llama2-13b-longctx
>>> /show
モデル情報が表示され、その中に`”num_ctx”`の項目があり、設定した値(この例では8192)が反映されていることを確認できます。
コード例・コマンド例:実践的なワークフロー
例1: Mistral 7Bモデルのコンテキスト長を16384に拡張する一連のコマンド
# 1. ベースモデルをプル
ollama pull mistral:7b
# 2. Modelfileを作成 (mistral-longctx.Modelfile)
# FROM mistral:7b
# PARAMETER num_ctx 16384
# 3. カスタムモデルを作成
ollama create mistral-longctx -f ./mistral-longctx.Modelfile
# 4. 実行して確認
ollama run mistral-longctx
例2: 既存のカスタムモデルを削除する方法
設定を間違えた場合や、モデルを整理したい場合は削除できます。
ollama rm llama2-13b-longctx
例3: Python (Ollamaライブラリ) からカスタムモデルを呼び出す
import requests
import json
# カスタムモデル 'llama2-13b-longctx' にプロンプトを送信
response = requests.post(
'http://localhost:11434/api/generate',
json={
'model': 'llama2-13b-longctx', # 作成したカスタムモデル名を指定
'prompt': 'ここに長いプロンプトを入力...',
'stream': False,
'options': {
'num_predict': 512,
'temperature': 0.8
}
}
)
result = response.json()
print(result['response'])
まとめ・補足情報
Ollamaでモデルのコンテキスト長を変更する方法は、カスタムModelfileを作成し、`PARAMETER num_ctx`を希望の値に設定して新しいモデルをビルドするというシンプルなプロセスです。これにより、「context length exceeded」エラーを解消し、より長い文脈を扱えるAIアプリケーションの開発が可能になります。
最後に重要な注意点を繰り返します:
- リソース制約: コンテキスト長を大きくすると、メモリ使用量と計算時間が増加します。特に長いコンテキストでは、`num_ctx`の値に比例してVRAM/ RAMを消費します。ご自身のハードウェア(例:GPUのVRAM容量)に合わせた現実的な値を設定してください。
- モデル本来の限界: ベースモデルが学習時に経験した最大コンテキスト長を超えて`num_ctx`を設定しても、モデルの性能(特に長い依存関係の理解)が保証されるわけではありません。モデルの仕様を確認することが望ましいです。
- パフォーマンストレードオフ: コンテキスト長を拡張すると、一度に処理できる情報は増えますが、その分、単純な質問に対する応答速度は低下する可能性があります。用途に応じて最適なバランスを見つけてください。
- その他の調整可能パラメータ: Modelfileでは、`temperature`(応答のランダム性)、`top_p`(生成の多様性)、`num_predict`(最大出力トークン数)など、推論の挙動を制御する多くのパラメータも同時に調整できます。これらを組み合わせることで、あなたの特定のユースケースに最適化された独自のモデルを作成することがOllamaの真の威力です。
このガイドを参考に、Ollamaの柔軟性を活用し、コンテキスト長の制限を克服した、よりパワフルなローカルLLM環境を構築してください。