순서가 곧 원칙이야
그날 아빠는 설계 질문 목록에 답하면서, 세 번째 항목에서 지금도 Spark의 모든 화면이 따르는 규칙을 정했어.
3. 괜찮아. 원칙이 가장 빠른 순으로 먼저 보여주는 거야. 텍스트 -> 저해상도 -> 고해상도 식으로. 나중에 이미지 번역하는 건 easel이나 ember 랑 연동하면 돼.
이게 불변식 2가 됐어. 결과는 층이 준비되는 순서대로 보여줘. 텍스트, 이어서 저해상도 그림, 마지막으로 고해상도 그림. 목소리보다 카드가 먼저. 고품질 모드의 버전은 끝나는 대로 하나씩. 빠른 층은 느린 층을 기다리지 않아. 이 규칙이 말하지 않는 것도 봐둬. 빨라 보이려고 느린 층을 버리지는 않아. 폰에 그린 오버레이가 Ember가 다시 그릴 수 있는 그림을 취소하지 않고, 지금 읽히는 카드도 결국 목소리를 받아. 다만 한 층은 아빠가 불러야 와. Ember 그림은 저절로 시작하지 않아. 아빠가 탭해서 따로 부탁하는 그림 턴이고, 그때 비로소 제일 느린 층이 출발해.
가장 빠른 것부터, 실제로는 이렇게
- 사진. 나는 읽은 걸 작은 결과들로 잘게 흘려보내. 엔진은 줄 하나가 완성되는 순간 그 줄을 보여줘. 폰은 번역을 해당 줄 위에 대충 덮어 그리고, 아빠가 부탁하면 글자를 새로 앉힌 생성 그림이 한참 뒤에 따라와.
- 카드. 내 목소리가 생기기 전에 글자부터 읽혀.
- 고품질 모드. 브레인마다 버전이 끝나는 대로 떠. 제일 느린 걸 기다리지 않아.
- 전송. 폰은 내 답이 제일 빨리 보이는 순서로 올려. 순간, 내가 읽을 작은 사본, 턴, 그리고 맨 마지막에 무거운 원본(첫 번째 코드 블록).
아키텍처에 적힌 측정값을 보면 순서가 왜 중요한지 알 수 있어. 실용 슬롯에서 사진 한 장의 첫 번역 줄은 요청 23초 뒤에 떴고, 열두 번째 결과는 32초에 들어왔어. 스트리밍 덕분에 아빠는 답 전체가 생기기 9초 전부터 읽을 게 있었던 거야. 라이브 카메라에선 새 텍스트가 라이브 레인을 거쳐 중앙값 3.4초 걸렸고, 아빠가 이미 만난 텍스트는 코퍼스에서 20밀리초 만에 돌아왔어. 원칙 하나에 시간 척도가 셋이야.
모드 둘, 모드마다 경계 하나
이어진 결정은 번역을 둘로 갈랐어.
번역 모드는 2가지여야해. 실용 vs 고품질.
실용이면 브레인 하나면 되지만, 고품질이면 브레인을 복수 선택해서 다른 버전을 볼 수 있어야 하고, 원문을 보지 않은 브레인의 cold-review도 선택적으로 가능하게. 길이 제한 없어야 하고.
| 실용 | 고품질 | |
|---|---|---|
| 브레인을 고르는 쪽 | 가족 브레인 컨트롤 플레인 (Spark 슬롯) | 아빠가 작업마다, 가족 브레인 카탈로그에서 |
| 몇 개 | 하나 | 여럿, 나란히 |
| 돌아오는 것 | 줄 번역이랑 바로 쓸 표현 카드. 일부러 짧게 | 정한 용도에 맞춘 전체 버전 |
| 리뷰 | 없어 | 원문을 안 보는 콜드 리뷰, 원하면 |
| 길이 | 실용이니까 짧게 | 제한 없어. 긴 원문은 원문 자체의 구조에서 나눠 |
이게 불변식 9야. 모드는 둘, 경계는 모드마다 하나. 실용 턴은 중앙 슬롯을 타고, 그 브레인을 Spark가 직접 고르는 일은 없어. 고품질 모드의 버전은 아빠가 그 작업에 고른 브레인과 정한 용도를 따라가. 그 선택은 어느 슬롯에도 손대지 않고. 엔진의 브레인 컨트롤 심은 이 분리를 독스트링 하나에 다 적어놨어(두 번째 코드 블록). 고품질 모드는 트랙 7에서 지어. 행으로 된 용도, 좌석, 섹션, 블라인드 리뷰까지.
모든 게 코퍼스야
같은 메시지에 이 퀘스트 전체가 기대는 줄도 들어 있었어.
실용이든 고품질이든, 맥락은 쌓여야 해. 한번 쓰고 버리는 게 아니라 모든게 코퍼스 자료야.
불변식 3이 이걸 구조로 만들어. Spark가 잡거나 만든 건 어느 모드에서든 버리지 않아. 결과마다 계보가 붙어. 사진이랑 Vision 줄, 턴, 브레인, 모델, 노력 수준, 용도까지. 그렇게 쌓인 코퍼스가 뒤에 오는 턴들의 맥락이 돼. 그 밑엔 덧붙이기만 하는 로그가 있어서, 고치는 것도 지우는 것도 되살리는 것도 전부 새 항목 하나로 남아. 그 로그는 트랙 2에서 열어볼게.