Grafy a RAG

Graph RAG s LangChain a Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Poznač svého lektora

 

  • Manager, Developer Education v Neo4j
  • Developer Education přes Neo4j GraphAcademy
  • 20+ let zkušeností s vývojem softwaru
  • 10+ let zkušeností s Neo4j

 

Adamova fotografie

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

R v RAG

Diagram aplikace: uživatelský vstup je přidán do promptu, který je odeslán LLM

Graph RAG s LangChain a Neo4j

R v RAG

Prompt vyžaduje kontext pocházející z dokumentů a datových zdrojů

Graph RAG s LangChain a Neo4j

R v RAG

Tato data jsou často převedena na vektorové embedding

Graph RAG s LangChain a Neo4j

Kde selhává sémantické vyhledávání?

Vektory fungují dobře pro

  • Volné nebo otevřené otázky

Vektory nefungují dobře pro

  • Vysoce specifické nebo faktické otázky
  • Numerické nebo přesně shodné dotazy
  • Logické dotazy

Co si Paul Graham myslí o generativní AI?

Do kolika startupů zaměřených na generativní AI Paul Graham investoval?

Graph RAG s LangChain a Neo4j

Vektory vs. znalostní grafy

Text Vektorový 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]

Grafový diagram zobrazující entity zmíněné v textu písně Don't Stop Believin'. Chlapec z malého města s relacemi BORN a RAISED do South Detroit

Graph RAG s LangChain a Neo4j

Vektory vs. znalostní grafy

Text Vektorový 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]

Uzly jsou: osoba – Small Town Boy, místo – South Detroit, vlak – Midnight Train a místo – Anywhere

Graph RAG s LangChain a Neo4j

Vektory vs. znalostní grafy

Text Vektorový 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]

Relace BORN a RAISED vedou od osoby k místu. Relace GOING vede z uzlu Midnight Train do uzlu Anywhere

Graph RAG s LangChain a Neo4j

Znalostní grafy a Neo4j

 

  • Neo4j je přední grafová databáze světa
  • Flexibilní, volitelné schéma
  • Integrace langchain-neo4j s LangChain
  • LCEL: LangChain Expression Language

Loga neo4j a langchain

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

Uzly reprezentují entity

from langchain_neo4j.graphs.graph_document \
  import Node

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

Uzel knihy v grafovém diagramu s vlastnostmi ID a Title

Graph RAG s LangChain a Neo4j

Relace propojují uzly

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(





)

Dvě relace WRITTEN_BY vedoucí z uzlu Book ke dvěma uzlům Person reprezentujícím autory

Graph RAG s LangChain a Neo4j

Relace propojují uzly

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,



)

Zdrojový uzel relace WRITTEN_BY je uzel Book

Graph RAG s LangChain a Neo4j

Relace propojují uzly

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,


)

Cílový uzel relace WRITTEN_BY je uzel Person

Graph RAG s LangChain a Neo4j

Relace propojují uzly

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

Grafový diagram s uzlem Book a dvěma relacemi WRITTEN_BY k autorům – ukázka, že uzly mohou mít více relací

Graph RAG s LangChain a Neo4j

Připojení k 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 s LangChain a Neo4j

Ukládání grafových dokumentů

from langchain_neo4j.graphs.graph_document import GraphDocument


# Wrapper pro uzly a relace doc = GraphDocument(
nodes=[book, jesus, jim],
relationships=[jesus_wrote_book, jim_wrote_book]
)
# Uložení uzlů a relací do databáze graph.add_graph_documents([graph_document])
Graph RAG s LangChain a Neo4j

Takže co je GraphRAG?

Předchozí diagram s kontextem z dokumentů a jejich embeddingů

Graph RAG s LangChain a Neo4j

Takže co je GraphRAG?

Předchozí diagram s kontextem z dokumentů, doplněný o znalostní graf zobrazující uzly a relace odvozené z dokumentů

Graph RAG s LangChain a Neo4j

Pojďme cvičit!

Graph RAG s LangChain a Neo4j

Preparing Video For Download...