본문 바로가기

인공지능

지식 그래프 기반 RAG 워크플로우, LangChain과 LangGraph로 구현하는 방법

728x90
반응형
728x170

지식 그래프 기반의 Retrieval-Augmented Generation(RAG)은 최근 들어 주목을 받고 있습니다. 단순한 검색 기반 RAG와 비교해, 데이터 간의 복잡한 관계를 반영할 수 있는 그래프 기반 RAG는 정보의 정확성과 연결성을 더욱 향상시킬 수 있기 때문입니다.

이번 글에서는 LangChainLangGraph, 그리고 Neo4j를 활용해 GraphRAG 워크플로우를 어떻게 설계하고 구현할 수 있는지 자세히 설명합니다. 질문 라우팅, 쿼리 분해, 벡터 검색, 프롬프트 구성까지 모든 과정을 포함하고 있으며, 실질적으로 작동하는 Python 코드 예제를 통해 실제 구현 방식을 살펴봅니다.

반응형

GraphRAG란? 왜 사용하는가?

RAG는 LLM의 답변 정확도를 높이기 위해 외부 정보를 검색해 응답에 반영하는 기술입니다. 대부분의 RAG는 벡터 기반 검색(Vector Search)을 활용하지만, 여기에는 한계가 있습니다. 예를 들어, 정보 간의 관계성을 구조적으로 표현하거나, 복잡한 조건 하에 쿼리를 구성하는 데에는 부족함이 있습니다.

이러한 한계를 보완하기 위해 그래프 데이터베이스 기반의 RAG, 즉 GraphRAG가 등장했습니다. Neo4j 같은 그래프 DB는 노드와 엣지를 활용해 데이터 간의 연결을 직관적으로 표현할 수 있으며, 정확도 높은 정보 추론이 가능합니다.


LangChain + Neo4j로 구성하는 기본 GraphRAG

LangChain은 LLM과 다양한 데이터 소스를 연결해주는 프레임워크입니다. GraphRAG의 기본 구조는 아래와 같습니다.

  1. 사용자 질문을 입력받아 LLM이 Cypher 쿼리를 생성
  2. 생성된 쿼리를 Neo4j에 실행
  3. 쿼리 결과를 기반으로 LLM이 답변 생성

예를 들어, 논문 데이터베이스에서 상위 10개의 인용 논문을 찾는 질문은 아래와 같이 표현됩니다:

MATCH(n:Article) 
WHERE n.citation_count > 50
RETURN n.title, n.citation_count

반면, “기후 변화에 대한 논문을 찾아줘” 같은 질문은 그래프 쿼리보다는 벡터 검색이 더 적합합니다. Neo4j는 벡터 인덱스를 지원하므로, 임베딩 기반의 의미 검색도 가능합니다.


복잡한 쿼리를 다루기 위한 LangGraph의 도입

LangChain만으로도 단순한 GraphRAG를 구성할 수 있지만, 복잡한 플로우를 구성하거나 여러 입력 변수를 처리할 때는 한계가 있습니다. 특히 다음과 같은 문제들이 발생합니다:

  • 질문에 따라 벡터 검색그래프 쿼리를 나눠서 처리할 수 없다
  • 하나의 질문을 여러 개의 하위 쿼리로 분해해 처리하기 어렵다
  • Prompt에 context를 유연하게 주입하기 어렵다

이를 해결하기 위해 LangGraph가 등장합니다. LangGraph는 LangChain의 상위 추상화로, 복잡한 조건 분기와 상태 관리가 가능한 워크플로우 엔진입니다.


GraphRAG 워크플로우 구조 살펴보기

LangGraph를 활용한 GraphRAG의 핵심은 질문의 흐름을 다음과 같이 두 가지 분기로 나누는 것입니다.

  1. 그래프 쿼리 기반 QA
  2. 벡터 검색 기반의 컨텍스트 활용 후 그래프 QA

1. 질문 라우팅 (Router Chain)

사용자 질문을 분석해, 어떤 방식이 더 적합한지 판단합니다.

  • 유사성, 관련성, “비슷한 논문” 등의 키워드가 포함된 경우 → 벡터 검색
  • 연도, 국가, 인용 수 등 구체적인 속성 기반 질문 → 그래프 쿼리

LLM이 질문을 분석해 적절한 경로를 선택합니다.


2. 질문 분해 (Decomposer)

벡터 검색 경로로 진입하면, 질문을 두 개의 하위 질문으로 나눕니다.

예시 질문: “산화 스트레스에 대한 논문을 찾아줘. 가장 관련 있는 논문의 제목을 알려줘.”

  • sub_query1: 산화 스트레스 관련 논문을 찾는다 (벡터 검색)
  • sub_query2: 가장 관련 있는 논문의 제목을 반환한다 (그래프 쿼리)

LangChain의 GPT-3.5 기반 Chain을 사용하여 자동 분해합니다.


3. 벡터 검색과 컨텍스트 생성

sub_query1을 이용해 Neo4j의 벡터 스토어에서 유사한 노드를 검색합니다. 예를 들어, 관련 논문의 노드 ID 리스트를 반환받습니다. 이 결과는 이후 프롬프트 템플릿에 컨텍스트로 삽입됩니다.


4. 프롬프트 템플릿 생성

컨텍스트와 함께 Cypher 쿼리를 생성하기 위한 프롬프트 템플릿을 구성합니다.


5. 그래프 QA 실행

최종적으로 구성된 Cypher 쿼리를 Neo4j에 실행하고, LLM이 결과를 해석해 응답을 생성합니다. 이 때 LangGraph의 GraphState를 통해 필요한 모든 정보(question, context, subqueries 등)가 노드 간에 자연스럽게 전달됩니다.


728x90

왜 이 방식이 효과적인가?

LangGraph를 활용한 GraphRAG는 다음과 같은 강점을 가집니다:

  • 복잡한 질문도 정확하게 처리: 질문 분해, 벡터 검색, 그래프 질의까지 통합
  • LLM hallucination 감소: 그래프 기반 정확한 데이터 기반 응답
  • 확장성 있는 구조: 에이전트 도입 등 다양한 흐름 구성 가능

기존 LangChain만으로는 한계가 있었던 다중 입력 변수 처리, 분기 로직, 컨텍스트 주입 문제를 LangGraph로 효과적으로 해결할 수 있습니다. 지식 그래프 기반의 LLM 응답 시스템을 고민하고 있다면, 이 구조는 매우 실용적인 출발점이 될 수 있습니다.

향후에는 이 구조에 에이전트 기반의 흐름까지 통합하는 실험도 이어질 예정입니다. Neo4j와 LangChain, LangGraph를 활용한 고급 RAG 시스템 구축에 도전해보세요.

https://neo4j.com/blog/developer/neo4j-graphrag-workflow-langchain-langgraph/?fbclid=IwY2xjawLdQXpleHRuA2FlbQIxMQABHhbkmTW80lmO2SI-_pXmGeksRd1oEOi6pwKcXqHX9p6Mp28Hpq7R9KU4YXMP_aem_Ro9Kz9J5vkErmFRa68c_ZA

 

Create a Neo4j GraphRAG Workflow Using LangChain and LangGraph - Graph Database & Analytics

Create a Neo4j GraphRAG workflow using LangChain and LangGraph, combining graph queries, vector search, and dynamic prompting for advanced RAG.

neo4j.com

728x90
반응형
그리드형