Grafi lessicali

Graph RAG con LangChain e Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Riepilogo

I risultati vengono inseriti nel prompt, pronti per essere inviati al LLM

Graph RAG con LangChain e Neo4j

Grafi lessicali

 

  • Una rappresentazione a grafo di testo e documenti non strutturati
  • Memorizza la struttura gerarchica di un libro, paper, ecc.
  • Al livello granulare memorizza il testo grezzo

Un diagramma che rappresenta la gerarchia: documento, relazioni uno-a-molti con pagine, ciascuna con molti nodi di chunk associati

Graph RAG con LangChain e Neo4j

Romeo e Giulietta

Introduzione:

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

Informazioni sui personaggi:

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

Prologo:

 Enter Chorus.

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

Atti e 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 con LangChain e Neo4j

Romeo e Giulietta come knowledge graph

 

  • L’opera è composta da Atti

Un grafo della conoscenza con evidenziato un nodo Atto

Graph RAG con LangChain e Neo4j

Romeo e Giulietta come knowledge graph

 

  • L’opera è composta da Atti
  • Gli atti sono composti da Scene

Un grafo della conoscenza con evidenziata la relazione HAS_SCENE dal nodo Atto al nodo Scena

Graph RAG con LangChain e Neo4j

Romeo e Giulietta come knowledge graph

 

  • L’opera è composta da Atti
  • Gli atti sono composti da Scene
  • Le scene hanno Battute

Un grafo della conoscenza con evidenziata la relazione HAS_LINE dal nodo Scena al nodo Battuta

Graph RAG con LangChain e Neo4j

Romeo e Giulietta come knowledge graph

 

  • L’opera è composta da Atti
  • Gli atti sono composti da Scene
  • Le scene hanno Battute
  • Le battute sono pronunciate dai Personaggi

Un grafo della conoscenza con evidenziata la relazione SPOKEN_BY dal nodo Battuta al nodo Personaggio

Graph RAG con LangChain e Neo4j

Romeo e Giulietta come knowledge graph

 

  • L’opera è composta da Atti
  • Gli atti sono composti da Scene
  • Le scene hanno Battute
  • Le battute sono pronunciate dai Personaggi

 

→ Ogni nodo Battuta avrà proprietà testo ed embedding

Un grafo che mostra: Atto HAS_SCENE Scena, Scena HAS_LINE Battuta, Battuta SPOKEN_BY Personaggio

Graph RAG con LangChain e Neo4j

Caricare il documento

Carica un documento in memoria con un loader:

# Carica il PDF
loader = PyPDFLoader("romeo-and-juliet.pdf")
pages = loader.load()
Graph RAG con LangChain e Neo4j

Suddividere il documento

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 con LangChain e Neo4j

Creare nodi e relazioni

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 con LangChain e Neo4j

Estrarre gli atti

parts = act_splitter.split_text(text)

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

ACT I
ACT II
ACT III
Graph RAG con LangChain e Neo4j

Estrarre gli atti

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 con LangChain e Neo4j

Estrarre gli atti

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 con LangChain e Neo4j

Salvare nodi e relazioni

Usando l’oggetto Neo4jGraph:

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

Aiamo a esercitarci!

Graph RAG con LangChain e Neo4j

Preparing Video For Download...