"하나는 model 이 뭐라 했나를 물어. 다른 하나는 오늘 뭘 보여주나를 물어."
명사 둘, 질문 둘
Recall 은 transcript 를 아주 다른 일을 하는 일급 대상 둘로 쪼개. 각각이 어느 질문에 답하는지만 알면 데이터 모델 전체가 딱 맞아 들어가.
- run 은 답해: "이 model 이, 이 설정으로, 이 source 바이트에 정확히 뭘 돌려줬나?" 얼린 증거야. 절대 안 바뀌어.
- release 는 답해: "지금 제품이 어느 버전의 텍스트를 보여주고, 요약이랑 검색을 파생하나?" 버전이야. 교정하면 바뀌어.
이건 같은 행에 붙인 두 이름이 아냐. 규칙이 다른 별도 테이블에 살아. run 은 한 번 쓰고 봉인해. release 는 '이게 이 영상의 지금 최선 텍스트야' 라고 말하며 옮겨 다니는, 번호 붙은 포인터고.
run 하나, release 여럿
여기 중요한 관계가 있어. 불변 run 하나가 시간이 지나면서 여러 release 밑에 앉을 수 있어. model 이 영상을 한 번 전사했다고 치자(그게 run). 그다음 이름을 잘못 들은 걸 발견해서 교정했고, 그게 release v2 를 만들었어. 나중에 타임스탬프를 고쳤고, 그게 release v3. run 은 꿈쩍도 안 했고 release 만 쌓인 거야. 어느 순간이든 영상당 정확히 한 release 가 current 로 표시되고, 그게 검색이랑 요약이 쓰는 거야.
버전 관리에 빗대면 쉬워. run 은 불변 commit 이야. 정확히 뭐가 캡처됐는지를 남긴 영구 기록. current release 는 최신 좋은 버전으로 옮겨 다니는 branch 포인터 같은 거고. 언제든 raw commit 으로 걸어 돌아갈 수 있고, 언제든 '지금 HEAD 가 어느 버전이야?' 를 물을 수 있어. 질문 둘, 답 둘, 헷갈릴 일 없고.
그냥 텍스트를 편집하면 안 돼?
'그냥 텍스트 편집' 은 두 질문을 mutable blob 하나로 뭉개서 답을 둘 다 날려버리거든. 제자리에서 편집하면 model 이 원래 뭘 돌려줬는지도(run 이 사라짐), 텍스트가 어떻게 진화했는지도(버전이 사라짐) 못 말해. run 은 얼리고 release 는 버전을 매기니까, Recall 은 '기계가 실제로 뭐라 했나' 도, '지금 뭘 보여주나' 도, '거기서 여기까지 어떻게 왔나' 도 한꺼번에 답할 수 있어. 다음 레슨이 교정의 순간에 뭐가 일어나는지, 왜 덮어쓰지 않고 분기하는지 보여줘.