LLM 에이전트가 대화 도중 내용을 까먹지 않게 해주는 오픈소스 SDK를 만들었음
Built an open-source SDK to stop LLM agents from forgetting things mid-conversation
핵심 요약
LLM 에이전트의 기억력 문제를 해결하기 위해 SQLite 기반의 계층적 요약 및 사실 저장소를 제공하는 오픈소스 SDK 'OpenLCM' 소개.
- OpenLCM 개발 — LLM 에이전트의 대화 맥락 유지 문제를 해결하는 오픈소스 SDK임.
- 계층적 구조 — SQLite 기반의 불변 메시지 저장소와 요약 DAG를 통해 컨텍스트를 관리함.
- 사실 저장소 — 대화와 별개로 사용자 선호도나 제약 사항 등 핵심 정보를 영구적으로 저장함.
- 범용성 — LangGraph, AutoGen 등 주요 에이전트 프레임워크와 호환되어 바로 적용 가능함.
지금까지 나온 모든 에이전트 프레임워크는 컨텍스트 제한을 처리하는 방식이 똑같음. 그냥 오래된 메시지를 뭉뚱그려서 요약본으로 바꿔치기하고 중요한 정보가 안 날아가길 기도하는 수준이지. 30턴 전에 설정했던 제약 조건? 다 날아감. 상세하게 설명했던 결정 사항? 그것도 다 날아감. 되돌릴 방법도 없음. 애초에 데이터 손실이 발생할 수밖에 없는 구조인데, 모든 프레임워크가 그냥 그걸 당연하게 받아들이고 있음.
하도 짜증 나서 내가 직접 OpenLCM을 만들었다.
아키텍처
SQLite 데이터베이스 하나를 공유하는 두 개의 독립적인 레이어로 구성됨.
첫 번째는 불변 메시지 저장소임. 모든 메시지는 고유 ID와 함께 토씨 하나 안 틀리고 그대로 기록되고, FTS5로 인덱싱됨. 수정도 삭제도 절대 안 함. 이게 바로 진실의 원천임.
두 번째는 그 위에 쌓아 올린 요약 DAG(방향성 비순환 그래프)임. 컨텍스트 압박이 임계치를 넘으면, 가장 오래된 메시지부터 D0 리프 노드로 요약되는데, 원본은 저장소에 그대로 남음. D0 노드가 충분히 쌓이면 D1 세션 아크로 압축되고, D1은 다시 D2 영구 기록으로 압축됨. 깊이 제한은 없음. 모델이 매 턴마다 보는 건 항상 이거임: 시스템 프롬프트 + 최상위 DAG 노드 + 최근 압축 안 된 노드 + 보호된 최신 원본 메시지들. 컨텍스트는 계속 일정하게 유지되고, 모든 데이터는 언제든 조회 가능함.
세 번째 레이어는 영구 팩트 저장소임. 대화 기록이 아니라 세션을 관통하는 불변의 진실을 담는 별도의 키-값 테이블이 같은 DB 안에 있음. 사용자 설정, 프로젝트 제약 사항, 아키텍처 결정 같은 것들 말이야. 팩트는 태그와 양방향 링크를 지원해서, 그래프 데이터베이스 없이도 기본적인 인과 관계 모델링이 가능함. 팩트가 완전히 다른 내용으로 덮어씌워지면 모순 탐지 기능이 작동해서 이전 값을 알려줌.
그 위에서 돌아가는 자동 기능들도 몇 개 있음: 압축할 때마다 관련 팩트가 키워드 매칭을 통해 시스템 메시지에 자동으로 주입됨. 그래서 모델은 굳이 검색 툴을 안 불러도 항상 컨텍스트를 유지할 수 있음. 제약 조건, 트레이스백, 사용자 수정 사항 같은 중요한 메시지는 자동으로 고정(pin)돼서 절대 압축 대상이 안 됨. 그리고 선택 사항으로, 새 요약 노드가 생성될 때마다 비동기 LLM이 내용을 분석해서 팩트를 추출하고 저장소를 자동으로 채워줌. 대화가 진행될수록 알아서 업데이트되는 거지.
LangGraph, AutoGen, CrewAI, Google ADK, OpenAI, Anthropic, LlamaIndex, Haystack이랑 바로 연동해서 쓸 수 있음. 토큰 압박 상황, 실시간으로 빌드되는 DAG, 태그 브라우징이 가능한 팩트 저장소까지 다 보여주는 라이브 대시보드도 같이 제공함.
pip install openlcm https://akshay-eng.github.io/OpenLCM/ (써보고 스타 좀 박아라)

