Lexicale grafen

Graph RAG met LangChain en Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Samenvatting

De resultaten worden in de prompt gezet en naar de LLM gestuurd

Graph RAG met LangChain en Neo4j

Lexicale grafen

 

  • Een grafische weergave van ongestructureerde tekst en documenten
  • Slaat een hiërarchische weergave op van een boek, paper, enz.
  • Op detailniveau staat ruwe tekst

Een diagram met de hiërarchie: document met één-op-veel naar pagina’s, elk met meerdere chunk-nodes

Graph RAG met LangChain en Neo4j

Romeo en Julia

Introductie:

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

Personages:

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

Proloog:

 Enter Chorus.

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

Bedrijf en scènes:

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 met LangChain en Neo4j

Romeo en Julia als kennisgrafiek

 

  • Een stuk bestaat uit bedrijven

Een kennisgrafiek met de node Act (bedrijf) gemarkeerd

Graph RAG met LangChain en Neo4j

Romeo en Julia als kennisgrafiek

 

  • Een stuk bestaat uit bedrijven
  • Bedrijven bestaan uit scènes

Een kennisgrafiek met de relatie HAS_SCENE van de node Act naar de node Scene gemarkeerd

Graph RAG met LangChain en Neo4j

Romeo en Julia als kennisgrafiek

 

  • Een stuk bestaat uit bedrijven
  • Bedrijven bestaan uit scènes
  • Scènes hebben regels

Een kennisgrafiek met de relatie HAS_LINE van de node Scene naar de node Line gemarkeerd

Graph RAG met LangChain en Neo4j

Romeo en Julia als kennisgrafiek

 

  • Een stuk bestaat uit bedrijven
  • Bedrijven bestaan uit scènes
  • Scènes hebben regels
  • Regels worden uitgesproken door personages

Een kennisgrafiek met de relatie SPOKEN_BY van de node Line naar de node Character gemarkeerd

Graph RAG met LangChain en Neo4j

Romeo en Julia als kennisgrafiek

 

  • Een stuk bestaat uit bedrijven
  • Bedrijven bestaan uit scènes
  • Scènes hebben regels
  • Regels worden uitgesproken door personages

 

→ Elke Line-node heeft tekst- en embedding-eigenschappen

Een grafiek met relaties: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG met LangChain en Neo4j

Het document laden

Laad een document in het geheugen met een documentlader:

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

Het document splitsen

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 met LangChain en Neo4j

Nodes en relaties maken

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 met LangChain en Neo4j

Bedrijven extraheren

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG met LangChain en Neo4j

Bedrijven extraheren

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 met LangChain en Neo4j

Bedrijven extraheren

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 met LangChain en Neo4j

Nodes en relaties opslaan

Met het object Neo4jGraph:

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

Laten we oefenen!

Graph RAG met LangChain en Neo4j

Preparing Video For Download...