Neo4j로 PropertyGraph 구축하기

Neo4j로 PropertyGraph 구축하기

LlamaIndex와 MistralAI를 사용해 Neo4j 기반의 PropertyGraph를 만드는 노트북이에요. Neo4j는 프로덕션급 그래프 데이터베이스로, property graph 저장, 벡터 검색, 필터링 등에 강점이 있습니다. 이 예제에서는 Docker로 로컬 데이터베이스를 실행해 그래프 인덱스를 구축하고 검색까지 해 봅니다.

출처: 문서

본문

가장 간단한 시작 방법은 Neo4j Aura로 클라우드 호스팅 인스턴스를 쓰는 거예요. 다만 이 노트북에서는 Docker로 로컬에서 데이터베이스를 실행하는 방법을 중심으로 다룹니다.

필요한 패키지를 설치합니다.

%pip install llama-index-core
%pip install llama-index-graph-stores-neo4j
%pip install llama-index-llms-mistralai
%pip install llama-index-embeddings-mistralai

Docker 설정

처음 실행 시 로그인하고 비밀번호를 설정해야 해요. 기본 자격 증명은 neo4j / neo4j입니다. APOC 플러그인을 활성화한 Neo4j 컨테이너를 띄웁니다.

!docker run \
    -p 7474:7474 -p 7687:7687 \
    -v $PWD/data:/data -v $PWD/plugins:/plugins \
    --name neo4j-apoc \
    -e NEO4J_apoc_export_file_enabled=true \
    -e NEO4J_apoc_import_file_enabled=true \
    -e NEO4J_apoc_import_file_use__neo4j__config=true \
    -e NEO4JLABS_PLUGINS=\[\"apoc\"\] \
    neo4j:latest

설정 (Setup)

import nest_asyncio
nest_asyncio.apply()
from IPython.display import Markdown, display
import os
os.environ['MISTRAL_API_KEY'] = 'YOUR MISTRAL API KEY'

Mistral LLM과 임베딩 모델을 설정합니다.

from llama_index.embeddings.mistralai import MistralAIEmbedding
from llama_index.llms.mistralai import MistralAI

llm = MistralAI(model='mistral-large-latest')
embed_model = MistralAIEmbedding()

데이터 다운로드·로드

Paul Graham 에세이를 예제 데이터로 다운로드해 로드합니다.

!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("./data/paul_graham/").load_data()

Index 구성 (Index Construction)

Neo4j용 PropertyGraph 스토어를 만들고, SimpleLLMPathExtractor로 지식 그래프를 추출해 PropertyGraphIndex를 구축합니다.

from llama_index.graph_stores.neo4j import Neo4jPropertyGraphStore
# Note: used to be `Neo4jPGStore`

graph_store = Neo4jPropertyGraphStore(
    username="neo4j",
    password="llamaindex",
    url="bolt://localhost:7687",
)
from llama_index.core import PropertyGraphIndex
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.indices.property_graph import SimpleLLMPathExtractor

index = PropertyGraphIndex.from_documents(
    documents,
    embed_model=embed_model,
    kg_extractors=[
        SimpleLLMPathExtractor(
            llm=llm
        )
    ],
    property_graph_store=graph_store,
    show_progress=True,
)
from llama_index.core import Settings
Settings.llm = llm
Settings.embed_model = embed_model

Retriever (Retrievers)

동의어 기반 검색기(LLMSynonymRetriever)와 벡터 문맥 검색기(VectorContextRetriever)를 만듭니다.

from llama_index.core.indices.property_graph import (
    LLMSynonymRetriever,
    VectorContextRetriever,
)

llm_synonym = LLMSynonymRetriever(
    index.property_graph_store,
    llm=llm,
    include_text=False,
)

vector_context = VectorContextRetriever(
    index.property_graph_store,
    embed_model=embed_model,
    include_text=False,
)

검색 (Retrieving)

두 검색기를 결합한 retriever로 쿼리에 관련된 노드를 가져옵니다.

retriever = index.as_retriever(
    sub_retrievers=[
        llm_synonym,
        vector_context,
    ],
)

nodes = retriever.retrieve("What did author do at Viaweb?")
for node in nodes:
    print(node.text)

쿼리 엔진 (QueryEngine)

include_text=True로 쿼리 엔진을 만들어 질의합니다.

query_engine = index.as_query_engine(include_text=True)
response = query_engine.query("What did author do at Viaweb?")
display(Markdown(f"{response.response}"))

더 알아보기 (Learn more)

  • LlamaIndex PropertyGraphIndex 문서 — 지식 그래프 기반 인덱스 가이드
  • Neo4jPropertyGraphStore — Neo4j 기반 그래프 스토어 (과거 Neo4jPGStore)
  • SimpleLLMPathExtractor — 문서에서 경로(관계)를 추출하는 LLM 추출기
  • Neo4j Aura — 클라우드 호스팅 Neo4j 서비스