AI · RAG · NEO4J-GRAPHRAG
이 시리즈의 목표는 지식 그래프를 많이 만드는 것이 아니다. 에이전트가 지식 사이의 관계를 탐색하고, 마지막에는 답을 뒷받침하는 원문 문서까지 돌아갈 수 있는 검색 도구를 만드는 것이다.
그래프의 성공은 노드 수나 관계 수로 판단하지 않는다. 벡터 검색만으로 놓치던 관계형 질문에서 더 나은 근거를 찾고, 권한·최신성·출처 조건을 지킨 컨텍스트를 제공할 때 가치가 생긴다.
이 시리즈는 다음 세 질문을 따라간다.
먼저 읽으면 좋은 글은 두 편이다.
원천 문서는 그래프에 흡수되어 사라지지 않는다. 그래프는 원문으로 가는 탐색 경로와 의미 계약을 제공하고, 최종 근거는 항상 문서와 청크를 가리킨다.
이 구조에서 Neo4j는 세 역할을 맡는다.
모든 글은 일반화한 사내 기술 지식 기반을 사용한다. 실제 회사명, 서비스명, 저장소명은 사용하지 않는다.
| 노드 | 역할 | 대표 식별자 |
|---|---|---|
Service | 운영되는 서비스 | service_id |
API | 서비스가 제공하거나 호출하는 API | api_id |
Repository | 구현 소스가 있는 저장소 | repository_id |
ADR | 기술 결정과 대안 | adr_id |
Owner | 담당 조직 또는 역할 | owner_id |
Incident | 장애와 영향 | incident_id |
Claim | 문서에서 추출한 검증 가능한 주장 | claim_id |
Evidence | 주장을 뒷받침하는 원문 구간 | evidence_id |
Document | 원본 문서 | document_id, source_uri |
Chunk | 검색과 인용을 위한 문서 구간 | chunk_id |
대표 식별자는 병합과 참조에 쓰는 안정적인 키다.
Service.name, API.path, Repository.name 같은 표시 속성은 정확한 이름 검색과 전문 검색에 쓰되,
노드 정체성을 대신하지 않는다.
모든 노드는 대표 식별자에 고유성 제약을 두고 표시 속성은 별도 인덱스로 관리한다.
관계는 질문에 답하기 위해 만든다.
Claim과 Evidence를 분리하는 이유가 중요하다.
그래프의 관계가 맞는 것처럼 보여도,
그 관계를 뒷받침하는 원문이 없으면 에이전트에 제공할 근거로 사용할 수 없다.
공식 KG Builder의 어휘 그래프 기본값은 Chunk-[:FROM_DOCUMENT]->Document와 Chunk.id다.
이 시리즈는 모든 실습에서 LexicalGraphConfig를 명시해
Chunk-[:PART_OF]->Document와 Chunk.chunk_id로 통일한다.
추출된 개체에서 청크로 향하는 기본 출처 관계는 MENTIONED_IN으로 기록하고,
Claim -> Evidence -> Chunk 경로는 적재 후 검증 단계에서 별도로 만든다.
권한 관련 속성은 같은 역할을 하지 않는다.
| 필드 | 저장 위치 | 역할 |
|---|---|---|
allowed_groups | Document | 원본 문서의 권한 원천이다 |
acl_partition | Chunk | 단일 권한 범위를 재현하는 벡터 선필터 실습용 속성이다 |
allowed_source_uris | 요청 계약 | 출력 직전 원문 접근 권한을 다시 확인한다 |
| 접근 범위별 인덱스·데이터베이스 | 검색 경계 | 하이브리드 검색에서 후보 생성 전 권한을 강제한다 |
allowed_groups 같은 복수 그룹 목록을 acl_partition과 같은 단일 필터 속성으로 보지 않는다.
복잡한 문서별 ACL은 접근 범위별 검색 공간, Neo4j 권한, 사용자 정의 검색기 중 하나로
후보 단계부터 제한해야 한다.
| 순서 | 글 | 읽고 나면 할 수 있는 것 |
|---|---|---|
| 시작 | Neo4j GraphRAG의 목표와 기준선 | 관계형 질문과 평가 기준선을 정의한다 |
| 모델 | 속성 그래프와 온톨로지 모델링 | 질문에서 노드·관계·식별 계약을 역설계한다 |
| 질의 | Cypher, 제약, 쿼리 계획으로 검색 안정화하기 | 관계 탐색 쿼리와 무결성·성능 경계를 검증한다 |
| 적재 | 문서에서 근거를 보존한 지식 그래프 구축하기 | 추출·저장·개체 식별 파이프라인을 분해한다 |
| 검색 | 벡터·전문·그래프 탐색을 결합한 하이브리드 검색 | 질문 유형에 맞춰 검색 경로를 선택한다 |
| 제공 | 에이전트를 위한 Neo4j 컨텍스트 제공자 설계 | 읽기 전용 검색 도구의 입출력과 안전 경계를 정의한다 |
| 평가 | GraphRAG 평가와 벡터 RAG 제거 실험 | 그래프 구축·검색·컨텍스트·답변 품질을 따로 측정한다 |
| 운영 | 권한·최신성·성능을 포함한 Neo4j 운영 설계 | 학습용 구성과 사내 운영 구성을 구분한다 |
시리즈 순서와 별개로 함께 읽을 보충 글이 있다.
각 글은 앞 글의 산출물을 다음 글의 입력으로 사용한다. 중간 글만 골라 읽을 수는 있지만, 실습은 위 순서대로 진행해야 평가 기준이 흔들리지 않는다.
실습 질문은 단일 문서 검색만으로 끝나는 질문과 관계 탐색이 필요한 질문을 섞는다.
관계형 질문이 있다고 해서 GraphRAG가 자동으로 유리한 것은 아니다. 관계 추출이 부정확하거나 원문 연결이 끊기면, 그래프 탐색은 벡터 검색보다 더 그럴듯한 오답을 만들 수 있다.
| 계층 | 확인할 항목 | 실패로 보는 조건 |
|---|---|---|
| 그래프 구축 | 개체 식별, 관계 정확성, 원문 연결 | 잘못 합쳐진 개체나 근거 없는 관계가 생긴다 |
| 후보 검색 | 필수 문서와 증거 회수 | 필요한 근거가 후보에 들어오지 않는다 |
| 관계 탐색 | 필요한 경로 회수, 경로 길이와 잡음 | 무관한 고차 관계가 컨텍스트를 채운다 |
| 컨텍스트 조립 | 출처, 최신성, 토큰 예산 | 후보에 있던 근거가 최종 입력에서 빠진다 |
| 안전 | 접근 권한, 읽기 전용, 시간 제한 | 권한 밖 문서나 쓰기 쿼리가 실행된다 |
| 최종 답변 | 근거 충실성, 인용 정확성, 무응답 | 원문이 지지하지 않는 답을 만든다 |
| 운영 | 지연, 비용, 실패율 | 품질을 얻었지만 서비스 예산을 넘는다 |
절대적인 목표 수치는 데이터와 서비스 예산을 보고 정한다. 처음에는 다음 불변 조건부터 고정한다.
학습 구현은 Python과 공식 neo4j-graphrag 패키지를 중심으로 한다.
로컬에서는 Neo4j Community Edition 또는 임시 AuraDB 인스턴스로 시작할 수 있다.
현재 공식 문서에서 확인해야 할 버전 경계가 있다.
neo4j-graphrag는 과거 neo4j-genai 패키지의 후속 패키지다.SEARCH 절 또는 프로시저를 사용한다.따라서 글의 코드를 복사하는 것보다, 현재 설치한 버전의 공식 문서에서 지원 범위를 다시 확인하는 습관이 더 중요하다.
다음 기술은 필요할 때만 선택한다.
neosemantics를 검토한다.기본 검색 경로를 검증하기 전에 선택 기능부터 붙이면, 어느 구성요소가 품질을 바꿨는지 알 수 없게 된다.