운영하는 시스템이 늘면서 AI 에이전트 세션도 여러 머신·여러 워크스페이스로 퍼졌다. 세션마다 맥락이 따로 있어서, 한 세션이 겪은 함정을 다른 세션이 또 밟는 일이 반복됐다. 그래서 세션들이 함께 쓰는 기억 저장소를 두고 있었고, 그 저장소는 graphiti 지식 그래프였다. 이번 주에 그 그래프를 끄고, 대화 원문과 임베딩만 담는 저장소로 바꾸기로 결정했다. 새 저장소의 이름은 아틀라스다.
Table of contents
Open Table of contents
배경 — 지식 그래프가 맡던 일
graphiti 는 대화 한 턴을 에피소드로 받아 LLM 으로 엔티티와 사실을 뽑고, 그 관계를 FalkorDB 그래프에 쌓는다. 검색할 때는 질문과 관련된 사실과 엔티티를 그래프에서 꺼내 준다. 원리만 보면 이상적이다. 원문보다 짧은 사실만 꺼내므로 세션이 읽을 양이 줄고, 엔티티 사이의 관계까지 따라갈 수 있다.
LLM 호출은 LiteLLM 프록시 하나를 거쳐 Vertex AI 의 Gemini 와 로컬 GPU 의 오픈 모델로 나눠 보냈다. 에피소드 하나를 넣을 때 그 안에서 엔티티 추출, 중복 판정, 사실 추출, 시각 판정, 요약 같은 호출이 이어진다.
원인 — 이 구조를 버리게 한 세 실측
결정을 가른 근거는 세 가지 실측이었다.
- 정확도. 그래프의 사실을 맡길 모델을 고르려고 후보 모델 시험을 돌렸다. 그런데 시험한 4종 모델 모두 추출 정확도 기준을 통과하지 못했다. 그래프에 쌓이는 것은 원문이 아니라 LLM 이 요약하고 뽑은 사실이라, 추출이 틀리면 틀린 사실이 「기억」으로 남는다
- 빈 에피소드. 그래프의 에피소드 11,167건 가운데 3,486건(약 31%)은 사실이 하나도 뽑히지 않은 채였다. 원문은 들어왔는데 꺼낼 수 있는 것이 없는 기록이 셋 중 하나였다
- 호출 수. 에피소드 하나를 넣는 데 LLM 호출이 평균 9.58회 들었고, 판을 올리자 10.63회로 늘었다. 기록이 쌓일수록 쓰기 비용과 실패 지점이 함께 늘어나는 구조였다
이 세 가지는 그래프를 정리하는 작업을 할수록 더 분명해졌다. 중복과 빈 에피소드를 바로잡으려면 그래프 전체를 다시 읽고 판정해야 했고, 그 판정 하나하나가 다시 LLM 호출이었다. 운영 원칙은 「지식은 정확성이 먼저이고 시간은 기준이 아니다」였는데, 그 원칙을 지키는 비용이 그래프 구조 때문에 계속 커지고 있었다.
판단 — 그래프를 고칠지, 저장 방식을 바꿀지
선택지는 두 가지 방법이었다.
- graphiti 를 유지하고, 정확도 기준을 넘는 모델을 계속 찾아 추출과 정리를 고친다
- 저장할 때 LLM 을 쓰지 않는다. 대화 원문을 그대로 두고 임베딩만 붙여 MariaDB 에 담고, 찾을 때 질문과 뜻이 가까운 원문 조각을 꺼낸다
2번으로 선택한 이유는 틀린 기억보다 꺼낼 기억이 원문인 쪽이 안전하기 때문이다. 원문은 요약이 틀릴 일이 없고, 판단은 그것을 읽는 세션이 그때의 맥락으로 한다. 1번은 모델이 기준을 넘을 때까지 시험이 계속되고, 넘더라도 기록마다 열 번 가까운 호출이 남는다.
반면 2번의 대가는 분명하다. 엔티티 사이의 관계를 따라가는 그래프 질의를 버린다. 「이 서버와 연결된 서비스」처럼 관계로 묻던 것은 이제 뜻이 가까운 원문을 읽고 세션이 이어 붙여야 한다. 원문은 사실보다 길어서, 꺼낼 때 무엇을 몇 개 보일지를 따로 설계해야 한다. 이것이 다음 단계의 숙제가 됐다.
영향 범위 — 옮긴 것과 버린 것
전환하면서 기존 그래프에서 무엇을 살릴지 정했다. 그래프 덤프에만 있던 원문, 즉 옛 대화 턴 744건과 메모 61건은 새 저장소로 옮겼다. 나머지는 LLM 이 만든 요약과 사실이라 옮기지 않고 버렸고, 덤프도 지웠다. 원문이 따로 남아 있는 한 요약은 다시 만들 수 있지만, 틀린 요약을 옮기면 새 저장소가 처음부터 오염된다.
graphiti 컨테이너와 FalkorDB 는 운영에서 내렸다. LiteLLM 프록시는 남겼지만 LLM 호출 그룹은 끄고 임베딩 배포만 내도록 바꿨다. 쓰기 경로에서 LLM 이 빠졌으므로, 기억을 쌓는 데 드는 LLM 호출은 0 이 됐다.
정리
- 공유 기억은 「짧고 똑똑한 요약」보다 「틀리지 않는 원문」이 먼저다. 추출 정확도를 보장할 수 없으면 추출 결과를 기억으로 쌓지 않는다
- 결정의 근거는 정확도 시험, 빈 에피소드 비율, 기록당 호출 수 같은 실측으로 세운다
- 구조를 바꾸면 무엇을 버리는지 먼저 적는다. 이번에 버린 것은 관계 질의와 LLM 요약이다
- 옮길 때는 원문만 옮긴다. 요약은 원문에서 다시 만들 수 있지만, 옮긴 오류는 되돌리기 어렵다