앱 개발은 에이전트와 같이 한다. 지침 파일, 스킬, 메모리, 에이전트 정의를 묶어 하네스라고 부르는데, 손볼 곳이 늘 많아 보였다. 이번에는 무엇부터 고칠지 정하기 전에 실제 사용 기록을 먼저 셌다.
집계한 것
8월 18일부터 10월 5일까지 7주 동안의 세션 기록 전체다. 메인 세션 89개, 서브에이전트 실행 625회. 호출마다 컨텍스트 크기, 부른 도구, 에이전트에 맡긴 일을 스크립트 하나로 집계했다.
| 항목 | 값 |
|---|---|
| 메인 호출당 평균 컨텍스트 | 48만 8천 토큰 |
| 메인 토큰 중 컨텍스트 40만 초과 구간 | 80% (70만 초과만 43%) |
| 상위 10개 세션의 비중 | 61% |
| 상시 컨텍스트(지침·스킬 목록·메모리 인덱스) | 세션 시작 중앙값 7만 2천 |
| 스킬 44개 중 실제로 쓴 것 | 11개 |
처음에는 매 세션 컨텍스트를 차지하는 스킬 목록과 메모리 인덱스를 줄이면 된다고 생각했다. 계산해 보니 그쪽을 다듬어서 줄어드는 건 4% 남짓이었다. 비용 대부분은 세션이 수십만 토큰으로 커진 다음에도 같은 세션에서 도구를 계속 부르는 데서 나왔다. 도구를 한 번 부를 때마다 그 컨텍스트 전체를 다시 읽기 때문이다.
예상과 달랐던 것
메인 세션에서 sleep이 2천 번 넘게 나와서 대기 전용 스크립트를 만들 생각이었다. 그런데 74%가 10초 이하였다. 앱을 띄우고 화면이 안정될 때까지 잠깐 기다렸다가 캡처하는 경우가 대부분이었다. 문제는 대기 시간보다 그 대기가 50만 토큰짜리 세션 안에서 일어난다는 점이어서, 스크립트는 만들지 않았다.
직접 만든 에이전트는 51개였는데 7주 동안 다 합쳐 한 번 호출됐다. 실제로 일한 건 범용 에이전트(480회)와 포크(179회)였다. 서브에이전트 호출 729번 중 526번은 모델을 지정하지 않아 메인 세션의 상위 모델을 그대로 썼고, 서브에이전트 토큰의 90% 정도가 상위 모델에서 나왔다. 빌드 로그를 기다리는 일까지 상위 모델이 하고 있었다.
바꾼 것
- 자동 압축 상한을 50만 토큰으로 낮췄다. 비용이 25~30% 줄 것으로 계산했고, 대신 압축이 두 배쯤 자주 일어난다. 그래서 압축할 때 요약에 꼭 남길 네 가지(고친 파일, 진행 중인 단계, 사용자가 내린 결정, 되돌릴 수 없는 작업의 상태)를 지침에 적었다.
- 하면 안 되는 일은 문장 대신 권한 규칙으로 막았다. 시뮬레이터 새로 만들기, 생성 소스까지 지워 빌드를 깨뜨리는 폴더 삭제 같은 명령 8개는 거부하고, 런타임 다운로드와 TestFlight 업로드 같은 7개는 실행할 때마다 확인을 받는다.
- 실행 에이전트를 셋 만들었다. 브라우저 콘솔 조작, 빌드·업로드·대기, 조사를 맡는다. 모두 가벼운 모델에 고정하고 코드 수정 도구는 뺐으며, 실패하면 직접 고치지 말고 보고하게 했다. 서브에이전트는 메모리를 자동으로 받지 못해서, 그 영역에서 지켜야 할 금지 규칙은 정의 파일에 직접 넣었다.
- 모델은 일의 성격으로 나눴다. 메인 세션은 대화와 결정을 맡고, 구조를 정하거나 원인을 모르는 문제는 가장 강한 모델의 자문 에이전트에 넘긴다. 끝이 정해진 실행은 가벼운 모델이 한다. 모델 이름은 버전 번호 대신 별칭으로 적어서 새 버전이 나오면 그대로 따라가게 했다.
외부 에이전트 묶음을 들여오거나 안 쓰는 에이전트를 정리하는 일은 하지 않았다. 스킬이 에이전트를 이름으로 부르는 곳이 많아서, 에이전트만 옮기면 스킬이 깨진다.
다음 측정
10월 7일 밤에 세션을 모두 새로 시작했고, 그 뒤 기록은 새 설정에서 나온 것이다. 직전 한 주의 기준선은 메인 호출당 평균 46만 8천 토큰, 40만 초과 구간 비중 79%다. 기간 길이가 달라서 총량 대신 하루 평균과 비중으로 비교한다. 중간 점검은 10월 10일, 재측정은 10월 19일이다.
그 다음에는 메모로만 남아 있는 규칙 가운데 두 번 이상 어긴 것을 골라 점검 스크립트나 권한 규칙으로 옮길 생각이다.
