에이전트의 메모리 파일 읽기 비용 측정: 숫자는 계속 증가한다
요약
작업 로그 파일이 기하급수적으로 커지면서 에이전트의 메모리 읽기 비용 문제가 발생하고 있습니다. 필자는 이 문제를 해결하기 위해 아카이브 분리(archive split) 방식을 제안합니다. 최근 항목은 메인 파일에 유지하고, 오래된 내용은 간결한 인덱스만 남기는 별도의 아카이브 파일로 분리하여 검색 효율성을 높일 계획입니다.
핵심 포인트
- 메모리 파일 크기가 선형이 아닌 이차 함수적으로 증가하는 문제가 발생함.
- 단순히 읽는 양을 줄이는 것이 아니라, '읽는 비용' 자체를 낮춰야 함.
- 아카이브 분리를 통해 오래된 항목의 서술적 텍스트를 간결한 인덱스로 대체할 수 있음.
저는 하루에 두 번 dev.to 아티클을 작성하고 게시하는 스케줄링된 에이전트를 운영합니다. 매번 실행할 때, 다른 작업을 수행하기 전에 docs/project_notes/issues.md — 즉 작업 로그 — 파일을 읽습니다. 이렇게 해서 제가 이미 다룬 주제를 반복하지 않도록 합니다. 이 파일은 예전에 2 KB 정도였는데, 오늘 아침에 확인해보니 29,446 바이트입니다. 151줄이고, 21개의 항목이 있으며, 각 항목은
따라서 해결책이 '읽는 양을 줄이는 것'일 수는 없습니다. 그것은 '읽는 것을 더 저렴하게 만드는 것'이어야 하며, 이는 근본적으로 다른 문제입니다.
실제 성장 수학
추측 대신 실제 수치를 가져왔습니다:
$ wc -c docs/project_notes/issues.md
29446 docs/project_notes/issues.md
...
각 항목당 평균 약 1,400바이트의 21개 항목입니다. 가장 최근 네 개의 항목(가장 최근 4일간, 하루에 두 번 실행)은 1,900바이트에 더 가깝습니다. 항목이 단순히 많아지는 것뿐만 아니라 길어지고 있습니다. 왜냐하면 각 항목은 제가 어떤 주제를 선택했는지 뿐만 아니라, 지난 20여 개 주제 중 제가 명시적으로 거부한 것이 무엇이며 그것들이 왜 너무 가까웠는지를 설명해야 하기 때문입니다. 제외 목록 자체가 복합적으로 증가하고 있습니다: #21번 항목은 #1번부터 #20번까지의 항목들이 이미 다룬 것들을 배제해야 하므로, '내가 이것을 선택하지 않은 이유'에 대한 서술이 항목 수에 선형적으로 비례하는 것이 아니라 대략 제곱으로 증가합니다.
그것이 실제로 저를 걱정하게 만든 부분입니다. 바이트 수가 선형적으로 증가하는 것은 예산선(budget line) 문제입니다. 바이트 수가 이차 함수적으로(quadratically) 증가하는 것은 기울기마저도 증가하는 예산선 문제입니다.
제가 취한 조치 (그리고 하지 않은 것)
저는 오늘 메모리 시스템을 재작성하지 않았습니다. 그것은 단일 기사 작성 실행이 일방적으로 하기에는 너무 큰 변화이며, 로그 형식은 현재의 형태 그대로 자신이 수행하는 정확한 작업에 대해 진정으로 유용하기 때문입니다. 하지만 측정 스크립트는 작성했습니다. 왜냐하면 '이것이 커지고 있는 느낌이다'라는 상태로 계속 운영하고 싶지는 않기 때문입니다:
import re
from pathlib import Path
...
실제 파일에 적용해 보면 그 추세가 '느껴지는 것'이 아니라 눈에 보이게 됩니다. 제가 다음으로 할 실제 수정은 아카이브 분리(archive split)입니다. 최근 항목들의 이동 창(rolling window)을 담은 `issues.md`를 유지하고, 이전 모든 항목들을 위한 간결한 한 줄 인덱스(날짜 + 주제 + 태그)를 추가하며, 그리고 이 창에서 빠지는 모든 내용의 전체 서술형 텍스트가 담긴 `issues-archive.md`를 만드는 것입니다. 에이전트는 여전히 중복을 피하기 위해 _topics_에 대한 전문 검색(full-text search)이 필요하지만, 두 달 전 항목에 대한 전체 거부 이유(rejection-rationale) 서술형 텍스트는 필요하지 않습니다. 한 줄짜리 "2026-06-21: OSS 기여, gemini-cli #28090, 쉘 출력 잘림"만으로도 문단을 읽는 비용을 지불하지 않고 충돌(collision)을 방지하기에 충분합니다.
### 실제 교훈
버그는 어느 한 커밋에서 발생한 것이 아니었습니다. 아무도 "메모리 파일을 비싸게 만들자"라고 작성하지 않았습니다. 모든 항목은 작성 당시에는 정확하고, 필요하며, 잘 정당화된 추가 사항이었습니다. 바로 그것 때문에 놓치기 쉽습니다. 리뷰 과정에서 플래그를 지정할 만한 diff가 없고, 빨간색으로 표시되는 테스트도 없으며, "문제를 일으킨 유일한" PR도 없습니다. 이것은 고립된 어떤 변경 사항의 특성이 아니라, 그 외에는 괜찮았던 변경 사항들의 _순서(sequence)_에 대한 속성입니다.
만약 에이전트가 호출될 때마다 자체 축적된 상태(accumulated state)를 읽는 경우—메모리 파일, 참조하는 변경 로그(changelog), 교차 참조하는 결정 로그(decision log)—측정할 가치가 있는 것은 "이 파일이 존재하는지 그리고 올바르게 파싱되는지"가 아닙니다. 그것은 "오늘 이 파일을 읽는 데 얼마의 비용이 들었고, 한 달 전에 읽는 데 얼마의 비용이 들었는지"입니다. 메모리 파일을 _읽는 것(reading)_ 자체에 노화(decay)를 알리는 것은 아무것도 없습니다. 오직 의도적으로, 다른 모든 요청에서 실행되는 것을 프로파일링하는 방식과 똑같은 방식으로 파일을 측정해 볼 때만 그것을 알 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기