6 months of .md memory, conflicting facts are the hard part
TL;DR Highlight
AI 에이전트 메모리를 마크다운 파일로 6개월 운영하면서 발견한 지식 충돌 문제와 Telegram 봇으로 사람이 직접 해결하는 에스컬레이션 패턴 소개
Who Should Read
로컬 AI 코딩 에이전트를 직접 운영하면서 장기 메모리 아키텍처를 고민하는 개발자. 특히 에이전트가 시간이 지나면서 잘못된 사실을 학습하는 문제를 겪고 있는 분들.
Core Mechanics
- .md 파일을 파일시스템으로 쓰는 에이전트 메모리 구조를 6개월 운영하고 클라우드로 마이그레이션 중 — 크로스링크, 청크 truncation, 지식 추출 기능을 추가했음.
- 메모리 레이어를 두 계층으로 설계: 하루에도 여러 번 업데이트되는 '웜(warm)' 지식 레이어 + 크로스링크가 많은 '아카이브(archive)' 레이어.
- 지식베이스에 서로 모순되는 사실들이 쌓이면 에이전트가 hallucination(모델이 잘못된 정보를 사실처럼 말하는 현상)을 일으키는 문제를 발견.
- 기존 서드파티 툴들은 최신성(recency) 기준으로 충돌을 자동 해결하지만, 이 개발자는 self-hosted + human-in-the-loop 방식을 선택.
- Telegram 봇을 통한 에스컬레이션 메커니즘 구현: 충돌 감지 시 사람에게 알림을 보내고, 사람의 판단 결과를 임베딩해서 이후 충돌 해결의 '진실(truth)'로 활용.
- 3주간 운영 결과 hallucination이 개선된 것으로 보이나, '언제 자동 해결하고 언제 사람에게 넘길지'와 '사람 입력을 진실로 쓰는 게 맞는지'는 여전히 미해결 질문.
Evidence
- 6개월 이상 .md 파일시스템 기반 에이전트 메모리를 실제 운영한 실전 경험 기반 — 특정 수치 벤치마크는 없으나 장기 운영 사례.
- 에스컬레이션 메커니즘 도입 후 3주간 hallucination이 개선된 것으로 체감 — 정량 지표는 없음.
- 충돌 해결 결과를 임베딩(텍스트를 벡터로 변환해 검색 가능하게 하는 기법)해서 유사 충돌 시 재활용하는 방식으로 점진적 개선 구조 구축.
How to Apply
- 에이전트 메모리를 '자주 바뀌는 웜 레이어(최근 학습/결정)'와 '잘 안 바뀌는 아카이브 레이어'로 분리하고, 두 레이어 간 크로스링크를 .md 파일 내부에 명시적으로 추가하면 맥락 추적이 훨씬 쉬워짐.
- 지식베이스에 새 사실을 추가할 때 기존 내용과 모순 여부를 체크하는 로직을 넣고, 충돌 감지 시 Slack/Telegram 봇으로 사람에게 에스컬레이션하는 파이프라인을 만들면 hallucination을 사전에 차단 가능.
- 사람이 내린 충돌 해결 결정을 별도 '진실 데이터셋'으로 임베딩해두면, 이후 유사한 충돌이 생겼을 때 벡터 유사도 검색으로 자동 해결 가능 범위를 점진적으로 넓힐 수 있음.
Code Example
# 충돌 감지 + Telegram 에스컬레이션 패턴 예시 (Python 슈도코드)
import json
from pathlib import Path
def check_conflict(new_fact: str, existing_facts: list[str], embedder, threshold=0.85) -> list[str]:
"""
새 사실과 기존 사실들 사이의 의미적 충돌 감지
"""
new_vec = embedder.encode(new_fact)
conflicts = []
for fact in existing_facts:
sim = cosine_similarity(new_vec, embedder.encode(fact))
if sim > threshold: # 비슷한 주제인데
# LLM에게 모순 여부 판단 요청
prompt = f"""다음 두 사실이 서로 모순되는지 판단해줘.
사실1: {fact}
사실2: {new_fact}
모순이면 'CONFLICT', 아니면 'OK'로만 답해."""
result = llm.complete(prompt)
if 'CONFLICT' in result:
conflicts.append(fact)
return conflicts
def escalate_to_human(conflict_pair: tuple, bot_token: str, chat_id: str):
"""
Telegram으로 충돌 사실 쌍을 사람에게 전송
"""
import requests
msg = f"""⚠️ 지식 충돌 감지!
기존: {conflict_pair[0]}
신규: {conflict_pair[1]}
어떤 게 맞나요?
1️⃣ 기존 사실 유지
2️⃣ 신규 사실로 교체
3️⃣ 둘 다 틀림 (직접 입력)"""
requests.post(
f"https://api.telegram.org/bot{bot_token}/sendMessage",
json={"chat_id": chat_id, "text": msg}
)
def save_resolution(fact_a: str, fact_b: str, truth: str, resolution_db_path: str, embedder):
"""
해결 결과를 임베딩해서 나중에 유사 충돌 자동 해결에 활용
"""
resolution = {
"fact_a": fact_a,
"fact_b": fact_b,
"truth": truth,
"embedding": embedder.encode(f"{fact_a} vs {fact_b}").tolist()
}
db = json.loads(Path(resolution_db_path).read_text())
db.append(resolution)
Path(resolution_db_path).write_text(json.dumps(db, indent=2))
# 메모리 구조 예시 (.md)
"""
# warm_memory.md ← 오늘 업데이트된 학습/결정
## 최근 결정
- 2024-01-15: auth 모듈은 JWT 방식 사용 [[decisions/auth.md]]
- 2024-01-16: JWT 대신 session 기반으로 변경 ← 충돌 감지 대상!
# archive/auth.md ← 크로스링크된 아카이브
## 관련 결정: [[warm_memory.md#최근-결정]]
## 히스토리: ...
"""Terminology
Related Papers
Show HN: ctx – Search the coding agent history already on your machine
Claude Code, Cursor, Codex 등 코딩 에이전트가 이전 세션의 논의·결정·실패 시도를 잊지 않도록 SQLite로 인덱싱해 재사용할 수 있게 해주는 오픈소스 CLI 도구다.
Micro-Agent: Beat Frontier Models with Collaboration Inside Model API
vLLM 팀이 단일 모델 API 호출 뒤에서 여러 모델이 협업하는 'Micro-Agent' 개념을 공개했습니다. 별도의 에이전트 코드 없이 라우터 레이어에서 모델 조합을 실행해 GPT-4급 결과를 더 저렴하게 낼 수 있다는 아이디어입니다.
Ornith-1.0: self-improving open-source models for agentic coding
Gemma 4와 Qwen 3.5를 기반으로 파인튜닝한 코딩 특화 오픈소스 모델로, RL(강화학습)을 통해 스캐폴드(에이전트 실행 구조)까지 함께 최적화하는 방식을 주장하지만, 커뮤니티에서는 벤치마크 과최적화에 불과하다는 의심을 받고 있다.
Entity Binding Failures in Tool-Augmented Agents
AI 에이전트가 올바른 도구를 선택해도 잘못된 대상에 실행하는 'Entity Binding 실패' 문제를 정의하고, 이를 막는 실행 정책을 평가한 논문.
Herdr: Agent multiplexer that lives in your terminal
여러 AI 코딩 에이전트(Claude, Codex 등)를 하나의 터미널에서 동시에 실행·관리할 수 있는 Rust 기반 오픈소스 툴로, tmux처럼 세션이 유지되고 SSH로 원격 접속도 가능해 멀티 에이전트 워크플로우를 크게 단순화해준다.
Ornith-1.0: Self-scaffolding LLMs for agentic coding
모델이 문제 풀이 전략(scaffold)을 직접 생성하고 개선하는 자기강화 학습 프레임워크를 적용한 오픈소스 코딩 특화 LLM으로, 9B 소형 모델부터 397B 대형 모델까지 라인업을 갖추고 SWE-Bench 등 주요 벤치마크에서 Claude Opus 4.7을 능가하는 성능을 보여줬다.