C.W.K.
Stream
Lesson 03 of 04 · published

정리 계약

~12 min · cleanup-contract, insertion, safety, provider

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"삽입 계층은 건네받은 뭐든 타이핑해. 그러니 챗봇이 쓴 문장을 절대 건네지 마."

변형이지 대화가 아냐

정리는 엄격한 변형이야: 원시 전사 입력, 다듬어 삽입 가능한 텍스트 출력. 전사에 절대 답하거나, 내용을 더하거나, 논평하면 안 돼. "은행에 전화하라고 알려줘" 라고 받아쓰면, 정리는 "은행에 전화하라고 알려줘." 를 돌려줘 — 문장부호 찍고 — "물론이죠, 알려드릴게요!" 가 아니라. 프로바이더는 구조화된 요청(원시 전사, 모드, 선택 텍스트, 허용된 맥락, 사전, 스니펫, 스타일 프로파일, 언어 힌트, 출력 제약)을 받아 구조화된 결과를 돌려줘. 양끝이 일부러 타입돼 있어.

결과가 구조화돼야 하는 이유

삽입 계층은 설계상 멍청해: 건네받은 뭐든 라이브 앱에 타이핑해. 그게 정리가 자유 산문을 건넬 수 없는 정확한 이유야. 정리 브레인이 "정리된 텍스트예요: …" 나 "무슨 뜻인지 모르겠어요" 를 돌려주면, 그게 유저 문서에 그대로 타이핑돼. 구조화된 결과 — text, action, press_enter, warnings — 가 삽입 계층이 작동할 줄 아는 필드만 받게 보장해. 산문은 유효한 반환값이 아냐; 결과 객체가 유효해.

CleanupRequest  { transcript, mode, selection?, context?, dictionary,
                  snippets, style, language, constraints }
        |
        v   (프로바이더: cwkPippa full / local Ollama / deterministic)
        v
CleanupResult   { text, action: "insert", press_enter, warnings[] }
        |
        v
Insertion       result.text 만 타이핑 -- 원시 모델 산문 절대 아님

약한 모델 길들이기

로컬 모델이 어려운 케이스야: 작은 Ollama 모델이 JSON 반환 지시를 무시하고 마크다운-펜스 덩어리, 서두, 감정 태그로 답할 수 있어. 프로바이더의 일은 그걸 길들이는 거야 — 펜스와 서두를 벗기고, 다 안 되면 원시 텍스트를 유효한 결과 객체로 감싸서 계약이 여전히 성립하게. 규칙은: 삽입 계층은 난장판을 절대 안 봐. 약한 모델이 뭘 하든, 어댑터가 강한 모델이 내는 같은 깨끗한 결과 모양으로 정규화해.

라이브 효과를 먹이는 건 뭐든 양끝을 타입해. 컴포넌트 출력이 되돌릴 수 없는 곳으로 갈 때 — 앱에 타이핑, 기기에 전송, 디스크에 쓰기 — 입력과 출력이 자유 텍스트가 아니라 구조화된 계약이어야 해. 구조가 수다스럽거나 헷갈린 모델이 건네받은 뭐든 믿는 하류 계층을 통해 손해를 입히는 걸 막아.
정리 브레인이 유저한테 답하게 절대 두지 마. 제일 중요한 정리 규칙 하나는 변형하지 응답 안 한다는 거야. 받아쓴 질문을 정리하는 대신 '친절하게' 답하는 모델은 자기 답을 네 이메일에 타이핑해. 의미 보존, 기제 고침, 반환 — 내용 없음, 답장 없음, 후속 질문 없음.

Code

구조화 입력, 구조화 출력 — 약한 모델용 감싸기-폴백과 함께·typescript
interface CleanupRequest {
  transcript: string;
  mode: "dictation" | "command" | "transform";
  selection?: string;
  context?: string;         // 옵트인 근처 텍스트, 보안 필드 절대 아님
  dictionary: DictEntry[];
  language: "ko" | "en" | "auto";
}

interface CleanupResult {
  text: string;             // 삽입이 타이핑할 유일한 것
  action: "insert";
  press_enter: boolean;
  warnings: string[];
}

// 약한 로컬 모델은 펜스 친 산문을 돌려줄 수 있어. 정규화해:
function toResult(raw: string): CleanupResult {
  const text = stripFencesAndPreamble(raw);
  return { text, action: "insert", press_enter: false, warnings: [] };
}
// 삽입은 항상 CleanupResult 를 받아, 원시 모델 출력 절대 아님.

External links

Exercise

모델 출력이 네 앱의 되돌릴 수 없는 액션을 먹이는 기능의 결과 타입을 설계해. 하류 계층이 필요한 필드를 나열하고, 모델이 포맷을 무시하고 수다스러운 산문을 대신 돌려줄 때 네 어댑터가 뭘 하는지 한 문장으로 써.
Hint
하류 계층은 작동하는 필드만 정확히 필요하고 그 이상 아냐. 모델이 잘못 굴면, 어댑터의 일은 정규화 — 수다를 벗기고, 쓸 수 있는 부분을 추출하고, 유효한 결과 모양으로 감싸기 — 그래서 되돌릴 수 없는 액션이 원시 미검증 모델 텍스트를 절대 안 받게.

Progress

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

댓글 0

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

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