모델별 실행 레시피

최종 업데이트

LangGraph와 로컬 LLM 작업을 저장하고 이어 가기

체크포인터는 같은 스레드의 그래프 상태를 저장해요. 로컬 모델 주소와 thread_id를 함께 고정하면 멈춘 뒤에도 이어서 확인할 수 있어요.

이 예제는 Python에서 ChatOllama로 http://127.0.0.1:11434의 Ollama 모델을 부르고, LangGraph StateGraph와 SqliteSaver로 입력·응답 메시지를 checkpoints.sqlite에 저장해요. 호출 때마다 configurable.thread_id에 같은 대화 ID를 넣으면 그 스레드의 상태가 이어져요. 인메모리 체크포인터는 프로세스가 끝나면 사라지므로 재시작 복원을 원하면 SQLite를 선택해요.

로컬 LLM1과 나눈 대화를 프로그램을 껐다 켠 뒤에도 이어가고 싶다면, 질문과 답변을 저장해야 해요. LangGraph의 체크포인트는 그래프 실행 상태를 보관하는 기록이에요. 아래 예제는 대화 메시지를 SQLite 파일에 저장하고 같은 대화 ID로 다시 불러와요.

실행 조건과 핵심 내용
  • StateGraph는 상태를 받아 다음 상태를 반환하고, 체크포인터는 실행 단계의 스냅샷을 저장해요.
  • 같은 thread_id는 같은 대화의 체크포인트를 가리켜요. 다른 ID는 별도 흐름으로 분리돼요.
  • Ollama API에 연결되는 것은 로컬 모델 호출 단계예요. 체크포인트 저장은 별도 SQLite 파일이 담당해요.

모델 호출과 그래프 상태 저장을 분리해요

LangGraph는 처리 단계를 노드로, 단계 사이 연결을 엣지로 묶어요. 각 단계의 상태를 체크포인트에 저장하면 같은 thread_id로 다음 요청을 이어갈 수 있어요. 이 글에서는 질문에 답하는 노드 하나와 로컬 Ollama 호출로 시작해요.

문서·표·메일 아이콘에서 화살표가 노트북 앞 로봇으로 이어지는 작업대
질문 내용과 모델 호출은 그래프 노드로, 상태 보관은 체크포인터로 나눠요.

가상 환경과 로컬 모델 주소를 준비해요

Ollama 앱을 실행하고 이미 받은 채팅 모델 ID를 확인해요. Python 가상 환경에서 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로 사용자 질문에 답하는 노드 하나를 정의해요. SQLite saver를 context manager로 열어 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개가 돼요.
문서 더미와 모니터, 서버 사이에 페이지 카드가 화살표를 따라 이동하는 그림
그래프 처리의 상태를 체크포인터에 저장해 다음 요청에서 이어가요.

두 번 호출해 상태를 확인하고 재시작 복원도 시험해요

같은 thread_id로 첫 질문과 후속 질문을 보내고 graph.get_state(config)의 values['messages'] 길이와 마지막 답변을 확인해요. 두 번째 질문에서 직전 주제를 참고하는지 확인할 때에는 대화 내용을 직접 재전달하지 않아야 체크포인터가 실제로 이어졌는지 볼 수 있어요. 프로세스를 끝냈다가 같은 SQLite 파일과 thread_id로 다시 열면 저장 상태를 읽어 이어갈 수 있어요.

인메모리 InMemorySaver는 프로세스 내부 확인에 적합하지만 실행을 종료하면 상태가 사라져요. SQLite 파일이 갱신되지 않으면 체크포인터가 그래프에 전달됐는지, 매 호출의 thread_id가 정확히 같은지 확인해요. 다른 thread_id를 쓰면 새 대화가 시작돼요.

여러 사람이 같은 대화를 이어서 쓰거나 기기를 바꿔 가며 이어야 한다면 이 로컬 체크포인트2만으로 해결되지 않아요. 상태를 서버에 두는 구성과 따로 비교해 보세요.

체크 표시와 문서 아이콘이 보이는 모니터 앞에 앉은 사람과 서류 더미
저장된 상태가 원하는 대화 흐름과 맞는지 재시작 뒤에도 검토해요.

용어 각주

  1. 대규모 언어 모델 — 대규모 텍스트 데이터에서 언어 패턴을 학습해 문맥에 맞는 텍스트를 처리하고 생성하는 모델입니다.

    본문으로 돌아가기
  2. 체크포인트 — 학습된 모델의 가중치 등을 저장한 파일입니다. 같은 모델 계열도 버전이나 용도에 따라 다른 체크포인트를 쓸 수 있습니다.

    본문으로 돌아가기

자주 묻는 질문

이 글에서 가장 먼저 확인할 것은 무엇인가요?
이 예제는 Python에서 `ChatOllama`로 `http://127.0.0.1:11434`의 Ollama 모델을 부르고, LangGraph `StateGraph`와 `SqliteSaver`로 입력·응답 메시지를 `checkpoints.sqlite`에 저장해요. 호출 때마다 `configurable.thread_id`에 같은 대화 ID를 넣으면 그 스레드의 상태가 이어져요. 인메모리 체크포인터는 프로세스가 끝나면 사라지므로 재시작 복원을 원하면 SQLite를 선택해요.