ChatGPT 메모리 기능의 원리와 한계
openAI에서 GPT-4에 메모리 기능을 추가한다고 발표했습니다.
메모리 기능을 간단히 설명드리면 ChtGPT에 필요한 내용을 사전에 입력시켜놓고 그것을 바탕으로 LLM이 사용자의 질문이나 요청에 답변 하는 겁니다.
예를 들어 결혼 기념일을 미리 입력시켜 놓은 상태에서 '올해 아내에게 결혼기념 선물을 뭐로 하면 좋을까?' 하고 물으면 '올해는 결혼 30주년이고 봄철에는 지중해쪽이 날씨가 좋으니 이탈리아 여행을 추천드립니다.' 같은 답변을 받을 수 있는 거죠.
이러면 개인 비서 같은 용도로 사용가능하겠다고 기대하시는 분들이 많습니다.
불가능하지는 않겠지만 제약이 있습니다.
먼저 LLM 메모리의 원리를 알아 볼 필요가 있습니다.
사용자가 질문하고 시스템이 답하고 또 질문하고 답하는 과정을 LLM이 기억한다고 우리는 생각하기 쉽습니다.
LLM은 기억하는 메모리가 없습니다.
내부적으로는 지금까지 주고 받았던 모든 대화 내용 모두와 새로운 질문을 합해서 통째로 LLM에게 보내는 것이고 LLM은 그것을 가지고 답변합니다.
그렇다면 그동안 대화 내용의 얼마만큼을 보내게 될까요?
그건 LLM의 메모리 크기에 제한됩니다.
여기서 메모리란 LLM이 처리할 수 있는 토큰 수를 말합니다.
( 여기서 토큰이란 문장의 기본 단위를 말합니다. LLM이 다루는 단어같은 거죠. )
ChatGPT 는 4K (4,096)개, GPT-4는 32K (32,768)개의 토큰을 처리할 수 있습니다.
구글의 gemini 1.5 pro는 백만개까지 처리할 수 있다고 하더군요.
어쨌든 우리가 ChatGPT와 주고 받았던 대화의 내용은 주어진 메모리의 크기를 벗어나는 순간부터 가장 오래된 대화부터 사라지고( = 더이상 LLM에 보내지 않고 ) LLM은 대화를 기억하지 못하는 것처럼 동작합니다.
그렇다면 특정한 내용을 계속 기억해두고 LLM이 답변에 활용하게 하려면 어떻게 할까요?
그건 매번 프롬프트를 입력할 때 해당내용을 함께 보내면 됩니다.
그러면 너무 불편하겠지요?
뿐만 아니라 프롬프트에 내용이 중복되어 결과적으로 메모리를 줄이는 폐단도 생깁니다.
LLM API를 이용해서 직접 프로그래밍을 할 때는 장기 기억과 단기 기억을 나누어서 LLM에 요청하는 방법을 쓸 수 있습니다.
LLM에 답변을 요청 할 때 보내는 내용을 '장기 기억' + '최근 대화 내용' + '사용자의 현재 프롬프트' 이렇게 보내는데 토큰수가 넘치게 되면 '최근 대화 내용'을 필요한 만큼 앞부분부터 덜어내서 크기를 맞춥니다.
이런 방법을 서비스에 적용한 것이 이번 ChatGPT의 메모리 기능으로 보입니다.
만약 제 추정이 맞다면 ( 아마 맞을 겁니다. OpenAI API를 공부하면서 메모리 기능이 있어야겠다고 생각했는데 그대로 나온 것을 봐서 ) 장기 기억에 해당되는 메모리 기능에 쓰이는 토큰은 결국 전체 32K의 한계를 압박하게 될겁니다.
즉, 개인 비서처럼 매일매일의 내용을 저장하다 보면 점차 ChatGPT가 단기 기억 상실증 걸린 사람처럼 반응 할 겁니다.
'잉? 아까 말한 내용을 벌써 잊어버렸어?'
32K라는 숫자 굉장히 커보이지만 프로그램 소스코드 분석 같은 대용량의 프롬프트를 요청하다 보면 의외로 적은 숫자임을 절감하게 됩니다.
결국 OpenAI도 gemini처럼 LLM의 처리 토큰수를 늘리고 장기 기억도 카테고리별, 캐릭터별로 선택할 수 있도록 해야 효용성이 더 좋아질 것으로 보입니다.