Grafy i RAG

Graph RAG z LangChain i Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Poznaj swojego instruktora

 

  • Manager, Developer Education w Neo4j
  • Edukacja dla deweloperów przez Neo4j GraphAcademy
  • Ponad 20 lat doświadczenia w tworzeniu oprogramowania
  • Ponad 10 lat doświadczenia z Neo4j

 

Zdjęcie Adama

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

R w RAG

Diagram aplikacji: dane wejściowe od użytkownika są dodawane do promptu wysyłanego do LLM

Graph RAG z LangChain i Neo4j

R w RAG

Prompt wymaga kontekstu pochodzącego z dokumentów i źródeł danych

Graph RAG z LangChain i Neo4j

R w RAG

Dane są często przekształcane w osadzenia wektorowe (embedding)

Graph RAG z LangChain i Neo4j

Gdzie szwankuje wyszukiwanie semantyczne?

Wektory sprawdzają się przy

  • Pytaniach otwartych lub przybliżonych

Wektory zawodzą przy

  • Pytaniach wymagających konkretnych faktów
  • Zapytaniach liczbowych i dokładnych
  • Zapytaniach logicznych

Co Paul Graham sądzi o generatywnej AI?

W ile startupów generatywnej AI zainwestował Paul Graham?

Graph RAG z LangChain i Neo4j

Wektory a grafy wiedzy

Tekst Osadzenie wektorowe (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]

Diagram grafu pokazujący encje wymienione w tekście piosenki „Don't Stop Believin'". Chłopiec z małego miasta z relacjami BORN i RAISED prowadzącymi do South Detroit

Graph RAG z LangChain i Neo4j

Wektory a grafy wiedzy

Tekst Osadzenie wektorowe (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]

Węzły: osoba (chłopiec z małego miasta), lokalizacja (South Detroit), pociąg (Midnight Train) i lokalizacja (Anywhere)

Graph RAG z LangChain i Neo4j

Wektory a grafy wiedzy

Tekst Osadzenie wektorowe (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]

Relacje BORN i RAISED prowadzą od osoby do lokalizacji. Relacja GOING prowadzi od węzła Midnight Train do węzła Anywhere

Graph RAG z LangChain i Neo4j

Grafy wiedzy i Neo4j

 

  • Neo4j to wiodąca na świecie grafowa baza danych
  • Elastyczna, opcjonalny schemat
  • Integracja z LangChain przez langchain-neo4j
  • LCEL: LangChain Expression Language

Logo Neo4j i LangChain

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

Węzły reprezentują obiekty

from langchain_neo4j.graphs.graph_document \
  import Node

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

Węzeł książki w diagramie grafu z właściwościami ID i Tytuł

Graph RAG z LangChain i Neo4j

Relacje łączą węzły

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(





)

Dwie relacje WRITTEN_BY prowadzące od węzła Book do dwóch węzłów Person reprezentujących autorów

Graph RAG z LangChain i Neo4j

Relacje łączą węzły

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,



)

Węzeł źródłowy relacji WRITTEN_BY to węzeł Book

Graph RAG z LangChain i Neo4j

Relacje łączą węzły

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,


)

Węzeł docelowy relacji WRITTEN_BY to węzeł Person

Graph RAG z LangChain i Neo4j

Relacje łączą węzły

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

Diagram węzłów z książką i dwiema relacjami WRITTEN_BY prowadzącymi do autorów — ilustruje, że węzły mogą mieć wiele relacji

Graph RAG z LangChain i Neo4j

Łączenie z 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 z LangChain i Neo4j

Zapisywanie dokumentów grafu

from langchain_neo4j.graphs.graph_document import GraphDocument


# Opakowanie dla węzłów i relacji doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Zapisz węzły i relacje do bazy danych graph.add_graph_documents([graph_document])
Graph RAG z LangChain i Neo4j

Czym właściwie jest GraphRAG?

Poprzedni diagram z kontekstem z dokumentów i ich osadzeniami wektorowymi

Graph RAG z LangChain i Neo4j

Czym właściwie jest GraphRAG?

Poprzedni diagram z kontekstem z dokumentów, uzupełniony o graf wiedzy z węzłami i relacjami wyekstrahowanymi z dokumentów

Graph RAG z LangChain i Neo4j

Czas na praktykę!

Graph RAG z LangChain i Neo4j

Preparing Video For Download...