유니코드 4분 소요

아무도 쓰지 않는 글자가 40년째 컴퓨터에 살아있습니다

여러분 컴퓨터 안에는 아무도 읽는 법을 모르는 글자가 들어 있습니다. 뜻도 없고, 어떤 문헌에도 나오지 않고, 40년 넘게 아무도 쓴 적이 없는 글자입니다. 그런데 지우질 못합니다. 지울 수가 없어서 지금 이 순간에도 스마트폰과 노트북 안에 조용히 살아 있습니다. 일본에서는 이걸 유령 문자, 幽霊文字라고 부릅니다.

1978년, 정체불명의 글자가 표준에 섞여 들어갔습니다

이야기는 일본의 문자 인코딩 표준인 JIS X 0208에서 시작합니다. 1978년 제정된 이 표준은 컴퓨터가 일본어를 다루라고 한자 6천여 자를 정리해둔 목록이었습니다. 당시 기준으로는 대단한 작업이었습니다. 여러 자료를 뒤져 실제로 쓰이는 한자를 골라내고 번호를 붙였으니까요.

문제는 그 목록에 출처를 찾을 수 없는 글자 몇 개가 끼어 있었다는 겁니다. 1997년 개정 작업 때 위원회가 전수 조사를 했는데, 12자 정도가 어떤 원본 자료에서도 확인되지 않았습니다. 사전에도 없고, 옛 문헌에도 없고, 인명이나 지명에도 안 나옵니다. 표준 목록에는 분명히 있는데 현실 세계에 대응하는 실체가 없었던 겁니다.

가장 유명한 사례가 妛라는 글자입니다. 조사해보니 이 글자는 원래 다른 두 글자였을 가능성이 큽니다. 자료를 오려 붙여 인쇄하는 과정에서 종이가 겹치며 생긴 그림자나 잘린 자국이 하나의 글자처럼 촬영됐고, 그게 그대로 정식 문자로 등록됐다는 겁니다. 복사기 시대의 사고가 국가 표준에 화석처럼 굳어버린 셈입니다.

실수인 걸 알면서도 왜 못 지우나

여기서 상식적인 의문이 생깁니다. 실수라는 게 밝혀졌으면 삭제하면 되는 거 아닌가요. 답은 명확합니다. 절대 안 됩니다.

문자 인코딩의 제1원칙은 안정성입니다. 한번 번호가 붙은 글자는 영원히 그 번호를 지켜야 합니다. 만약 유령 문자를 목록에서 빼고 뒤에 있는 글자들을 한 칸씩 당긴다면, 그 표준으로 저장된 세상의 모든 문서가 순식간에 깨집니다. 20년 전 작성된 관공서 문서, 백업 테이프에 잠든 데이터베이스, 아무도 손대지 않는 레거시 시스템까지 전부요. 글자 하나 정리하자고 국가적 데이터 재앙을 감수할 이유는 없습니다.

그래서 JIS는 유령 문자를 그대로 뒀습니다. 그리고 1990년대 유니코드가 각국 표준을 통합할 때, 이 유령들도 함께 승계됐습니다. 유니코드의 원칙은 기존 표준과의 왕복 호환성이었거든요. 기존 표준에 있는 글자는 실체가 있든 없든 전부 옮겨 담아야 했습니다. 그렇게 일본의 인쇄 사고가 전 세계 표준이 됐습니다.

지금 이 글자들은 U+59DB 같은 정식 코드포인트를 갖고 있습니다. 폰트에도 들어 있습니다. 여러분 컴퓨터의 일본어 폰트 파일 안에는 아무도 쓰지 않을 글자를 위한 글리프가 정성껏 그려져 있습니다.

표준은 실수를 지우는 대신 보존합니다

이게 유니코드만의 특수한 사정은 아닙니다. 오래 살아남은 표준일수록 비슷한 화석을 품고 있습니다.

QWERTY 자판 배열이 그렇습니다. 타자기 시대의 제약에서 나온 배치인데, 그 제약이 사라진 지 한참인 지금도 그대로입니다. 전 세계 사람들의 손가락이 이미 그 배열에 적응했기 때문입니다. HTTP 상태 코드 418 I’m a teapot은 만우절 농담으로 시작했는데 여전히 문서에 남아 있습니다. 유닉스에서 파일을 복사하는 명령어가 왜 cp인지, 시간대 데이터베이스에 왜 그렇게 예외 조항이 많은지도 다 비슷한 이야기입니다.

핵심은 이겁니다. 표준의 가치는 정확함이 아니라 변하지 않음에 있습니다. 정확한 표준보다 안 변하는 표준이 훨씬 쓸모 있습니다. 그래서 표준을 다루는 사람들은 오류를 고치는 대신 오류에 이름을 붙이고 문서로 남긴 뒤 그대로 둡니다. 유령 문자에 유령 문자라는 이름이 붙은 것 자체가 그 증거입니다. 실수를 인정하되 건드리지는 않겠다는 선언이거든요.

우리가 매일 쓰는 소프트웨어도 마찬가지입니다. 이상하게 생긴 API, 아무도 이유를 모르는 설정값, 주석에 이 코드는 건드리지 마시오라고 적힌 함수. 대부분 누군가의 옛날 실수에 이미 너무 많은 게 매달리게 된 결과입니다.

그리고 AI가 이 유산을 그대로 학습했습니다

여기서부터가 요즘 다시 이 이야기가 회자되는 이유입니다.

거대 언어모델은 인터넷의 텍스트를 학습합니다. 그 텍스트는 유니코드로 인코딩돼 있습니다. 즉 모델이 보는 세계의 최소 단위가 이미 40년 전 인쇄 사고를 포함한 목록이라는 뜻입니다. 토크나이저는 유령 문자에도 토큰 번호를 붙입니다. 임베딩 공간에도 자리가 있습니다. 뜻이 없는 글자에 벡터가 배정되는 겁니다.

실제로 이런 글자들은 모델을 이상하게 만듭니다. 학습 데이터에 거의 나오지 않는 희귀 토큰은 제대로 훈련되지 않은 상태로 남는데, 이런 토큰이 입력에 들어오면 모델이 예측 불가능하게 반응합니다. 몇 년 전 영어권에서 화제가 된 SolidGoldMagikarp 현상이 딱 이 문제였습니다. 특정 희귀 토큰을 입력하면 모델이 엉뚱한 단어를 뱉거나 지시를 무시했습니다. 유령 문자도 구조적으로 같은 자리에 있습니다.

더 흥미로운 건 AI가 이 글자들을 설명하려 든다는 점입니다. 뜻이 없는 글자에 대해 물어보면 그럴듯한 해설을 지어냅니다. 부수를 보고 의미를 추론하고, 존재하지 않는 용례를 만들어냅니다. 모델은 세상에 있는 모든 글자에는 뜻이 있다고 가정하도록 훈련됐으니까요. 실수로 태어난 글자에 AI가 성실하게 의미를 붙여주는 겁니다. 유령이 AI를 통해 뒤늦게 실체를 얻는 셈입니다.

한 번 정해진 것은 좀처럼 사라지지 않습니다

1978년 어느 사무실에서 종이를 오려 붙이다 생긴 그림자가 국가 표준이 됐고, 국제 표준이 됐고, 이제는 AI 모델의 어휘 목록에까지 들어갔습니다. 중간에 실수라는 걸 모두가 알게 됐지만 아무도 지우지 못했습니다. 지우는 비용이 남겨두는 비용보다 훨씬 컸기 때문입니다.

이 이야기가 지금 와닿는 이유는 우리가 또 한 번 그런 시기를 지나고 있어서입니다. AI 모델의 토크나이저, 프롬프트 관행, API 스펙, 지금 급하게 만들어지는 온갖 규격들이 몇 년 뒤 어떤 유령을 남길지 아무도 모릅니다. 표준을 만드는 일은 정답을 정하는 일이라기보다 되돌릴 수 없는 것을 정하는 일에 가깝습니다.

여러분 회사 코드베이스에도 아무도 이유를 모르는데 다들 지키고 있는 규칙이 하나쯤 있을 겁니다. 그게 언제부터 있었는지, 처음에 왜 생겼는지 혹시 아시나요.

유니코드 문자인코딩 일본어 표준 AI

댓글

    댓글을 불러오는 중...