엔터프라이즈 RAG의 측정 불가능한 사각지대: FalkorDB 기반 시간적 주장 그래프로 해결
요약
엔터프라이즈 지식은 단순한 사실이 아닌 시간에 구속된 주장의 집합입니다. 기존 RAG 파이프라인은 오래되거나 폐기된 정보를 포함하는 문서에 의존하여 잘못된 답변을 생성할 위험이 있습니다. 본 글은 FalkorDB 기반의 'Canon'이라는 시간적 주장 그래프를 도입하여, LLM이 컨텍스트를 받기 전에 증거의 유효성을 판단하는 방법을 제시합니다.
핵심 포인트
- 엔터프라이즈 지식은 시간에 구속된 주장의 형태로 관리되어야 합니다.
- 기존 RAG는 오래되거나 폐기된 정보에 취약한 '시간적 사각지대'가 존재합니다.
- Canon은 FalkorDB를 활용하여 문서를 시간적 주장 그래프로 구조화합니다.
- 질의 시점(Temporal Cut)에 증거의 유효성을 판단하는 것이 핵심입니다.
엔터프라이즈 RAG의 측정 불가능한 사각지대: FalkorDB를 이용한 시간적 주장 그래프로 해결

엔터프라이즈 지식은 사실(facts)의 집합이 아닙니다. 그것은 **시간에 구속된 주장(time-bound assertions)**입니다.
거의 모든 프로덕션 RAG (Retrieval-Augmented Generation) 파이프라인이 겪는 실패 모드가 있습니다:
직원이 질문합니다: "저희 티어-1 엔터프라이즈 할인 기준은 얼마인가요?"
리트리버(retriever)가 50만 개의 내부 문서를 검색합니다.
2022년의 Confluence 페이지를 발견했는데, 거기에는 "할인은 $100k부터 적용됩니다." 라고 적혀 있습니다.
BM25 점수는 매우 높습니다. 임베딩 코사인 유사도는 0.94입니다.
리트리버는 이를 컨텍스트에서 #1 또는 #2 순위로 매깁니다.
LLM은 이를 읽고 완전한 확신을 가지고 응답합니다: "저희 할인 기준은 $100k입니다."
문서는 매우 관련성이 높습니다. 하지만 완전히 잘못된 정보이기도 합니다.
6개월 후, 재무 부사장(VP Finance)이 업데이트를 서명했습니다: "2023년 3분기부터 효력이 발생하는 엔터프라이즈 할인 기준은 $250k으로 상향 조정되며, 이전 모든 지침을 대체합니다."
다른 8개의 내부 문서는 여전히 예전의 $100k 가격을 인용하고 있습니다. 만약 에이전트가 다수 투표(majority voting)를 사용한다면, 오래된 문서가 8 대 1로 승리합니다. 리트리버가 벡터 유사도(vector similarity)를 사용하더라도, 오래된 문서가 개정 메모보다 질문 구문과 더 잘 일치합니다.
모델이 환각(hallucinate)을 일으킨 것이 아닙니다. 주어진 증거를 충실하게 요약했을 뿐입니다.
이를 해결하기 위해, 저희는 FalkorDB 기반의 엔터프라이즈 AI용 시간적 진실 계층인 Canon을 구축했습니다. Canon은 리트리벌과 생성 사이에 직접 위치하여, 언어 모델이 보기 전에 어떤 증거가 여전히 유효한지 결정하는 시간적 주장 그래프로 문서를 변환합니다.
핵심 원시 요소: 시간적 절단(The Temporal Cut)
기업 코퍼스를 단순히 정리되지 않은 텍스트 청크의 버킷으로 취급하는 대신, Canon은 주장(claim)들을 시간적 그래프(temporal graph)로 구조화합니다.
[2022 Confluence Doc]
│
(asserts: $100k)
...
기업 질의가 도착하면, Canon은 **시간적 절단(Temporal Cut)**을 실행합니다:
- 표준 고재현율 검색(high-recall retrieval) (BM25 또는 임베딩 벡터)을 사용하여 후보 문서 검색을 수행합니다.
- 그래프 순회(Graph Traversal): FalkorDB에서 검색된 후보 문서들이 주장하는 명제들을 검사합니다.
- 폐기된 증거 식별: 나중에 발생한 유효한
CanonEvent로부터 들어오는[:SUPERSEDES]관계를 가진 모든 명제는 무효화됩니다. - 만료된 문서 제거: 무효화된 문서들을 프롬프트 창에서 제거합니다.
- 백필(Backfill): 모델이 여전히 전체 컨텍스트 창을 받을 수 있도록 원래 검색 순위에서 다음 최적의 후보를 가져옵니다.
BM25 Candidates: [Doc A (Rank 1), Doc B (Rank 2), Doc C (Rank 3), Doc D (Rank 4)]
│
FalkorDB Check: [Doc B asserts Proposition_129, which was SUPERSEDED by Event_42]
...
이 아키텍처의 장점은 책임 분담에 있습니다. 검색기(retriever)가 무엇이 관련 있는지 결정하고. FalkorDB 그래프가 무엇이 여전히 진실인지 결정합니다.
왜 FalkorDB가 엔진인가 (단순한 저장소가 아닌)
질의 시간에 발생하는 시간적 그래프 순회는 LLM 파이프라인에 200ms의 지연 시간을 추가할 수 없습니다. 그래프 해상도는 프롬프트 직렬화 전에 단일 자릿수 밀리초 내에 이루어져야 합니다.
저희는 세 가지 특정 이유로 FalkorDB를 핵심 그래프 엔진으로 선택했습니다:
1. 눈부신 빠른 순회 (<3ms)
FalkorDB의 GraphBLAS 희소 행렬 표현과 인메모리 실행은 다중 점프 도달 가능성(multi-hop reachability) 질의를 2~4 밀리초 만에 해결합니다. 상호 작용하는 에이전트 루프에서 이 오버헤드는 실질적으로 눈에 띄지 않습니다.
2. 시간적 계보를 위한 표현력이 풍부한 Cypher
Canon의 모든 주장 전환은 정확한 증거 바이트 스팬, 타임스탬프 및 귀속(attribution) 엣지를 가진 CanonEvent 노드로 재현됩니다.
검색된 명제(proposition) 중 어떤 것이 대체되거나 이의가 제기되었는지 확인하기 위해 Canon은 단일 Cypher 쿼리를 실행합니다:
MATCH (p:Proposition)-[:ASSERTED_IN]->(a:Assertion)-[:SOURCED_FROM]->(art:Artifact)
WHERE art.id IN $retrieved_doc_ids
OPTIONAL MATCH (newer_event:CanonEvent)-[:SUPERSEDES]->(p)
...
만약 is_superseded가 true라면, 해당 문서는 즉시 잘립니다.
3. 개체 및 별칭 해상도 (Company Brain)
엔터프라이즈 문서들은 같은 사람, 팀, 제품을 수십 가지 이름으로 언급합니다("T. Farhan", "Toufiq", "VP Eng", "Head of Engineering").
FalkorDB에서는 985개의 Person 노드와 300개의 Alias 노드를 포함하여 총 1,488개 노드와 **1,661개 관계(relationship)**를 저장하며, 이들은 [:RESOLVES_TO] 간선(edge)으로 연결됩니다. 사용자가 업데이트 이전의 누군가의 결정 사항을 물어볼 때, FalkorDB는 모든 별칭을 해상하고 그들의 역사적 주장들을 끊김 없이 탐색합니다.
벤치마크: 511,958개 문서, 제로 프롬프트 치트
저희는 장난감 같은 합성 데이터셋으로 테스트하지 않았습니다. 공식적으로 인간이 라벨링한 충돌 질문을 포함하는 511,958개의 실제 엔터프라이즈 문서 (4.03 GB 코퍼스 데이터베이스)로 구성된 Enterprise RAG-Bench를 사용하여 Canon을 평가했습니다.
모든 테스트는 엄격한 제약 조건 하에서 실행되었습니다:
- 정확히 동일한 모델
- 정확히 동일한 프롬프트
- 정확히 동일한 BM25 리트리버(retriever)
- 정확히 동일한 10개 문서 컨텍스트 예산(context budget)
| 지표 | 표준 RAG 기준선 (Standard RAG Baseline) | Canon (FalkorDB) | 변화량 (Delta) |
|---|---|---|---|
| 벤치마크 정확도 | 70.0% | 82.5% | +12.5% |
| ... |
부정적 통제 (The Negative Control)
정확도가 +12.5%인 것이 컨텍스트에 포함된 단어 수가 적다는 것의 단순한 산물이 아님을 증명하기 위해, 저희는 부정적 통제를 실행했습니다: 동일한 수의 문서를 무작위로 잘라내는 방식.
결과: 이 무작위 제어는 **정확히 70.0%**를 기록했습니다 (기준선과 동일).
전체 성능 향상은 어떤 문서를 정확하게 잘라내야 하는지 아는 것에서 나옵니다.
실시간 검증 및 데이터베이스 재시작
엔터프라이즈 그래프는 실제 운영 환경 조건에서도 살아남아야 합니다. 저희는 FalkorDB에 대해 7가지 라이브 검사를 실행하는 자동화된 테스트 하네스(scripts/verify/verify_falkordb.py)를 구축했습니다:
- 연결 및 스키마 검증: 20개의 주장 키(claim keys), 19개의 해결된 전이(resolved transitions), 그리고 1개의 논쟁 중인 사례(contested case)를 검증합니다.
- 활성 대 논쟁 상태 무결성: 논쟁 중인 주장이 잘못된 해결로 강제되기보다는 정직하게 플래그 지정되는지 확인합니다.
- 시간적 절단 검증 (Temporal Cut Verification): 대체된 문서가 깨끗하게 필터링되고 백필(backfills)이 원시 코퍼스(raw corpus)와 비교하여 검증되는지 확인합니다.
- 적대적 대체 (Adversarial Supersession): 충돌하는 주장을 주입하고, 명시적인 대체 구문(explicit supersession syntax)이 반복 횟수보다 항상 우선권을 갖는지 확인합니다.
- 데이터베이스 재시작 지속성: 테스트는 실행 중간에 FalkorDB 컨테이너에
docker restart를 수행합니다. FalkorDB가 다시 부팅되면, 그래프를 재쿼리하며: 모든 상태(state), 관계(relationships), 그리고 주장 키(claim keys)가 100% 온전하게 유지됩니다.
7가지 검사 모두 통과했으며, 저희의 단위 테스트 스위트(unit test suite)는 그래프 연산, 검색(retrieval), API 직렬화 전반에 걸쳐 71/71개의 테스트를 성공적으로 실행했습니다.
직접 사용해 보기 (Try It Yourself) - 4가지 명령어만으로
저장소는 오픈 소스이며 완전히 재현 가능합니다:
# 1. 저장소 복제(Clone)
git clone https://github.com/toufiqfarhan0/falkor-hack.git
cd falkor-hack
...
대화형 UI와 함께 전체 스택을 실행하려면:
# 백엔드 API 시작 (포트 8000)
uv run uvicorn canon_api.app:app --port 8000
...
http://localhost:3000에 접속하여 라이브 대시보드를 검사하고, /cut 시각화기(visualizer)를 탐색하며, 실시간으로 쿼리를 테스트해 보세요.
우리가 배운 것 (What We Learned)
- 시간적 그래프가 없는 RAG는 근본적으로 취약합니다: 기업 코드베이스와 문서 저장소가 성장함에 따라, 가장 유사한 문서가 최신이 아닐 확률은 확실성에 가까워집니다.
- 그래프 데이터베이스는 추론 경로에 포함되어야 합니다: FalkorDB는 단순한 오프라인 지식 덤프용 데이터베이스가 아닙니다. 활성 생성(active generation) 중 인라인 쿼리 게이트(inline query gate) 역할을 할 만큼 충분히 빠릅니다.
- 정직한 시스템은 모호성에 대해 유보합니다: 두 개의 활성 문서가 명시적인 대체 조항 없이 충돌할 경우, Canon은 추측하거나 환각하지 않습니다. 대신, 역사적 맥락과 현재의 진실을 모두 보존하며 해당 충돌을 _논쟁 중(contested)_으로 표출합니다.
FalkorDB Hackathon 2026을 위해 제작되었습니다.
Repository: github.com/farhan0-code/graph-hack
Demo Video:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기