모델별 실행 레시피
최종 업데이트
GraphRAG란? 여러 문서의 관계를 찾는 원리와 Neo4j 예제
GraphRAG는 문서에서 찾은 사람·조직·사건의 연결을 답변에 활용하는 검색 방식이에요.
계약서에는 A사와 B사의 거래가, 다른 공지에는 B사를 인수한 C사가 나와요. 'A사의 거래처를 인수한 회사는 어디인가요?'라고 물으면 두 문서의 정보를 이어야 하죠. GraphRAG는 이런 관계를 그래프로 저장하고, 질문에 필요한 연결과 원문을 찾아 LLM1에 전달해요.
단락을 찾는 검색에서 관계를 찾는 검색으로
벡터 검색은 질문과 의미가 가까운 단락을 찾는 데 강해요. 그런데 계약서에 '인수'라는 말이 없고 인수 공지에 'A사'가 없으면, 질문 한 번으로 필요한 두 단락을 모두 가져오기 어려울 수 있어요. 그래프에는 A사→계약→B사, C사→인수→B사라는 연결을 저장해요. B사를 중심으로 두 정보를 이어 답의 근거를 모을 수 있죠.
Neo4j GraphRAG Python은 검색기와 LLM을 연결하는 구성요소를 제공해요. 벡터 검색 뒤에 연결된 개체를 더 가져오는 VectorCypherRetriever나, 질문을 Cypher 질의로 바꾸는 Text2CypherRetriever 등을 선택할 수 있어요. 먼저 손으로 작은 관계를 만들어 보면 어떤 정보를 추출해야 하는지 이해하기 쉬워요.

실습용 Neo4j를 내 컴퓨터에서 열어요
Docker가 실행 중인 Mac·Windows·Linux에서 시작할 수 있어요. 아래 명령은 Neo4j Community 2026.09.0을 내려받고, 브라우저 화면과 데이터베이스 포트를 내 컴퓨터에만 열어요. replace_this_password는 실행 전에 자신이 정한 비밀번호로 바꾸세요. graphrag-demo-data 볼륨에는 이 실습의 데이터가 저장돼요.
docker run -d --name graphrag-demo \
-p 127.0.0.1:7474:7474 -p 127.0.0.1:7687:7687 \
-e NEO4J_AUTH=neo4j/replace_this_password \
-v graphrag-demo-data:/data \
neo4j:2026.09.0시작이 끝나면 http://127.0.0.1:7474를 열어요.

가상의 회사 세 곳을 연결하고 답을 찾아요
로그인 이름은 neo4j, 비밀번호는 앞에서 정한 값이에요. 화면의 질의 입력란에 아래 첫 코드를 실행하면 Demo A·B·C라는 회사 세 곳과 계약·인수 관계 두 개가 생겨요. 가상의 계약서와 공지 파일 이름, 페이지, 인수일도 관계 속성에 넣었어요.
MERGE (a:DemoCompany {name: 'Demo A'})
MERGE (b:DemoCompany {name: 'Demo B'})
MERGE (c:DemoCompany {name: 'Demo C'})
MERGE (a)-[contract:CONTRACTED_WITH]->(b)
SET contract.source = 'demo-contract.pdf', contract.page = 1
MERGE (c)-[purchase:ACQUIRED]->(b)
SET purchase.date = '2026-10-01',
purchase.source = 'demo-notice.pdf', purchase.page = 2
RETURN a, b, c;두 번째 질의는 A사의 거래처를 찾은 뒤, 그 거래처를 인수한 회사를 찾아요. 정상 결과는 Demo B, Demo C, 2026-10-01, 그리고 근거 파일 두 개예요. 이처럼 답과 근거를 함께 반환해야 잘못 연결된 관계를 원문으로 확인할 수 있어요.
MATCH (:DemoCompany {name: 'Demo A'})-[contract:CONTRACTED_WITH]->(b)
MATCH (c:DemoCompany)-[purchase:ACQUIRED]->(b)
RETURN b.name AS supplier, c.name AS acquirer,
purchase.date AS acquisition_date,
contract.source AS contract_source,
purchase.source AS notice_source;실제 PDF와 Ollama를 붙일 때 추가되는 작업
실제 문서에서는 PDF 텍스트를 추출한 뒤 회사명·사람·관계를 찾아 그래프에 저장하는 단계가 필요해요. 'B주식회사'와 'B사'를 같은 개체로 묶고, 계약과 인수의 방향·날짜·출처를 보존해야 하죠. 처음에는 문서 두세 개만 넣고 추출된 관계를 사람이 확인하세요. 잘못된 인수 관계 하나가 이후 답변에도 이어지기 때문이에요.
Neo4j GraphRAG의 OllamaLLM과 OllamaEmbeddings로 로컬 모델을 연결할 수 있어요. 채팅 모델은 답변을 만들고 임베딩 모델은 벡터 검색을 맡아요. Docker 안에서 Python을 실행한다면 Ollama 접속 주소를 따로 지정해야 해요. 컨테이너의 localhost는 호스트 컴퓨터가 아니라 그 컨테이너를 가리켜요.
최종 비교에는 같은 문서와 질문을 써요. 날짜 하나를 찾는 질문과 여러 문서를 연결하는 질문을 나눠서, 정답 근거를 가져오는지와 답변 대기 시간을 기록하세요. 관계 질문에서 도움이 된다면 그래프를 확장하고, 차이가 작다면 기존 벡터 검색을 유지해요. 설치 후 화면이 열리지 않으면 docker logs graphrag-demo로 시작 로그와 포트 충돌을 먼저 확인하세요.

용어 각주
대규모 언어 모델 — 대규모 텍스트 데이터에서 언어 패턴을 학습해 문맥에 맞는 텍스트를 처리하고 생성하는 모델입니다.
본문으로 돌아가기
자주 묻는 질문
- 이 글에서 가장 먼저 확인할 것은 무엇인가요?
- 계약서에는 A사와 B사의 거래가, 다른 공지에는 B사를 인수한 C사가 나와요. 'A사의 거래처를 인수한 회사는 어디인가요?'라고 물으면 두 문서의 정보를 이어야 하죠. GraphRAG는 이런 관계를 그래프로 저장하고, 질문에 필요한 연결과 원문을 찾아 LLM에 전달해요.
