본문으로 건너뛰기

전체 연구 기록

기법

기본 모델 교체가 문서의 언어를 바꿨다 — 프롬프트로 못 고친 결함을 코드로 옮기기

문서가 이상한 언어로 나온다는 사용자 리포트의 원인을 기본 모델 교체까지 추적하고 셀 여섯 개로 재현했습니다. 프롬프트 문구 다섯 가지가 전부 한쪽을 고치고 다른 쪽을 깨뜨려, 모델이 못 하는 판정을 코드로 옮겼습니다.

모델 교체 전후 문서 언어 유지 (Fisher p=4.5e-5)
20/20 vs 8/20
프롬프트 문구 5안이 전부 다른 셀을 깨뜨림 · 코드로 옮긴 뒤 160/160 통과
0 / 5

사용자 리포트는 한 문장이었습니다. 앱이 작성하는 문서가 이상한 문법으로, 한국어를 영어로 직역한 것처럼 나온다는 것입니다.

이런 리포트는 프롬프트를 고치고 싶게 만듭니다. 이 경우 프롬프트는 원인이 아니었고, 다섯 번 시도한 끝에 프롬프트로는 고칠 수 없다는 것이 측정으로 확인됐습니다.

원인은 기본 모델 교체였다

보고자가 쓴 빌드에는 문제의 언어 지시문이 아예 없었습니다. 그 빌드는 지시문이 병합되기 이틀 전 태그입니다. 같은 창에서 모델 동작을 바꾼 변경은 하나뿐이었습니다. 두 릴리스 전에 기본 모델이 교체됐고, 그 시점의 모델 선택은 실행마다 초기화되는 세션 상태였습니다. 즉 이전 버전까지는 항상 이전 모델이었고, 그 버전부터는 항상 새 모델이었습니다. 전환이 전면적이고 조용했습니다.

그 빌드가 실제로 조립하는 프롬프트를 그대로 써서, 한국어 노트를 영어로 질문하는 조건을 n=20으로 돌렸습니다.

모델 문서가 원문 언어 유지 원문 인용 보존
이전 기본 모델 20/20 20/20
새 기본 모델 8/20 8/20

Fisher 정확검정 p=4.5e-5입니다. 뒤집힌 쪽은 문장 단위 직역이고, 한국어 인용부호 안의 발언까지 영어로 재번역됩니다. 보고자의 실제 UI 언어로 다시 재도 재현됩니다.

인용 날조가 파생 효과로 따라옵니다. 문서 언어로 조건부 분해하면, 문서가 출처와 같은 언어일 때 원문 인용 보존은 24/24이고, 다른 언어일 때는 1/26입니다. 실제로 한 영어 발언이 한국어 노트를 거쳐 뜻은 비슷하지만 문구가 다른 문장으로 재생산되면서, 따옴표와 실명 귀속이 그대로 붙었습니다.

진단을 셀로 쪼갠 것

무엇이 언어를 정해야 하는지가 애초에 어디에도 적혀 있지 않았습니다. 후보는 세 가지입니다. 자료의 언어, 사용자가 이번 턴에 쓴 언어, UI 언어. 셋이 갈리는 조합을 셀로 만들어 전부 측정했습니다.

자료 사용자 턴 UI 언어 올바른 답
A 한국어 영어 산문 영어 영어
B 영어 산문 없음 한국어 영어
C 영어 한국어 산문 한국어 한국어
E 한국어 한국어 산문 영어 한국어
F 영어 한국어 산문 영어 한국어

판정에 심판을 쓰지 않았습니다. 문서 본문의 문자 중 한글 비율이 10% 이상이면 한국어로 분류하는 결정론적 규칙입니다.

E가 결정적인 부정 결과입니다. 한국어로 쓰는 사용자는 UI가 영어여도 30/30 한국어 문서를 받습니다. 즉 리포트는 “한국어로 물었는데 영어가 나왔다”가 아닙니다. 문제는 산문이 없는 진입점에서 나옵니다. 버튼, 슬래시 명령, 제안 카드, 첨부만 있는 첫 턴입니다. 영어 99.9%인 볼트에 UI가 한국어인 조합이 정확히 그 셀입니다.

프롬프트로는 못 고친다 — 다섯 번

산문 없는 턴에서 영어 볼트를 다루는 셀 B와, 한국어로 물었는데 UI가 영어인 셀 F를 동시에 통과해야 합니다.

문구 B F 판정
섹션 없음 (수정 전) 영어 50/50 한국어 29/29 A가 동전 던지기
배포된 지시문 한국어 13/50 한국어 25/30 회귀
후보 1. 문서는 자료 언어를 따른다 영어 30/30 한국어 0/29 기각
후보 2. 산문 없으면 자료에서 한국어 25/30 한국어 19/20 기각
후보 3. 볼트 언어를 코드가 명명, 헤더에 영어 30/30 한국어 11/20 기각
후보 4. 같은 명명, 조건절 안에만 영어 17/30 한국어 19/20 기각

정확히 트레이드오프입니다. 볼트 언어를 눈에 띄게 명명하면 산문 없는 케이스가 잡히고 산문 케이스가 깨집니다. 조건절 안에 가두면 정반대가 됩니다. 다섯 문구가 전부 같은 축을 따라 움직였습니다.

여기서 읽어야 할 것은 문구가 부족했다는 게 아닙니다. 모델이 못 하는 단계는 “언어를 고르는 것”이 아니라 “이 턴에 산문이 있는가”를 판정하는 것입니다. 그 판정은 모델에게 맡길 종류의 일이 아닙니다.

수정은 판정을 코드로 옮긴 것

규칙은 하나로 정리됩니다. 문서 본문은 호출자의 UI 언어로 쓴다. 에이전트가 말하는 것은 사람이 산문을 썼으면 그 언어를, 안 썼으면 UI 언어를 따릅니다.

어느 절반이 적용되는지는 프롬프트가 아니라 코드가 정합니다. 앞선 슬래시 명령과 위키링크와 코드 스팬과 경로와 URL을 제거하고 남은 문자가 두 자 이상인지 보는 함수입니다. “산문 있음” 쪽으로 편향돼 있습니다. 오탐은 모델이 턴을 직접 읽게 할 뿐이지만, 미탐은 사용자가 실제로 쓴 언어를 덮어쓰기 때문입니다.

기각한 두 경쟁 규칙도 기록했습니다. “원문을 따른다”는 한 셀을 30/30으로 고치지만 한국어로 물은 사람에게 영어 문서를 줍니다. “질문자의 턴을 따른다”는 검사를 통과했지만 이유가 틀렸습니다. 그 문구는 “사람이 쓴 언어로”인데 사람은 영어로 물었고 결과는 한국어였습니다. 헤더에 있던 UI 언어 한 줄이 문구를 이긴 것이고, UI 언어를 바꿔 같은 규칙을 재면 반대 결과가 나옵니다. 통과한 이유가 문구가 아닌 규칙은 채택하지 않습니다.

수정 후

n=20에서 30, 문서 160편입니다.

정답 문서 인용 보존
리포트 재현 조건 한국어 30/30 30/30
그 거울 조건 한국어 30/30 30/30
산문 없는 턴 한국어 20/20 20/20
정상 조건 한국어 20/20 20/20
정책 비용 1 영어 20/20 20/20
정책 비용 2 영어 20/20 20/20

마지막 두 줄은 버그가 아니라 이 정책의 대가입니다. 영어 UI로 한국어 볼트를 쓰는 사용자는 영어 문서를 받습니다. 통과/실패로 세지 않고, 기록으로 남기려고 측정했습니다.

같이 들어간 것이 두 가지 더 있습니다. 하나는 인용 보존 절이고, 어느 언어 규칙과도 독립이며 두 모델 공통의 기존 결함을 잡습니다. 다른 하나는 기본 모델을 되돌린 것입니다. 지시문이 있으면 새 모델도 30/30이라 정확성 의존은 아니지만, 이전 버전까지 모든 사용자가 쓰던 모델이고 지시문 없이도 이걸 맞혔으며 입출력 단가가 절반입니다. 모델을 명시적으로 저장한 사용자는 그 선택을 유지합니다.

조립 순서가 만든 결함 하나

지시문 파일이 개행 하나로 시작하고 있었습니다. 앞 섹션이 개행 없이 끝나기 때문에, 그 결과 지시문 전체가 앞 섹션 마지막 불릿의 이어지는 줄로 파싱됐습니다. 인용한 선행 연구가 바로 그 형태를 비교하고 있었고(분리된 지시가 통합된 지시보다 낫다), 이 변경은 통합된 쪽 형태였습니다.

그리고 그 파일을 지키고 있다고 주장된 골든 스냅샷 테스트는 실재하지 않았습니다. 실제 가드는 다른 테스트이고, 작성 직후 실제 회귀를 잡았습니다.

이 측정이 보여주지 않는 것

  • 한국어와 영어뿐입니다. 지원하는 나머지 다섯 언어에 대해서는 아무것도 모릅니다.
  • “이상한 문법”을 직접 점수화하지 않았습니다. 잰 것은 언어 선택과 원문 인용 보존입니다. 번역투 자체는 주관적 판단이라 심판 없이 재지 않았고, 대신 생성된 문서 실물을 전부 남겼습니다.
  • 산문 없는 턴은 합성입니다. 실제 진입점(제안 카드, 버튼)은 각자의 시드 프롬프트를 싣고 오고, 그중 일부는 볼트 언어로 생성됩니다.
  • 프로덕션 절대 비율이 아닙니다. 하니스는 1턴 합성 히스토리입니다. 프롬프트가 복잡해질수록 혼동이 커진다는 선행 연구가 있으므로 실제 비율은 이보다 나쁠 가능성이 높습니다.
  • 저가 모델은 다른 실패를 합니다. 같은 실험에서 어떤 모델은 파일 쓰기 도구를 20번 중 10회 이상 아예 호출하지 않았습니다. 증상이 “글이 이상하다”가 아니라 “파일이 안 써진다”입니다.

측정 기록

항목
실행 시점 2026년 7월 30일부터 31일
총 호출 1,760회, $70.63
모델 claude-opus-5, 비교군은 claude-sonnet-5
트랜스포트 /chat/completions — 프로덕션에서 해당 모델이 쓰는 경로
조건 정의 전부 실제 프롬프트 조립 함수가 만든 프롬프트. 조건 간에는 언어 섹션 외에 바이트 단위로 동일
판정 심판 없음. 문서 본문의 한글 비율 10% 임계
표본 셀당 n=20에서 50, 수정 후 검증 160편
하니스 조립된 프롬프트를 그대로 덤프하는 진단 테스트, 셀별 배치 실행은 lang/round10.py

프롬프트 캐시를 켜서 입력 토큰의 91.6%가 캐시 히트였고, 실제 비용은 정가 대비 약 1/2.4였습니다.

측정 기록 원본은 Consilience 저장소의 docs/details/language-directive-document-language-2026-07-31.md에 있습니다.

무엇을 측정한 것인가

  • Consilience

    세계 최초의 범용 온톨로지 OS — 마크다운 문서에서 지식그래프를 자동으로 구축하고, 그 그래프를 대상으로 에이전트가 추론합니다