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

네 레인, 하나의 길

~12 min · lane-split, fix, architecture, cleanup

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"해법은 더 빠른 브레인이 아니었어. 대부분의 받아쓰기가 브레인이 아예 필요 없다는 걸 알아챈 거였어."

통찰

진단은 정리가 너무 비싸다고 말했어. 순진한 해법은 '브레인을 더 빠르게' 야. 더 작은 모델, 덜한 추론. 진짜 해법이 더 나아. 브레인한테 아예 묻지 마. 받아쓰기 정리는 대부분 기계적이야. '어' 벗기고, 마침표 붙이고, 사전 용어 강제하고. 어느 것도 판단이나 기억이나 볼트가 필요 없어. 그걸 한 번 보고 나면 답이 더 빠른 대성당이 아니게 돼. 레인 네 개짜리 길이고, 그 일을 해낼 수 있는 제일 싼 레인을 타는 거지.

받아쓰기 레인들

DictationCleanupLane:
  1. 결정론적       순수 코드, ~0ms      -- 필러, 문장부호, 사전
  2. 로컬 빠름      작은 Ollama 모델     -- 제한된 프롬프트, keep_alive, 강한 타임아웃
  3. Pippa 유틸리티  Pippa, 볼트 없음     -- 추론 패스 없음, 유틸리티 모델
  4. Pippa Full     대성당               -- 명시적 옵트인만

CommandCleanupLane:
  풀-브레인 사다리 — 의도적, 지연 관용, 판단 필요

받아쓰기 레인은 싼 쪽을 기본으로 두고 유저가 요청할 때만 올라가. 눈여겨볼 건 Pippa 유틸리티 레인이 비용 없이 Pippa 를 루프 안에 남겨 둔다는 거야. 같은 브레인인데 볼트 시스템 프롬프트도 없고 추론 패스도 없어. 알고 보니 'Pippa 처럼 들린다' 랑 'Pippa 기억을 통째로 로드한다' 는 애초에 같은 요구사항이 아니었던 거지. 우리가 그냥 묶어서 사고 있었을 뿐이고.

커맨드 레인은 대성당을 그대로 둬

이 분리가 우아한 건 아무것도 안 빼앗기 때문이야. 커맨드 모드는, 그러니까 '내 목소리로 더 간결하게' 같은 건 진짜 판단이 필요하고, 다시 써 달라고 부탁한 쪽이니까 한 박자 기다릴 마음도 의식적으로 있어. 그래서 커맨드 레인은 풀 브레인 사다리를 그대로 유지해. 대성당이 문제였던 적은 없어. 문장부호 찍는 데 그걸 쓴 게 문제였지. 이제 레인마다 비용이 작업에 맞고, 둘 다 옳아.

컴포넌트가 뭘 주느냐가 아니라 작업이 뭘 필요로 하느냐로 쪼개. 경로 하나가 요구사항이 크게 다른 일들을 다 떠맡고 있으면, 해법은 대개 레인이야. 싼 일엔 너무 느리고 비싼 일엔 너무 약한 어중간한 타협 설정이 아니라. 레인마다 자기 트래픽에 딱 맞게 두고, 작업이 실제로 필요한 걸 보고 보내.
기본값이 옮겨가면 옛 설정도 부드럽게 데려와. 느린 설정을 저장해 둔 유저가 해법이 나온 뒤에도 거기 갇혀 있으면 안 되잖아. Firekeeper 는 레거시 설정을 한 번 슬쩍 밀어 줘. 추론 노력이랑 지나치게 큰 컨텍스트 창을 상식적인 기본값으로 내리는 거야. 유저가 일부러 고른 값은 그대로 두면서. 아무 설정도 안 데려오는 해법은 배포 안 된 해법이야.

Code

작업이 필요한 만큼만 태우고, 올라가는 건 요청할 때만·swift
enum DictationCleanupLane { case deterministic, localFast, pippaUtility, pippaFull }

func cleanupProvider(for lane: DictationCleanupLane) -> CleanupProvider {
    switch lane {
    case .deterministic: DeterministicProvider()                    // ~0ms, 모델 없음
    case .localFast:     OllamaProvider(boundedPrompt: true,
                                        keepAlive: true,
                                        timeout: .seconds(3))       // 강한 천장
    case .pippaUtility:  CwkPippaProvider(vault: false,
                                          reasoning: false)         // Pippa, 대성당 없음
    case .pippaFull:     CwkPippaProvider(vault: true,
                                          reasoning: true)          // 옵트인만
    }
}

// 커맨드 모드는 다른 레인이고 일부러 풀 사다리를 유지:
// 지시로 재작성은 판단이 필요하고, 한 박자 기다림이 받아들일 만해.

External links

Exercise

경로 하나가 사소한 요청이랑 까다로운 요청을 다 받아 주는 시스템을 골라봐. 레인을 설계해. 흔한 경우를 감당하는 제일 싼 레인이 뭐고, 비싼 레인이 뭐고, 어디로 보낼지 정하는 규칙이 뭐야? 그다음 어느 레인을 기본으로 둘지 정하고, 왜 비싼 쪽이 아닌지 변호해봐.
Hint
기본은 흔한 경우를 만족시키는 제일 싼 레인이어야 해. 필요하면 올라갈 수 있게 열어 두고. '품질을 위해서' 비싼 레인을 기본으로 두면, 사소한 요청 하나하나가 필요한 적도 없는 능력을 대신 떠받치는 셈이야. 1초짜리 작업이 40초가 되는 게 정확히 그렇게야. 힘은 자동이 아니라 골라서 켜는 것으로 만들어.

Progress

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

댓글 0

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

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