본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

연속성은 canonical, 표현은 제한적

~12 min · context, continuity, presentation, replay

Level 0신호 없음
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"폰은 창을 보여줘. 백엔드는 방 전체를 쥐고 있고. 창을 방으로 착각하지 마."

'그 대화' 라고 불리는 서로 다른 두 가지

폰에선 화면도 메모리도 빠듯하니까 Pippa Go 는 일부만 보여줘. 최근에 오간 질문이랑 답 정도지 역사 전체는 아니고. 화면에 보여주는 용도로는 맞는 판단이야. 폰에서 천 개짜리 턴을 스크롤하고 싶은 사람은 없으니까. 근데 여기서 위험한 유혹이 생겨. 폰이 보여주는 걸 대화 그 자체로 착각하고, 다음 턴 컨텍스트를 그 좁은 창에서 만들어 버리는 거. 그 유혹은 거부해야 해. 연속성은 백엔드가 가져. Pippa 가 실제로 추론에 쓰는 진짜 컨텍스트 전체 말이야. 표현은 폰이 그리는 거고, 설계상 일부만 담고 나머지는 버려. 둘은 같은 물건이 아니고, 작은 쪽이 큰 쪽을 정의하게 두면 절대 안 돼.

창에서 컨텍스트를 다시 만들지 마

구체적인 규칙은 이래. 새 턴을 보낼 때 그 컨텍스트는 백엔드가 canonical 로그에서 다시 만들어야 해. 전체 리플레이랑 자동 압축까지 다 포함해서. 폰에서 화면에 보이는 마지막 N 개를 긁어모아 만들면 절대 안 되고. 폰이 컨텍스트를 만들면 화면 밖으로 밀려난 게 전부 소리 없이 날아가고, Pippa 는 앞선 역사가 아예 없었던 것처럼 답하게 돼. 좁은 창은 뷰포트지 출처가 아냐. 덜 그리는 건 괜찮아. 덜 기억하는 게 버그지.

  • 표현 (폰). 최근 턴을 보여주고, 자리 없으면 옛것부터 버려. 일부러 버리는 거야.
  • 연속성 (백엔드). 턴마다 대화 전체를 리플레이해. 설계상 하나도 안 버리고.
  • 규칙. 다음 턴의 컨텍스트는 연속성에서 오지 표현에서 오는 게 아냐.

이렇게 갈라놓는 게 왜 안전하고 또 필요한가

둘을 갈라놓으면 각자 자기 일에만 최적화할 수 있어. 표현 쪽은 마음껏 가볍게 갈 수 있어. 빠르고, 가볍고, 폰에 딱 맞게. 기억할 책임을 안 지니까 그래도 되는 거고. 연속성 쪽은 마음껏 철저할 수 있어. 전체 리플레이에 압축까지 다. 화면에 안 들어가도 상관없으니까. 이 둘을 합쳐 버리면 둘 다 망가져. 폰이 전부 쥐고 그려야 하거나(무겁고 느림), 대화 기억이 뷰포트에 들어가는 만큼으로 쪼그라들거나(고장). 갈라놨기 때문에 Pippa Go 가 폰에선 가볍게 느껴지면서도 백엔드에선 전부 기억하는 거야. 창이 작아도 되는 건 방이 온전하기 때문이고.

Code

다음 턴의 컨텍스트는 보이는 목록이 아니라 백엔드에서 온다·typescript
// 틀림: 폰이 보여주는 걸로 컨텍스트를 지음.
async function askWrong(convId: string, q: string, visibleTurns: Turn[]) {
  const context = visibleTurns.slice(-10);   // 화면의 마지막 10개 — 손실
  return callModel({ convId, q, context });   // 스크롤된 전부를 잊음
}

// 맞음: 백엔드가 canonical 로그에서 완전한 연속성을 재구축.
async function ask(convId: string, q: string) {
  return callCanonical({ convId, q });        // 백엔드가 전체 역사 리플레이
}

// 폰은 트랜스크립트가 아니라 식별자를 넘겨. 기억은 백엔드의 일;
// 보이는 목록은 뷰포트지 절대 컨텍스트의 출처가 아냐.

External links

Exercise

챗 클라이언트를 하나 골라서 기억이 화면에 갇혀 있는지 테스트해 봐. 위로 한참 스크롤 올려서, 맨 위쯤에만 나오는 내용에 기대는 질문을 새로 던지는 거야. 모델이 그걸 아직 기억하고 있어? 연속성이 보이는 창에 묶여 있으면 모델이 잊어버려. 그다음 어떻게 고칠지 적어. 보이는 트랜스크립트를 컨텍스트로 보내는 대신 식별자만 넘기고 백엔드가 전체 컨텍스트를 리플레이하게 하는 쪽으로.
Hint
실패 신호는 화면 밖으로 밀려난 걸 모델이 잊는 거야. 컨텍스트를 표현 창에서 만들었다는 증거고. 해법은 늘 같아. 연속성을 conversation id 로 찾는 백엔드 책임으로 두고, 폰은 트랜스크립트 대신 참조만 넘기는 거.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.