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
관련 논문
성경을 RAG Database로 구축한 프로젝트: Cross Canon
성경 전체를 RAG(검색 증강 생성) 데이터베이스로 인덱싱해 주제나 키워드로 관련 성경 구절을 의미론적으로 검색할 수 있는 웹 서비스다. 종교 텍스트에 RAG를 적용한 실용적 예시로, 유사한 프로젝트를 만들려는 개발자에게 참고가 된다.
Haystack: 프로덕션 수준의 AI Agent와 RAG를 위한 오픈소스 프레임워크
deepset이 만든 오픈소스 AI 오케스트레이션 프레임워크로, LangChain의 대안으로 주목받고 있으며 모듈형 파이프라인 방식으로 RAG·Agent·멀티모달 앱을 프로덕션까지 구축할 수 있다.
Elasticsearch로 만든 Agent 영구 메모리 레이어 - R@10 0.89 달성기
AI 에이전트가 세션이 끝나도 사용자 정보를 기억할 수 있도록 Elasticsearch 위에 구축한 멀티테넌트 장기 메모리 시스템 아키텍처 공개. 168개 질문 기준 R@10 0.89, 테넌트 간 데이터 누출 0건을 달성한 구체적인 구현 방법을 담았다.
TAHOE: 경험 기반 자동 Hint 최적화를 통한 Text-to-SQL 시스템
LLM이 SQL 생성 실패에서 배운 힌트를 재사용 가능한 Hint Bank로 쌓아, 모델 재학습 없이 Snowflake 방언 SQL 정확도를 대폭 끌어올리는 시스템.
FAISS 내부 동작 원리: 10억 개 벡터 유사도 검색
FAISS가 수십억 개 벡터를 빠르게 검색하는 핵심 알고리즘인 IVF(파티셔닝)와 Product Quantization(압축)을 시각적으로 설명한 글로, RAG나 벡터 검색 시스템을 구축하는 개발자에게 내부 동작 원리를 이해시켜 준다.
Airbyte Agents – 여러 데이터 소스를 아우르는 Agent용 Context Layer
Airbyte가 Slack, Salesforce, Linear 등 여러 SaaS 시스템의 데이터를 미리 인덱싱해서 Agent가 API를 일일이 뒤지지 않아도 되는 Context Store를 출시했다. 기존 MCP 방식보다 토큰을 최대 90%까지 줄이는 효과를 확인했다.