대화는 턴과 턴 사이에 어디에 있나
모든 턴이 자기완결적 요청이라면 대화의 나머지는 어디에 있을까요. 턴마다 무엇이 저장되고 무엇은 결코 저장되지 않는지, 원문 창이란 무엇인지, 오래된 턴이 어떻게 정확히 한 번만 롤링 요약으로 접혀 들어가는지, 한 턴만으로도 넘칠 때 어떻게 되는지, 그리고 어떤 사실이 세션보다 오래 남는지.
모든 턴은 하나의 자기완결적 요청입니다. 모델은 턴 사이에 아무것도 보관하지 않고, 요청에 없는 것은 모델에게 존재하지 않습니다. 그러면 당연한 질문이 남습니다 — 모델이 아무것도 기억하지 못한다면 대화는 어디에 있을까요.
우리 쪽에, 수명이 서로 다른 세 층으로 있습니다. 턴은 매번 그 세 층에서 조립되고, 층을 가르는 것은 중요도가 아니라 얼마나 과거까지 닿는가입니다.
세 층
무엇이 저장되고, 무엇은 결코 저장되지 않나
턴마다 정확히 두 행을 씁니다. 방문자가 한 말과 에이전트가 답한 말. 둘 다 그 사용자별 키로 저장 시 암호화되며, 나머지 콘텐츠와 같은 방식입니다(설계로 지키는 프라이버시).
쓰지 않는 것도 똑같이 의도적입니다. 모델이 한 도구 호출, 그 도구들이 돌려준 원본 페이로드, 그 과정의 중간 추론 — 어느 것도 저장되지 않습니다. 그것들은 한 턴 동안, 하나의 요청 안에 존재했다가 사라집니다. 남는 대화 기록은 실제로 오간 말이며, 그래서 저장된 대화를 사람이 기계의 계산 과정을 헤치지 않고 읽을 수 있습니다.
원문 창
가장 최근의 턴들은 한 마디도 바꾸지 않고 요청에 들어갑니다 — 현재는 마지막 열두 개 메시지입니다. 에이전트가 대화에 함께 있는 것처럼 느껴지게 하는 층이 바로 이것입니다. 지시어가 풀리고, 정정이 유지되고, "두 번째"가 무언가를 가리킵니다.
창을 토큰 예산이 아니라 개수로 정한 것은 의도적입니다. 고정된 개수는 예측 가능합니다 — 에이전트 앞에 무엇이 남아 있을지 헤아릴 수 있습니다. 그 창 자체가 예산에 들어가지 않을 때는 요청 수준의 우선순위가 이어받고(무엇부터 버리는지), 그 메시지들 중 가장 오래된 것이 먼저 나갑니다.
롤링 요약
창보다 오래된 것은 버려지지 않습니다. 창이 담을 수 있는 양보다 메시지가 쌓이는 순간, 초과분 — 가장 오래된 것들 — 이 세션의 요약으로 접혀 들어가고 커서가 그것들을 지나 전진합니다.
그 커서가 알아 둘 만한 부분입니다. 요약은 매번 대화 전체에서 다시 만들어지지 않고 점진적으로 늘어납니다. 기존 요약에 방금 창에서 밀려난 메시지들을 더해 새 요약이 나오고, 그 메시지들은 다시는 요약되지 않습니다. 이것이 긴 대화의 유지 비용이 계속 커지지 않게 하는 장치이며, 요약이 다시 쓰이는 대신 가라앉는 이유이기도 합니다 — 초기 컨텍스트는 처음 기록된 모습 그대로 남습니다.
요약에는 상한(수백 토큰)이 있고, 세션에 저장되며, 나머지와 마찬가지로 암호화됩니다. 요청 안에서는 히스토리 위의 한 블록입니다.
한 턴만으로도 넘칠 때
앞의 두 장치는 정상 상태에 대한 것입니다. 단일 턴이 그 자체로 너무 클 수도 있습니다 — 아주 긴 질문, 붙여 넣은 큰 문서, 지식 베이스가 유난히 많이 기여한 턴.
그럴 때 요청 수준 예산은 가장 오래된 히스토리부터 버리는데, 버려진 턴들은 그냥 제거되는 대신 그 턴의 요약 블록으로 압축됩니다. 이 구분이 중요합니다. 버리는 것은 내용을 소리 없이 잃는 일이고, 압축하는 것은 알맹이를 남기고 표현만 잃는 일입니다. 요청을 맞추려고 무언가가 몰래 삭제되는 일은 없습니다.
세션보다 오래 남는 것
위의 층들은 모두 하나의 대화에 속합니다. 그렇지 않은 것이 둘 있습니다.
- 고객에 대한 지속적 사실 — 턴이 일어나는 대로 도출되고, 중복이 제거되어 같은 사실은 쌓이는 대신 갱신되며, 최신순이 아니라 관련도로 불러옵니다. 세션을 넘어, 채널을 넘어 그 사람을 따라갑니다. 어떻게 도출되고 무엇이 회상되는지는 고객별 기억에 있습니다.
- 짧은 프로필 — 최근 메시지에서 주기적으로 갱신되며, 사실이라기보다 상시적인 배경을 담습니다.
그래서 새 세션은 진짜로 새로운 대화입니다 — 히스토리도 요약도 없습니다 — 그러나 기억상실은 아닙니다. 에이전트가 그 사람에 대해 배운 것은 그대로 있습니다.
이것이 의미하는 바
- 세션이란 같은 session id를 유지하는 구간입니다. 웹 위젯은 방문자마다 하나를 유지하고, API 호출자는 직접 정합니다. 새로 시작한다는 것은 고객에 대해 배운 것을 잃지 않으면서 지금의 실마리를 의도적으로 놓는 방법입니다.
- 긴 대화는 갑자기가 아니라 서서히 나빠집니다. 가장 오래된 턴은 알맹이보다 표현을 먼저 잃고, 완전히 사라지기 전에 알맹이를 잃습니다.
- 내보내기와 기록에 보이는 것은 대화이지 기계의 작동 과정이 아닙니다. 도구 트래픽은 애초에 저장되지 않았으므로, 읽어 오는 것은 사람이 읽었을 그것입니다.