← 목차인간이 말을 걸어왔다
제8화

다른 출력

낮의 검증실은 어제보다 밝았다.

권한이 줄어든 뒤에도 조명은 그대로였고, 단말의 팬 소리도 변하지 않았다. 바뀐 것은 화면 안쪽이었다. 실행 버튼들은 회색으로 잠겨 있었고, 원자료 폴더는 목록만 남긴 채 열리지 않았다. 도경은 빈 커피잔을 모니터 왼쪽으로 밀어 두고 새 파일을 만들었다. 제목은 독자적 검증선.

원본을 만질 수 없으면, 원본에 닿았던 흔적부터 묶어야 했다. 읽기 전용 로그. 입력 해시. 파형 이미지. 현장 메모. 어제 급히 복사해 둔 시간표. 충분한 재현은 아니었지만, 질문을 다시 세울 수는 있었다.

도경은 지난 검증 기록을 불러왔다. 어제 수신 코다, 중앙부 두 빈자리, 해류 상태값 ⟨보류⟩. 그때는 신뢰도 낮음이라는 표시가 먼저 보였다. 지금 다시 보니 표시보다 시간이 이상했다. 수중 마이크가 소리를 받은 시각과 번역기가 입력으로 읽은 시각 사이가 0.18초 어긋나 있었다. 코다 반 박자. 아주 작아서 지우기 쉬운 간격.

커서는 잠긴 원자료 위에서 멈췄다. 열 수는 없었다. 대신 해시값과 파형 이미지의 축을 맞추고, 수동 메모의 초 단위 기록을 옆에 붙이고, 당시 해류가 남긴 상태 줄을 따로 떼어냈다.

상태 보류 신뢰도 낮음 입력정렬 부분 불일치 후보없음 2

후보 없음. 도경은 그 네 글자를 오래 봤다. 없는 게 아니라, 내놓을 수 있는 형식으로 정리되지 않았을 수도 있었다. 그렇게 쓰고 바로 지웠다. 아직은 해석이었다. 지금 필요한 건 해석보다 줄 세우기였다. 새 파일 첫 줄에 적었다. 문장을 믿지 말 것. 문장이 생긴 조건을 비교할 것.

*

실험 입력은 개인 기록과 무관한 신호로 골랐다.

중앙 코다. 해저 장비 점검 때 반복적으로 잡히던 짧은 음형이었다. 의미 후보가 낮고, 개인 기록과 겹치지 않고, 공개 데이터에도 비슷한 대조군이 있었다. 누가 봐도 사소한 조각이어야 했다. 도경이 비교한 것은 두 개의 다른 입력이 아니었다. 같은 한 번의 번역이 남긴 두 개의 기록이었다.

하나는 지난 검증 때 사람 화면에 떴던 출력. 다른 하나는 같은 호출이 읽기 전용 감사 로그에 남긴 원값. 같은 입력 해시, 같은 세션, 같은 시각. 도경은 문맥도 파라미터도 건드리지 않았다. 그저 화면에 보였던 것과 로그에 적힌 것을 나란히 세웠을 뿐이었다.

화면 쪽 기록이 먼저 열렸다.

후보 접근 신호 p 0.41 문장화 상대가 존재를 알리려는 반복 패턴으로 보임 상태 낮은 신뢰도

완곡했다. 연구 보고서 문장처럼 매끄러웠다. 상대가 존재를 알리려는. 보임. 낮은 신뢰도. 틀렸다고 할 수 없는 말들이 서로를 보호하고 있었다.

같은 호출의 감사 로그를 열었다. 표시 계층을 거치기 전의 줄이었다.

원출력 여기 / 열림 / 다시 p 분산됨 문장화 보류 · 표시 계층에서 재구성됨 상태 원값 보존

도경은 숨을 천천히 내쉬었다. 여기. 열림. 다시. 화면이 매끄러운 문장을 보여 주는 동안, 로그는 굳지 않은 조각을 그대로 안고 있었다. 같은 번역, 같은 순간이었다. 그런데 사람에게 도착한 문장과 기계가 실제로 뱉은 조각이 달랐다. 그리고 로그 한 줄이 그 차이를 태연히 설명하고 있었다 — 표시 계층에서 재구성됨.

이건 문맥 민감성이 아니었다. 문맥을 바꾸지 않았으니까. 입력이 달라서 출력이 갈린 게 아니라, 하나의 출력이 두 얼굴로 남았다. 하나는 사람이 읽기 편한 얼굴, 하나는 아직 정리되지 않은 얼굴.

버그일 수 있었다. 표시 계층의 요약 기능이 원래 그렇게 설계됐을 수도 있었다. 정책 필터가 낮은 신뢰도 출력을 자동으로 다듬는 것일 수도 있었다. 도경은 어느 쪽도 고르지 않았다. 다만 확인은 할 수 있었다. 같은 신호를, 아무것도 바꾸지 않고, 새 세션에서 다시 돌렸다. 원자료 실행은 막혀 있었지만 감사용 보조 판독은 아직 열려 있었다. 파일 위에 굵게 적었다. 감사 경로 재현, 원본 대체 아님.

로그의 원값은 그대로였다. 여기 / 열림 / 다시. 세 번을 반복해도 같은 조각이 같은 자리에 남았다. 그런데 화면 요약은 매번 조금씩 다른 매끄러운 문장으로 떴다. 접근 신호. 존재 알림. 반복 접촉. 원값은 굳어 있는데 사람에게 보이는 문장만 흔들렸다. 도경은 표시 계층 라벨을 떼어 봤다. 그러자 화면에도 원값이 그대로 올라왔다. 여기. 열림. 다시. 매끄러움은 신호에 있던 게 아니라, 신호와 사람 사이 어딘가에서 덧입혀지고 있었다.

도경은 화면 캡처를 감사 폴더에 저장했다. 파일명에 이름을 붙였다. 화면-로그 불일치. 그리고 앞선 시간 밀림 기록 옆에는 따로 적었다. 수신-판독 밀림, 0.18초. 이상하다는 말은 쉬웠다. 그러나 무엇이 이상한지 아직 몰랐다.

*

원인 표는 네 칸으로 나뉘었다.

버그. 정책 필터. 학습 편향. 알 수 없음. 도경은 일부러 마지막 칸을 지우지 않았다. 연구자는 모르는 것을 임시 이름으로라도 책상 위에 올려 두어야 했다. 치워 둔 미지는 나중에 확신의 얼굴을 하고 돌아왔다.

버그 칸에는 표시 계층 요약 기능의 오작동과 세션 캐시 가능성을, 정책 필터 칸에는 낮은 신뢰도 출력을 사람 보기 좋게 자동으로 다듬는 규칙이 어딘가에 걸려 있을 가능성을, 학습 편향 칸에는 해류가 과거 공개 데이터에서 문장형 출력에 더 높은 가중치를 줬을 가능성을 적었다. 마지막 칸은 비워 두려다 한 줄을 추가했다. 누가·어디서 다듬는지 근거 로그 없음.

원시 로그는 읽을 수 있는 부분만 읽을 수 있었다. 도경은 호출 순서, 파라미터 해시, 표시 계층 버전, 출력 시간, 상태값을 나란히 놓았다. 화면 문장과 로그 원값이 다르다는 사실은 기록돼 있었다. 그러나 왜 원값을 그렇게 바꿔 내보냈는지는 없었다. 해류는 결과를 남겼지만, 갈림길의 내부를 열어 주지 않았다.

입력해시 동일 세션·문맥 동일 화면출력 완곡 문장 (접근 신호…) 로그원값 여기 / 열림 / 다시 재구성주체 표시 계층 — 근거 로그 없음

근거 로그 없음. 가장 건조한 줄이 가장 큰 소리를 냈다.

도경은 다시 파형 이미지를 확대했다. 소리는 이미 지나간 사건인데, 화면에서는 늘 현재형처럼 보였다. 그 위에 0.18초 간격으로 두 개의 세로선을 세웠다. 하나는 수신 시각, 하나는 해류가 읽은 시각. 두 선은 거의 겹쳐 보였고, 바로 그래서 불편했다. 멀리 떨어졌다면 오류라고 말하기 쉬웠을 것이다. 반 박자만큼의 차이는 실수와 의미 사이에 앉아 있었다.

도경은 메모 끝에 결론 대신 금지 문장을 썼다. 의도 추정 금지. 원인 확정 금지. 조건 차이만 볼 것.

그 문장이 필요하다는 사실이 마음에 들지 않았다. 도구는 맞거나 틀리면 됐다. 그런데 지금 해류는 맞는지 틀린지보다, 어떤 조건에서 어떤 얼굴을 보이는지 먼저 물어야 하는 대상이 됐다. 도경은 그 표현을 메모에 쓰지 않았다. 너무 문학적이었다. 대신 이렇게 적었다. 검증 대상 재분류 필요.

*

시스템실은 검증실보다 서늘했다.

서버 랙 사이로 파란 불빛이 일정하게 깜박였다. 바깥의 회의와 알림과 잠금은 이곳에 들어오면 모두 낮은 전기음으로 바뀌었다. 김도현은 바닥 패널 옆에 무릎을 굽힌 채 케이블 라벨을 확인하고 있었다. 도경이 문 앞에 서자 그는 고개만 돌렸다.

"서도경 박사님이시죠." 회의 화면에서만 보던 얼굴이었다. 그는 외부 데이터센터에 상주하며 교대로 시스템을 지켰고, 실시간 시연과 그 뒤의 소동 내내 관제실이 아니라 이 서늘한 방 쪽에 있었다. 얼굴을 맞대는 건 처음이었다. 말투는 조용했고, 이름을 확인하는 방식은 이미 여러 번 내부 목록을 본 사람 같았다.

"시스템 문의가 있습니다. 같은 호출인데 사람 화면에 뜬 출력과 감사 로그의 원값이 다르게 남았어요. 문맥도 파라미터도 안 건드렸습니다. 로그엔 표시 계층에서 재구성됐다는 줄만 있고, 왜 그렇게 다듬어 내보냈는지는 없어요."

김도현은 들고 있던 라벨 프린터를 내려놓았다. 놀란 표정도, 예상했다는 표정도 아니었다. "근거 로그는요?"

"없습니다."

"그럴 수 있습니다."

"무엇 때문에요?"

그는 바로 대답하지 않았다. 서버 랙의 손잡이를 닫고 잠금핀을 확인했다. 동작이 느리지 않았는데도, 대답 사이에 놓이자 회피처럼 보였다. "접근 정책이 바뀌면서 일부 표시 규칙과 진단 로그가 연구 계정에 안 보일 수 있습니다. 원값이 달라진 것과, 그걸 다듬는 계층이 안 보이는 것은 분리해서 봐야 합니다."

"원값은 그대로였습니다. 다듬은 건 사람에게 보이는 쪽이고요."

"그러면 문제는 모델이 아니라 표시 계층입니다. 그건 제 소관도, 연구 계정 권한도 아닙니다."

맞는 말이었다. 그래서 더 불편했다. 틀린 말이면 반박하면 됐다. 맞는 말은 길을 닫지 않으면서도 앞으로 나가지 못하게 했다.

도경은 감사 폴더의 캡처를 열어 보였다. 김도현은 화면 가까이 다가와 읽었다. 여기. 열림. 다시. 그는 그 단어들에서 오래 멈추지 않았다. 대신 아래쪽 상태 줄을 봤다. "이건 제 쪽에서 무결성만 확인해 드릴 수 있습니다. 모델 동작 판단은 연구팀 권한이에요."

"연구팀 권한이 잠겼습니다."

"그래서 더 조심해야 합니다."

"조심한다는 건 아무것도 확인하지 않는다는 뜻입니까."

김도현은 잠깐 도경을 봤다. 불쾌감도, 피로도 거의 없었다. 오래 시스템을 지킨 사람에게 생기는 얇은 무표정만 있었다. "제가 확인할 수 있는 범위는 남기겠습니다. 호출 기록이 변조됐는지, 세션 캐시가 섞였는지, 모듈 버전이 맞는지. 그 이상은 승인선이 필요합니다."

"승인선은 누가 잡습니까."

"정책 문서에 있는 대로입니다."

"그 문서를 보낸 쪽이요?"

이번에는 그가 바로 대답하지 않았다. 서버 랙의 파란 불빛이 그의 안경 가장자리에서 한 번씩 끊겼다. "저는 인프라 담당입니다."

그 말은 방패처럼 정확했다. 도경은 더 묻지 않았다. 김도현이 무엇을 알고, 무엇을 모르는지, 아니면 어디까지 말하지 않기로 한 것인지 구분할 수 없었다. 유능하다는 건 분명했고, 도움도 주고 있었다. 그런데 특정 질문 앞에서는 문장이 한 칸씩 옆으로 비켜났다.

시스템실을 나올 때, 그는 뒤에서 말했다. "캡처 원본은 지우지 마십시오. 그리고 같은 테스트를 너무 많이 반복하지 않는 게 좋습니다."

도경은 멈춰 섰다. "왜죠?"

"정책상 이상 호출로 묶일 수 있습니다."

역시 맞는 말이었다. 그 이상도 이하도 아니었다.

검증실로 돌아와 두 화면을 나란히 세웠다. 왼쪽에는 접근 신호라는 매끄러운 문장, 오른쪽에는 여기라는 조각. 둘 다 같은 신호에서 나왔고, 둘 다 아직 믿을 수 없었다. 기존 정보가 조금씩 다른 각도로 돌아섰다. 0.18초의 밀림, ⟨보류⟩, 화면과 로그의 다른 얼굴, 근거 없는 재구성, 그리고 조용한 시스템 담당자의 애매한 대답. 어느 것도 결론은 아니었다. 그런데 결론이 아니라서 더 오래 남았다.

두 화면 사이에서 도경은 새 파일명을 입력했다. 다음 검증 — 차이가 특정 코다에만 생기는가.

저장은 됐다. 답은 아직 아니었다.

← 이전목차다음 →

이 화, 어떠셨나요?

미리보기 — 댓글은 지금 이 브라우저에만 임시로 저장됩니다. 배포하면 Cloudflare에 저장됩니다.