Graf leksikal

Graph RAG dengan LangChain dan Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Ringkasan

Hasil dimasukkan ke prompt dan siap dikirim ke LLM

Graph RAG dengan LangChain dan Neo4j

Graf leksikal

 

  • Representasi graf dari teks dan dokumen tidak terstruktur
  • Menyimpan hierarki buku, makalah riset, dll.
  • Level terperinci menyimpan teks mentah

Diagram yang merepresentasikan hierarki dokumen, relasi satu-ke-banyak ke halaman, masing-masing memiliki banyak simpul potongan (chunk)

Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet

Pendahuluan:

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

Informasi Tokoh:

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.
...

Prolog:

 Enter Chorus.

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

Babak dan Adegan:

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
Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet sebagai graph pengetahuan

 

  • Naskah terdiri dari Babak (Act)

Diagram graph pengetahuan menyorot simpul Act

Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet sebagai graph pengetahuan

 

  • Naskah terdiri dari Babak (Act)
  • Babak terdiri dari Adegan (Scene)

Diagram graph pengetahuan menyorot relasi HAS_SCENE dari simpul Act ke simpul Scene

Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet sebagai graph pengetahuan

 

  • Naskah terdiri dari Babak (Act)
  • Babak terdiri dari Adegan (Scene)
  • Adegan berisi Baris dialog (Line)

Diagram graph pengetahuan menyorot relasi HAS_LINE dari simpul Scene ke simpul Line

Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet sebagai graph pengetahuan

 

  • Naskah terdiri dari Babak (Act)
  • Babak terdiri dari Adegan (Scene)
  • Adegan berisi Baris dialog (Line)
  • Baris diucapkan oleh Tokoh (Character)

Diagram graph pengetahuan menyorot relasi SPOKEN_BY dari simpul Line ke simpul Character

Graph RAG dengan LangChain dan Neo4j

Romeo dan Juliet sebagai graph pengetahuan

 

  • Naskah terdiri dari Babak (Act)
  • Babak terdiri dari Adegan (Scene)
  • Adegan berisi Baris dialog (Line)
  • Baris diucapkan oleh Tokoh (Character)

 

→ Setiap simpul Line memiliki properti teks dan embedding

Diagram graph menampilkan relasi: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG dengan LangChain dan Neo4j

Memuat dokumen

Muat dokumen ke memori dengan pemuat dokumen:

# Muat PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG dengan LangChain dan Neo4j

Memecah dokumen

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 )
Graph RAG dengan LangChain dan Neo4j

Membuat node dan relasi

play = Node(

type="Play",
id="romeo-and-juliet",
properties={ "title": "Romeo and Juliet", "playwright": "William Shakespeare", "genres": ["Romance", "Tragedy"] }
)
# Simpan dalam dokumen graph graph_doc = GraphDocument(nodes=[play], relationships=[])
Graph RAG dengan LangChain dan Neo4j

Mengekstrak babak

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG dengan LangChain dan Neo4j

Mengekstrak babak

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)
Graph RAG dengan LangChain dan Neo4j

Mengekstrak babak

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


# Buat relasi relationship = Relationship(
source=play,
target=act_node,
type="HAS_ACT",
properties=dict(order=a)
)
graph_doc.relationships.append(relationship)
Graph RAG dengan LangChain dan Neo4j

Menyimpan node dan relasi

Menggunakan objek Neo4jGraph:

graph = Neo4jGraph(
    url=NEO4J_URI, 
    username=NEO4J_USERNAME, 
    password=NEO4J_PASSWORD
)
graph.add_graph_documents([graph_doc])
Graph RAG dengan LangChain dan Neo4j

Ayo berlatih!

Graph RAG dengan LangChain dan Neo4j

Preparing Video For Download...