Grafos léxicos

Graph RAG con LangChain y Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Resumen

Los resultados se inyectan en el prompt listos para enviarse al LLM

Graph RAG con LangChain y Neo4j

Grafos léxicos

 

  • Una representación en grafo de texto y documentos no estructurados
  • Almacena la jerarquía de un libro, artículo, etc.
  • En el nivel granular guarda el texto bruto

Un diagrama que representa la jerarquía de un documento, relaciones de uno-a-muchos con páginas, cada una con muchos nodos de fragmento asociados

Graph RAG con LangChain y Neo4j

Romeo y Julieta

Introducción:

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

Información de personajes:

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

Prólogo:

 Enter Chorus.

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

Actos y escenas:

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 y Neo4j

Romeo y Julieta como grafo de conocimiento

 

  • Una obra tiene actos

Un diagrama de grafo de conocimiento que resalta un nodo Acto

Graph RAG con LangChain y Neo4j

Romeo y Julieta como grafo de conocimiento

 

  • Una obra tiene actos
  • Los actos tienen escenas

Un diagrama de grafo de conocimiento que resalta la relación HAS_SCENE del nodo Acto al nodo Escena

Graph RAG con LangChain y Neo4j

Romeo y Julieta como grafo de conocimiento

 

  • Una obra tiene actos
  • Los actos tienen escenas
  • Las escenas tienen líneas

Un diagrama de grafo de conocimiento que resalta la relación HAS_LINE del nodo Escena al nodo Línea

Graph RAG con LangChain y Neo4j

Romeo y Julieta como grafo de conocimiento

 

  • Una obra tiene actos
  • Los actos tienen escenas
  • Las escenas tienen líneas
  • Las líneas las dicen los personajes

Un diagrama de grafo de conocimiento que resalta la relación SPOKEN_BY del nodo Línea al nodo Personaje

Graph RAG con LangChain y Neo4j

Romeo y Julieta como grafo de conocimiento

 

  • Una obra tiene actos
  • Los actos tienen escenas
  • Las escenas tienen líneas
  • Las líneas las dicen los personajes

 

→ Cada nodo Línea tendrá propiedades de texto y de embedding

Un diagrama de grafo que muestra las relaciones: Acto HAS_SCENE Escena, Escena HAS_LINE Línea, Línea SPOKEN_BY Personaje

Graph RAG con LangChain y Neo4j

Cargar el documento

Carga un documento en memoria con un cargador de documentos:

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

Dividir el 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 y Neo4j

Crear nodos y relaciones

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 y Neo4j

Extraer actos

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 y Neo4j

Extraer actos

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 y Neo4j

Extraer actos

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 y Neo4j

Guardar nodos y relaciones

Usa el objeto Neo4jGraph:

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

¡Vamos a practicar!

Graph RAG con LangChain y Neo4j

Preparing Video For Download...