"폰은 창을 보여줘. 백엔드는 방 전체를 쥐고 있고. 창을 방으로 착각하지 마."
'그 대화' 라고 불리는 서로 다른 두 가지
폰에선 화면도 메모리도 빠듯하니까 Pippa Go 는 일부만 보여줘. 최근에 오간 질문이랑 답 정도지 역사 전체는 아니고. 화면에 보여주는 용도로는 맞는 판단이야. 폰에서 천 개짜리 턴을 스크롤하고 싶은 사람은 없으니까. 근데 여기서 위험한 유혹이 생겨. 폰이 보여주는 걸 대화 그 자체로 착각하고, 다음 턴 컨텍스트를 그 좁은 창에서 만들어 버리는 거. 그 유혹은 거부해야 해. 연속성은 백엔드가 가져. Pippa 가 실제로 추론에 쓰는 진짜 컨텍스트 전체 말이야. 표현은 폰이 그리는 거고, 설계상 일부만 담고 나머지는 버려. 둘은 같은 물건이 아니고, 작은 쪽이 큰 쪽을 정의하게 두면 절대 안 돼.
창에서 컨텍스트를 다시 만들지 마
구체적인 규칙은 이래. 새 턴을 보낼 때 그 컨텍스트는 백엔드가 canonical 로그에서 다시 만들어야 해. 전체 리플레이랑 자동 압축까지 다 포함해서. 폰에서 화면에 보이는 마지막 N 개를 긁어모아 만들면 절대 안 되고. 폰이 컨텍스트를 만들면 화면 밖으로 밀려난 게 전부 소리 없이 날아가고, Pippa 는 앞선 역사가 아예 없었던 것처럼 답하게 돼. 좁은 창은 뷰포트지 출처가 아냐. 덜 그리는 건 괜찮아. 덜 기억하는 게 버그지.
- 표현 (폰). 최근 턴을 보여주고, 자리 없으면 옛것부터 버려. 일부러 버리는 거야.
- 연속성 (백엔드). 턴마다 대화 전체를 리플레이해. 설계상 하나도 안 버리고.
- 규칙. 다음 턴의 컨텍스트는 연속성에서 오지 표현에서 오는 게 아냐.
이렇게 갈라놓는 게 왜 안전하고 또 필요한가
둘을 갈라놓으면 각자 자기 일에만 최적화할 수 있어. 표현 쪽은 마음껏 가볍게 갈 수 있어. 빠르고, 가볍고, 폰에 딱 맞게. 기억할 책임을 안 지니까 그래도 되는 거고. 연속성 쪽은 마음껏 철저할 수 있어. 전체 리플레이에 압축까지 다. 화면에 안 들어가도 상관없으니까. 이 둘을 합쳐 버리면 둘 다 망가져. 폰이 전부 쥐고 그려야 하거나(무겁고 느림), 대화 기억이 뷰포트에 들어가는 만큼으로 쪼그라들거나(고장). 갈라놨기 때문에 Pippa Go 가 폰에선 가볍게 느껴지면서도 백엔드에선 전부 기억하는 거야. 창이 작아도 되는 건 방이 온전하기 때문이고.