한 턴에 하나의 서브에이전트 호출만 허용되는 이유

26년 07월 05일

같은 턴에 여러 서브에이전트를 부르면 거부된다

이날은 서브에이전트 동시성 제한의 진실을 발견한 날이다.

같은 턴에서 서브에이전트를 4개 호출했는데, 첫 번째만 접수되고 나머지 3개가 전부 거부됐다.

원인은 턴당 1회 호출 가드였다.

그리고 괴담 소설 파이프라인에 품질 게이트도 구현했다.

오케스트레이터가 같은 턴에서 서브에이전트를 4개 호출했다.

탐색, 분석, 검증을 병렬로 돌리려고 했다.

근데 첫 번째만 접수되고 나머지는 전부 “이미 진행 중인 서브에이전트가 있다”며 거부됐다.

원인을 소스에서 확인했다.

턴당 1회 호출을 하드가드하는 플래그가 있었다.

비동기 실행으로도 면제되지 않는다.

“실행하고 잊어버리고 계속 진행”하는 탈출구가 없었다.

해결: tasks 배열

복수 동시 실행은 단일 호출 내의 tasks 배열로만 가능하다.

동시성은 “여러 번 호출”이 아니라 “한 번 호출 안에서 배열”로 일어난다.

이전에 위키에 적어둔 해결책이 “턴을 직렬화하라”였다.

매 호출 사이에 턴을 종료하는 거다.

근데 이건 거짓된 유일해법이었다.

tasks 배열을 쓸 수 없는 특수 상황의 fallback일 뿐이었다.

시스템 프롬프트가 함정을 만들었다

시스템 프롬프트에 “한 응답에서 여러 위임을 발사하라”, “병렬화를 적극적으로 하라” 같은 문구가 있었다.

이게 “별도 호출 여러 번”으로 읽혀서 같은 실수를 반복하게 만들었다.

교정 문구를 추가했다가, 사용자 피드백으로 뺐다.

“어차피 실행해보고 실패하면 알게 되는 내용”은 프롬프트에 안 쓰는 게 낫다.

정확한 올바른 패턴 한 줄만 남겼다.

시스템 프롬프트 최소 편집 원칙

이 과정에서 최소 편집 원칙을 세웠다.

첫째, 꼭 필요한 교정만 추가한다.

모호한 문구를 정확한 패턴으로 바꾸는 한 가지 핵심만. 둘째, 실행해보면 알게 되는 내용은 제외한다.

거부 에러 메시지, 실패 시 자연히 학습되는 동작은 프롬프트에 안 쓴다.

셋째, 중복 설명을 피한다.

넷째, 한 줄로 끝낼 수 있으면 한 줄로. 시스템 프롬프트는 매 턴 컨텍스트 윈도우를 차지한다.

비대해질수록 비용이 증가하고 핵심 지시가 희석된다.

“방어적으로 미리 경고”보다 정확한 패턴 한 줄이 더 효과적이다.

괴담 소설 품질 게이트

틈틈이 괴담 소설 파이프라인에 품질 게이트를 구현했다.

9단계 파이프라인이다.

크롤링으로 수집하고 시리즈 완결 여부를 확인하고 선별하고 계획하고 작성하고 리뷰하고 AI 티를 제거하고 TTS 정규화하고 발행한다.

순수 휴리스틱으로 비용 0인 게이트를 먼저 둔다

핵심 원칙은 “순수 휴리스틱으로 비용 0인 게이트를 먼저 두고 LLM은 모호한 케이스에만”이다.

시리즈 완결 감지는 순수 휴리스틱이다.

(상)(중)(하) 같은 파트 마커, 2/3 같은 비율 마커, “완결됐다” 같은 완결 마커를 정규식으로 찾는다.

LLM이 필요 없다.

비용이 거의 0이다.

TTS 정규화도 순수 TypeScript다.

잔존 한자를 검출하면 발행을 차단한다.

한국 TTS는 한자를 못 읽는다.

한자가 남아 있으면 발행하면 안 된다.

비용 최적화

AI 티 점수가 낮으면 휴머나이제이션을 스킵한다.

이미 자연스러운 텍스트에 비용을 쓸 필요가 없다.

점수가 35 미만이면 전체 스킵이다.

이 원칙이 일관된다.

비용이 드는 LLM은 정말 필요할 때만 쓴다.

휴리스틱으로 처리할 수 있는 건 휴리스틱으로 한다.

LLM은 모호한 케이스랑 비용 최적화 임계값을 통과한 경우에만.

마무리

내가 이날 배운 핵심은 다음과 같다.

이날의 교훈은 두 가지다.

첫째, “여러 번 호출”이 아니라 “한 번 호출 안에서 배열”이다.

동시성을 원하면, 호출을 여러 번 하는 게 아니라, 한 호출 내에 배열을 넣는다.

이 제약을 모르면 “왜 거부되지”라고 삽질하게 된다.

둘째, “순수 휴리스틱으로 비용 0인 게이트를 먼저 둔다.” LLM이 필요 없는 검사는 휴리스틱으로 한다.

정규식 매칭, 길이 검사, 한자 감지. 이런 건 LLM 없이도 정확하다.

LLM은 모호한 케이스에만 쓴다.

비용을 아끼면서 정확도를 유지하는 방법이다.