Grafen en RAG

Graph RAG met LangChain en Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Maak kennis met je docent

 

  • Manager, Developer Education bij Neo4j
  • Developer Education via Neo4j GraphAcademy
  • 20+ jaar software-ervaring
  • 10+ jaar Neo4j-ervaring

 

Foto van Adam

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

De R in RAG

Een app-diagram: gebruikersinvoer wordt aan een prompt toegevoegd en naar een LLM gestuurd

Graph RAG met LangChain en Neo4j

De R in RAG

De prompt heeft context nodig uit documenten en databronnen

Graph RAG met LangChain en Neo4j

De R in RAG

Deze data wordt vaak omgezet naar vector-embeddings

Graph RAG met LangChain en Neo4j

Waar faalt semantisch zoeken?

Vectoren werken goed voor

  • Vage of open vragen

Vectoren werken minder voor

  • Zeer specifieke of feitelijke vragen
  • Numerieke of exact-match queries
  • Logische queries

Wat vindt Paul Graham van Generative AI?

In hoeveel Generative AI-startups heeft Paul Graham geïnvesteerd?

Graph RAG met LangChain en Neo4j

Vectoren vs. knowledge graphs

Tekst Vector-embedding
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]

Een grafiek met de entiteiten uit de songtekst van Don't Stop Believin'. Een jongen uit een kleine stad met BORN- en RAISED-relaties naar South Detroit

Graph RAG met LangChain en Neo4j

Vectoren vs. knowledge graphs

Tekst Vector-embedding
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]

De knooppunten zijn: een persoon Small town boy, een locatie South Detroit, een trein Midnight Train en een locatie Anywhere

Graph RAG met LangChain en Neo4j

Vectoren vs. knowledge graphs

Tekst Vector-embedding
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]

De relaties BORN en RAISED gaan van de persoon naar de locatie. De GOING-trein gaat van het knooppunt Midnight Train naar Anywhere

Graph RAG met LangChain en Neo4j

Knowledge graphs en Neo4j

 

  • Neo4j is ’s werelds toonaangevende graafdatabase
  • Flexibel, schema-optioneel
  • langchain-neo4j-integratie voor LangChain
  • LCEL: LangChain Expression Language

De logo’s van neo4j en langchain

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

Nodes stellen dingen voor

from langchain_neo4j.graphs.graph_document \
  import Node

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

Een boekknooppunt in een graaf met eigenschappen voor ID en titel

Graph RAG met LangChain en Neo4j

Relaties verbinden nodes

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(





)

Twee WRITTEN_BY-relaties van een Book-knooppunt naar twee Person-knooppunten (de auteurs)

Graph RAG met LangChain en Neo4j

Relaties verbinden nodes

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,



)

De bron van de WRITTEN_BY-relatie is het Book-knooppunt

Graph RAG met LangChain en Neo4j

Relaties verbinden nodes

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,


)

De bestemming van een WRITTEN_BY-relatie is een Person

Graph RAG met LangChain en Neo4j

Relaties verbinden nodes

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

Het diagram met het Book-knooppunt en twee WRITTEN_BY-relaties naar auteurs; nodes kunnen veel relaties hebben.

Graph RAG met LangChain en Neo4j

Verbinden met 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 met LangChain en Neo4j

Graph-documenten opslaan

from langchain_neo4j.graphs.graph_document import GraphDocument


# Wrapper voor Nodes en Relationships doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Sla nodes en relaties op in de database graph.add_graph_documents([graph_document])
Graph RAG met LangChain en Neo4j

Wat is GraphRAG?

Het vorige diagram met context uit documenten en hun embeddings

Graph RAG met LangChain en Neo4j

Wat is GraphRAG?

Het vorige diagram met context uit documenten plus een knowledge graph met nodes en relaties afgeleid uit de documenten

Graph RAG met LangChain en Neo4j

Laten we oefenen!

Graph RAG met LangChain en Neo4j

Preparing Video For Download...