Lemmalog: LLM 에이전트에게 취약점 연구를 위한 점진적, 사실 기반 메모리를 제공하기 위한 Datalog 사용

TL;DR

Lemmalog은 관찰 내용을 구조화된 사실로 저장하고 논리 규칙으로 결론을 도출하며, 무효화된 사실을 자동으로 철회하는 Datalog 기반의 메모리 계층입니다. 이로 인해 쿼리 컨텍스트 크기가 훨씬 작아졌습니다 (2–3 k 토큰 대 >100 k), LongMemEval 및 LoCoMo 벤치마크에서 경쟁력 있는 성능을 보였습니다.


문제: LLM은 현재 참인 사실을 잊어버린다

LLM 에이전트가 취약점 연구를 지원할 때, 대규모 코드베이스를 올바르게 탐색하고 공격 벡터를 제안할 수 있습니다. 그러나 몇 시간이 지나면 모델이 이미 반박된 가정이 무엇인지 잊어버리기 시작합니다. 다음과 같은 문제가 발생할 수 있습니다:

  • 이미 배제된 접근 방식을 다시 제안합니다.
  • 잘못된 관찰에서 계속 추론합니다.
  • 대화 기록에서 더 일찍 등장한 사실로 인해 수정된 사실을 여전히 참으로 간주합니다.

기존의 메모리 솔루션은 전체 대화를 저장하거나 과거 메시지를 임베딩하고 가장 관련 있는 조각을 검색합니다. 이는 과거 정보를 찾는 데는 효과적이지만, 검색된 사실이 현재 지식 상태를 반영한다는 보장은 없습니다.


메모리를 프로그램 분석으로 재정의하기

프로그램 분석은 사실(예: calls(foo, bar))과 규칙(예: 전이적 호출 도달 가능성)의 집합을 유지합니다. 고정점 계산을 통해 가능한 모든 결론을 도출하고, 입력이 변경될 때 영향을 받는 사실만을 증분적으로 업데이트합니다.

이를 LLM 에이전트에 적용하면 명확한 목표가 생깁니다:

  • 현재 사실의 집합을 유지합니다.
  • 결론을 자동으로 도출합니다.
  • 새로운 증거가 사실을 반박하면 이를 철회하고, 의존하는 결론으로 전파합니다.

Lemmalog 소개

Lemmalog (https://github.com/JordyZomer/lemmalog)는 위 아이디어를 구현합니다:

  1. 퍼지 프론트엔드 – LLM이 디버거 출력, 소스 코드, 노트와 같은 자연어 입력을 원자적 사실로 파싱합니다.
  2. 결정론적 백엔드 – Datalog 엔진이 이러한 사실을 저장하고 사용자 정의 규칙을 적용하며 도출된 사실을 계산합니다.
  3. 증분 업데이트 – 사실을 추가하면 전방 추론이 트리거되고, 사실을 제거하면 후방 철회가 트리거되어 여전히 유효한 도출을 보존합니다.
  4. 근거 추적 – 각 도출된 사실은 정확한 지지 사실과 규칙의 체인을 기록하므로 "왜?" 질문에 답할 수 있습니다.
  5. 시간 간격 – 사실은 유효성 윈도우로 주석을 달 수 있어, "지금 primitive_a는 타당한가?" 또는 "왜 과거에는 타당하다고 생각했는가?"와 같은 질의가 가능합니다.

철회 및 다중 도출 처리

Datalog 엔진은 사실이 참인 이유를 알아야 합니다. 다음을 고려해 보세요:

a.
b.
c :- a.
c :- b.

a가 제거되면 c는 여전히 참이 됩니다. 왜냐하면 b가 여전히 c를 도출하기 때문입니다. Lemmalog은 모든 도출 경로를 추적하므로, 제거는 마지막 지지 사실이 사라지는 결론만 철회합니다.

이는 후보 공격이 여러 독립적인 원천을 가질 수 있는 취약점 연구와 유사합니다. 후보는 모든 지지 원천이 무효화될 때까지 유효성을 유지합니다.


근거 추적: "왜?" 질문하기

Lemmalog이 종속성 그래프를 기록하기 때문에, 사용자는 어떤 도출된 사실에 대한 근거를 요청할 수 있습니다. 예시 출력:

candidate_3_is_exploitable
|
+-- attacker_controls_pointer
|   |
|   +-- observation_41
+-- pointer_reaches_target
+-- observation_57
+-- rule_12

observation_41이 나중에 거짓임이 입증되면, 시스템은 자동으로 상위 수준의 결론을 철회합니다.


시간적 사실과 유효성 간격

사실은 삭제되지 않고 시간이 지남에 따라 변화할 수 있습니다. Lemmalog은 이를 다음과 같이 표현합니다:

viable(primitive_a) [10:14, 12:37)
not_viable(primitive_a) [12:37, ...)

질의는 현재 상태 또는 과거 결정을 이끌어낸 역사적 추론에 대해 묻을 수 있으며, 동일한 논리 세계에 모순되는 사실을 저장하지 않아도 됩니다.


왜 벡터 데이터베이스가 아닌가?

벡터 저장소는 관련 있는 과거 조각을 검색하는 데 뛰어나지만, 다음과 같은 점에서 한계가 있습니다:

  • 검색된 사실이 철회되었음을 감지하지 못합니다.
  • 철회의 영향을 의존하는 결론으로 전파하지 못합니다.
  • 추가 논리 없이 "현재 참인 것은 무엇인가?"에 답할 수 없습니다.

Lemmalog은 두 번째 문제를 해결하지만, 벡터 저장소는 첫 번째 문제(원시 조각의 의미적 검색)에 여전히 사용될 수 있습니다. 두 계층은 서로 보완되며, 실제로 자주 함께 사용됩니다.


벤치마크 평가

LongMemEval (102개 질문)

지표 Lemmalog PropMem SimpleMem Full‑Context GPT‑4.1
F1 0.463 ± 0.010 0.550 0.480 0.197
정확도 0.575 ± 0.004
쿼리당 토큰 수 ~2.7 k ~104 k

지식 업데이트 (취약점 연구와 가장 유사한 범주)는 0.579를 기록해 PropMem (0.528)을 앞서고, 전체 컨텍스트 (0.202)를 훨씬 뛰어넘었습니다.

LoCoMo (1,986개 질문)

시스템 F1
PropMem 0.605
OpenClaw 0.557
Full‑Context 0.542
Lemmalog 0.533 ± 0.001
Hindsight 0.489
Graphiti 0.416
Memory‑R1 0.389
SimpleMem 0.358

Lemmalog은 전용 메모리 시스템 중 세 번째로 높은 순위를 기록했으며, 쿼리당 ~6배 적은 토큰(3.4 k 대 18.9 k)을 사용했습니다.


벤치마크에서 얻은 교훈

  • 엔티티 해석 – (예: "Honda Civic" 대 "the Civic")과 같은 언급을 정규화함으로써 무의미한 별개의 사실을 방지했습니다.
  • 날짜 처리 – 추출된 날짜를 비교 가능한 정수로 변환함으로써 주요 시간적 추론 버그를 수정했습니다.
  • 집계 가시성 – 줄 수를 세는 작업이 과도하게 엄격한 스테머에 의해 필터링되었고, 이를 노출시킴으로써 올바른 답변을 복구했습니다.
  • 리더 지시사항 – "정답을 포함하는 단일 사실이 없으면 거부하라"는 지나친 엄격함이 많은 거짓 음성 결과를 초래했고, "지지되지 않은 전제"와 "집계가 필요함"을 분리함으로써 이를 해결했습니다.

모든 개선은 모델 확장이 아닌 엔지니어링 수준의 수정이었습니다.


프론트엔드가 생각보다 더 중요하다

성능 향상의 가장 큰 요인은 더 나은 정보 추출엔티티 재결합이었으며, 더 똑똑한 Datalog 평가자보다 훨씬 중요했습니다. 자연어를 올바른 예술자로 파싱하는 것이 핵심 장애물이며, 사실이 깨끗해지면 논리 엔진이 무료로 무거운 작업을 수행합니다.


여전히 부족한 점

  • 조건부 또는 확률적 지식 – 순수 Datalog은 단조롭습니다. "여행 중 친구와 함께라면 제외하고 조용한 레스토랑을 선호한다"와 같은 미묘한 진술은 평탄화되면서 뉘앙스를 잃습니다.
  • 추론 / 부드러운 추론 – Lemmalog의 LoCoMo 추론 범주에서의 F1은 0.164로 PropMem(0.289)보다 뒤처졌습니다. 조건부 규칙이나 하이브리드 퍼지 논리 계층을 추가하면 이 격차를 메울 수 있습니다.
  • 다중 세션 추출 – 실패는 종종 잘못된 추론 때문이기보다는 누락된 사실 때문이었습니다. 실제 장시간 작동하는 에이전트를 위해 추출기의 커버리지를 개선하는 것이 필수적입니다.

아키텍처 개요

LLM (퍼지 프론트엔드) ──► 사실 추출 ──► Lemmalog (Datalog 엔진)
      ▲                                 │
      │                                 ▼
   자연어 ◄── 사실 및 근거 렌더링 ──► 답변 생성
  • 에이전트 메모리 = 구조화된 사실 + 근거
  • 에피소딕 메모리 = 원본 조각, 임베딩, BM25/그래프 부스팅
  • 쿼리 경로 = 관련 사실 검색 → 작고 작은 Datalog 슬라이스 실행 → LLM이 결과를 자연어로 변환

커뮤니티 반응 (선택된 HN 댓글)

"LLM은 요청 처리의 터미널에 있어야 하며, 중간 계층은 Datalog과 같은 엄격한 표현이어야 합니다." – @sim04ful

"저는 Claude 노트를 SQLite에 인덱싱하고 모델이 필요로 하는 것만 쿼리해봤습니다. Datalog은 훌륭한 다음 단계처럼 보입니다." – @akkad33

"이것은 이전의 AI 시도(Cyc, 지식 그래프)와 유사하지만, 퍼지 추출을 위한 현대적인 LLM 프론트엔드를 갖추고 있습니다." – @keeda

"가장 큰 고통은 정보를 제거하는 것입니다. Lemmalog의 명시적 철회는 Claude가 반박된 사실을 잊는 문제를 매일 겪고 있는 저에게 해결책을 제공합니다." – @iamflimflam1

이 댓글들은 커뮤니티가 퍼지 추출과 결정론적 추론의 분리를 전망되는 방향으로 보고 있음을 강화합니다.


시간이 지남에 따른 토큰 절약

턴 수 전체 컨텍스트 토큰/쿼리 Lemmalog 토큰/쿼리
50 ~100 k ~2.5 k
100 ~200 k ~2.5 k
500 ~1 M ~2.5 k

Lemmalog의 쿼리 크기가 일정하게 유지되므로, 컨텍스트 창 제한에 도달하지 않고도 임의로 긴 조사에 스케일링할 수 있습니다.


결론

Lemmalog은 프로그램 분석 기술—사실, 규칙, 증분 고정점 계산, 근거—이 LLM 에이전트의 단순한 대화 재생을 대체할 수 있음을 보여줍니다. 이 시스템은:

  • 무효화된 사실을 자동으로 철회함으로써 현재 상태를 정확하게 유지합니다.
  • 토큰 수가 수십 배 적은 저렴하고 설명 가능한 쿼리를 제공합니다.
  • 표준화된 메모리 벤치마크에서 지식 업데이트 성능을 향상시킵니다.

결과는 아직 최첨단 수준은 아닙니다 (PropMem이 여전히 전반적으로 선두), 하지만 성과는 더 큰 모델이 아닌 구체적인 CS 솔루션의 공학적 개선에서 나왔습니다. 다음 단계는 Lemmalog을 실제 다시간 취약점 조사에서 실행하고, 실제로 사라진 가설이 다시 부활되는 것을 방지하고 환각된 관계를 줄이는지 측정하는 것입니다.

소스 코드는 https://github.com/JordyZomer/lemmalog 에서 이용 가능합니다.

Sources

관련

  • 프로젝트
  • 프로젝트
  • Dispatch
  • Dispatch
  • Dispatch