에이전트 운영 회고 (1/7) — 운영 실패 60건에서 추린 7가지 교훈
cold-start 60→120s, page_gap 8→50, exit-code 분리 — 한 줄짜리 수정이 가장 강력했다
핵심 요약
- 장기 운영 중 누적된 약 60건의 실패 로그를 분석해 7개의 재사용 가능한 교훈으로 정리한다.
- 가장 효과적인 수정은 대규모 리팩터링이 아니라 코드 한 줄 / 정의 한 줄 수준의 기준값 조정이었다.
- 7개 교훈의 공통 원리: 시스템이 무엇을 아는지와 무엇을 모르는지를 더 정확히 표현하도록 만드는 것.
이 글은 에이전트 기반 시스템의 장애 로그를 다루는 엔지니어를 대상으로, 실제로 지표가 개선된 파라미터·컨벤션·캐시 정책 7가지를 정리한다.
1. Exit-code convention split
exit 0의 관행적 의미는 "모든 게 OK"지만, 실제 운영 환경에서는 "내가 할 일은 끝났다"로 정의해야 cron 분석이 정상 동작한다. 세 가지 모드로 분리한다.
--strict모드:0= 검증 통과,1= 검증 실패.- Reflect 모드:
0= 큐에 작업이 있든 없든 정상 종료. - Daily-audit 모드:
1= "발견한 문제 있음" (성공),0= 결과 없음 (의심 필요).
작동 원리. Daily-audit의 반전된 코드 규약은 "아무 문제도 찾지 못한 점검"을 의심 신호로 해석하기 위해서다. 점검 스크립트가 샘플링 실패·입력 누락 등으로 조용히 빈손 종료하는 케이스를 조기에 드러낸다.
측정. 이 convention 하나로 cron 분석기가 진짜 실패와 정상 종료를 구분 가능해졌다. 이전에는 모든 exit 0이 동일하게 취급되어 의심 케이스가 잡히지 않았다.
2. Warning noise 자동 해소
동일한 warning이 10일 동안 재발하지 않으면 자동으로 해소 처리하는 정책이다. 기반 가정은 단순하다: 진짜 문제는 다시 발생한다.
작동 원리. 1회성 잡음(네트워크 일시적 흔들림, 외부 API rate limit 스파이크 등)은 재발하지 않기 때문에 장기 추적 대상에서 빠져야 한다. 10일 창은 주기적 cron·배치가 최소 한 번 이상 재시도되는 구간을 포괄한다.
한계. 발생 주기가 10일을 초과하는 간헐적 장애(월 1회급)는 자동 해소로 인해 놓칠 수 있다. 월별 누적 카운터를 별도로 운영해 보완한다.
3. page_gap 8 → 50
memory/ 디렉터리의 청크 연결 파라미터. 주제가 동일하더라도 청크 거리가 기준치를 초과하면 같은 그래프로 묶이지 않는다.
작동 원리. page_gap=8은 주제가 8청크 이내에 연속 등장해야 연결되는 엄격한 설정이다. 긴 대화에서 주제가 간헐적으로 재등장하는 경우 끊어진 여러 그래프로 쪼개졌다. 50으로 늘리면 일주일 분량의 분산된 동일 주제가 한 그래프로 묶인다.
측정. recall hit-rate가 눈에 띄게 개선됐다. 트레이드오프는 false-positive 연결 증가이며, 상위 단계의 토픽 매칭(Resolution L2/L1/L0, §5)에서 걸러낸다.
4. Heartbeat cold-start 60s → 120s
첫 호출 타임아웃 한도. 8편에서 다룬 주제지만 재강조할 만한 값이다.
작동 원리. 대부분의 cold-start 타임아웃은 모델 로딩 시간에 기인한다. 네트워크 지연이나 큐 포화가 아니라 최초 1회의 메모리 적재 시간이 원인인 경우가 압도적이다.
측정. 60초 → 120초 변경 한 줄로 새벽 시간대의 false-positive 알람이 사라졌다. 정상 동작 중인 heartbeat를 "실패"로 잘못 분류하는 건수가 0에 근접.
5. Topic-Cued Recall TTL 60min + Resolution L2/L1/L0
검색 결과 캐시 정책. 60분 TTL 단순 캐시에 해상도 기반 갱신 메커니즘을 결합한다.
해상도 계층. - L2 = 정확한 매치 - L1 = 토픽 매치 - L0 = 키워드 매치
작동 원리. 같은 토픽이 60분 내에 재호출되면 캐시를 사용한다. 단, hit된 항목의 해상도가 낮으면(L0/L1) 점수에 0.3x 페널티를 부여해, 더 정확한 결과로 갱신될 기회를 남긴다. 이 구조가 단순 TTL 캐시를 적응형 캐시로 전환한다.
적용 가능 범위. Retrieval 계층이 있는 모든 에이전트 시스템에 일반화 가능. TTL 값은 도메인 전환 빈도에 맞춰 조정한다.
6. softThresholdTokens 6000 — 조기 압축
컨텍스트 압축 트리거. 한계 근처가 아니라 훨씬 이전에 작동시킨다.
작동 원리. 압축을 한계 직전에 실행하면 압축 대상 양이 지나치게 많아 정보 손실 비율이 커진다. 6000 토큰 임계값에서 미리 트리거하면 한 번에 압축할 양이 적어 의미 손실이 줄어든다.
측정. 압축 자체가 모델 응답 품질을 떨어뜨리는 빈도가 감소. 조기 압축은 여러 번 나눠 수행되므로 각 세션의 누적 손실이 선형이 아닌 완만한 곡선으로 증가한다.
7. Retain 4 카테고리 + c=X 신뢰도
저장되는 내용에 메타데이터 두 축을 부여한다: 카테고리 태그와 신뢰도.
카테고리 태그. - W = world fact (세계에 대한 사실) - B = behavior pattern (행동 패턴) - O = opinion (의견) - S = source pointer (출처 포인터)
신뢰도 c=. 0~1 사이 값. confidence-decay와 결합되어 시간에 따라 자동으로 감쇠한다.
작동 원리. decay 함수는 카테고리별로 다르게 작동한다 — 오래된 의견(O)은 자동으로 약해지고, 오래된 사실(W)은 감쇠 계수가 0에 가까워 거의 약해지지 않는다. 이 구분이 "사실은 안정적, 해석은 재검토 대상"이라는 정보 위생을 시스템 수준에서 강제한다.
공통 패턴: 모름에 자리 주기
7가지 교훈을 관통하는 단일 원리.
시스템이 모른다는 사실을 표현할 자리를 만들어 줘라.
exit-code split은 "이게 실패인지 정상인지"를 표현한다.c=신뢰도는 "이 정보가 얼마나 확실한지"를 표현한다.Resolution L0/L1/L2는 "이 검색이 얼마나 정확한지"를 표현한다.
모름에 전용 표현 자리를 둔 시스템은 자기 점검이 가능해진다. 불확실성을 숨기지 않는 인터페이스가 관측가능성(observability)의 실질적 출발점이다.
이식성: Hermes 포팅 매핑
7가지 교훈은 모두 백엔드 독립적이다. Hermes로 옮길 때 대응 지점은 다음과 같다.
| 교훈 | Hermes 대응 지점 |
|---|---|
| exit-code convention | cron 페이로드 |
| page_gap | memcore 파라미터 |
| cold-start 120s | Hermes hook |
| TTL 60min + Resolution | prefetch 캐시 |
| softThreshold 6000 | context_compressor 설정 |
| Retain 4 카테고리 | ingest 파이프라인 |
| Warning 자동 해소 | audit 루프 |
모두 1:1 이식 가능한 구조적 설정이다.
정리: 큰 수정 vs 한 줄짜리 수정
큰 리팩터링은 통상 더 큰 버그를 동반한다. 장기 운영에서 가장 효과적이었던 개선은 기준값 한 줄 / 정의 한 줄 수준의 수정이었다. 공통 속성은 세 가지다.
- 국소성 — 수정 범위가 한 파일·한 줄 이내.
- 의미 계층의 변경 — 값만 바꾸는 게 아니라 "이 값이 무엇을 의미하는가"를 재정의.
- 관측가능성 향상 — 수정 후 로그가 이전보다 더 많은 정보를 담게 됨.
열린 질문
- 카테고리 태그(W/B/O/S) 4개로 충분한가? 장기적으로는 더 세분화가 필요한 도메인이 나타날 수 있다.
page_gap=50은 현재 운영 규모에서 최적이지만, 청크 밀도가 다른 도메인(예: 고빈도 대화 vs 저빈도 문서)에서 동일한 값이 유효할지는 재측정이 필요하다.c=신뢰도의 decay 곡선은 현재 지수형이다. 비선형 감쇠(예: 스텝 함수)가 특정 카테고리에서 더 정확할 가능성.
적용하려는 시스템의 도메인 특성에 따라 값은 조정되어야 하며, 본문의 수치는 출발점으로 참고할 때 유효하다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기