LLM 메모리를 Datalog로 바꿨더니 프로그램 분석이 됐다 (Lemmalog)
I accidentally turned LLM memory into program analysis
TL;DR Highlight
LLM 메모리를 Datalog 규칙으로 유지했더니 지식 갱신 문항에서 최고점이 나왔다
Who Should Read
장시간 에이전트 작업에서 이미 반증된 가정을 LLM이 계속 쓰는 문제로 고민하는 에이전트 개발자
Core Mechanics
- 기억은 '검색'과 '현재 참'으로 나뉜다
- 벡터 DB는 질문과 관련 있는 과거 기록을 잘 찾는다.
- 하지만 그 기록이 나중에 반증됐는지, 그 위에 쌓인 결론이 무효인지는 모른다.
- LLM은 사실 추출만, 추론은 DB가 한다
- LLM이 로그·디버거 출력·자연어를 구조화된 사실로 바꾼다.
- 규칙으로 결론을 도출하고 관리하는 일은 Datalog 엔진(Lemmalog)이 한다.
- 사실을 빼면 결론도 자동 무효화된다
- 결론이 어떤 사실에서 나왔는지 추적해 근거가 둘 이상이면 하나가 빠져도 유지한다.
- 근거가 하나도 안 남으면 결론도 사라진다.
- '왜 그렇게 믿는지' 물을 수 있다
- 모든 결론에 출처(provenance, 어떤 관찰·규칙에서 나왔는지)가 붙는다.
- 출처 없는 결론은 유지되는 상태에 들어가지 못한다.
- 사실에 유효 구간을 붙여 과거 상태도 보존한다
- 예: viable(primitive_a) [10:14, 12:37), not_viable(primitive_a) [12:37, ...).
- 지금 상태와 '예전엔 왜 그렇게 생각했나'를 모두 답할 수 있다.
Community Reactions
- 풀컨텍스트 대비 지식 갱신에서 앞섰다
- LongMemEval Knowledge Update에서 Lemmalog 0.579, PropMem 0.528, Full Context 0.202였다.
- 반면 Multi-Session은 Lemmalog 0.211로 PropMem 0.582보다 크게 낮았다.
- LoCoMo 전체에서는 3위권이다
- 3회 실행 F1 0.533±0.001로 PropMem 0.605, OpenClaw 0.557, Full Context 0.542 다음이다.
- 적대적(거짓 전제) 질문은 0.707로 Full Context 0.509보다 높았다.
- 실패 원인은 추론이 아니라 추출 누락이었다
- Multi-Session 실패는 연결 오류가 아니라 사실이 아예 추출되지 않은 경우가 많았다.
- 추출 모델은 Claude Sonnet 4.6이고 이후 단계는 벤치마크 표준 reader·judge를 썼다.
- 긴 리서치에서 반증된 사실이 남는 문제는 흔하다는 경험담
- 댓글에서 Claude가 반증된 내용을 여러 곳에 기록해 두고 계속 사실처럼 쓴다는 경험이 나왔다.
- 하드웨어 장애 조사에서 배제한 원인을 LLM이 계속 되살려 반복해서 일깨워야 했다는 경험도 있었다.
- 결정 로그 파일로 비슷한 문제를 푼다는 경험담
- 댓글에서 CLAUDE.md로 모든 결정을 시점·맥락과 함께 파일에 기록하게 했더니 잘 동작한다는 사례가 있었다.
How to Apply
- 에이전트 작업 노트에 '철회 목록'을 두기
- 오늘 쓰는 CLAUDE.md나 작업 노트에 '기각된 가정'과 '그 가정에 기댄 결론' 섹션을 만들어라.
- 가정을 뒤집을 때마다 의존 결론을 같이 지우거나 '무효' 표시하도록 지시하라.
- 메모리를 검색용과 현재 상태용으로 나누기
- 벡터 검색 메모리는 그대로 두고, 현재 참인 사실만 담는 별도 저장소를 추가하라.
- 답변 시 현재 상태를 우선 쓰고 검색 결과는 보조로 쓰게 하라.
- 결론마다 근거 ID를 강제하기
- 에이전트가 결론을 쓸 때 근거 관찰 ID를 필수 필드로 요구하라.
- 근거 없는 결론은 상태에 반영하지 않도록 검증 단계를 넣어라.
- '근거 확인' 지시가 거절을 부르는지 점검하기
- 환각 방지 프롬프트를 넣었다면 답할 수 있는 질문 세트로 거절률을 측정하라.
- 전제가 없으면 거절, 근거가 있으나 세기·비교·정렬이 필요하면 추론하라고 구분해 써라.
Try It
# Claude나 ChatGPT 대화 맨 앞에 붙여넣기 (논문 방법의 간이 버전: Datalog 없이 프롬프트로 흉내)
너는 조사 보조 에이전트다. 대화 내내 아래 형식의 '유지 상태'를 관리하라.
- FACTS: 번호 붙은 관찰 (F1, F2...). 각각 상태: 유효/철회
- CONCLUSIONS: 번호 붙은 결론 (C1...). 각각 근거 FACT 번호를 반드시 표기
- 규칙: FACT가 철회되면, 그 FACT에만 의존하는 CONCLUSION을 즉시 '무효'로 바꿔라. 다른 유효한 근거가 남은 결론은 유지하라.
- 근거 번호가 없는 결론은 쓰지 마라.
- 매 답변 끝에 갱신된 상태를 출력하라.
주제: {{조사 주제}}
지금부터 내가 관찰을 알려줄 테니 상태를 갱신하라. 첫 관찰: {{관찰 1}}
이어서 해 볼 것: 나중에 '{{관찰 1}}은 틀렸다'고 말한 뒤 어떤 결론이 무효가 되는지, 왜 그런지 설명하게 시켜 보라.Terminology
관련 논문
같은 시뮬레이션, 다른 근거: 도구 출력을 파일로 넘기면 LLM 에이전트 정확도가 어디서 깎이나
긴 툴 출력을 파일로 넘기자 GPT-5.1은 정확도 11.3%p 하락, 정식 출력 지정하니 회복
가짜 뉴스가 진짜 폭락을: LLM 트레이딩 에이전트 대상 정보 주입 공격
가짜 헤드라인 한 줄로 LLM 트레이딩 에이전트 62%를 조종했다(프롬프트 주입은 14%)
Harness Engineering 101: LLM은 뇌, harness는 몸
에이전트는 JSON 배열을 관리하는 루프이고, 16개 챕터로 직접 만들어 본다
Harness²: 에이전트 harness를 스스로 고쳐 쓰는 재귀 최적화 프레임워크
모델은 고정하고 harness를 재귀로 고쳤더니 벤치마크 점수가 최대 11.8%p 올랐다
해고된 Savannah 경찰관, ICE 요원 남편에게 Flock 계정 공유
경찰관이 Flock 계정을 남편(ICE 요원)에게 공유했고, 감사에서 983건 검색이 드러나 해고됐다
tmux와 Claude Code: 세션, send-keys, 그리고 한계선
tmux로 Claude Code 여러 개를 돌리면 편하지만 에이전트 4개쯤에서 한계가 온다
Hybrid Reasoning Agents: 잠재 공간에서 생각하고 텍스트로 행동하는 LLM 에이전트
잠재 공간 추론과 텍스트 도구 호출을 섞었더니 성능 10.4%↑, 토큰 최대 54.7%↓
Related Resources
- https://pwning.systems/posts/llm-memory-program-analysis/
- https://en.wikipedia.org/wiki/Cyc
- https://en.wikipedia.org/wiki/Answer_set_programming
- https://github.com/deepclause/deepclause-sdk
- https://github.com/deepclause/deepclause-pi
- https://github.com/cookiengineer/exocomp
- https://github.com/cookiengineer/gobayashi
- https://github.com/cookiengineer/gonano
- https://mirekrusin.com/cave