Think-on-Graph: Knowledge Graph를 활용한 LLM의 깊고 책임감 있는 추론
Think-on-Graph: Deep and Responsible Reasoning of Large Language Model with Knowledge Graph
TL;DR Highlight
LLM이 Knowledge Graph를 단계적으로 탐색하여 추론하는 방식이 환각을 감소시키고 정확도를 향상시킨다.
Who Should Read
LLM의 환각 문제를 줄이고 싶은 백엔드/AI 개발자. 특히 도메인 지식 기반 QA 시스템이나 사실 검증 파이프라인을 구축 중인 경우에 유용하다.
Core Mechanics
- LLM을 Knowledge Graph(KG) 위의 에이전트로 활용해서, 질문에 답하기 위해 KG 노드를 단계적으로 탐색(beam search 방식)함
- 기존 RAG처럼 텍스트 덩어리를 가져오는 게 아니라, KG의 엔티티-관계 트리플(entity-relation triple)을 따라가며 추론 경로를 구성함
- LLM이 각 탐색 단계에서 어떤 관계(relation)를 따라갈지 스스로 판단하고, 답이 충분한지도 자체적으로 평가함
- 추론 근거가 KG 경로로 추적 가능해서 '왜 이 답이 나왔는지' 설명 가능(explainable)함
- 외부 KG(Freebase, Wikidata 등)를 실시간으로 쿼리하므로 모델 재학습 없이 최신 지식 활용 가능
Evidence
- KGQA 벤치마크(WebQSP, CWQ)에서 기존 RAG 방식 대비 정확도 약 8~12% 향상
- 다중 홉(multi-hop) 추론이 필요한 질문에서 Chain-of-Thought 단독 사용 대비 최대 15% 이상 성능 개선
- 답변 근거 추적 가능성(traceability) 면에서 블랙박스 LLM 대비 명시적 경로 제공
How to Apply
- 도메인 KG(예: 의료, 법률 온톨로지)가 있는 경우, 사용자 질문에서 엔티티를 추출하고 KG 탐색 에이전트를 LLM으로 구성해 multi-hop 답변 파이프라인을 만들 수 있음
- 기존 RAG 파이프라인에서 청크 검색 대신 KG triple 경로 검색으로 교체하면, 특히 '누가 누구와 어떤 관계인가' 형태의 관계형 질문에서 정확도가 올라감
- LLM 프롬프트에 'KG에서 가져온 관계 후보 목록'을 제시하고 어떤 관계를 탐색할지 선택하게 하는 방식으로, Freebase/Wikidata API와 연결해 바로 구현 가능
Code Example
# Think-on-Graph 핵심 루프 pseudo-code
def think_on_graph(question, kg_client, llm, max_depth=3, beam_width=3):
# 1. 질문에서 시작 엔티티 추출
start_entities = llm.extract_entities(question)
paths = [(entity, []) for entity in start_entities] # (현재노드, 경로)
for depth in range(max_depth):
candidates = []
for current_node, path in paths:
# 2. KG에서 현재 노드의 관계 후보 조회
relations = kg_client.get_relations(current_node)
# 3. LLM이 관련 관계 선택
prompt = f"""
질문: {question}
현재 탐색 노드: {current_node}
현재까지 경로: {path}
사용 가능한 관계들: {relations}
위 관계들 중 질문에 답하기 위해 탐색해야 할 관계를 선택하세요.
관련 없으면 'none'을 출력하세요."""
selected_relations = llm.call(prompt)
for rel in selected_relations[:beam_width]:
next_nodes = kg_client.get_neighbors(current_node, rel)
for node in next_nodes:
candidates.append((node, path + [(current_node, rel, node)]))
# 4. LLM이 현재 후보들로 답 가능한지 판단
answer_check_prompt = f"""
질문: {question}
탐색된 경로와 엔티티들: {candidates}
현재 정보로 질문에 답할 수 있나요?
답할 수 있으면 답변을 제시하고, 없으면 'continue'를 출력하세요."""
result = llm.call(answer_check_prompt)
if result != 'continue':
return result, candidates # 답변 + 근거 경로 반환
paths = candidates[:beam_width] # beam 유지
return llm.call(f"질문: {question}\n수집된 정보: {paths}\n최종 답변:"), pathsTerminology
관련 논문
Airbyte Agents – 여러 데이터 소스를 아우르는 Agent용 Context Layer
Airbyte가 Slack, Salesforce, Linear 등 여러 SaaS 시스템의 데이터를 미리 인덱싱해서 Agent가 API를 일일이 뒤지지 않아도 되는 Context Store를 출시했다. 기존 MCP 방식보다 토큰을 최대 90%까지 줄이는 효과를 확인했다.
Polynomial Autoencoder가 Transformer Embedding에서 PCA를 능가하는 방법
PCA 인코더에 2차 다항식 디코더를 붙여서 닫힌 형태(closed-form)로 embedding 압축 품질을 크게 개선하는 기법으로, SGD 없이 numpy만으로 구현 가능하다.
비정형 Recall에서 Schema 기반 Memory로: 반복적 Schema-Aware Extraction을 통한 신뢰할 수 있는 AI Memory
RAG 스타일 텍스트 검색 대신 Schema로 정의된 구조화 레코드에 메모리를 저장하면, 정확한 사실 조회·상태 추적·집계 쿼리에서 압도적으로 높은 정확도를 얻을 수 있다.
Atomic – Local-first, AI 기반 개인 지식 그래프 앱
노트, 웹 클립, RSS 피드를 자동으로 임베딩·태깅·연결해주는 오픈소스 개인 지식 그래프 앱으로, 시맨틱 검색과 LLM 기반 위키 합성, MCP 통합까지 지원한다.
RAG 대신 Virtual Filesystem으로 AI 문서 어시스턴트 만든 이야기
Mintlify의 ChromaFs(Chroma DB 위의 UNIX 명령어 흉내 가상 파일시스템)가 RAG 청킹 한계를 극복해 세션 부팅 시간을 46초에서 100ms로 단축한다.
Chroma Context-1: Self-Editing 기능을 갖춘 검색 에이전트 학습 방법
Chroma의 20B 파라미터 agentic search 모델이 프론티어급 LLM 수준의 검색 성능을 1/10의 비용과 10배 빠른 속도로 달성한다.