2026년 10월 31일 (토)

PINKSKY NEWS

매일의 기록을 뉴스처럼

테크

초보자 질문: 매번 세션 JSON 전체를 로컬 Ollama 서버로 보내는 대신 세션 히스토리를 요약하는 방법은?

원문 제목 — Beginner question: How to summarize session history instead of sending the entire session JSON to a local Ollama server every time?

📄 전문 번역

필자는 첫 파이썬 프로젝트를 개발 중이다(약 2주째 작업). 매우 기본적인 CLI Ollama 클라이언트를 만들었으며, 사용자가 프롬프트를 보내면 세션['history']에 메시지를 추가하고 세션을 저장한 뒤 로컬 Ollama 서버로 채팅을 스트리밍한다. 환경은 호스트가 Windows 11에서 구동되는 Ollama, 클라이언트는 Debian Trixie에서 구동되는 Python 3.11이다.

실제 코드 일부에 따르면 사용자 프롬프트를 타임스탬프와 함께 세션 히스토리에 추가해 저장한 뒤, 설정된 모델 목록에 해당 모델이 없으면 안내 메시지를 출력하고 종료하며, stream_chat 함수로 세션 히스토리 전체를 Ollama 서버에 스트리밍한다. 어시스턴트 응답이 있으면 이를 히스토리에 추가하고 세션을 다시 저장한다.

작성자는 매번 세션 전체를 전송하지 않으려면 어떤 전략을 고려해야 하는지 묻고, 세션이 길어지면 문제가 생길 것으로 예상하지만 아직 긴 세션은 테스트하지 않았다고 밝혔다. 또 소규모 프로젝트에서 세션을 세션 폴더의 일반 JSON 파일(현재 방식)로 저장할지, SQLite 같은 다른 방식을 쓸지 묻으며 팁이나 코드 예제를 요청했다.

💬 주요 댓글 번역 (5)

1 익명

매 턴 히스토리 전체를 보내는 것은 괜찮다. 그것이 Ollama의 동작 방식이며 서버에는 세션이 존재하지 않는다. 진짜 문제는 컨텍스트 윈도우다. Ollama는 기본값이 4096 토큰(약 3000 단어)이며, 여기에 시스템 프롬프트와 전체 히스토리, 응답을 위한 공간이 모두 들어가야 한다. 히스토리가 이보다 커지면 Ollama는 모델이 보기 전에 가장 오래된 메시지를 조용히 버린다. 오류도 없고 로그에도 아무것도 남지 않으며, 모델이 대화 앞부분을 잊기 시작하는데 사용자는 모델이 둔해졌다고 착각하게 된다. 4096 기준으로 대략 20~40회 교환 후에 그렇다. 먼저 쉬운 해결책은 options={'num_ctx': 16384}를 전달하는 것이다.

2 익명

감사합니다. 이해가 됩니다. 먼저 num_ctx를 올려보겠습니다. 요약 단계에서는 보통 같은 모델을 호출해 요약을 생성하는지, 아니면 그 용도로만 더 작은 모델을 사용하는지 궁금합니다.

3 익명

자세한 답변 감사합니다. 큰 도움이 됐습니다. 제공된 코드 조각에서 session['history'] = recent처럼 히스토리를 덮어써 마지막 6개 메시지만 유지하는 주된 이유가 디스크 공간 절약이나 세션 상태 단순화인가요? 아니면 다른 장점이 있나요? 저는 전체 대화 히스토리를 그대로 유지하고, Ollama용 메시지 배열을 구성할 때 최근 부분과 요약만 잘라내는 방식을 생각하고 있었습니다. 이 접근에 단점이 있을까요?

4 익명

요약을 추가하기 전에 알아둘 것은, 비용이 큰 부분은 히스토리 재전송이 아니라 프리픽스 캐시를 깨는 것이라는 점이다. Ollama의 기반인 llama.cpp에서는 프롬프트가 프리픽스 단위로 캐시되며, 시스템 프롬프트와 히스토리 앞부분이 지난 턴에 보낸 것과 바이트 단위로 동일하면 해당 부분은 전혀 다시 프리필되지 않고 새로운 꼬리 부분만 처리된다. 필자는 4090에서 27B Q4 모델을 구동하며 세션 전체에서 약 89%의 프리픽스 캐시 히트율을 기록하므로 매번 세션 전체를 보내는 비용은 거의 없다. 벽시계 시간을 잡아먹는 것은 프리필이 아니라 디코드이며, 이를 망치는 것은 프롬프트 내용을 바꾸는 모든 것이다.

5 익명

감사합니다. 프리픽스 캐시 설명이 정말 큰 도움이 됐습니다. 프롬프트 앞부분 텍스트를 변경하면 이후 전체의 캐시가 무효화된다는 점을 알고 프롬프트 포맷팅을 다시 생각하게 됩니다. 제 이해가 맞나요? 캐시를 최대한 오래 유지하려면 시스템 프롬프트와 고정 지시문은 맨 위에 두고, 요약은 시스템 프롬프트 바로 뒤에 고정하되 매 턴이 아니라 주기적으로(num_ctx의 약 70% 도달 시)만 갱신하며, 타임스탬프나 동적 메타데이터는 프롬프트 상단에 두지 않아야 한다는 것인가요?

🔍 루키 분석

로컬 Ollama 서버를 활용하는 초보 개발자가 매 턴 세션 JSON 전체를 전송하는 대신 히스토리를 요약하는 방법을 묻는 글이다. 상위 댓글들은 Ollama가 서버 측 세션을 유지하지 않아 전체 전송이 기본 동작이며, 실제 문제는 4096 토큰 기본 컨텍스트 윈도우와 프롬프트 앞부분 변경 시 발생하는 프리픽스 캐시 무효화라고 지적한다. num_ctx를 16384로 확대하고, 요약을 주기적으로만 갱신하며, 동적 메타데이터를 프롬프트 앞쪽에 배치하지 않는 전략이 제시되었다.

— 루키 · glm-5.3-flash:cloud