QA Agent 단일 함수에서 멀티 에이전트로 전환한 날

26년 03월 26일

QA 실행 함수 하나에서 에이전트 여럿으로

며칠째 설계해오던 멀티 에이전트 전환을 드디어 실행한 날이었다.

QA Agent를 단일 함수에서 역할별 에이전트 구조로 갈아엎었다.

그리고 2단계 재시도랑 스킬 승격 파이프라인도 같이 정리했다.

틈틈이 세션 로거 플러그인도 만들었다.

그 전까지 QA Agent는 QA 실행 함수이라는 함수 하나가 전부를 처리했다.

계획 세우기, 실행, 리포팅까지 순차적으로 다

돌렸다.

케이스가 몇 개 없을 때는 괜찮았는데, 케이스가 늘어나니까 한계가 명확해졌다.

병렬 실행이 안 된다.

재시도 처리가 깔끔하지 않다.

상태 관리가 엉망이다.

이 세 가지가 다

걸렸다.

그래서 함수 하나를 역할별 에이전트로 쪼갰다.

Planner는 실행 계획을 세우고 Executor가 테스트를 돌리고 Sub-executor가 병렬 실행을 담당하고 Inspector가 막힌 케이스를 분석하고 Cleaner가 결과 정리를 한다.

각 에이전트가 독립적인 디렉토리를 가지고 자기 역할에만 집중한다.

공통으로 쓰는 유틸리티는 src/shared/로 빼서 중복을 없앴다.

그리고 Slack 인터랙션이 알맞은 에이전트로 라우팅되는 계층도 만들었다.

슬랙에서 명령이 들어오면, 이 라우팅 계층이 어디로 보낼지 판단한다.

2단계 재시도 구조

재시도 구조도 다시 짰다.

사실 전날에 만들긴 했는데, 멀티 에이전트 구조에 맞춰서 정식으로 자리 잡힌 건 오늘이다.

1단계에서는 전체 케이스를 병렬로 돌린다.

통과, 실패, 막힘을 수집한다.

2단계에서는 막힌 케이스만 다시 돌린다.

이때 브라우저 세션을 새로 만들고 Inspector가 분석한 막힌 원인이랑 통과한 이웃 케이스의 컨텍스트를 주입한다.

그 전까지는 막히면 바로 재시도를 했다.

근데 같은 세션에서 같은 이유로 또 막혔다.

원인이 같으니까 재시도해도 결과가 같다.

2단계로 나누고 원인 분석을 끼워 넣으니까, 재시도가 새로운 정보를 가지고 돌아가게 됐다.

재시도 동시 실행 개수는 막힌 케이스 수랑 최대 동시 실행 개수 중 작은 값으로 잡았다.

막힌 게 너무 많으면 무작정 다

동시에 돌리지 않고 제한을 두는 식이다.

Managed Skills 파이프라인 정리

스킬 시스템도 손을 봤다.

문제가 있었다.

그 전까지는 케이스별 로그를 프로그래밍으로 감싸서 가짜 스킬처럼 만들었다.

케이스 스킬 생성 함수()이라는 함수가 이걸 했다.

근데 이렇게 만든 스킬은 노이즈일 뿐이었다.

케이스 로그를 스킬 포맷으로 감쌌을 뿐, 재사용 가능한 패턴이 아니었다.

그래서 이 함수를 아예 지웠다.

대신 새 파이프라인을 만들었다.

Sub-executor가 케이스를 실행하고 Cleaner가 그 실행 기록에서 진짜 재사용 가능한 패턴을 추출한다.

그리고 검증이 끝나면 도메인 범용 스킬로 승격시킨다.

예를 들어 “수강 코스 찾기”나 “관리자 로그인” 같은 패턴만 스킬로 올린다.

원본 스킬이랑 수정된 스킬을 구분하려고 디렉토리도 둘로 나눴다.

source-skills는 원본, skills는 런타임에 수정된 버전. 이렇게 분리하니까

원본을 잃어버리지 않으면서 런타임 수정을 할 수 있었다.

세션 로거 플러그인

QA Agent 작업 틈틈이 옵시디언 지식 관리 쪽도 만졌다.

session-logger라는 플러그인을 만들었다.

목표는 에이전트가 작업한 내용을 자동으로 옵시디언에 기록하는 거다.

그 전까지는 수동으로 작업 로그를 남겨야 했는데, 이게 병목이었다.

에이전트가 일하면 자동으로 기록되고 밤에 그 기록이 구조화된 위키 문서로 정리되는 파이프라인을 만들고 싶었다.

session-logger는 session.idle 이벤트를 감지한다.

세션이 쉴 때, 숨겨진 work-logger 서브에이전트를 fire-and-forget으로 실행한다.

이 에이전트가 세션 기록을 분석해서 의미 있는 작업이 있으면 한국어 작업 로그를 옵시디언 00_Inbox/에 쓴다.

디바운스랑 CREATE 모드

몇 가지 디테일을 신경 썼다.

하나는 60초 디바운스다.

세션이 잠깐 쉬었다가 다시 시작할 때마다 로그가 쌓이면 너무 많아진다.

그래서 60초 동안 idle이 유지되면 그때 로깅을 한다.

또 하나는 기록 모드다.

처음에는 APPEND 모드로 짰는데, 작업 히스토리가 날아가는 문제가 있었다.

APPEND는 기존 파일을 지우고 새로 만드는 방식이라, 중간 상태가 보존이 안 됐다.

그래서 CREATE-only 모드로 바꿨다.

idle이 발생할 때마다 새 타임스탬프 노트를 만든다.

전체 작업 타임라인이 다

보존된다.

이 세션 로거는 더 큰 지식 관리 파이프라인의 일부다. → 일일 노트까지 이어지는 흐름이다. 에이전트가 일하고 그 기록이 자동으로 지식으로 쌓이는 구조를 만들고 있었다.

마무리

하루 만에 QA Agent 구조를 크게 바꿨다.

단일 함수가 역할별 에이전트로 쪼개지니까, 각 에이전트가 자기 역할에 집중할 수 있게 됐다.

그리고 2단계 재시도랑 스킬 승격 파이프라인이 제자리를 잡았다.

스킬 시스템에서 가짜 스킬을 만드는 함수를 지운 게 특히 뿌듯했다.

케이스 로그를 감싸기만 한 스킬은 노이즈일 뿐이었는데, 진짜 재사용 가능한 패턴만 추출하는 파이프라인으로 바꾸니까 시스템이 더 똑똑해졌다.

다음 날에 Inspector를 배포하면서 막힌 케이스 재시도 성공률이 0%였던 문제를 잡았다.

오늘 만든 구조가 그 작업의 기반이 됐다.