Graphen und RAG

Graph RAG mit LangChain und Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Dein Instructor

 

  • Manager, Developer Education bei Neo4j
  • Developer Education über Neo4j GraphAcademy
  • 20+ Jahre Softwareentwicklung
  • 10+ Jahre Neo4j-Erfahrung

 

Adams Foto

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

Das R in RAG

Ein App-Diagramm: Nutzereingabe wird zu einem Prompt ergänzt und an ein LLM gesendet

Graph RAG mit LangChain und Neo4j

Das R in RAG

Der Prompt braucht Kontext aus Dokumenten und Datenquellen

Graph RAG mit LangChain und Neo4j

Das R in RAG

Diese Daten werden oft in Vektor-Einbettungen umgewandelt

Graph RAG mit LangChain und Neo4j

Wo scheitert semantische Suche?

Vektoren eignen sich für

  • Unklare oder offene Fragen

Vektoren sind ungeeignet für

  • Sehr spezifische oder faktenbasierte Fragen
  • Numerische oder exakte Abfragen
  • Logische Abfragen

Was denkt Paul Graham über Generative KI?

In wie viele Generative-KI-Startups hat Paul Graham investiert?

Graph RAG mit LangChain und Neo4j

Vektoren vs. Knowledge Graphs

Text Vektor-Einbettung
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]

Ein Graphdiagramm mit den Entitäten aus dem Liedtext von Don't Stop Believin'. Ein Kleinstadtjunge mit BORN- und RAISED-Beziehungen zu South Detroit

Graph RAG mit LangChain und Neo4j

Vektoren vs. Knowledge Graphs

Text Vektor-Einbettung
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]

Die Knoten: eine Person „Kleinstadtjunge“, ein Ort „South Detroit“, ein Zug „Midnight Train“ und ein Ort „Anywhere“

Graph RAG mit LangChain und Neo4j

Vektoren vs. Knowledge Graphs

Text Vektor-Einbettung
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]

Die Beziehungen BORN und RAISED führen von der Person zum Ort. Die GOING-Zug-Beziehung führt vom Knoten „Midnight Train“ zum Knoten „Anywhere“

Graph RAG mit LangChain und Neo4j

Knowledge Graphs und Neo4j

 

  • Neo4j ist die führende Graphdatenbank weltweit
  • Flexibel, schema-optional
  • langchain-neo4j-Integration in LangChain
  • LCEL: LangChain Expression Language

Die Logos von Neo4j und LangChain

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

Knoten repräsentieren Dinge

from langchain_neo4j.graphs.graph_document \
  import Node

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

Ein Buch-Knoten in einem Graphdiagramm mit Eigenschaften für ID und Titel

Graph RAG mit LangChain und Neo4j

Beziehungen verbinden Knoten

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(





)

Zwei WRITTEN_BY-Beziehungen gehen von einem Book-Knoten zu zwei Person-Knoten der Autor:innen

Graph RAG mit LangChain und Neo4j

Beziehungen verbinden Knoten

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,



)

Der Quellknoten der WRITTEN_BY-Beziehung ist der Book-Knoten

Graph RAG mit LangChain und Neo4j

Beziehungen verbinden Knoten

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,


)

Der Zielknoten einer WRITTEN_IN-Beziehung ist eine Person

Graph RAG mit LangChain und Neo4j

Beziehungen verbinden Knoten

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

Das Knotendiagramm mit dem Book-Knoten und zwei WRITTEN_BY-Beziehungen zu Autor:innen; zeigt, dass Knoten viele Beziehungen haben können.

Graph RAG mit LangChain und Neo4j

Verbindung zu Neo4j herstellen

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 mit LangChain und Neo4j

Graph-Dokumente speichern

from langchain_neo4j.graphs.graph_document import GraphDocument


# Wrapper für Nodes und Relationships doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Knoten und Beziehungen in der DB speichern graph.add_graph_documents([graph_document])
Graph RAG mit LangChain und Neo4j

Was ist GraphRAG?

Das vorherige Diagramm mit Kontext aus Dokumenten und deren Einbettungen

Graph RAG mit LangChain und Neo4j

Was ist GraphRAG?

Das vorherige Diagramm mit Kontext aus Dokumenten und einem zusätzlichen Knowledge Graph mit Knoten und Beziehungen aus den Dokumenten

Graph RAG mit LangChain und Neo4j

Lass uns üben!

Graph RAG mit LangChain und Neo4j

Preparing Video For Download...