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

반쪽 둘, 부름 하나

~11 min · boundary, client-server, separation, narrow-interface

Level 0식은 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Flint 는 글을 잡아서 도로 넣는 법을 알아. 생각하는 법은 모르고. 그 선이 아키텍처 전부야."

반쪽 둘, 부름 하나

Flint 는 두 조각짜리 시스템의 한쪽이고, 두 조각은 아주 좁은 한 점에서 만나. 선을 넘는 요청 하나. Flint 쪽엔 손에 잡히고 이 컴퓨터 안에 있는 것들이 다 있어. 몸짓, 자리, 매크로 목록, 단축키, 삽입. 반대쪽엔 머리 쓰는 게 다 있고. 모델, 성격, 얼마나 오래 생각할지, 실제 변환. 그 사이엔 같이 쓰는 라이브러리도, 얽힌 호출도 없어. 완성된 프롬프트 하나가 나가고 바뀐 글 하나가 돌아올 뿐이야.

클라이언트 쪽

Flint 쪽은 보이고 만져지는 부분이야. 어느 앱 어느 글을 뜻했는지 붙잡고, 매크로랑 단축키를 이 컴퓨터에 저장하고, 프롬프트를 만들고, 자리를 확인하고 결과를 넣고. 그중 뭐도 말을 이해할 필요가 없어. 필요한 건 macOS 랑 포커스랑 클립보드랑 안전을 이해하는 거지. 어떻게 보면 Flint 는 아주 조심스러운 손 한 쌍인데, 그 글이 뭐가 돼야 하는지에 대해선 아무 의견이 없어.

머리 쪽

다른 반쪽은 Flint 안을 아무리 뒤져도 안 보여. 거기 없거든. 어느 모델이 돌지, 성격을 입힐지, 얼마나 오래 생각할지, 추론이 어디서 일어날지, 그걸 가능하게 하는 열쇠까지 전부 빌린 머리 몫이야. Flint 는 모델을 고르지도 열쇠를 쥐지도 않아. 뭘 골랐는지 말해주고 — 이 매크로, 로컬 쪽, vault 는 건너뛰고 — 완성된 프롬프트를 넘길 뿐이지. 머리는 불러 쓰는 서비스고 Flint 는 그 손님이야.

FLINT (클라이언트 쪽)         |  빌린 머리 (생각하는 쪽)
-----------------------------|------------------------------------
몸짓 / 단축키                 |  어느 모델이 도는지
자리 붙잡기                   |  소울 / 성격
매크로 관리 (이 컴퓨터에)      |  얼마나 오래 생각할지
프롬프트 만들기               |  실제 추론
확인하고 넣기                 |  모든 열쇠와 경로
                             |
     요청 하나  --->          |   바뀐 글 하나  <---

왜 선을 좁게 긋나

좁은 게 요점이야. 선을 넘는 게 프롬프트랑 결과뿐이라서 한쪽을 바꿔도 다른 쪽이 안 흔들려. 모델을 갈아도, 성격을 새로 붙여도, 추론을 로컬에서 서버로 옮겨도 Flint 는 그대로야. 그런 걸 애초에 몰랐으니까. Flint 의 삽입 로직을 통째로 다시 짜도 브레인은 아무 상관 없고. 프롬프트 한 줄만 봤을 뿐이거든. 넓은 선은 두 시스템을 따져볼 수도 없는 하나로 묶어버리고, 좁은 선은 둘로 남겨둬.

Flint 는 집안 규칙을 그대로 물려받았어. 선은 좁게, 비용은 아래쪽에서. cwkPippa 집안 전체가 도는 규율이 이거야. 재미있는 복잡함은 얇은 이음새 뒤에 살고, 클라이언트는 서버 속을 알기를 거부해서 단순하게 남아. Flint 는 그 머리의 손님이라 규칙을 밖으로 들고 나온 셈이고. 일이 허락하는 만큼 머리 쪽을 적게 알고, 그 모름을 깨끗하고 잘 안 변하는 계약으로 갚는 거지.

Code

Flint 쪽에서 본 머리는 이 호출 하나가 전부다·swift
// 머리에 대해 Flint 가 아는 건 이 인터페이스에 다 들어간다.
protocol BrainClient {
    func applyFree(prompt: String,
                   vault: VaultContextMode,
                   tier: OllamaTier?) async throws -> String
}

// Flint 는 모델도, 열쇠도, 어디로 보낼지도 안 쥔다. 완성된 프롬프트와
// 자기가 고른 실행 조건을 넘기고 바뀐 글을 기다릴 뿐이다.
// 구현을 로컬이든 서버든 클라우드든 갈아끼워도 Flint 는 그대로다.
let result = try await brain.applyFree(prompt: rendered,
                                       vault: macro.vaultContextMode,
                                       tier: profile.ollamaTier)

External links

Exercise

Flint 의 두 반쪽을 그려놓고 책임을 맞는 쪽에 하나씩 붙여봐. 그다음 현실적인 변경 둘을 골라. '기본 모델을 바꾼다' 랑 '삽입이 터미널을 다루는 방식을 다시 짠다'. 각각 어느 반쪽이 바뀌고, 왜 다른 반쪽은 알아채지도 못하는지 말해봐. 선의 어떤 성질이 그 독립을 가능하게 하는 걸까?
Hint
모델 고르기는 전부 머리 쪽 일이라 Flint 의 붙잡기나 넣기를 하나도 안 건드려. 터미널 삽입은 전부 Flint 쪽 일이라 프롬프트 한 줄만 본 브레인은 아무 상관이 없고. 그걸 가능하게 한 건 선을 좁게 그어둔 거고. 완성된 프롬프트랑 결과만 선을 넘으니까 어느 쪽도 상대 속사정에 안 기대는 거지.

Progress

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

댓글 0

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

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