Grafuri lexicale

Graph RAG cu LangChain și Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Recapitulare

Rezultatele sunt inserate în prompt și trimise către LLM

Graph RAG cu LangChain și Neo4j

Grafuri lexicale

 

  • O reprezentare graf a textului nestructurat și a documentelor
  • Stochează o reprezentare ierarhică a unei cărți, lucrări de cercetare etc.
  • Nivelul granular stochează textul brut

Diagramă reprezentând ierarhia unui document, relații unu-la-mai-mulți cu pagini, fiecare având mai multe noduri chunk asociate

Graph RAG cu LangChain și Neo4j

Romeo și Julieta

Introducere:

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

Informații despre personaje:

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

Acte și scene:

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 cu LangChain și Neo4j

Romeo și Julieta ca graf de cunoștințe

 

  • Piesa este formată din Acte

Diagramă a unui graf de cunoștințe evidențiind un nod Act

Graph RAG cu LangChain și Neo4j

Romeo și Julieta ca graf de cunoștințe

 

  • Piesa este formată din Acte
  • Actele sunt formate din Scene

Diagramă a unui graf de cunoștințe evidențiind relația HAS_SCENE de la nodul Act la nodul Scene

Graph RAG cu LangChain și Neo4j

Romeo și Julieta ca graf de cunoștințe

 

  • Piesa este formată din Acte
  • Actele sunt formate din Scene
  • Scenele conțin Replici

Diagramă a unui graf de cunoștințe evidențiind relația HAS_LINE de la nodul Scene la nodul Line

Graph RAG cu LangChain și Neo4j

Romeo și Julieta ca graf de cunoștințe

 

  • Piesa este formată din Acte
  • Actele sunt formate din Scene
  • Scenele conțin Replici
  • Replicile sunt rostite de Personaje

Diagramă a unui graf de cunoștințe evidențiind relația SPOKEN_BY de la nodul Line la nodul Character

Graph RAG cu LangChain și Neo4j

Romeo și Julieta ca graf de cunoștințe

 

  • Piesa este formată din Acte
  • Actele sunt formate din Scene
  • Scenele conțin Replici
  • Replicile sunt rostite de Personaje

 

→ Fiecare nod Line va avea proprietăți de text și embedding

Diagramă a unui graf cu relațiile: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG cu LangChain și Neo4j

Încărcarea documentului

Încarcă un document în memorie folosind un document loader:

# Load the PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG cu LangChain și Neo4j

Divizarea documentului

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 cu LangChain și Neo4j

Crearea nodurilor și relațiilor

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=[])
Graph RAG cu LangChain și Neo4j

Extragerea actelor

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG cu LangChain și Neo4j

Extragerea actelor

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 cu LangChain și Neo4j

Extragerea actelor

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)
Graph RAG cu LangChain și Neo4j

Salvarea nodurilor și relațiilor

Folosind obiectul Neo4jGraph:

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

Hai să exersăm!

Graph RAG cu LangChain și Neo4j

Preparing Video For Download...