はじめに:長いテキスト処理でエラーが出ていませんか?
Ollamaを使って長いドキュメントの要約や、長いチャット履歴との対話を試みたとき、以下のようなエラーに遭遇したことはありませんか?
Error: prompt is too long. The length of the prompt tokens (8500) exceeds the context window size (4096).
あるいは、会話の途中でモデルが以前の内容を「忘れて」しまい、一貫性のない回答を返すようになった経験は?
これらの問題は、モデルの「コンテキスト長(コンテキストウィンドウ)」が、処理したいテキストの長さに対して不足していることが主な原因です。本記事では、Ollamaでモデルのコンテキスト長を安全かつ効果的に拡張する方法を、実際のコード例とエラー解決策を交えて詳しく解説します。
コンテキスト長とは?「LLMの短期記憶」の正体
コンテキスト長(Context Length)とは、大規模言語モデル(LLM)が一度の処理で考慮できるトークンの最大数です。トークンは単語やサブワードの単位で、日本語の場合はおおよそ1トークンが1〜2文字に相当します。
このコンテキスト長は、モデルの「短期記憶の容量」と考えるとわかりやすいでしょう。例えば、コンテキスト長が4096トークンのモデルは、ユーザーのプロンプト(指示文)と自分が生成する応答を合わせて、最大4096トークン分の情報を保持しながら処理を行います。
Ollamaでプルする各モデル(llama3.2、mistral、qwen2.5など)には、そのアーキテクチャと学習方法に基づいたデフォルトのコンテキスト長が設定されています。この制限を超えると、冒頭のエラーが発生するか、モデルが古いコンテキストを切り捨て始めます(「コンテキストのスライディングウィンドウ」現象)。
重要な注意点:長ければ良いわけではない
コンテキスト長を無闇に大きくすることは、以下のリスクを伴います。
- メモリ消費の急増: RAM/VRAM不足によるOut of Memory (OOM) エラー
- 処理速度の低下: 生成にかかる時間が大幅に長くなる
- 出力品質の劣化: 長いコンテキストに対して適切に学習されていないモデルでは、かえって性能が落ちる可能性も
したがって、「必要な長さまで、無理のない範囲で拡張する」 ことが鉄則です。
実践:コンテキスト長を変更する2つの方法
Ollamaでモデルのコンテキスト長を変更するには、主に以下の2つの方法があります。
- Modelfileを作成して新しいモデルとして永続化する方法(推奨)
- 実行時にオプションとして一時的に指定する方法
ここでは、より一般的で再現性の高い1つ目の方法を中心に説明します。
ステップ1: ベースモデルの準備
まず、カスタマイズの元となるモデルを用意します。まだ入手していない場合はpullコマンドで取得しましょう。既に持っている場合はこのステップは飛ばせます。
# 例: Llama 3.2 3Bモデルをベースにする場合
ollama pull llama3.2:3b
# 他のモデル例
# ollama pull mistral:7b
# ollama pull qwen2.5:7b
# ollama pull gemma2:2b
ステップ2: Modelfileの作成
Modelfileは、ベースモデルに変更を加えて独自のモデルを作成するための「レシピ」です。テキストエディタで新規ファイル(例: Modelfile.context)を作成し、以下の内容を記述します。
# Modelfile.context
# ベースとなるモデルを指定
FROM llama3.2:3b
# コンテキスト長を8192トークンに設定(デフォルト4096から拡張)
PARAMETER num_ctx 8192
# 必要に応じて他のパラメータも調整可能
# PARAMETER temperature 0.7 # 出力のランダム性(0.0〜1.0)
# PARAMETER num_predict 2048 # 一度に生成する最大トークン数
num_ctxパラメータがコンテキスト長を制御します。この例ではデフォルトの4096から8192へと倍増させています。多くのOllamaモデルではnum_ctxが標準でサポートされています。
ステップ3: 新しいモデルの作成
ollama createコマンドを使って、Modelfileの設定を適用した新しいモデルを作成します。
# 書式: ollama create <新しいモデル名> -f <Modelfileのパス>
ollama create llama3.2-8k -f ./Modelfile.context
コマンドが成功すると、ollama listを実行して新しいモデルがリストに表示されることを確認できます。
ollama list
# 出力例:
# NAME ID SIZE MODIFIED
# llama3.2-8k xxxxxxxxxxxx 1.8 GB 2 minutes ago
# llama3.2:3b yyyyyyyyyyyy 1.8 GB 1 week ago
ステップ4: 拡張したモデルの実行と確認
作成したモデルは、通常のモデルと同様にrunコマンドで起動できます。
ollama run llama3.2-8k
モデルの詳細設定を確認したい場合は、以下のコマンドでModelfileの内容を表示できます。
ollama show llama3.2-8k --modelfile
【別方法】実行時に一時的にコンテキスト長を指定する
Modelfileを作成するほどではないが、一時的にコンテキスト長を変えて試したい場合には、runコマンドにオプションを直接渡す方法もあります。
ollama run llama3.2:3b --options num_ctx 8192
この方法では設定が永続化されないため、毎回オプションを指定する必要があります。実験や簡単なテストに向いています。
よくあるエラーとその解決策(コード例付き)
コンテキスト長を変更する過程で遭遇しやすいエラーと、その具体的な解決方法を紹介します。
エラー1: メモリ不足(OOM)エラー
症状
コンテキスト長を大きくしすぎた場合、以下のようなエラーが発生します。
Error: failed to load model: open blade... not enough memory
# または
Error: DNNL_OUT_OF_MEMORY
原因と解決策
コンテキスト長を拡張すると、モデルが保持する情報量が増えるため、必要なメモリ容量もほぼ比例して増加します。
-
コンテキスト長の値を下げる
無理のない値までnum_ctxを小さくします。8192→4096など、段階的に調整しましょう。 -
より軽量なモデルを使用する
7Bパラメータのモデルから、3Bや1Bパラメータのモデルに切り替えることでメモリ負荷を軽減できます。 -
GPUオフロードを調整する(GPU環境の場合)
環境変数OLLAMA_NUM_GPUで、GPUにオフロードするレイヤー数を指定できます。値を増やすとGPUメモリ使用量が増え、CPUメモリ使用量が減ります。# Linux/macOS export OLLAMA_NUM_GPU=100 ollama run llama3.2-8k # Windows (PowerShell) $env:OLLAMA_NUM_GPU=100 ollama run llama3.2-8k
エラー2: 無効なパラメータエラー
症状
Error: invalid parameter 'num_ctx' for model 'llama3.2:3b'
原因と解決策
使用しているモデルがnum_ctxパラメータをサポートしていない可能性があります。
-
モデルのドキュメントを確認する
モデルによっては、コンテキスト長のパラメータ名が異なる場合があります(例:max_position_embeddings)。Ollamaのモデルカードや、元のモデル提供元の情報を確認しましょう。 -
Ollamaのバージョンを確認・更新する
古いバージョンのOllamaでは一部のパラメータがサポートされていない場合があります。ollama --version # アップデートが必要な場合 # 公式サイトから最新版をインストールし直す
応用:長いテキストを効果的に処理するためのヒント
コンテキスト長を拡張するだけでなく、以下のテクニックを組み合わせることで、より効果的に長いテキストを扱えます。
ヒント1: プロンプトを分割して処理する(Map-Reduce)
非常に長いドキュメント(コンテキスト長を超える長さ)を要約する場合、ドキュメントを複数のチャンクに分割し、それぞれを要約した後で統合する「Map-Reduce」アプローチが有効です。
# 疑似コード例(Python)
def summarize_long_document(text, model_name, chunk_size=3000):
# 1. テキストを適切なサイズのチャンクに分割
chunks = split_text_into_chunks(text, chunk_size)
summaries = []
for chunk in chunks:
# 2. 各チャンクを個別に要約
prompt = f"以下のテキストの要点をまとめてください:\n\n{chunk}"
summary = call_ollama(model_name, prompt)
summaries.append(summary)
# 3. 各要約を結合して、最終的な要約を生成
combined_summary = "\n".join(summaries)
final_prompt = f"以下の複数の要約を統合し、一貫した全体の要約を作成してください:\n\n{combined_summary}"
final_summary = call_ollama(model_name, final_prompt)
return final_summary
ヒント2: 重要なコンテキストをプロンプトに明示的に含める
長い会話の中で、モデルに絶対に「忘れてほしくない」情報がある場合は、各プロンプトの冒頭にその情報を繰り返し含める方法があります。
ユーザー:
【重要なコンテキスト】
- 私は山田太郎と申します。
- 私たちは現在、XYZプロジェクトの進捗について話し合っています。
- プロジェクトの最終期限は2024年12月31日です。
【今回の質問】
では、次のマイルストーンまでに完了すべきタスクは何ですか?
まとめ
Ollamaでモデルのコンテキスト長を拡張する方法をまとめると以下の通りです。
-
Modelfile作成が基本:
PARAMETER num_ctx <値>を設定して新しいモデルを作成する方法が、再現性と管理のしやすさで優れています。 - 無闇な拡張は禁物: メモリ不足や性能劣化のリスクがあるため、必要最小限の拡張を心がけましょう。
- エラーには段階的対応: メモリ不足エラーにはコンテキスト長の縮小や軽量モデルへの切り替えで対応します。
- テクニックの組み合わせ: コンテキスト長拡張だけでなく、テキスト分割やプロンプト設計の工夫も重要です。
適切なコンテキスト長の設定は、Ollamaをより実践的な長文処理タスクに活用するための第一歩です。本ガイドが、皆さんのプロジェクトや学習の助けとなれば幸いです。
この記事の詳細版は元記事サイトで公開しています。