Grafy leksykalne

Graph RAG z LangChain i Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Podsumowanie

Wyniki są wstrzykiwane do promptu gotowego do wysłania do LLM

Graph RAG z LangChain i Neo4j

Grafy leksykalne

 

  • Grafowa reprezentacja nieustrukturyzowanego tekstu i dokumentów
  • Przechowuje hierarchiczną strukturę książki, artykułu naukowego itp.
  • Na najniższym poziomie granularności — surowy tekst

Diagram przedstawiający hierarchię dokumentu: relacje jeden-do-wielu z węzłami stron, do których przypisane są węzły fragmentów

Graph RAG z LangChain i Neo4j

Romeo i Julia

Wstęp:

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

Postacie:

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

Akty i sceny:

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 z LangChain i Neo4j

Romeo i Julia jako graf wiedzy

 

  • Sztuka składa się z Aktów

Diagram grafu wiedzy z wyróżnionym węzłem Aktu

Graph RAG z LangChain i Neo4j

Romeo i Julia jako graf wiedzy

 

  • Sztuka składa się z Aktów
  • Akty składają się ze Scen

Diagram grafu wiedzy z wyróżnioną relacją HAS_SCENE między węzłem Aktu a węzłem Sceny

Graph RAG z LangChain i Neo4j

Romeo i Julia jako graf wiedzy

 

  • Sztuka składa się z Aktów
  • Akty składają się ze Scen
  • Sceny zawierają Kwestie

Diagram grafu wiedzy z wyróżnioną relacją HAS_LINE między węzłem Sceny a węzłem Kwestii

Graph RAG z LangChain i Neo4j

Romeo i Julia jako graf wiedzy

 

  • Sztuka składa się z Aktów
  • Akty składają się ze Scen
  • Sceny zawierają Kwestie
  • Kwestie wypowiadają Postacie

Diagram grafu wiedzy z wyróżnioną relacją SPOKEN_BY między węzłem Kwestii a węzłem Postaci

Graph RAG z LangChain i Neo4j

Romeo i Julia jako graf wiedzy

 

  • Sztuka składa się z Aktów
  • Akty składają się ze Scen
  • Sceny zawierają Kwestie
  • Kwestie wypowiadają Postacie

 

→ Każdy węzeł Kwestii ma właściwości: tekst i osadzenie (embedding)

Diagram grafu przedstawiający relacje: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG z LangChain i Neo4j

Wczytywanie dokumentu

Wczytaj dokument do pamięci za pomocą loadera dokumentów:

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

Podział dokumentu

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 z LangChain i Neo4j

Tworzenie węzłów i relacji

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 z LangChain i Neo4j

Wyodrębnianie aktów

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG z LangChain i Neo4j

Wyodrębnianie aktów

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 z LangChain i Neo4j

Wyodrębnianie aktów

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 z LangChain i Neo4j

Zapisywanie węzłów i relacji

Korzystając z obiektu Neo4jGraph:

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

Czas na praktykę!

Graph RAG z LangChain i Neo4j

Preparing Video For Download...