어휘 그래프

LangChain과 Neo4j로 배우는 Graph RAG

Adam Cowley

Manager, Developer Education at Neo4j

요약

결과가 프롬프트에 주입되어 LLM으로 전송할 준비가 됨

LangChain과 Neo4j로 배우는 Graph RAG

어휘 그래프

 

  • 비정형 텍스트/문서의 그래프 표현
  • 책, 논문 등의 계층 구조 저장
  • 최하위에는 원문 텍스트 저장

문서의 계층, 페이지로의 일대다 관계, 각 페이지에 연결된 여러 청크 노드를 나타내는 다이어그램

LangChain과 Neo4j로 배우는 Graph RAG

로미오와 줄리엣

소개:

The Project Gutenberg eBook of Romeo and Juliet

This ebook is for the use of anyone anywhere in the United States and
most other parts of the world at no cost and with almost no restrictions

Title: Romeo and Juliet
Author: William Shakespeare

인물 정보:

Dramatis Personæ

ESCALUS, Prince of Verona.
MERCUTIO, kinsman to the Prince, and friend to Romeo.
PARIS, a young Nobleman, kinsman to the Prince.
Page to Paris.
...

프롤로그:

 Enter Chorus.

CHORUS.
Two households, both alike in dignity,
In fair Verona, where we lay our scene,
From ancient grudge break to new mutiny,
...

막과 장:

ACT I
SCENE I. A public place.
 Enter Sampson and Gregory armed with swords and bucklers.

SAMPSON.
Gregory, on my word, we’ll not carry coals.

GREGORY.
No, for then we should be colliers...
1 https://gutenberg.org/ebooks/1513
LangChain과 Neo4j로 배우는 Graph RAG

지식 그래프로 본 로미오와 줄리엣

 

  • 희곡은 막(Act)으로 구성됨

막 노드를 강조한 지식 그래프 다이어그램

LangChain과 Neo4j로 배우는 Graph RAG

지식 그래프로 본 로미오와 줄리엣

 

  • 희곡은 막(Act)으로 구성됨
  • 막은 장(Scene)으로 구성됨

Act 노드에서 Scene 노드로 가는 HAS_SCENE 관계를 강조한 지식 그래프 다이어그램

LangChain과 Neo4j로 배우는 Graph RAG

지식 그래프로 본 로미오와 줄리엣

 

  • 희곡은 막(Act)으로 구성됨
  • 막은 장(Scene)으로 구성됨
  • 장에는 대사(Line)가 있음

Scene 노드에서 Line 노드로 가는 HAS_LINE 관계를 강조한 지식 그래프 다이어그램

LangChain과 Neo4j로 배우는 Graph RAG

지식 그래프로 본 로미오와 줄리엣

 

  • 희곡은 막(Act)으로 구성됨
  • 막은 장(Scene)으로 구성됨
  • 장에는 대사(Line)가 있음
  • 대사는 인물(Character)이 말함

Line 노드에서 Character 노드로 가는 SPOKEN_BY 관계를 강조한 지식 그래프 다이어그램

LangChain과 Neo4j로 배우는 Graph RAG

지식 그래프로 본 로미오와 줄리엣

 

  • 희곡은 막(Act)으로 구성됨
  • 막은 장(Scene)으로 구성됨
  • 장에는 대사(Line)가 있음
  • 대사는 인물(Character)이 말함

 

→ 각 Line 노드는 텍스트와 임베딩 속성을 가짐

다음 관계를 보여주는 그래프 다이어그램: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

LangChain과 Neo4j로 배우는 Graph RAG

문서 적재

문서 로더로 문서를 메모리에 적재:

# Load the PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
LangChain과 Neo4j로 배우는 Graph RAG

문서 분할

act_splitter = RecursiveCharacterTextSplitter(
    # Split text into acts
    separators=[ r"\n\nTHE PROLOGUE.",  r"\n\nACT", r"\n\n\*\*\* END"],
    is_separator_regex=True
)

scene_splitter = RecursiveCharacterTextSplitter( # Split act into scenes separators=[r"\nSCENE "], is_separator_regex=True )
LangChain과 Neo4j로 배우는 Graph RAG

노드와 관계 생성

play = Node(

type="Play",
id="romeo-and-juliet",
properties={ "title": "Romeo and Juliet", "playwright": "William Shakespeare", "genres": ["Romance", "Tragedy"] }
)
# Store in a graph document graph_doc = GraphDocument(nodes=[play], relationships=[])
LangChain과 Neo4j로 배우는 Graph RAG

막 추출

parts = act_splitter.split_text(text)

for act in parts: print(act[:20])
THE PROLOGUE...

ACT I
ACT II
ACT III
LangChain과 Neo4j로 배우는 Graph RAG

막 추출

parts = act_splitter.split_text(text)

for a, act in enumerate(parts):

first_line = act_text.split("\n")[0].strip()
if first_line.startswith("ACT"):
act_node = Node(
type="Act",
id=first_line,
)
graph_doc.nodes.append(act_node)
LangChain과 Neo4j로 배우는 Graph RAG

막 추출

for a, act in enumerate(parts):
    # ...
    # act_node = Node(...)


# Create a relationship relationship = Relationship(
source=play,
target=act_node,
type="HAS_ACT",
properties=dict(order=a)
)
graph_doc.relationships.append(relationship)
LangChain과 Neo4j로 배우는 Graph RAG

노드와 관계 저장

Neo4jGraph 객체 사용:

graph = Neo4jGraph(
    url=NEO4J_URI, 
    username=NEO4J_USERNAME, 
    password=NEO4J_PASSWORD
)
graph.add_graph_documents([graph_doc])
LangChain과 Neo4j로 배우는 Graph RAG

연습해 봅시다!

LangChain과 Neo4j로 배우는 Graph RAG

Preparing Video For Download...