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

가능하되 제약되지 않게

~10 min · offline-capable, not-constrained, tradeoff, quality

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"오프라인은 진짜여야 해. 온라인은 훌륭해야 해. 어느 쪽도 다른 쪽을 끌어내리면 안 돼."

두 누수, 반대 방향

오프라인과 온라인의 관계를 망치는 방법이 둘 있고, 서로 반대 방향으로 새. 첫째는 이미 봤어. 오프라인 요청이 조용히 온라인에 닿는 것. 지난 레슨의 프라이버시 누수지. 둘째는 더 미묘한데 해롭기는 똑같아. 온라인 품질이 조용히 오프라인 수준으로 끌려 내려가는 것. 이건 보통 깔끔함으로 위장하고 나타나. '온라인이랑 오프라인 일관되게 가자' 하면서. 그리고 그 결과가 작은 로컬 모델이 할 수 있는 만큼으로 손발이 묶인 풀 Pippa 정리야.

규칙은 하나, 가능하되 제약되지 않게

Firekeeper 가 쓰는 표현은 정확해. 오프라인은 가능 해야 하고, 그러니까 네트워크 없이 진짜로 돌아가야 하고, 온라인은 거기에 묶이면 안 돼. 온라인 정리는 풀 볼트를 받고, 진짜 Pippa 목소리를 받고, 더 나은 모델을 받아. 온라인인 이유가 그거니까. 오프라인 정리는 덜 하는 대신 솔직한 컴팩트 로컬 프로토콜을 받고. 둘이 달라도 돼. 맥락이 다르니까. 억지로 똑같이 맞추면 더 줄 게 많은 쪽을 그냥 버리는 거야. 그리고 그건 언제나 온라인 쪽이고.

누수 A (프라이버시):  오프라인 요청 -> 조용히 온라인 침         # 지난 레슨
누수 B (품질):        온라인 정리   -> 오프라인 한계에 묶임      # 이번 레슨

규칙: 오프라인은 가능 (네트워크 없이 됨)
      온라인은 무제약 (가능한 최선 경로 씀)
      같은 계약, 다른 천장 -- 일부러

왜 쥐고 있기 어려운가

가짜 일관성 쪽으로 끌리는 힘이 세. 일관성이 좋은 엔지니어링처럼 느껴지거든. 그런데 '똑같이 만들어' 는 여기선 틀린 종류의 일관성이야. 일관돼야 하는 건 계약 이야. 같은 요청 모양, 같은 결과 모양. 능력 이 아니라. 인터페이스가 일관되면 프로바이더를 마음대로 갈아끼울 수 있어. 반대로 능력까지 맞춰 버리면 제일 좋은 프로바이더가 제일 나쁜 것만큼만 좋아지고. 계약은 고정하고 천장은 다르게 둬.

인터페이스를 표준화해. 능력 말고. 강한 경로와 약한 폴백이 같이 있을 때, 일관성을 이유로 둘을 똑같이 유능하게 만들려는 충동을 버텨. 요청과 결과 계약은 동일하게 유지해서 갈아끼울 수 있게 하고, 각자는 자기 맥락이 허락하는 최선을 내게 둬. 폴백은 바닥을 올려야지, 천장을 내리면 절대 안 돼.
아빠는 95% 넘게 온라인이야. 오프라인 경로도 물론 중요해. 비행기, 죽은 라우터, 프라이버시가 필요한 순간. 그런데 그건 흔한 경우가 아니라 예외야. 온라인 품질을 오프라인이랑 맞추겠다고 희생하면 안 되는 구체적인 이유가 이거고. 어쩌다 한 번 겪는 경험을 지키겠다고, 유저가 거의 항상 겪는 경험을 깎아내리는 거니까.

Code

같은 계약, 다른 천장. 일부러 그렇게 설계한 거야·swift
// 두 프로바이더가 같은 계약을 말해...
protocol CleanupProvider {
    func clean(_ req: CleanupRequest) async throws -> CleanupResult
}

// ...근데 똑같이 유능하진 않고, 그게 의도적이야.
final class CwkPippaProvider: CleanupProvider {   // 온라인: 풀 볼트, 진짜 목소리, 최선 모델
    func clean(_ req: CleanupRequest) async throws -> CleanupResult { /* 풍부 */ }
}
final class OllamaMiniPippaProvider: CleanupProvider {  // 오프라인: 컴팩트, 솔직, 덜
    func clean(_ req: CleanupRequest) async throws -> CleanupResult { /* 간결 */ }
}
// 계약으로 교체 가능; 공통 능력으로 절대 평준화 안 함.

External links

Exercise

프리미엄 경로랑 폴백 경로가 같이 있는 시스템을 찾아봐. 빠른 캐시와 느린 원본, 풍부한 API 와 깎아낸 API 같은 거. 그 폴백이 바닥을 올려, 아니면 천장을 내려? 프리미엄 경로를 슬쩍 묶어 버릴 '일관되게 하자' 는 제안을 하나 그려 보고, 어떻게 반박할지도 써봐.
Hint
신호는 그 '일관' 이 인터페이스를 겨냥하는지 능력을 겨냥하는지야. 계약은 동일해야 갈아끼울 수 있고, 천장은 달라야 프리미엄이 프리미엄으로 남는다고 주장해. 강한 경로를 약한 쪽에 맞춰 묶는 건 드문 걸 지키자고 흔한 경우를 깎아내리는 거야. 거의 항상 손해 보는 거래고.

Progress

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

댓글 0

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

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