자동 제목 요청 뒤 본 대화가 제목처럼 답하던 문제를 추적한 기록

에이전트 클라이언트가 자동 제목을 만든 뒤 본 대화에도 제목 같은 한 줄만 돌아오는 문제였습니다. 템플릿 해시로 프롬프트 문제를 배제하고, 8월과 9월 빌드를 대조해 조건부로 결론을 냈습니다.

로컬 llama.cpp 서버(Qwen3.8 27B, gfx1151/HIP)에 코딩 에이전트 OpenCode를 붙였더니, 세션을 시작할 때 에이전트가 보내는 자동 제목 요청 뒤로 본 대화에도 "간단한 인사" 같은 제목 한 줄만 돌아왔습니다. 프롬프트, 클라이언트, 서버, kernel 중 어디서 생긴 문제인지 좁혀 간 과정입니다.

프롬프트 문제인지부터 확인

가장 먼저 의심한 것은 클라이언트가 제목 지시를 본 대화에 섞어 보냈을 가능성입니다. 프록시로 HTTP 요청을 관찰하고, 서버가 실제로 렌더링한 템플릿 문자열을 받아 해시로 비교했습니다.

  • 본 대화의 system 프롬프트는 모든 조건에서 SHA256이 같았고(11,081자) 제목 지시가 없었습니다.
  • 제목용 system(2,096자)은 별도 HTTP 요청에만 들어 있었습니다.
  • 서버가 렌더링한 본 대화 문자열도 8월·9월 빌드에서 해시가 같았습니다.

요청에는 문제가 없었습니다. 그렇다면 앞선 요청의 상태가 서버 안에 남아 다음 요청에 영향을 준 것으로 봐야 했습니다.

조건을 하나씩 바꿔 보기

한 번에 하나씩 바꿔 각 1회 실행했습니다. 걸린 시간에는 큐 대기가 들어 있어 속도 비교로는 쓰지 않습니다.

조건 본 대화 결과
자동 제목 후 본 대화 제목처럼 답함
자동 제목 없이 (제목을 직접 지정) 정상 인사
자동 제목 + cache_prompt=false 제목처럼 답함
자동 제목 + fusion을 끄는 환경변수 제목처럼 답함

제목 요청이 먼저 있어야 문제가 생겼고, prompt cache를 꺼도 똑같아서 단순한 캐시 문제는 아니었습니다. fusion 환경변수로도 안 됐지만, 그 변수는 fused kernel 전부를 끄는 스위치가 아니어서 이 결과로 kernel 쪽을 배제하지는 않았습니다.

8월 빌드와 9월 빌드 대조

8월 말 빌드(90c26fcd4)와 9월 19일 빌드(e613ef2c8)를 같은 모델과 설정으로 비교했습니다.

빌드 / backend 본 대화
8월 HIP 제목처럼 답함 (반복 재현, greedy·seed 고정에서도)
9월 HIP 정상 3회
9월 Vulkan 정상 2회

greedy와 seed를 고정한 비교에서 세 조건의 렌더링 템플릿 해시가 같았는데 응답만 달랐습니다. 문제는 프롬프트가 아니라 빌드에 따라 나타났습니다.

9월 빌드의 GDN kernel 수정이 고친 것처럼 보였지만, 확인해 보니 두 빌드의 해당 kernel 파일은 해시가 같았습니다. 달라진 곳은 graph 재사용과 scheduler 같은 다른 부분이고, bisect를 하지 않았으니 어느 커밋이 고쳤는지는 모릅니다. upstream에 비슷한 증상의 이슈가 있지만 다른 빌드에서 나온 확인되지 않은 보고라 같은 원인이라고 보지 않았습니다.

서비스 교체

원인 커밋을 몰라도 "8월 HIP 빌드에서는 재현되고, 9월 빌드는 HIP와 Vulkan 모두 이 시나리오를 통과한다"는 결론은 낼 수 있습니다. 이를 근거로 서비스를 9월 HIP 빌드로 바꿨습니다.

  • 바꾸기 전 서비스 설정을 백업하고, 바꾼 뒤 실행 파일과 불러온 라이브러리가 새 빌드인지 확인했습니다.
  • 한국어 산술, 이미지, 도구 호출 JSON, 도구 결과 전달, 별개의 인사 요청까지 회귀 검사 5건을 통과했습니다.
  • 실제 클라이언트로 자동 제목 뒤 본 대화를 보내는 시나리오를 두 번 다시 돌려 정상 응답을 확인했습니다.

돌이켜 보면 도움이 된 것은 세 가지였습니다. 프롬프트가 원인이 아니라는 것을 렌더링 결과의 해시로 바로 확인할 수 있었습니다. 우회 실험이 실패했을 때 그 스위치가 정말 해당 경로를 끄는지 먼저 따져 봤습니다. 그리고 bisect 없이 "무엇이 고쳤다"고 쓰는 대신 "어느 빌드에서 재현되는가"로 결론을 적었습니다.

이 서버의 성능 측정은 Qwen3.8 upstream 재측정에 있습니다.