Lexikala grafer

Graph RAG med LangChain och Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Sammanfattning

Resultaten injiceras i prompten och skickas till LLM:en

Graph RAG med LangChain och Neo4j

Lexikala grafer

 

  • En grafrepresentation av ostrukturerad text och dokument
  • Lagrar en hierarkisk representation av en bok, forskningsartikel osv.
  • Den granulära nivån lagrar råtext

Ett diagram som visar en hierarki med ett dokument som har ett-till-många-relationer till sidor, där varje sida har många chunk-noder kopplade till sig

Graph RAG med LangChain och Neo4j

Romeo och Julia

Introduktion:

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

Karaktärsinformation:

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

Akter och scener:

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 med LangChain och Neo4j

Romeo och Julia som kunskapsgraf

 

  • Pjäsen består av Akter

Ett kunskapsgrafdiagram som markerar en akt-nod

Graph RAG med LangChain och Neo4j

Romeo och Julia som kunskapsgraf

 

  • Pjäsen består av Akter
  • Akter består av Scener

Ett kunskapsgrafdiagram som markerar relationen HAS_SCENE från akt-noden till scen-noden

Graph RAG med LangChain och Neo4j

Romeo och Julia som kunskapsgraf

 

  • Pjäsen består av Akter
  • Akter består av Scener
  • Scener har Repliker

Ett kunskapsgrafdiagram som markerar relationen HAS_LINE från scen-noden till replik-noden

Graph RAG med LangChain och Neo4j

Romeo och Julia som kunskapsgraf

 

  • Pjäsen består av Akter
  • Akter består av Scener
  • Scener har Repliker
  • Repliker framförs av Karaktärer

Ett kunskapsgrafdiagram som markerar relationen SPOKEN_BY från replik-noden till karaktärsnoden

Graph RAG med LangChain och Neo4j

Romeo och Julia som kunskapsgraf

 

  • Pjäsen består av Akter
  • Akter består av Scener
  • Scener har Repliker
  • Repliker framförs av Karaktärer

 

→ Varje Replik-nod har egenskaperna text och embedding

Ett grafdiagram med följande relationer: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG med LangChain och Neo4j

Läsa in dokumentet

Läs in ett dokument i minnet med en dokumentladdare:

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

Dela upp dokumentet

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 med LangChain och Neo4j

Skapa noder och relationer

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 med LangChain och Neo4j

Extrahera akter

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG med LangChain och Neo4j

Extrahera akter

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 med LangChain och Neo4j

Extrahera akter

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 med LangChain och Neo4j

Spara noder och relationer

Använd Neo4jGraph-objektet:

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

Nu kör vi en övning!

Graph RAG med LangChain och Neo4j

Preparing Video For Download...