1. 단순 벡터 검색의 한계와 GraphRAG의 도래
전통적인 RAG 파이프라인은 질문과 텍스트 조각 간의 '의미적 유사도(Cosine Similarity)'만을 기준으로 문서를 검색합니다. 그러나 복잡한 기술 아키텍처나 방대한 노하우를 다룰 때는 "A 기술이 B 인프라에서 C 성능 지연을 유발하는 상관관계"처럼 여러 문서에 걸쳐 얽혀 있는 다단계 관계(Multi-Hop Relationships)를 추론하지 못하는 치명적 한계가 있습니다.
이를 극복하기 위해 옵시디언(Obsidian)의 양방향 링크(WikiLinks, [[Document]])로 연결된 지식 그래프(Knowledge Graph)와 Qdrant의 고차원 벡터 검색을 결합한 하이브리드 GraphRAG 아키텍처를 구축했습니다.
2. 파이썬 AST 파서를 이용한 마크다운 관계 추출
옵시디언 볼트의 마크다운 파일을 순회하며 엔티티(Entity)와 엣지(Edge)를 자동 추출하는 파이프라인을 구축했습니다:
# 그래프 엔티티 및 관계 자동 추출 예시
import re
from pathlib import Path
def extract_knowledge_triplets(vault_path: Path):
triplets = []
for md_file in vault_path.glob("**/*.md"):
content = md_file.read_text(encoding="utf-8")
links = re.findall(r"[[(.*?)]]", content)
source = md_file.stem
for target in links:
triplets.append({"source": source, "relation": "RELATES_TO", "target": target})
return triplets
3. 벡터 공간과 그래프 토폴로지의 결합
사용자 질문이 들어오면 다음 3단계 알고리즘이 순차적으로 작동합니다:
- 1단계 (초기 엔티티 탐색): Qdrant에서 질문과 가장 가까운 핵심 노드 3개를 벡터 유사도로 탐색.
- 2단계 (그래프 2-Hop 순회): 추출된 핵심 노드와 연결된 1차, 2차 이웃 노드 및 기술 의존성 엣지를 그래프 탐색(BFS)으로 확장.
- 3단계 (컨텍스트 합성): 그래프 구조와 원본 문서 본문을 결합하여 프롬프트에 주입 후 로컬 LLM이 종합적인 솔루션 도출.
4. 실전 적용 성과
"12노드 Ceph 스토리지와 Qdrant 벡터 검색의 상관관계"와 같은 복합 질의에서, 기존 단일 RAG 대비 답변의 논리적 완결성과 팩트 정확도가 43% 향상되었으며 환각 현상이 0건으로 통제되었습니다.