Lexikalische Graphen

Graph RAG mit LangChain und Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Zusammenfassung

Die Ergebnisse werden in den Prompt eingefügt und an das LLM gesendet

Graph RAG mit LangChain und Neo4j

Lexikalische Graphen

 

  • Eine Graphdarstellung unstrukturierter Texte und Dokumente
  • Speichert eine hierarchische Darstellung eines Buchs, Papers usw.
  • Auf granularer Ebene steht Rohtext

Ein Diagramm, das eine Hierarchie zeigt: Dokument, 1:n zu Seiten, jede mit vielen zugehörigen Chunk-Knoten

Graph RAG mit LangChain und Neo4j

Romeo und Julia

Einführung:

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

Figureninfos:

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

Akte und Szenen:

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 mit LangChain und Neo4j

Romeo und Julia als Wissensgraph

 

  • Ein Stück besteht aus Akten

Ein Wissensgraph mit hervorgehobenem Akt-Knoten

Graph RAG mit LangChain und Neo4j

Romeo und Julia als Wissensgraph

 

  • Ein Stück besteht aus Akten
  • Akte bestehen aus Szenen

Ein Wissensgraph mit hervorgehobener HAS_SCENE-Beziehung vom Akt- zum Szenen-Knoten

Graph RAG mit LangChain und Neo4j

Romeo und Julia als Wissensgraph

 

  • Ein Stück besteht aus Akten
  • Akte bestehen aus Szenen
  • Szenen enthalten Zeilen

Ein Wissensgraph mit hervorgehobener HAS_LINE-Beziehung vom Szenen- zum Zeilen-Knoten

Graph RAG mit LangChain und Neo4j

Romeo und Julia als Wissensgraph

 

  • Ein Stück besteht aus Akten
  • Akte bestehen aus Szenen
  • Szenen enthalten Zeilen
  • Zeilen werden von Figuren gesprochen

Ein Wissensgraph mit hervorgehobener SPOKEN_BY-Beziehung vom Zeilen- zum Figuren-Knoten

Graph RAG mit LangChain und Neo4j

Romeo und Julia als Wissensgraph

 

  • Ein Stück besteht aus Akten
  • Akte bestehen aus Szenen
  • Szenen enthalten Zeilen
  • Zeilen werden von Figuren gesprochen

 

→ Jeder Zeilen-Knoten hat Text- und Embedding-Eigenschaften

Ein Graph mit folgenden Beziehungen: Akt HAS_SCENE Szene, Szene HAS_LINE Zeile, Zeile SPOKEN_BY Figur

Graph RAG mit LangChain und Neo4j

Dokument laden

Lade ein Dokument mit einem Loader in den Speicher:

# PDF laden
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG mit LangChain und Neo4j

Dokument aufteilen

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 mit LangChain und Neo4j

Knoten und Beziehungen erstellen

play = Node(

type="Play",
id="romeo-and-juliet",
properties={ "title": "Romeo and Juliet", "playwright": "William Shakespeare", "genres": ["Romance", "Tragedy"] }
)
# In einem Graph-Dokument speichern graph_doc = GraphDocument(nodes=[play], relationships=[])
Graph RAG mit LangChain und Neo4j

Akte extrahieren

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG mit LangChain und Neo4j

Akte extrahieren

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 mit LangChain und Neo4j

Akte extrahieren

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


# Beziehung erstellen relationship = Relationship(
source=play,
target=act_node,
type="HAS_ACT",
properties=dict(order=a)
)
graph_doc.relationships.append(relationship)
Graph RAG mit LangChain und Neo4j

Knoten und Beziehungen speichern

Mit dem Objekt Neo4jGraph:

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

Lass uns üben!

Graph RAG mit LangChain und Neo4j

Preparing Video For Download...