モデル別実行レシピ
最終更新
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で復元します。
モデル呼び出しとグラフ状態の保存を分ける
LangGraphは処理段階をノード、つながりをエッジにまとめます。状態をチェックポイントに保存すると、同じthread_idで次の要求を続けられます。ここでは質問に答える1ノードとローカルOllamaから始めます。

仮想環境とローカルモデルの接続先を準備する
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質問に答える状態グラフを作る
MessagesStateとStateGraphでユーザーの質問に答えるノードを1つ定義します。SQLite saverをコンテキストマネージャーとして開いてcheckpoints.sqliteにチェックポイントを保存し、グラフのコンパイル時にsaverを接続します。最初と後続の呼び出しに{'configurable': {'thread_id': 'demo-1'}}を渡すと同じスレッドのメッセージが続きます。
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")
2回呼び出して状態を確認し、再起動後の復元も試す
同じthread_idで最初の質問と続きの質問を送り、graph.get_state(config).values['messages']の件数と最後の回答を確認します。継続性を確かめるには、2回目の質問で前の会話を手動で再送しません。プロセスを終了した後、同じSQLiteファイルとthread_idで開き直すと保存状態を読み込めます。
InMemorySaverは同一プロセス内の確認に向いていますが、プロセス終了で状態が消えます。SQLiteファイルが更新されない場合は、グラフにチェックポインターを渡したか、各呼び出しで同じthread_idを使っているか確認します。異なるIDは別の会話を開始します。
複数の人が同じ会話を続ける、または端末を変えて続ける必要があるなら、ローカルのチェックポイント3だけでは解決しません。状態をサーバーに置く構成と別に比較してください。

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