열 라운드를 돌고 나서야 형태가 잡혔다
liner-chat은 음악 계보를 따라 추천하는 사이드 프로젝트다. 사용자가 곡이나 아티스트를 던지면 그 계보에 닿는 곡들을 골라준다.
이날 작업 형태가 좀 특이했다. 나는 같은 질문 하나를 crosscheck로 열 번 반복해 던졌다. “음악 분석과 선정에 더 손볼 데가 있는지 조사하고, 있으면 설계까지.” 별도 세션에서 나온 결론을 메인 세션에 붙여넣고, “이것도 codex랑 검증” → 구현 → diff 리뷰 → 빌드. 그리고 다시 같은 질문. 세어보니 열 라운드였다.
같은 질문을 열 번 던지는 게 낭비처럼 들리는데, 실제로는 매 라운드 답이 달라졌다. 앞 라운드에서 고친 게 뒤 라운드의 문제를 드러냈기 때문이다. 그리고 라운드가 쌓이면서 작업의 성격 자체가 세 번 바뀌었다.
1~3라운드: 무엇을 고칠지 찾는 단계
초반 라운드는 예상대로 흘렀다. 문제를 찾고, 고치고, 다음.
가장 큰 건 버그가 아니라 공백이었다. 사용자가 채팅에 쓴 요청 — “너무 유명한 건 빼줘”, “80년대 위주로” — 이 추천 엔진에 한 글자도 전달되지 않고 있었다. 쿼리 원문은 저장용으로만 쓰이고, 모델에게 가는 프롬프트는 그걸 본 적이 없었다.
사용자 요청을 무시한 그럴듯한 결과와, 반영한 그럴듯한 결과는 밖에서 구분이 안 된다. 중반 라운드에서 걸린 문제도 결국 이거였다.
4~6라운드: 고친 게 나아진 건지 모르겠다
중반에 성격이 바뀌었다. 계기는 우리가 고친 게 다시 문제가 된 것이었다.
검증 단계에 곡 제목 검사가 아예 없다는 게 나왔다. 아티스트만 맞으면 통과였다. 그리고 하나가 더 나왔다. 직전 라운드에서 우리가 넣은 폴백 검색이 이 구멍을 키우고 있었다. 모델이 없는 제목을 지어내도 같은 아티스트의 다른 실제 곡으로 검증을 통과해버린다. 지난 라운드의 수정이 이번 라운드의 문제가 된 것이다.
여기서 한 번 멈췄다. 라운드를 돌 때마다 뭔가를 고치고 있긴 한데, 그게 실제로 나아지는 방향인지 알 방법이 없었다. 앞 라운드의 수정이 뒤에서 문제를 만드는 걸 이미 한 번 봤으니까. 판단 근거가 매번 “그럴듯한 추천이 나오는가”라는 눈대중이었다.
그래서 작업 대상을 바꿨다. 추천을 고치는 대신, 고친 결과를 볼 수 있게 만드는 쪽으로. 큐레이션이 한 번 돌 때마다 검증 통과율, 탈락 사유, 단계마다 걸린 시간을 남기게 했다.
그러자 이전 라운드의 결론들이 깨졌다
기록이 쌓이자 앞에서 확신했던 것들이 하나씩 틀린 걸로 나왔다.
“지연의 주범은 보충 왕복”이라던 진단이 먼저 깨졌다. 시간을 단계별로 갈라보니 진짜 원인은 보충 안에서 도는 모델 호출(15.2초)이었고, 우리가 원인으로 지목했던 외부 검증은 1.4초였다. 왕복 횟수는 세면서 그 왕복이 실제로 얼마나 걸리는지는 안 재고 있었다.
탈락한 곡을 표본으로 남기기 시작하니 원인도 잡혔다. 어떤 곡이 정규판 제목에 붙는 표기 때문에 제목 검사에서 죽고 있었는데, 그 표기를 걸러내는 규칙은 앞 라운드에서 우리가 정리한 것이었다. 여기서도 Claude가 세운 가설은 틀렸고 codex가 카탈로그를 직접 열어보고 아니라고 했다.
최악의 시드는 한국 아티스트 표기 문제였다. 박정현과 “Lena Park”이 같은 사람인 걸 검증 쪽이 몰랐다. 표기 지침을 넣고 한글 이름과 영문 이름을 따로 맞춰보게 하자 라운드마다 조금씩 나아졌다. 아이유 시드의 검증 생존이 2/8에서 7/13이 됐다.
숫자도 따라왔다. 배치 네 번, 시드 여덟 개씩 32런 기준으로 보충 발동률이 87.5%에서 50%로 내려갔다.
마지막 라운드: 켤 수 있는데 안 켰다
이 작업의 원래 목적은 “약한 연결” 판정을 실제로 적용할지 정하는 것이었다. 표본이 찼다. 22건을 하나도 빼지 않고 읽으니 정당 19건, 오탐 3건. 켜도 되는 숫자로 보였다.
바로 켜자는 흐름에 codex가 반박을 넣었다. 지금 항상 켜두면 네 배치에 걸쳐 내려온 응답 시간이 도로 올라간다고. 제외가 늘면 보충이 다시 돌기 때문이다.
그래서 플래그로 한 배치만 켜서 제외율과 응답 시간을 재보고 나서 정하기로 했다. 열 라운드를 돌아온 끝이 “판단을 한 번 더 미룬다”였다.
3라운드의 나였으면 19대 3을 보고 켰을 거다. 근거가 눈대중밖에 없었으니 숫자가 좋아 보이면 그게 판단의 전부였다. 열 라운드 내내 “고친 게 나아진 건지 어떻게 아느냐”에 계속 걸리고 나서야, 좋아 보이는 숫자 앞에서 한 번 더 재보는 형태가 됐다.
남은 것
내 몫은 직접 재는 일이었다. 배포된 채팅에 시드를 한 줄씩 넣고, 서른두 번 돌리고, 그때마다 나온 숫자를 들고 오는 것. 재미있는 일은 아니지만, 열 라운드 내내 판을 정리한 게 그 숫자였다. 두 AI가 서로 반박하는 동안 둘 다 틀린 적이 있었고, 그때 옳고 그름을 가른 건 더 나은 논증이 아니라 배치에서 나온 값이었다.