Grafos e RAG

Graph RAG com LangChain e Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Conheça seu instrutor

 

  • Manager, Educação para Desenvolvedores na Neo4j
  • Educação para devs pela Neo4j GraphAcademy
  • 20+ anos de experiência em desenvolvimento de software
  • 10+ anos de experiência com Neo4j

 

Foto do Adam

1 https://graphacademy.neo4j.com
Graph RAG com LangChain e Neo4j

O R em RAG

Um diagrama de aplicação com uma entrada do usuário sendo adicionada a um prompt enviado para um LLM

Graph RAG com LangChain e Neo4j

O R em RAG

O prompt precisa de contexto vindo de documentos e fontes de dados

Graph RAG com LangChain e Neo4j

O R em RAG

Esses dados geralmente são convertidos em embeddings vetoriais

Graph RAG com LangChain e Neo4j

Onde a busca semântica falha?

Vetores funcionam bem para

  • Perguntas vagas ou abertas

Vetores são ineficazes para

  • Perguntas muito específicas ou factuais
  • Consultas numéricas ou de correspondência exata
  • Consultas lógicas

O que Paul Graham acha de IA generativa?

Em quantas startups de IA generativa Paul Graham investiu?

Graph RAG com LangChain e Neo4j

Vetores vs. grafos de conhecimento

Texto Embedding vetorial
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Um diagrama de grafo mostrando as entidades mencionadas na letra de Don't Stop Believin'. Um garoto de cidade pequena, com relacionamentos BORN e RAISED com South Detroit

Graph RAG com LangChain e Neo4j

Vetores vs. grafos de conhecimento

Texto Embedding vetorial
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Os nós são: uma pessoa (Small town boy), um local (South Detroit), um trem (Midnight Train) e um local (Anywhere)

Graph RAG com LangChain e Neo4j

Vetores vs. grafos de conhecimento

Texto Embedding vetorial
He's just a city boy born [0.12, -0.34, 0.56, 0.78, ..., -0.91]
born and raised in South Detroit [0.22, 0.45, -0.67, 0.11, ..., 0.33]
He took the midnight train [-0.55, 0.89, 0.12, -0.44, ..., 0.67]
going anywhere [0.78, -0.23, 0.45, 0.91, ..., -0.12]

Os relacionamentos BORN e RAISED vão da pessoa para o local. O trem GOING vai do nó Midnight Train para o nó Anywhere

Graph RAG com LangChain e Neo4j

Grafos de conhecimento e Neo4j

 

  • Neo4j é o principal banco de dados de grafos do mundo
  • Flexível, com esquema opcional
  • Integração LangChain langchain-neo4j
  • LCEL: LangChain Expression Language

Os logos do neo4j e do langchain

1 https://db-engines.com/en/ranking/graph%20dbms
Graph RAG com LangChain e Neo4j

Nós representam coisas

from langchain_neo4j.graphs.graph_document \
  import Node

book = Node(
type="Book",
id=f"9781098127107",
properties={ "title": "Building Knowledge Graphs" }
)

Um nó de livro em um diagrama de grafo com propriedades de ID e Título

Graph RAG com LangChain e Neo4j

Relacionamentos conectam nós

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(





)

Dois relacionamentos WRITTEN_BY indo de um nó Book para dois nós Person que representam os autores

Graph RAG com LangChain e Neo4j

Relacionamentos conectam nós

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,



)

O nó de origem do relacionamento WRITTEN_BY é o nó Book

Graph RAG com LangChain e Neo4j

Relacionamentos conectam nós

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,


)

O nó de destino para um relacionamento WRITTEN_IN é uma Person

Graph RAG com LangChain e Neo4j

Relacionamentos conectam nós

from langchain_neo4j.graphs.graph_document \
  import Node, Relationship

book = Node(type="Book", id=f"9781098127107")

jesus = Node(type="Person", id="dr-jesus-barrasa")
jim = Node(type="Person", id="chief-scientist")
for author in [jesus, jim]:
    relationship = Relationship(

source=book,
target=author,
type="WRITTEN_BY"
properties=dict(...)
)

O diagrama inclui o Book e dois relacionamentos WRITTEN_BY com autores para mostrar que nós podem ter muitos relacionamentos.

Graph RAG com LangChain e Neo4j

Conectando ao Neo4j

from langchain_neo4j import Neo4jGraph


graph = Neo4jGraph( url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD )
1 https://neo4j.com/docs/getting-started/
Graph RAG com LangChain e Neo4j

Salvando documentos de grafo

from langchain_neo4j.graphs.graph_document import GraphDocument


# Wrapper for Nodes and Relationships doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Save nodes and relationships to the database graph.add_graph_documents([graph_document])
Graph RAG com LangChain e Neo4j

Então, o que é GraphRAG?

O diagrama anterior com contexto de documentos e seus embeddings

Graph RAG com LangChain e Neo4j

Então, o que é GraphRAG?

O diagrama anterior com contexto de documentos e um grafo de conhecimento adicional mostrando nós e relacionamentos derivados dos documentos

Graph RAG com LangChain e Neo4j

Vamos praticar!

Graph RAG com LangChain e Neo4j

Preparing Video For Download...