flowchart LR R[대화 내보내기] -->|시스템·빈 줄 제거| L[26,226줄] L -->|90초 안 연속 메시지 묶기| T[12,487턴] T -->|제 턴만| M[4,123개] M -->|남의 말 뒤에 온 것만| P[학습쌍 3,790개] M -.->|맨 처음 · 연속 내 턴 · 30분 초과| X[빠짐 333개]
상세
이번 주말에 재밌게 진행했던 작업입니다.
시작은 자동화였습니다. 요즘 주변에서 gpt, claude 등을 붙여 업무를 자동화하는데 카카오톡만 빠져 있어서, 주말에 시간이 비는 김에 카톡 자동화 도구를 하나 만들었습니다. 에뮬레이터 안에 격리해두고 수집·발신·스케줄 발송까지 붙였습니다. 만드는 과정과 한계는 따로 적었습니다 — 봇이 도는 동안에도 제 카톡을 쓰고 싶었습니다.
자동응답까지 되니까 궁금해졌습니다
정해진 문장을 보내는 것까지 되고 나니 다음 생각이 따라왔습니다. 저 자리에 제 말투로 답하는 걸 놓으면 어떻게 될까.
그다음이 진짜 궁금한 것이었습니다. 친구들이 알아볼까.
최종 목표는 블라인드 대화입니다
그래서 이 실험의 끝을 이렇게 잡았습니다. 트윈의 완성도를 올린 다음, 친구와 실제로 대화를 시켜보고 알아채는지 봅니다.
조건은 미리 정했습니다.
- 참여할 친구들에게 사전에 동의를 받았습니다. 무엇을 하는지, 대화가 어떻게 쓰이는지 알렸습니다
- 다만 어느 시점에 제가 교체되는지는 알리지 않기로 했습니다. 알면 그걸 찾게 되고, 그러면 애초에 재려던 것을 못 잽니다
- 이상하다 싶으면 저한테 바로 말하기로 했습니다. 언제든 그만둘 수 있습니다
호기심에서 시작한 것이고 그 이상으로 쓸 생각이 없습니다. 사칭이나 몰래 하는 용도는 이 실험의 목적이 아니고, 동의 없이 진행하지 않습니다. 이 문단을 결과보다 앞에 두는 이유가 그것입니다.
데이터부터 만들었습니다
말투를 배우게 하려면 학습에 쓸 형태가 있어야 합니다. 카카오톡 공식 ‘대화 내보내기’ 로 받은 제 대화 기록에서 시작했습니다. 로그를 그대로 먹일 수는 없어서 (맥락 → 답변) 쌍으로 바꾸는 작업을 먼저 했는데, 해보니 그 절반은 무엇을 넣을지가 아니라 무엇을 뺄지 정하는 일이었습니다.
네 번 줄었습니다
먼저 대화가 아닌 줄을 걷어냅니다. 초대·퇴장 같은 시스템 안내, 사진·이모티콘·동영상처럼 본문이 없는 줄입니다. 남은 것이 26,226줄입니다.
다음은 묶는 일입니다. 사람은 한 문장을 세 번에 나눠 보내는데, 그게 세 개의 발화로 세어지면 “짧게 여러 번 말한다”는 습관이 그대로 왜곡됩니다. 같은 사람이 90초 안에 이어 보낸 메시지를 하나의 턴으로 합쳤습니다. 26,226줄이 12,487턴이 됐습니다.
그중 제 턴은 4,123개입니다. 그런데 학습쌍으로 남은 것은 3,790개였습니다.
333개가 빠진 이유
코드가 학습쌍을 만드는 조건은 하나입니다. 남이 먼저 말한 뒤에 제가 답한 것만 씁니다. 그래서 세 경우가 빠집니다. 로그의 맨 처음 턴이라 앞에 아무것도 없는 경우, 직전 턴도 제 턴이라 답변이 아닌 경우, 그리고 직전 대화가 30분보다 오래전이라 맥락으로 붙일 게 없는 경우입니다.
셋 중 어느 것이 몇 개인지는 세어보지 않았습니다. 비율로는 전체의 8%가 조금 넘습니다.
그래서 이 데이터에는 먼저 거는 말이 없습니다
빠진 것보다 남은 것의 성격이 중요합니다. 조건이 “남의 말 뒤에 온 내 말”이었으니, 3,790개 전부가 응답입니다. 제가 먼저 말을 꺼낸 순간은 데이터에 한 건도 들어가지 않았습니다.
의도한 설계는 아니었고, 학습쌍을 만들려면 맥락이 있어야 한다는 요구에서 자동으로 따라온 결과입니다. 그게 실제 대화에서 어떻게 나타나는지는 아직 확인하지 못했습니다. 다만 이 데이터로 배울 수 있는 것이 응답뿐이라는 사실은 분명합니다.
다음 편
이렇게 좁혀 만든 3,790개로 모델을 학습시켰습니다. 말투는 꽤 비슷해졌습니다. 그리고 실제로 대화를 시켰더니 몇 번 만에 무너졌습니다. 원인을 찾는 데 통제실험이 세 번 걸렸고, 두 번은 제가 틀렸습니다.