올해는 머신러닝이다.
그래프 RAG를 위한 Text-to-Cypher 에이전트 구현 본문
원문 영상
https://www.youtube.com/watch?v=O93x9JvDQd0&list=PLeP_2-Xa7OBIdGlagL8n6IohwQXVISPFl&index=3
아래 내용은 위 영상에 대한 내용 요약입니다.
그래프 RAG를 위한 Text-to-Cypher 에이전트 구현하기
1. 그래프 RAG란?
그래프 RAG는 **네오4j(Graph Database)**를 활용하여 사용자 질문과 관련된 데이터를 조회하고, 이를 기반으로 답변을 생성하는 RAG(Retrieval-Augmented Generation) 방식입니다. 기존에 생성형 AI 패키지를 사용해 그래프 RAG를 구현한 적이 있지만, 이번에는 처음부터 직접 구축해보려 합니다.
2. Text-to-Cypher 에이전트 개념
Text-to-Cypher 에이전트는 사용자의 자연어 질문을 Cypher 쿼리로 변환하고, 네오4j 데이터베이스에서 데이터를 조회한 후, 만약 오류가 발생하면 자동으로 수정하여 정확한 결과를 반환하는 AI 시스템입니다.
AI 에이전트는 미리 정해진 워크플로우를 따르는 것이 아니라, 동적으로 판단하여 최적의 경로를 선택하는 것이 특징입니다. 예를 들어, 사용자의 질문이 웹 검색이 필요한 경우 웹 검색을 수행하고, 그렇지 않다면 바로 답변을 반환하는 방식과 유사합니다.
3. 구현할 Text-to-Cypher 에이전트의 구조
에이전트는 크게 4개의 주요 노드(Node)로 구성됩니다:
- Generate Cypher Node: 사용자의 질문을 Cypher 쿼리로 변환
- Execute Cypher Node: 변환된 쿼리를 네오4j에 실행하여 결과 조회
- Correct Cypher Node: 쿼리에 오류가 발생하면 자동으로 수정
- Answer Node: 최종 조회된 결과를 사용자에게 전달
4. 예제 데이터: 영화 추천 데이터셋
이번 실습에서는 **영화 추천 데이터셋(Recommendation Dataset)**을 사용합니다. 데이터베이스에는 영화(Movie), 배우(Actor), 장르(Genre), 사용자(User), 감독(Director) 등의 노드가 존재하며, 관계(Relationship)도 정의되어 있습니다.
사용자가 "톰 행크스가 출연한 영화 4개를 알려주세요." 라고 질문하면 다음과 같은 과정이 진행됩니다:
- Generate Cypher Node에서 MATCH (a:Actor {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie) RETURN m.title LIMIT 4 와 같은 쿼리문을 생성
- Execute Cypher Node에서 해당 쿼리를 실행하여 영화 목록 조회
- 정상적으로 조회되면 바로 Answer Node로 이동하여 사용자에게 답변 제공
하지만, 존재하지 않는 인물을 검색하는 경우(예: "공원 나연"), 데이터가 조회되지 않기 때문에 Correct Cypher Node에서 오류를 감지하고 적절한 답변을 반환하도록 합니다.
5. 구현 과정
1) 네오4j 샌드박스 설정
네오4j에서 제공하는 **샌드박스(Sandbox)**를 활용하여 데이터베이스를 생성합니다. 이 과정은 네오4j 공식 사이트에서 간단히 설정할 수 있으며, Python 기반의 neo4j 드라이버를 통해 연결합니다.
2) LLM 프롬프트 설계
OpenAI의 GPT-4o를 활용하여 Cypher 쿼리를 생성하도록 프롬프트를 설계합니다.
- 예제 질문과 이에 해당하는 Cypher 쿼리 패턴을 포함
- 쿼리 생성 시 데이터베이스의 스키마(Schema) 정보를 제공하여 정확도를 향상
- 생성된 쿼리가 오류를 발생시키면, 오류 메시지를 기반으로 자동 수정
3) 각 노드의 동작 방식
(1) Generate Cypher Node
- 사용자의 질문을 LLM에 입력하여 적절한 Cypher 쿼리 생성
- 생성된 쿼리는 오직 Cypher 코드만 포함하도록 프롬프트 설계
(2) Execute Cypher Node
- 생성된 쿼리를 네오4j에서 실행하고, 결과를 저장
- 쿼리 실행 중 오류 발생 시, 오류 메시지를 함께 저장
(3) Correct Cypher Node
- 오류 발생 시, 기존 쿼리와 오류 메시지를 LLM에 전달하여 자동 수정
- 존재하지 않는 데이터를 조회하는 경우, "검색 결과가 없습니다." 메시지를 반환하는 쿼리로 대체
(4) Answer Node
- 최종적으로 정상 실행된 쿼리의 결과를 기반으로 사용자 질문에 대한 답변을 생성
- 한국어 답변을 출력하도록 프롬프트 설정
6. 구현 코드 개요 (Python)
아래는 핵심 로직을 요약한 코드 예제입니다.
from neo4j import GraphDatabase
import openai
# 네오4j 연결 정보
NEO4J_URI = "your_neo4j_uri"
NEO4J_USER = "your_username"
NEO4J_PASSWORD = "your_password"
# OpenAI API 키
OPENAI_API_KEY = "your_api_key"
# 네오4j 드라이버 연결
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))
# 사이퍼 쿼리 실행 함수
def execute_cypher(query):
with driver.session() as session:
result = session.run(query)
return [record for record in result]
# LLM을 이용한 Cypher 쿼리 생성 함수
def generate_cypher(user_input):
prompt = f"""사용자 질문: {user_input}
Cypher 쿼리를 생성해 주세요."""
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=[{"role": "system", "content": "당신은 Cypher 전문가입니다."},
{"role": "user", "content": prompt}]
)
return response["choices"][0]["message"]["content"]
# 실행 예시
user_input = "톰 행크스가 출연한 영화 4개를 알려주세요."
cypher_query = generate_cypher(user_input)
result = execute_cypher(cypher_query)
print("결과:", result)
7. 결론
이 프로젝트를 통해 LLM을 활용하여 사용자 질문을 Cypher 쿼리로 변환하고, 자동으로 오류를 수정하는 AI 에이전트를 구현해 보았습니다.
📌 앞으로의 확장 가능성
- 쿼리 평가 기능 추가: 생성된 쿼리가 사용자 질문에 적절한지 검증하는 기능
- 다양한 그래프 데이터셋 적용: 영화 추천 외에도 소셜 네트워크, 금융 데이터 분석 등에 활용
- 다국어 지원: 한국어 외에도 다국어 쿼리 변환 기능 추가
'AI' 카테고리의 다른 글
파이썬과 OpenAI API로 AI 워크플로우 구현하기 (2) | 2025.03.07 |
---|---|
Pydantic을 이용한 AI 주식 에이전트 개발 (1) | 2025.03.07 |
AI SaaS 스타트업 아이디어를 찾는 핵심 전략 (1) | 2025.03.06 |
LangChain, LangGraph, LangFlow, LangSmith 비교 분석 (0) | 2025.03.06 |
구글의 에이전트 백서 요약 (0) | 2025.03.06 |