"삽입 계층은 건네받은 게 뭐든 타이핑해. 그러니 챗봇이 쓴 문장은 절대 건네지 마."
변형이지 대화가 아냐
정리는 엄격한 변형이야. 원시 전사가 들어가고, 다듬어서 바로 삽입할 수 있는 텍스트가 나와. 전사에 답을 하거나, 내용을 보태거나, 한마디 얹는 건 절대 안 돼. "은행에 전화하라고 알려줘" 라고 받아쓰면 정리는 "은행에 전화하라고 알려줘." 를 돌려줘야 해. 문장부호만 찍어서. "물론이죠, 알려드릴게요!" 가 아니라. 프로바이더는 구조화된 요청을 받아서 구조화된 결과를 돌려줘. 요청에는 원시 전사, 모드, 선택 텍스트, 허용된 맥락, 사전, 스니펫, 스타일 프로파일, 언어 힌트, 출력 제약이 들어가 있어. 양쪽 끝을 일부러 타입으로 묶어 놓은 거야.
결과가 구조화돼야 하는 이유
삽입 계층은 설계상 멍청해. 건네받은 게 뭐든 라이브 앱에 타이핑해 버려. 정리가 자유 산문을 건네면 안 되는 이유가 정확히 이거야. 정리 브레인이 "정리된 텍스트예요: …" 나 "무슨 뜻인지 모르겠어요" 를 돌려주면 그게 유저 문서에 그대로 찍혀. 구조화된 결과, 그러니까 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 으로 돌려달라는 지시를 무시하고 마크다운 펜스 덩어리나 서두, 감정 태그를 붙여서 답하기도 해. 프로바이더가 할 일이 그걸 길들이는 거야. 펜스랑 서두를 벗겨 내고, 그래도 안 되면 원시 텍스트를 유효한 결과 객체로 감싸서 계약이 그대로 성립하게 만들어. 규칙은 하나야. 삽입 계층은 난장판을 절대 안 봐. 약한 모델이 뭘 하든 어댑터가 강한 모델이 내는 것과 같은 깨끗한 결과 모양으로 정리해 놓는 거지.