Grafos lexicais

Graph RAG com LangChain e Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Recapitulando

Os resultados são inseridos no prompt, prontos para enviar ao LLM

Graph RAG com LangChain e Neo4j

Grafos lexicais

 

  • Uma representação em grafo de texto e documentos não estruturados
  • Armazena a hierarquia de um livro, artigo científico etc.
  • No nível granular, guarda o texto bruto

Um diagrama representando a hierarquia de um documento, relacionamentos de um-para-muitos para páginas, cada uma com vários nós de chunks associados

Graph RAG com LangChain e Neo4j

Romeu e Julieta

Introdução:

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

Informações de personagens:

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

Ato e cenas:

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

Romeu e Julieta como grafo de conhecimento

 

  • A peça tem Atos

Um diagrama de grafo de conhecimento destacando um nó Act

Graph RAG com LangChain e Neo4j

Romeu e Julieta como grafo de conhecimento

 

  • A peça tem Atos
  • Atos têm Cenas

Um diagrama de grafo de conhecimento destacando o relacionamento HAS_SCENE do nó Act para o nó Scene

Graph RAG com LangChain e Neo4j

Romeu e Julieta como grafo de conhecimento

 

  • A peça tem Atos
  • Atos têm Cenas
  • Cenas têm Fal falas

Um diagrama de grafo de conhecimento destacando o relacionamento HAS_LINE do nó Scene para o nó Line

Graph RAG com LangChain e Neo4j

Romeu e Julieta como grafo de conhecimento

 

  • A peça tem Atos
  • Atos têm Cenas
  • Cenas têm Falas
  • Falas são ditas por Personagens

Um diagrama de grafo de conhecimento destacando o relacionamento SPOKEN_BY do nó Line para o nó Character

Graph RAG com LangChain e Neo4j

Romeu e Julieta como grafo de conhecimento

 

  • A peça tem Atos
  • Atos têm Cenas
  • Cenas têm Falas
  • Falas são ditas por Personagens

 

→ Cada nó Line terá propriedades de texto e embedding

Um diagrama de grafo mostrando os relacionamentos: Act HAS_SCENE Scene, Scene HAS_LINE Line, Line SPOKEN_BY Character

Graph RAG com LangChain e Neo4j

Carregando o documento

Carregue um documento na memória usando um loader:

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

Dividindo o 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 com LangChain e Neo4j

Criando nós e relacionamentos

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

Extraindo atos

parts = act_splitter.split_text(text)

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

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

Extraindo atos

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

Extraindo atos

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

Salvando nós e relacionamentos

Usando o objeto Neo4jGraph:

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

Vamos praticar!

Graph RAG com LangChain e Neo4j

Preparing Video For Download...