Neo4j GraphRAG Python 라이브러리에 다음과 같은 강력한 새 기능이 추가되었어요. 바로 ToolsRetriever 클래스와 Retriever.convert_to_tool() 메서드랍니다. 이 기능 덕분에 라이브러리의 유연성이 훨씬 좋아졌어요. 이제 LLM이 작업에 가장 적합한 검색기를 똑똑하게 선택해서, 단일 쿼리에서 여러 검색기를 도구처럼 활용할 수 있게 되었거든요. 이번 블로그 포스팅에서는 이 기능이 왜 필요했는지, 어떻게 구현되었는지, 그리고 이걸 활용해서 어떻게 동적인 Retrieval-Augmented Generation(RAG) 애플리케이션을 만들 수 있는지 자세히 알아볼게요.
동기 부여: 유연하고 똑똑한 검색
RAG 시스템은 검색기를 사용해서 지식 기반에서 관련 데이터를 가져온 다음, LLM 응답에 필요한 맥락을 제공하죠. 보통은 쿼리 하나에 검색기 하나를 사용하는데, 쿼리마다 필요한 데이터 유형이나 검색 전략이 다를 수 있거든요. 예를 들어 "내일 일정"을 물어보는 쿼리에는 달력 기반 검색기가 필요할 거고, "내일 날씨"를 물어보는 쿼리에는 날씨 검색기가 필요하겠죠?
ToolsRetriever는 여러 검색기(도구)를 하나의 인터페이스로 묶어서 이런 문제를 해결해 줘요. 검색기를 직접 선택하는 대신, 시스템이 LLM을 사용해서 쿼리에 가장 알맞은 도구를 알아서 선택하는 거죠. 이렇게 추상화하면 개발 과정이 훨씬 간단해지고, RAG 파이프라인이 더 유연하고 효율적으로 바뀌어서 다양한 쿼리를 한 번에 처리할 수 있게 돼요.
게다가 Retriever.convert_to_tool() 메서드를 사용하면 Retriever 인터페이스를 따르는 모든 검색기를 ToolsRetriever와 호환되는 도구로 바꿀 수 있어요. 예를 들어, Semantic Search를 위한 VectorRetriever와 구조화된 그래프 쿼리를 위한 Text2CypherRetriever를 함께 사용하고 싶을 때 정말 유용하겠죠? 이 둘을 대체 또는 보완 메커니즘으로 활용할 수 있으니까요.
주요 특징
ToolsRetriever
ToolsRetriever는 여러 도구(도구로 변환된 검색기 포함)를 하나로 모으고, LLM을 사용해서 쿼리에 따라 어떤 도구를 호출할지 결정하는 새로운 클래스예요. Retriever 인터페이스를 따르기 때문에 기존 GraphRAG 클래스와도 문제없이 잘 연동돼서 엔드투엔드 RAG 워크플로우를 만들 수 있답니다.
ToolsRetriever를 사용하는 방법은 다음과 같아요.
from neo4j_graphrag.llm import OpenAILLM
from neo4j_graphrag.retrievers import ToolsRetriever
from neo4j_graphrag.graphrag import GraphRAG
import neo4j
# Hypothetical imports from a reader's file system
from my_tools import CalendarTool, WeatherTool
# Initialize tools and LLM
calendar_tool = CalendarTool()
weather_tool = WeatherTool()
llm = OpenAILLM()
driver = neo4j.GraphDatabase.driver(…)
# Create ToolsRetriever with multiple tools
tools_retriever = ToolsRetriever(
driver=driver,
llm=llm,
tools=[calendar_tool, weather_tool],
)
# Integrate with GraphRAG
graphrag = GraphRAG(
llm=llm,
retriever=tools_retriever,
)
# Perform a search
result = graphrag.search(query_text="Tell me about tomorrow", return_context=False)
이 예시에서 LLM은 "내일에 대해 말해 주세요"라는 쿼리에 CalendarTool, WeatherTool, 아니면 둘 다 필요한지 판단해서 가장 관련성 높은 데이터를 검색해 줄 거예요.
Retriever.convert_to_tool()
Retriever.convert_to_tool() 메서드를 사용하면 VectorRetriever나 Text2CypherRetriever처럼 어떤 검색기든 ToolsRetriever에서 사용할 수 있는 도구로 변환할 수 있어요. 다양한 검색 전략을 결합할 때 특히 강력하죠. 예를 들어 VectorRetriever는 Semantic Search에 뛰어나고, Text2CypherRetriever는 Neo4j 그래프에서 정확하고 구조화된 쿼리를 수행하는 데 더 적합하거든요.
검색기를 도구로 변환하는 예시를 한번 살펴볼까요?
from neo4j_graphrag.retrievers import VectorRetriever, Text2CypherRetriever
from neo4j_graphrag.retrievers import ToolsRetriever
from neo4j_graphrag.llm import OpenAILLM
from neo4j_graphrag.graphrag import GraphRAG
import neo4j
# Initialize retrievers and LLM
driver = neo4j.GraphDatabase.driver(…)
llm = OpenAILLM()
vector_retriever = VectorRetriever(driver, …)
text2cypher_retriever = Text2CypherRetriever(driver, …)
# Convert retrievers to tools
vector_tool = vector_retriever.convert_to_tool()
text2cypher_tool = text2cypher_retriever.convert_to_tool()
# Create ToolsRetriever
tools_retriever = ToolsRetriever(
driver=driver,
llm=llm,
tools=[vector_tool, text2cypher_tool],
)
# Use in GraphRAG
graphrag = GraphRAG(
llm=llm,
retriever=tools_retriever,
)
# Perform a search
result = graphrag.search(query_text="Find documents about AI and their authors", return_context=False)
이 경우 LLM은 쿼리의 의도에 따라 VectorRetriever (Semantic Search를 위해) 또는 Text2CypherRetriever (구조화된 쿼리를 위해)를 사용할지 결정하는 거예요.
구현 세부정보
ToolsRetriever
ToolsRetriever 클래스는 기존 Neo4j GraphRAG 프레임워크와 자연스럽게 통합되도록 설계되었어요. 주요 구현 세부 정보는 다음과 같아요.
- LLM 기반 Tool 선택: ToolsRetriever는 LLM을 사용해서 쿼리를 분석하고 가장 적합한 Tool을 선택해요. 이렇게 하면 시스템이 쿼리 요구 사항에 맞춰서 동적으로 적응할 수 있죠.
- Tool 이름 고유성: 구현 시 모든 Tool에 고유한 이름이 있는지 확인해서 Tool 선택 중에 충돌이 발생하지 않도록 유효성 검사를 포함하고 있어요.
- 일관된 결과 형식: ToolsRetriever는 Tool의 `RetrieverResult` 객체를 처리해서 각 검색기의 형식 지정 로직을 유지하면서 결과 형식이 일관되게 유지되도록 해요.
- GraphRAG와의 통합: `Retriever` 인터페이스를 준수함으로써 ToolsRetriever는 GraphRAG 클래스의 다른 검색기에 대한 드롭인 대체품으로 사용할 수 있어요.
Retriever.convert_to_tool()
convert_to_tool() 메서드가 Retriever 기본 클래스에 추가되어서 모든 검색기를 Tool로 변환할 수 있게 되었어요. 구현의 주요 측면은 다음과 같아요.
- 추상 get_parameters() 메서드: 새로운 추상 메서드인
get_parameters()가 `Retriever` 기본 클래스에 추가되었기 때문에 모든 구체적인 검색기 클래스에서 해당 파라미터를 정의해야 해요. 이렇게 하면 Tool로 변환할 때 호환성이 보장되죠. - 검색 방법 통합:
convert_to_tool()메서드는 검색기의search()검색기에 내장된 결과 포맷터를 활용해서 일관된 결과 포맷을 보장하는 방법이에요. - 메타데이터 및 속성: 변환된 Tool은 메타데이터와 속성을 유지해서 데이터 소스의 추적성을 보장해요.
이점
- 동적 Tool 선택: LLM은 쿼리에 가장 적합한 Tool을 지능적으로 선택하므로 수동 검색기 구성의 필요성이 줄어들어요.
- : 여러 검색기 (예: VectorRetriever, Text2CypherRetriever)를 Tool로 결합해서 하이브리드 검색 전략을 활성화할 수 있어요.
- : ToolsRetriever는 기존 GraphRAG 프레임워크와 통합되어서 다른 구성 요소와의 호환성을 유지해요.
- :
convert_to_tool()방법을 사용하면 모든 검색기를 Tool로 사용할 수 있으므로 시스템 확장성이 높아져요. - 향상된 사용자 경험: Tool 선택을 추상화함으로써 검색기 로직 관리가 아닌 애플리케이션 구축에 집중할 수 있어요.
요약
ToolsRetriever 및 Retriever.convert_to_tool() 메서드는 Neo4j GraphRAG Python 라이브러리의 발전을 보여주는 좋은 예시라고 할 수 있어요. Tool로 여러 검색기의 동적 LLM 기반 선택을 활성화함으로써 이 기능은 RAG 파이프라인을 더욱 유연하고 강력하게 만들어 줘요. 다양한 데이터 소스가 필요한 애플리케이션을 구축하든, 다양한 검색 전략을 위한 폴백 메커니즘이 필요한 애플리케이션을 구축하든, 이 기능은 강력하고 확장 가능한 솔루션을 제공해 줄 거예요.
시작하려면 업데이트된 예제를 Neo4j GraphRAG 저장소에서 확인하고, 여러분의 Retriever를 Tool로 결합해서 실험해 보세요!
다음을 사용해서 애플리케이션에 설치하고 사용할 수 있어요.
pip install neo4j-graphrag
저희는 커뮤니티가 이 기능을 활용해서 앞으로 GraphRAG 애플리케이션을 어떻게 구축할지 정말 기대하고 있어요!
자원
- 무료 도서: 필수 GraphRAG (Tomaž Bratanic, Oskar Hane 저)
- 블로그: Retrieval-Augmented Generation(RAG)이란 무엇일까요?
- 블로그: GraphRAG란 무엇일까요?
- GraphRAG
- Retrieval-Augmented Generation
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'GraphRAG' 카테고리의 다른 글
| 지식 그래프 vs 벡터 RAG: 벤치마킹, 최적화, 그리고 금융 분석 예시 (0) | 2026.05.22 |
|---|---|
| 짐 웨버와 매트 클로이드: 분쟁 해결에 그래프의 힘 (Neo4j, GraphRAG 활용) (0) | 2026.05.21 |
| 금융 분석가를 위한 똑똑한 추천 엔진: Machine Learning과 Neo4j, GraphRAG의 만남 (0) | 2026.05.21 |
| Integrating Neo4j with Google Genkit: A Practical Guide (0) | 2026.05.20 |
| 그래프 데이터 과학 내부자 가이드: 먼저, 간단한 개요 (0) | 2026.05.20 |
