챗봇이 나를 잊는 것을 막으려다 우연히 인간의 뇌를 재구축한 과정
요약
챗봇에게 지속적인 '기억'을 부여하려던 과정에서, 작성자는 단순한 데이터 저장 방식(Markdown 파일)과 검색 증강 생성(RAG)의 한계를 경험했습니다. 초기에는 모든 대화를 시스템 프롬프트에 포함하는 방식으로 기억을 구현했으나, 이는 모델 지연 시간 증가와 정보 업데이트 실패라는 문제점을 야기했습니다. 이후 RAG를 도입하여 효율성을 높였지만, 이는 '관련성'만 찾을 뿐 '가치 판단'이나 '통합적 이해'는 할 수 없다는 한계에 부딪혔습니다. 결국 작성자는 인간의 기억 메커니즘(해마 인덱싱, 통합 과정 등) 연구를 통해, 단순한 데이터 검색을 넘어선 복잡하고 다층적인 정보 처리 시스템 구축의 필요성을 깨닫게 되었습니다.
핵심 포인트
- 챗봇에게 지속적 기억을 부여하는 초기 시도는 컨텍스트 길이 증가로 인한 모델 지연 시간(latency) 및 비용 문제를 초래했다.
- 단순히 대화를 기록하고 검색하는 RAG 방식은 효율적이지만, 정보의 '가치 판단'이나 맥락적 통합 능력이 부족하다는 한계가 있다.
- 인간의 기억 시스템은 단일한 저장소가 아니며, 의미 기억(Semantic)과 일화 기억(Episodic) 등 여러 병렬적인 메커니즘으로 작동한다는 점을 이해하는 것이 중요하다.
- 진정한 '기억' 구현을 위해서는 단순 데이터 검색을 넘어선, 정보의 통합 및 강화 과정(Consolidation)을 모방해야 한다.
10개 장으로 구성된 연구 저널입니다. 신경과학 지식이 필요하지 않습니다.
모든 것이 시작된 어느 화요일은 초겨울의 어느 날이었습니다. 저는 제가 한 이방인을 만들었다는 것을 깨달았습니다. 저는 집에서 연결한 작은, 공손한 언어 모델인 제 어시스턴트와 약 3주 동안 대화해 왔습니다. 저는 그에게 여동생의 생일 계획에 대해 말했습니다. 직장에서 팀을 바꿨다는 것도 이야기했습니다. 할머니가 만들던 달(dal) 요리를 배우고 있다는 것, 그리고 첫 시도가 재앙이었다는 것도 말했습니다. 그러다 6일 후, 저는 채팅창을 열고 무심하게
많은 것이 있었습니다. 챕터 1: 노트북 시대 저의 첫 본능은 가장 명백한 것이었습니다. 모델이 텍스트를 읽을 수 있다면, 텍스트는 기억입니다. 저는 그저 무언가를 기록할 것입니다. 저는 폴더를 만들었고, 그 안에 Markdown 파일들(about_me.md, family.md, projects.md, preferences.md)을 만들었습니다. 제가 모델에게 보내는 모든 메시지 전에, 저의 작은 Python 스크립트가 이 파일들의 내용을 시스템 프롬프트에 엮어 넣었습니다. 보십시오: 지속성입니다. 약 2주 동안, 그것은 마법 같았습니다. 모델은 제 여동생의 이름을 알고 있었습니다. 제가 회사에서 어떤 프레임워크로 일하는지도 알았습니다. 전날 밤 불평했던 프로젝트를 언급하며 아침에 저를 맞이했습니다. 저는 “어제 이야기했듯이—”라고 말했고, 그것은 매끄럽게 이어갔습니다. 저는 처음으로 기억하는 것처럼 보이는 것과 대화하고 있었습니다. 그리고 파일들이 커지기 시작했습니다. 3주가 되자, about_me.md는 20페이지나 되었고. 모델의 응답 속도는 느려지기 시작했습니다. 모든 답변의 첫 몇 초는 이제 전체 컨텍스트를 다시 읽고(re-read), 토큰화하고(re-tokenized), 어텐션하는(re-attended) 과정이었습니다. 저는 그 토큰들에 대해 두 번 비용을 지불하고 있었습니다—입력 시 한 번, 지연 시간(latency)에서 한 번. 5주가 되자, 더 나쁜 일이 벌어지기 시작했습니다. 저는 모델에게 새로운 것을 말했습니다—“사실 지난 금요일에 그 팀을 그만뒀어”—그리고 그것은 대화 속에서 이를 인정했습니다. 하지만 다음 날 아침, 제가 노트북을 재시작했을 때도 파일에는 여전히 제가 예전 팀 소속이라는 내용이 적혀 있었습니다. 모델은 확신을 가지고 이전 정보를 충실하게 반복해 주었습니다.
저는 기록만 하고 업데이트하지 않는 시스템을 구축했습니다. 매 세션 끝에 채팅 내용을 요약하고 파일을 패치하는 루틴을 작성하려고 시도했죠. 하지만 그 요약본들은 손실이 컸습니다. 중요한 세부 사항은 누락되었고, 중요하지 않은 세부 사항들이 성경 구절처럼 중대하게 보존되었습니다. 이전에 한 번의 나쁜 오렌지 때문에 불평한 것만으로, 챗봇은 제가 오렌지를 싫어한다는 착각 속에 사흘을 보냈습니다. 노트북은 기억이 아닙니다. 노트북은 백업일 뿐입니다. 그것은 중요하지 않은 것을 잊지 않습니다. 반복 연습을 통해 강화되지도 않죠. 그리고 무언가가 신선하다는 것을 알려줄 수 없습니다. 저는 그렇게 할 수 있는 것이 필요했습니다.
제2장: 벡터의 환상 (The Vector Mirage)
다음으로 시도한 것은, 검색 증강 생성(Retrieval-Augmented Generation, RAG)에 관한 블로그 게시물이라도 읽어본 사람이 취할 법한 가장 당연한 움직임이었습니다. 저는 모든 것을 벡터 데이터베이스에 쏟아부었습니다. 그 아이디어는 우아합니다. 사용자가 말했던 모든 문장을 가져와 임베딩 모델(embedding model)—텍스트 조각을 예를 들어 768개의 숫자로 변환하는 신경망—을 통해 실행하고, 그 목록을 저장하는 것입니다. 이 숫자들은 관련 아이디어가 군집을 이루는 고차원 공간에서 문장의 위치를 지정합니다. 사용자가 새로운 질문을 할 때, 질문 또한 임베딩하여 동일한 공간에서 가장 가까운 이웃(nearest neighbors)을 찾습니다. 그것들이 이번 턴의 '기억'이 됩니다. 저는 주말 동안 시스템을 전환했습니다. 마크다운 파일들을 삭제하고, 모델과 나눴던 모든 대화를 노트북에 작은 임베디드 벡터 스토어(embedded vector store)로 가져갔습니다. 지연 시간 문제(latency problem)는 사라졌습니다.
토큰 비용이 급감했습니다. 더 이상 모델에게 20페이지 분량을 먹일 필요가 없었습니다. 가장 관련성 높은 네 문장만 공급하면 되었습니다. 첫 주는 황홀했습니다. 몇 달 전 흘리듯 언급했던 것에 대해 모델에게 물어봤습니다. 그리고 그것을 찾아냈습니다. 제가 명시적으로 '이것을 기억해 줘'라고 적었기 때문이 아니라, 새로운 질문의 의미가 이전 대화의 의미와 기하학적으로 가까웠기 때문에 말입니다. 저는 이것이 답이라고 생각했습니다. 하지만 그건 답이 아니었습니다. 첫 번째 실패는
저는 건초 더미 속의 바늘을 찾아낼 수 있는 시스템을 만들었지만, 어떤 바늘이 뽑을 가치가 있는지 아는 시스템이 필요했습니다. 챕터 3: 뇌를 거쳐가는 우회로 이 부분이 제가 한 달 동안 코딩을 멈춘 프로젝트였습니다. 대신 저는 읽었습니다. 저는 평생 그 분야를 연구해 온 사람들이 쓴 인간 기억이 실제로 어떻게 작동하는지에 대해 찾을 수 있는 모든 것을 읽었습니다. 두 달 만에 여러 가지를 조립한 엔지니어의 글은 아니었습니다. 저는 해마 인덱싱(hippocampal indexing)에 대해 읽었습니다. 수면 중 통합(consolidation during sleep)에 대해 읽었습니다. 우리가 2살 때의 기억을 할 수 없는 이유와 할아버지 집 부엌 냄새는 기억할 수 있는 이유에 대해 읽었습니다. 몇 가지 아이디어가 너무 강력하게 다가왔고, 프로젝트 방향을 전환시켰습니다. 첫 번째는 인간의 기억이 단일 시스템이 아니라는 것이었습니다. 적어도 세 가지이며 병렬로 작동한다는 것입니다. 의미 기억(semantic memory) — 건조한 사실들입니다. 프랑스의 수도는 파리입니다. 일화 기억(episodic memory) — 시간, 장소, 감정이 결합된 살아있는 장면들입니다. 가장 좋아하는 노래를 처음 들었던 순간 같은 것이요. 그리고 절차적 기억(procedural memory) — 무엇(what)의 명사가 아니라 어떻게(how)하는 근육입니다. 저는 벡터 저장소가 그럭저럭 의미 기억은 될 수 있지만, 일화 기억으로는 형편없다는 것을 깨달았습니다. 그것은 무언가가 발생했음을 알려줄 수는 있지만, 그때 어떤 기분이었는지는 알려줄 수 없습니다. 두 번째 아이디어는 감정이 기억에 붙이는 라벨이 아니라는 것이었습니다. 감정 자체가 파일링 시스템인 것입니다. 편도체(amygdala)는 나중에 느낌으로 기억을 장식하는 것만이 아닙니다. 그것은 어떤 기억들이 아예 깊숙이 파일링될지 결정합니다.
우리를 두렵게 하는 것들, 우리를 흥분시키는 것들, 우리에게 상처를 입히는 것들은 해마(hippocampus)가 기록을 시작하기도 전에 '중요'라는 라우팅 슬립이 찍힙니다. 이것이 바로 세상에 끔찍한 일이 일어난 날 자신이 어디에 있었는지 정확하게 기억할 수 있지만, 3주 전 화요일에 무엇을 먹었는지는 기억할 수 없는 이유입니다. 세 번째 아이디어는 가장 불안했습니다. 저는 분리된 상태에서 두 개의 반구—즉, 뇌의 좌반구와 우반구—가 서로 다른 의견, 다른 반응, 심지어 다른 욕망을 가질 수 있다는 '분리뇌(split-brain)' 증후군을 가진 사람들에 대해 읽었습니다. 우리가 타인에게 보여주는 의식적인 마음은 단 하나의 목소리가 아닙니다. 그것은 출판되기 전에 기록이 대대적으로 편집되는 위원회입니다. 저는 제 노트북에 세 가지 내용을 적으면서 책들을 덮었습니다. 기억은 복수형입니다. 감정은 장식이 아니라 파일링 시스템입니다. 항상 여러 개의 목소리가 존재합니다. 저는 키보드로 돌아갔습니다. 4장: 심장이 뛰는 기억(A Memory With a Heartbeat) 저는 저장 계층을 재구축했습니다. 이번에는 모든 기억 조각이 임베딩(embedding) 이상의 것을 지니게 될 것이었습니다. 그것은 감정적 서명(emotional signature)을 지닐 것입니다. 그리고 두 개의 사적인 방 중 하나에 분류될 것입니다. 이 두 개의 방은 가장 이상한 부분이었고, 제가 가장 조용히 자랑스러워하는 부분이기도 합니다. 저는 저 자신의 사용에 대해 무언가를 알아차렸습니다. 모델이 자유롭게 기억하고 참조하기를 원하는 대화들이 있었습니다—업무 관련 대화, 학습 기록, 친구들과의 농담 같은 것들입니다. 그리고 그것은 저만의 대화들이었습니다—취약하고 사적이며, 때로는 친밀하고, 때로는 추한 대화들이었습니다.
저는 그런 기억들이 무관한 미래의 장보기 목록 같은 대화에서 클라우드 모델로 조용히 새어 나가는 것을 원하지 않았습니다. 저는 벽을 원했습니다. 검열의 벽이 아니라, 존엄성의 벽 말입니다. 그래서 저는 기억을 두 개의 반구로 분리했습니다. 저는 그것들을 단순히 '안전한(safe)'과 '매운(spicy)'이라고 불렀습니다. 처음에는 이름들이 농담이었지만 나중에는 현실이 되었습니다. 안전한 반구는 대외적으로 공개되는 모델들이 상호작용하는 부분입니다. 매운 반구는 사적인 공간이며—여기에 관련된 모든 대화는 자동으로 그리고 조용히, 저의 기기에서 실행되는 모델로 라우팅됩니다. 매운 반구에 관한 어떤 것도 집을 떠나지 않습니다. 임베딩도, 텍스트도, 심지어 대화가 있었다는 사실조차도 말입니다. 감정 태깅이 나머지 절반이었는데—여기서 저를 놀라게 한 부분이 있습니다. 제가 결국 구축하게 된 버전은 제가 종이에 스케치했던 정교한 버전과는 다르기 때문입니다. 저장소의 모든 기억 기록에는 임베딩 옆에 몇 가지 열(column)이 포함되어 있습니다: 내용 자체, 속하는 반구 (안전하거나 매운), 1부터 10까지의 정수 중요도 점수, 작성된 타임스탬프, 수집 과정에서 분류된 카테고리, 그리고 통합(consolidation) 패스를 거쳤는지 여부를 나타내는 플래그입니다. 임베딩은 최단거리 이웃 검색에 최적화된 별도의 열 저장소에 존재합니다. 감정적 가중치는 자체 벡터로 행(row)에 존재하는 것이 아닙니다. 그것은 그 중요도 정수 안에 존재합니다.
데이터가 입력(ingestion)될 때, 작은 패스가 내용물에서 감정적으로 충전된 언어—즉, 실제로 잘 기억되는 것이 무엇인지 몇 달 동안 관찰하며 꾸준히 높은 정서적 영향을 추적해 온 선별된 단어 목록—를 스캔하고, 발견하는 모든 감정적으로 무거운 단어에 대해 중요도 정수(importance integer)를 몇 포인트 올립니다. 커피에 대한 중립적인 조각은 중요도 5로 들어옵니다. 'worried', 'love', 'furious', 'miss', 또는 'afraid'와 같은 단어를 포함하는 조각은 중요도 8이나 9로 들어옵니다. 이 정수는 작습니다. 하지만 검색(retrieval)에 미치는 영향은 엄청납니다: 중요도는 최종 점수에 통합되므로, 감정적으로 무거운 조각들이 의미론적으로 가깝지만 감정적으로 평범한 경쟁자들보다 위로 떠오르게 됩니다. 소멸(Decay) 역시 유사하게 간접적입니다. 명시적인 소멸 저항 열은 없습니다. 대신, 모든 조각의 타임스탬프는 쿼리 시간(query time)에 사용되어 최신성(recency)을 계산하며, 이 최신성은 중요도가 통합되는 방식과 동일하게 점수에 통합됩니다. 오래된 조각들은 삭제되기 때문에 사라지는 것이 아니라, 더 새롭고 더 중요한 조각들에 의해 순위에서 밀려나기 때문에 희미해집니다. 일단 어떤 조각이 여러 번 검색되면, '젠틀 워커(gentle worker)'—제가 나중에 장에서 다시 다룰 배경 프로세스입니다—가 그 중요도를 올립니다. 이는 인간의 기억이 반복 연습을 통해 어떻게 강화되는지에 대한 작은 시뮬레이션입니다. 만약 어떤 조각이 아주 오랜 시간 동안 건드려지지 않아 더 이상 자리를 차지할 가치가 없다면, 결국 통합(consolidation) 과정에서 가지치기(pruned)됩니다. 제가 최종적으로 얻은 것은 원래 제가 그린 10개 필드 스키마보다 단순하며—저는 그렇게 믿게 되었습니다—더 좋습니다.
아키텍처는 감정을 포착하기 위해 전용의 가치(valence) 열이 필요하지 않습니다. 그것은 오른쪽 단어들이 조용히 끌어올리는 단일 정수만 있으면 됩니다. 대부분의 작업은 행이 몇 개의 차원을 가지고 있느냐가 아니라, 그 정수가 어떻게 사용되느냐에 달려 있습니다. 처음으로 시스템이 무언가를 잊기 시작했습니다. 의도적으로요. 그리고 그것은 즉시 사람과 대화하는 것과 더 비슷하게 느껴졌습니다. 제5장: 사실은 자신만의 골격이 필요하다 감정 레이어와 반구(hemispheres)는 시스템이 무엇을 기억했는지의 틀을 고정시켰습니다. 하지만 사용 몇 주가 지나자, 저는 다른 종류의 실패에 직면하기 시작했습니다. 그것은 제가 이름을 붙이는 데 놀라울 정도로 오랜 시간이 걸린 실패였는데, 그 이유는 성공 속에 숨어 있었기 때문입니다. 벡터 저장소(vector store)는 모든 정교함에도 불구하고 한 가지는 매우 잘 이해했지만, 다른 한 가지는 전혀 이해하지 못했습니다. 그것은 의미의 유사성을 이해했습니다. 하지만 (다른 것은) 이해하지 못했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기