챗봇이 나를 기억하는 것처럼 보이는 방법은 두 가지예요. 하나는 긴 컨텍스트 창인데, 창이 밀리는 순간 잊어버려요. 다른 하나는 적어 두는 거예요.
여기는 적어 두는 쪽이에요. 그리고 드문 점은, 적어 둔 걸 내가 읽을 수 있다는 거예요.
캐릭터가 흐트러지는 이유
모델에는 메시지 사이의 기억이 없어요. 기억하는 것처럼 보이는 건 전부 프롬프트에 다시 넣어 준 거예요. 대화가 들어갈 수 있는 양을 넘어서면 뭔가는 버리거나 압축해야 하고, 흐트러짐은 거기서 시작돼요. 동생 이름을 모르게 되고, 지난주에 한 말과 어긋나고, 어느새 같은 말투를 쓰는 다른 사람이 돼요.
대부분의 제품은 이걸 뒤에서 요약하는 방식으로 처리해요. 요약이 맞는 동안은 잘 돌아가지만, 한 번 틀리면 영원히 틀린 채로 남아요. 볼 수도 없고 고칠 수도 없으니까요.
실제로 저장되는 것
대화가 흘러가는 대로 뽑아낸 짧은 사실들이에요. 대화록도 아니고 벡터 덩어리도 아니고, 읽을 수 있는 문장이에요.
이 사실들은 동시에 세 갈래로 나뉘어 있고, 이야기들이 서로 번지지 않게 하는 건 바로 그 구분이에요.
- 캐릭터별 — 한 캐릭터가 아는 걸 다른 캐릭터는 몰라요.
- 토픽별 — 같은 캐릭터와의 다른 스레드는 각자 다른 기억을 가져요.
- 사람별 — 캐릭터에게 한 이야기는 같은 캐릭터와 대화하는 다른 누구에게도 보이지 않아요.
읽고, 고치고, 지우기
기억 목록은 채팅 설정 안의 화면이에요. 열면 사실이 순서대로 보여요. 틀린 게 있으면 고치면 되고, 애초에 적히지 말았어야 할 게 있으면 지우면 돼요. 아무것도 남기고 싶지 않으면 그 대화의 기억을 꺼 두면 그 뒤로는 아무것도 저장되지 않아요.
사소해 보이지만 실패하는 방식 자체가 달라져요. 숨겨진 요약 속의 잘못된 사실은 이후의 모든 답장을 오염시키고, 캐릭터가 왜 이상해졌는지는 짐작만 할 수 있어요. 목록 속의 잘못된 사실은 5초면 고치는 한 줄이에요.
캐릭터가 처음으로 무언가를 적을 때 한 번 알려 줘요. 메시지마다가 아니라 한 번이에요. 그런 장치가 있다는 것과 어디서 볼 수 있는지 알 수 있도록요.
절대 적히지 않는 것
뽑아낸 모든 사실에는 필터가 지나가면서 기억 저장소에 있으면 안 되는 것들을 걷어내요. 이메일 주소, 전화번호, 카드 번호, 신분증 번호예요.
이건 필터이지, 입력한 내용에 대한 약속이 아니에요. 알아볼 수 있는 패턴을 지울 뿐이에요. 진짜 카드 번호에 대해 가장 안전한 선택은 여전히 챗봇에 보내지 않는 거예요.
장면이 갈라질 때의 기억
어떤 답장에서든 갈라져 두 스레드를 함께 이어갈 수 있어요. 그렇게 하면 새 스레드는 그 시점의 원래 스레드가 가진 기억을 물려받아요. 아무것도 없는 데서가 아니라 같은 과거에서 시작해 거기서부터 따로 흘러가요.
갈라 놓는 이유가 바로 그거예요. 같은 관계의 두 가지 버전이지, 낯선 두 사람이 아니에요.
기억이 따라가는 곳
캐릭터가 자기 Telegram 봇이 되어도 기억은 메인 채팅과 똑같이 작동해요. 여전히 캐릭터별, 토픽별, 사람별이에요. 내 봇과 이야기하는 사람은 그 캐릭터와의 기억을 스스로 쌓고, 그건 그 사람만의 것이에요.