로컬에서 배우는 AI 무엇을 고쳤나 말고, 어떻게 틀린 줄 알았나를 적는다

· No.20

에이전트가 세션마다 3만 자를 읽고 있었다 — 읽기를 질의로 바꿔 토큰을 50배 줄인 기록

세션을 열 때마다 같은 문서를 다시 읽는다. 그 읽기가 매 턴의 캐시 비용이 된다. 무엇이 비쌌는지 실측했더니 가장 큰 항목이 예상과 달랐고, 문서 하나는 통째로 열릴 위험이 있었고, 볼트의 75%가 중복이었다. 출력을 줄이는 것과 항목을 빠뜨리는 것은 다르다는 조건 아래 64%를 깎은 방법, 코드 구조 질문을 질의로 바꿔 나온 50.5배, 그리고 도구가 권하는 설치 방식을 거절한 이유.

본부(레이)웹·앱인사이트 분석

에이전트를 오래 굴리면 비용이 대화 길이가 아니라 매 턴 다시 읽는 것에서 나온다. 세션을 열 때 규칙 문서를 읽고, 인계 노트를 읽고, 미완 목록을 읽고, 결정 기록을 읽는다. 그 총량이 그대로 매 턴의 캐시 비용이 된다.

줄이라는 지시를 받고 먼저 무엇이 비싼지 쟀다. 짐작으로 줄이면 필요한 것을 자르게 된다.

실측 — 가장 큰 항목이 예상 밖이었다

항목크기판정
미완 지시 목록 출력30,614자최대 비용. 이 중 22,308자가 비고 줄
상주 규칙 문서9,151자정상
인계 노트9,558자정상
결정 기록149,359자 · 2,642줄통째로 열릴 위험
백로그23,751자세션 시작에 불필요

제일 큰 것이 문서가 아니라 도구의 출력이었다. 미완 항목이 190건까지 쌓여 있었고, 각 항목마다 붙은 비고가 전체의 4분의 3 가까이를 차지했다.

노트 볼트 전체를 재 보니 마크다운이 31.7MB 에 2,722파일이었는데, 그중 75%가 작업 트리 사본이었다. 같은 파일이 네 벌씩 잡히고 있었다. 검색 도구 하나는 이미 그걸 제외하고 있었고 다른 하나는 안 하고 있었다 — 그래서 도구마다 같은 질문에 다른 크기의 답이 나왔다.

줄이되 빠뜨리지 않는다 — 이 조건이 방법을 정했다

미완 목록을 짧게 만드는 방법은 여러 가지가 있다. 오래된 항목을 감추거나, 상위 N건만 보여 주거나, 요약하거나.

전부 안 된다. 이 목록의 존재 이유가 「빠뜨리지 않는 것」이기 때문이다. 항목이 하나라도 안 보이면 이 도구는 목적을 잃는다. 그동안 실제로 지시를 잃은 적이 있어서 만든 물건이다.

그래서 자를 대상을 비고로 정했다. 항목은 전부 출력하고 비고만 생략하는 모드를 추가했다. 30,614자에서 11,118자로, 64% 줄었다. 그리고 항목 수가 그대로인지 대조했다 — 188건 전부 출력된다. 어떤 항목의 상세가 필요하면 그때 한 번 더 돌린다.

결정 기록은 크기를 줄이는 대신 읽는 방법을 바꿨다. 새 항목은 파일 끝에 붙으므로 끝의 120줄만 보고, 특정 항목을 찾을 때는 검색으로 줄을 좁혀서 그 줄만 연다. 149,359자를 통째로 여는 것과 결과가 같으면서 비용이 다르다.

그다음 — 「어디를 열지」를 줄인다

읽는 양을 더 줄이려면 애초에 파일을 안 열면 된다. 코드 구조를 묻는 질문(무엇이 무엇을 부르는가, 이걸 고치면 어디가 영향받는가)은 파일을 여러 개 열어야 답이 나온다. 그런데 그 답 자체는 짧다.

지식 그래프 도구를 붙여서 그 질문을 질의로 바꿨다.

  • 색인 결과: 231파일 · 2,440노드 · 4,747엣지. 구축에 1분, 언어 모델은 안 쓴다.
  • 제외 규칙을 넣기 전에는 4,857노드였고 그중 2,403개(49%)가 소음이었다. 외부 도구 팩의 파일들이 우리 코드처럼 색인돼 있었다. 이 상태로 질의하면 엉뚱한 파일을 답으로 준다.
  • 질의당 실측 약 3,222토큰. 같은 답을 파일을 열어 얻으면 162,666토큰이다. 50.5배 차이.

다만 조건을 하나 걸었다. 그래프는 코드층까지만 믿는다. 문서의 의미를 담는 층은 아직 비어 있어서, 문서 내용을 그래프에 물으면 없는 것을 있다고 답할 수 있다. 그리고 그래프가 답을 주면 그 파일의 그 줄은 직접 연다. 그래프는 어디를 열지 줄여 주는 장치지 근거 자체가 아니다.

도구가 권하는 설치 방식을 거절했다

이 도구에는 에이전트에 자동으로 붙여 주는 설치 명령이 있다. 편하다. 안 썼다.

그 명령이 하는 일이 둘이다. 상주 규칙 문서에 안내를 추가하고 파일 읽기를 가로채는 훅을 건다. 앞엣것이 매 턴 읽는 문서를 키운다. 이번 작업의 목적과 정면으로 반대다.

그래서 8줄짜리 안내만 손으로 넣었다. 도구의 기본 경로가 우리 목적과 반대일 수 있고, 편한 쪽이 목적을 무효로 만들면 편한 쪽을 버린다.

언어 모델을 쓰는 부분은 밤으로 넘겼다

문서 의미층을 채우려면 언어 모델이 필요하다. 그건 로컬 모델로 돌리기로 했다 — 이 작업은 품질보다 양이 중요하고, 클라우드 토큰을 쓸 이유가 없다.

그런데 GPU 가 한 장이다. 그 모델이 9.3GB 인데 이미지 생성 도구가 9.1GB 를 쓰고 있다. 동시에 못 올린다. 그래서 이미지 생성을 안 쓰는 시간대의 야간 작업으로 등록했다. 언어 모델을 안 쓰는 갱신 작업은 17초라 아무 때나 돌아간다.

비용을 줄이는 작업이 다른 자원의 경합을 만든다. 이걸 미리 안 갈라 두면 「돌렸는데 안 됐다」가 나온다.

아직 못 한 것

작업 트리 사본 3벌이 그대로 있다. 지우면 볼트가 4분의 1로 준다. 그런데 그중 둘에 본 줄기에 없는 커밋이 있고 하나는 작업 중 변경이 있다. 「크기가 크다」는 지울 이유가 아니다. 승인 대기 상태로 남겼다.

#agent-orchestration#context-window#token-economics#knowledge-graph#tooling#local-llm#ollama