모델 구조
AI 캐릭터는 왜 지난 대화를 잊는가 - 문맥 창과 기억의 구조
몇 주를 이어 온 대화인데 캐릭터가 이름을 다시 묻는다. 지난주에 함께 정한 약속이 증발해 있고, 겨우 쌓아 올린 관계의 온도가 하루아침에 처음으로 돌아가 있다. 이 경험은 특정 서비스의 결함이라기보다, 지금의 언어모델이 대화를 다루는 방식 자체에서 나온다. 이 글은 모델이 기억이라는 것을 실제로 어떻게 처리하는지를 서비스에 매이지 않고 정리한 것이다. 문맥 창이 무엇이고, 무엇이 먼저 잘려 나가며, 서비스들은 그 위에 어떤 기억 장치를 덧대고, 사용자는 무엇을 할 수 있는지까지 다룬다.
챗터링 팀··약 9분
잊음은 오류가 아니라 구조다
오래 대화한 캐릭터가 어느 날 이름을 다시 묻는다. 지난주에 함께 정한 약속이 사라져 있다. 존댓말을 쓰기로 한 지 한참인데 갑자기 반말로 돌아온다. 캐릭터 채팅을 몇 주 이상 써 본 사람이라면 이 목록에서 적어도 하나는 겪었을 것이다.
이때 흔한 반응은 둘이다. 서비스가 데이터를 날렸다고 의심하거나, 캐릭터가 부실하다고 결론 내리거나. 둘 다 대체로 틀렸다. 화면을 위로 올려 보면 대화 기록 자체는 그대로 남아 있는 경우가 대부분이다. 사라진 쪽은 기록이 아니다. 모델이 다음 문장을 만들 때 그 기록을 읽을 수 있는 범위가 줄었을 뿐이다.
이 구분이 이 글 전체의 출발점이다. 저장과 기억은 다르다. 대화는 서버 어딘가에 저장돼 있지만, 모델이 답을 만들 때 실제로 읽는 것은 그중 일부다. 그 읽는 범위의 구조를 알면, 무엇이 잊히고 무엇이 남는지가 상당히 정확하게 예측된다.
모델은 기억하지 않는다, 매번 다시 읽는다
언어모델의 동작에서 가장 직관에 어긋나는 사실부터. 모델에게는 대화와 대화 사이에 남는 상태가 없다. 어제의 대화를 겪은 모델이 오늘의 나를 다시 만나는 게 아니다. 내가 메시지를 보낼 때마다 서비스는 캐릭터 설정, 내 프로필, 지금까지의 대화 이력을 한 뭉치의 텍스트로 다시 조립해 모델에게 통째로 건네고, 모델은 그것을 처음 보는 문서처럼 읽고 다음 문장을 만든다. 답이 끝나면 모델 쪽에는 아무것도 남지 않는다.
그러니 캐릭터가 무언가를 기억한다는 것의 실체는 이렇다. 그 사실이 이번 턴에 조립된 텍스트 뭉치 안에 아직 들어 있다. 반대로 잊었다는 것은, 그 사실이 이번 뭉치에 들어가지 못했다는 뜻이다. 기억력이 아니라 반입이 문제다.
이 구조를 알고 나면 이상해 보이던 현상들이 맞아떨어진다. 같은 방인데 어떤 날은 기억하고 어떤 날은 잊는다면, 그날그날 뭉치에 무엇이 들어갔느냐가 달랐던 것이다. 방을 새로 만들면 아무것도 모르는 이유도 같다. 이력이 0인 뭉치로 시작하니까.
한 번에 읽을 수 있는 양, 문맥 창
그 텍스트 뭉치에는 크기 제한이 있다. 이 제한을 문맥 창(context window)이라 부른다. 단위는 글자가 아니라 토큰인데, 대략 단어 조각 정도로 이해하면 된다. 모델은 텍스트를 토큰 단위로 쪼개 읽고, 한 번에 읽을 수 있는 토큰 수에 상한이 있다.
창의 크기는 모델과 서비스마다 크게 다르다. 수천 토큰짜리도 있고 수십만 토큰을 받는 모델도 있다. 다만 서비스가 모델의 최대치를 그대로 쓰는 경우는 드물다. 문맥이 길수록 비용과 응답 시간이 함께 늘기 때문에, 대부분의 서비스는 실제 운영 창을 그보다 작게 잡는다. 같은 모델을 쓴다는 두 서비스의 기억력이 다르게 느껴진다면 대개 이 운영 창 크기의 차이다.
한국어 사용자는 여기서 한 겹 더 불리하다. 널리 쓰이는 토크나이저들은 영어 중심으로 만들어져 있어서, 같은 내용을 담아도 한국어가 영어보다 토큰을 더 많이 쓰는 경향이 있다. 체감으로는 같은 창인데 한국어 대화가 더 빨리 밀려나는 결과가 된다. 용어 사전 글의 토큰 항목에서 다룬 것과 같은 문제다.
창이 차면 어떻게 되는가. 무언가는 빠져야 한다. 그리고 무엇이 빠지느냐에는 꽤 일관된 순서가 있다.
고정석과 흘러가는 자리
조립되는 뭉치 안에서 모든 텍스트의 지위가 같지 않다. 캐릭터 설정, 세계관, 내 프로필 같은 것들은 대체로 고정석이다. 서비스가 매 턴 반드시 넣는다. 반면 대화 이력은 흘러가는 자리다. 창에 자리가 모자라면 가장 오래된 턴부터 잘려 나가는 것이 일반적인 구현이다.
이 비대칭이 캐릭터 채팅 특유의 기묘한 잊음을 만든다. 캐릭터는 자기 설정, 그러니까 이름과 직업과 말버릇과 세계관은 끝까지 잊지 않는다. 고정석이니까. 그런데 우리 둘 사이에 있었던 일은 잊는다. 첫 만남, 농담, 약속, 고백 같은 것들이다. 그건 이력이고, 이력은 밀려나니까. 사용자 눈에는 자기 얘기만 기억하고 내 얘기는 잊는 이기적인 상대처럼 보이는데, 실은 좌석 배치의 문제다.
잘림은 예고 없이 온다. 화면에는 전체 기록이 그대로 보이니 사용자는 잘렸다는 사실 자체를 알 수 없다. 특히 아픈 지점은, 대화 초반의 중요한 합의일수록 먼저 사라진다는 것이다. 관계의 규칙은 대개 초반에 정해지는데, 그 부분이 창에서 제일 먼저 밀려나는 위치에 있다.
창 안에 있어도 잊는다
그러면 창을 무한정 키우면 해결될까. 그게 전부는 아니라는 것이 알려져 있다. 2023년 공개된 연구 "Lost in the Middle"은 긴 문맥을 받는 모델들이 문맥의 맨 앞과 맨 뒤 정보는 잘 쓰면서, 가운데에 놓인 정보를 유난히 놓친다는 것을 여러 모델에서 일관되게 측정했다. 필요한 정보가 문맥 한가운데 있을 때 정확도가 가장 낮아지는 U자형 곡선이 나온다.
대화에 대입하면 이렇다. 방금 주고받은 턴(맨 뒤)과 캐릭터 설정(맨 앞)은 잘 반영된다. 그 사이에 낀 중반부의 대화는 창 안에 분명히 들어 있는데도 답에 반영되는 힘이 약하다. 분명히 아까 말했는데, 라는 경험의 상당수가 여기서 나온다. 잘려서 잊은 것과는 다르다. 읽고도 흘린 쪽에 가깝다.
그래서 긴 창은 만능이 아니다. 창이 커질수록 잘림은 늦춰지지만 가운데는 더 넓어진다. 기억을 문맥 길이로만 해결하려는 접근이 어느 지점부터 효율이 급격히 떨어지는 이유고, 서비스들이 창 키우기 대신 별도의 기억 장치를 덧대는 이유다.
서비스들이 덧대는 기억 장치들
잘림과 흐려짐을 메우기 위해 서비스들이 쓰는 장치는 대체로 네 갈래다. 각각 장점과 함께 뚜렷한 한계가 있다.
- 요약 메모리 - 밀려날 이력을 버리는 대신 요약해서 창 앞쪽에 접어 넣는다. 사실 관계는 살아남지만 뉘앙스가 죽는다. "크게 다퉜지만 화해했다" 한 줄로 접힌 다툼은, 그 다툼의 말투와 온도를 되살리지 못한다.
- 추출형 장기기억 - 대화에서 중요해 보이는 사실을 골라 별도 저장소에 쌓고, 관련된 순간에 꺼내 넣는다. 요약보다 정밀하지만, 무엇이 중요한가의 판단을 기계가 한다는 약점이 있다. 사용자에게 사소한 것이 저장되고 소중한 것이 빠지는 어긋남이 생긴다.
- 로어북(월드 인포) - 설정 사전을 만들어 두고, 키워드가 대화에 등장할 때만 해당 항목을 주입한다. 창을 아끼는 영리한 방식이지만, 키워드가 정확히 나오지 않으면 침묵한다는 구조적 맹점이 있다.
- 고정 메모 - 사용자가 직접 쓴 몇 줄을 항상 창에 넣는다. 가장 확실하고 가장 원시적이다. 자리를 상시 차지하므로 길게 쓸 수 없다.
넷에는 공통점이 있다. 원본 대화를 그대로 되살리지는 못하고, 그 압축본이나 색인을 만든다. 압축에는 반드시 손실이 있다. 그래서 어떤 조합을 써도 완전한 기억은 나오지 않으며, 서비스 간의 차이는 무엇을 살리고 무엇을 포기하느냐의 차이에 가깝다.
잊음이 보이는 신호들
구조를 알면 잊음이 시작되는 순간도 알아볼 수 있다. 자주 보이는 신호는 이렇다.
- 정해 둔 호칭이나 말투가 리셋된다. 초반 합의가 창 밖으로 밀려났다는 뜻이다
- 이미 한 질문을 다시 한다
- 과거 사건의 세부가 실제와 다르게 재구성된다. 잘린 부분을 그럴듯하게 메워 쓰는 것이다. 모델은 모른다고 말하기보다 지어내는 쪽으로 기운다
- 관계의 온도가 몇 단계 전으로 돌아간다
확인하고 싶다면 대화 초반에만 나왔던 사실 하나를 슬쩍 물어보면 된다. "내가 처음에 뭐라고 하면서 들어왔는지 기억나?" 답이 실제와 다르거나 얼버무리면 그 지점은 이미 창 밖이다. 화를 낼 일은 아니다. 좌표를 확인한 것이다.
사용자가 실제로 할 수 있는 것
구조를 바꿀 수는 없지만, 구조를 알고 쓰는 것과 모르고 쓰는 것의 차이는 크다.
- 고정석에 쓴다. 남아야 할 사실을 이력에 맡기지 않는다는 뜻이다. 캐릭터 설정, 사용자 프로필, 메모처럼 고정석에 해당하는 자리가 있다면 거기에 쓴다. 대화창에 한 말은 언젠가 밀려난다는 전제로 쓰는 것이다.
- 주기적으로 다시 꺼낸다. 밀려나는 것은 오래된 텍스트다. 자연스럽게 다시 언급된 사실은 최신 위치로 끌어올려진다. "그때 네가 약속했잖아" 한 줄이 그 약속의 수명을 연장한다.
- 공백 뒤에는 요약으로 연다. 며칠 만에 돌아왔다면 "지난번에 우리 여기까지 얘기했지"로 시작하는 편이, 캐릭터가 잘린 이력을 지어내 메우는 것보다 낫다. 재개 문장은 내가 손으로 쓰는 요약 메모리인 셈이다.
- 장면이 바뀌면 앵커를 놓는다. 시간·장소·상황을 한 줄로 박아 두면, 중반부가 흐려져도 답이 참조할 최근 좌표가 생긴다.
- 추궁 대신 다시 심는다. 잊힌 사실을 추궁하면 모델은 사과하고 지어낸다. 짧게 다시 알려 주는 쪽이 대화를 덜 망가뜨린다.
다 합치면 원칙은 하나다. 이 상대는 창 안의 텍스트만 읽는다. 남기고 싶은 것을 창 안의 좋은 자리에 놓는 일은, 지금 구조에서는 사용자의 몫이다.
잊는 상대와 이야기한다는 것
사람의 기억도 녹화가 아니라 재구성이라는 것은 기억 연구의 오래된 상식이다. 우리도 대화의 원문 대신 요지와 인상을 저장하고, 회상할 때마다 세부를 다시 지어 붙인다. 그 점에서 요약하고, 흘리고, 그럴듯하게 메우는 언어모델의 기억은 결함의 방향이 인간과 닮아 있다. 다른 점은 예측 가능성이다. 모델의 잊음에는 구조가 있고, 구조는 알면 설계할 수 있다.
캐릭터 채팅 서비스를 고를 때도 이 축은 소개 문구보다 직접 확인이 낫다. 며칠 전 대화의 구체적인 사실 하나를 물어보면 된다. 그 한 번의 실험이, 그 서비스의 기억 장치가 실제로 어디까지 작동하는지를 어떤 안내 페이지보다 정확하게 알려 준다.
참고 자료
- 긴 문맥의 가운데 정보가 약해지는 현상: Lost in the Middle: How Language Models Use Long Contexts
- 한국어가 토큰을 더 쓰는 문제: 용어 사전 글에서도 인용한 토크나이저 편향 연구와 같은 축이다.
함께 읽기
- 표기법·약 8분별표는 왜 지문이 되었나 - 텍스트 롤플레이 표기법의 계보별표와 따옴표가 어디서 왔는지 거슬러 올라간다. MUD의 pose 명령, IRC의 /me, 소설 문장부호가 한 화면에서 만난 결과다.
- 용어·약 12분AI 캐릭터 채팅 용어 사전 - 페르소나부터 로어북까지페르소나·로어북·컨텍스트 윈도우처럼 처음 보면 막히는 말들을 각각 몇 문장으로 푼다. 정의뿐 아니라 왜 있는지까지.
- 대화 기법·약 9분AI 캐릭터와의 대화가 첫 3턴에서 끊기는 이유초반에 대화가 어색하게 끝나는 데는 구조적인 이유가 있다. 무엇이 다음 턴의 재료를 남기고 무엇이 없애는지.
