モデル別実行レシピ

LangGraphでローカルLLMの処理を保存して再開する

チェックポインターはスレッドごとのグラフ状態を保存します。ローカルモデルの接続先とthread_idを固定すると、中断後も状態を確認して再開できます。

この例ではPythonのChatOllamaでhttp://127.0.0.1:11434のOllamaモデルを呼び出し、LangGraphのStateGraphにある入力・応答メッセージをSqliteSaverでcheckpoints.sqliteへ保存します。各呼び出しで同じconfigurable.thread_idを使うと、そのスレッドの状態が続きます。インメモリのチェックポインターはプロセス終了で消えるため、再起動後に復元したい場合はSQLiteを選びます。

プログラム再起動後もローカルLLM1との会話を続けるには、質問と回答を保存します。LangGraphのチェックポイントはグラフの実行状態の記録です。以下の例では会話メッセージをSQLiteに保存し、同じ会話IDで復元します。

実行条件と要点
  • StateGraphは状態を受け取り次の状態を返し、チェックポインターは実行段階のスナップショットを保存します。
  • 同じthread_idは同じ会話のチェックポイントを参照し、異なるIDは別の処理として分かれます。
  • ローカルモデル呼び出しとチェックポイント保存は別の処理です。Ollamaがモデルを提供し、SQLiteがチェックポイントを保存します。

モデル呼び出しとグラフ状態の保存を分ける

LangGraphは処理段階をノード、つながりをエッジにまとめます。状態をチェックポイントに保存すると、同じthread_idで次の要求を続けられます。ここでは質問に答える1ノードとローカルOllamaから始めます。

書類・表・メールのアイコンからノートPCの横のロボットへ矢印が伸びる作業台
質問とモデル呼び出しはグラフノードで、状態保存はチェックポインターで分けます。

仮想環境とローカルモデルの接続先を準備する

Ollamaを起動し、取得済みのチャットモデルIDを確認します。Python仮想環境2でlanggraph、langgraph-checkpoint-sqlite、langchain-ollamaをインストールします。ChatOllamaのbase_urlは既定サーバーのhttp://127.0.0.1:11434、モデル名はollama listに表示されたIDにします。

仮想環境とパッケージをインストール
python -m venv .venv
source .venv/bin/activate
python -m pip install -U langgraph langgraph-checkpoint-sqlite langchain-ollama
macOS・Linuxのシェル用です。Ollamaは別途起動しておきます。

質問に答える状態グラフを作る

MessagesStateとStateGraphでユーザーの質問に答えるノードを1つ定義します。SQLite saverをコンテキストマネージャーとして開いてcheckpoints.sqliteにチェックポイントを保存し、グラフのコンパイル時にsaverを接続します。最初と後続の呼び出しに{'configurable': {'thread_id': 'demo-1'}}を渡すと同じスレッドのメッセージが続きます。

SQLiteチェックポインターとOllamaグラフ
import sys
from langchain_ollama import ChatOllama
from langgraph.checkpoint.sqlite import SqliteSaver
from langgraph.graph import START, END, MessagesState, StateGraph

model = ChatOllama(model="YOUR_OLLAMA_MODEL_ID", base_url="http://127.0.0.1:11434")
def answer(state: MessagesState):
    return {"messages": [model.invoke(state["messages"])]}

builder = StateGraph(MessagesState)
builder.add_node("answer", answer)
builder.add_edge(START, "answer")
builder.add_edge("answer", END)
config = {"configurable": {"thread_id": "demo-1"}}
mode = sys.argv[1]
with SqliteSaver.from_conn_string("checkpoints.sqlite") as checkpointer:
    graph = builder.compile(checkpointer=checkpointer)
    if mode == "start":
        question = "예제 문서: 장비 대여 규정의 시행일은 2026년 4월 1일이다. 이 문서의 시행일은 언제야?"
        graph.invoke({"messages": [("user", question)]}, config)
        print("saved messages:", len(graph.get_state(config).values["messages"]))
    elif mode == "resume":
        print("restored messages:", len(graph.get_state(config).values["messages"]))
        result = graph.invoke({"messages": [("user", "방금 답변에서 날짜만 다시 말해줘.")]}, config)
        print("messages after follow-up:", len(graph.get_state(config).values["messages"]))
        print(result["messages"][-1].content)
    else:
        raise SystemExit("Usage: python app.py start|resume")
`YOUR_OLLAMA_MODEL_ID`を`ollama list`のIDに置き換えて`app.py`に保存します。`python app.py start`は架空の規程と日付をSQLiteに保存し、メッセージ数2を表示します。プロセス終了後に`python app.py resume`を実行すると、同じファイルとthread_idから2件を復元し、後続質問後は合計4件になります。
書類の束・モニター・サーバーの間を矢印に沿って移動するページカード
グラフ状態をチェックポインターに保存し、次のリクエストで続けます。

2回呼び出して状態を確認し、再起動後の復元も試す

同じthread_idで最初の質問と続きの質問を送り、graph.get_state(config).values['messages']の件数と最後の回答を確認します。継続性を確かめるには、2回目の質問で前の会話を手動で再送しません。プロセスを終了した後、同じSQLiteファイルとthread_idで開き直すと保存状態を読み込めます。

InMemorySaverは同一プロセス内の確認に向いていますが、プロセス終了で状態が消えます。SQLiteファイルが更新されない場合は、グラフにチェックポインターを渡したか、各呼び出しで同じthread_idを使っているか確認します。異なるIDは別の会話を開始します。

複数の人が同じ会話を続ける、または端末を変えて続ける必要があるなら、ローカルのチェックポイント3だけでは解決しません。状態をサーバーに置く構成と別に比較してください。

チェックマークと書類アイコンがあるモニターの前に座る人と書類の束
再起動後も保存状態が想定した会話の流れと合うか確認します。

用語の注釈

  1. 大規模言語モデル — 大量のテキストデータから言語パターンを学び、文脈に沿ったテキストを処理・生成するモデルです。

    本文に戻る
  2. Python仮想環境 — プロジェクトごとにPythonパッケージを分けて導入する環境です。パッケージのバージョンの衝突を減らせます。

    本文に戻る
  3. チェックポイント — 学習済みモデルの重みなどを保存したファイルです。同じモデル系列でも、版や用途によって異なるチェックポイントを使うことがあります。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
この例ではPythonの`ChatOllama`で`http://127.0.0.1:11434`のOllamaモデルを呼び出し、LangGraphの`StateGraph`にある入力・応答メッセージを`SqliteSaver`で`checkpoints.sqlite`へ保存します。各呼び出しで同じ`configurable.thread_id`を使うと、そのスレッドの状態が続きます。インメモリのチェックポインターはプロセス終了で消えるため、再起動後に復元したい場合はSQLiteを選びます。