Grafer och RAG

Graph RAG med LangChain och Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Möt din instruktör

 

  • Manager, Developer Education på Neo4j
  • Developer Education via Neo4j GraphAcademy
  • 20+ års erfarenhet av mjukvaruutveckling
  • 10+ års erfarenhet av Neo4j

 

Adams bild

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

R:et i RAG

Ett applikationsdiagram där användarens indata läggs till i en prompt som skickas till en LLM

Graph RAG med LangChain och Neo4j

R:et i RAG

Prompten behöver kontext från dokument och datakällor

Graph RAG med LangChain och Neo4j

R:et i RAG

Dessa data konverteras ofta till vektorinbäddningar

Graph RAG med LangChain och Neo4j

När räcker inte semantisk sökning till?

Vektorer fungerar bra för

  • Vaga eller öppna frågor

Vektorer fungerar dåligt för

  • Specifika eller faktabaserade frågor
  • Numeriska frågor eller exakta matchningar
  • Logiska frågor

Vad tycker Paul Graham om generativ AI?

I hur många generativa AI-startups har Paul Graham investerat?

Graph RAG med LangChain och Neo4j

Vektorer vs. kunskapsgrafer

Text Vektorinbäddning
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]

Ett grafdiagram med entiteter från texten i Don't Stop Believin'. En pojke från landet med relationerna BORN och RAISED till South Detroit

Graph RAG med LangChain och Neo4j

Vektorer vs. kunskapsgrafer

Text Vektorinbäddning
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]

Noderna är: en person – Small town boy, en plats – South Detroit, ett tåg – Midnight Train och en plats – Anywhere

Graph RAG med LangChain och Neo4j

Vektorer vs. kunskapsgrafer

Text Vektorinbäddning
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]

Relationerna BORN och RAISED går från personen till platsen. Tåget GOING går från noden Midnight Train till noden Anywhere

Graph RAG med LangChain och Neo4j

Kunskapsgrafer och Neo4j

 

  • Neo4j är världens ledande grafdatabas
  • Flexibel, schemafri
  • langchain-neo4j LangChain-integration
  • LCEL: LangChain Expression Language

Neo4j- och LangChain-logotyperna

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

Noder representerar entiteter

from langchain_neo4j.graphs.graph_document \
  import Node

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

En boknod i ett grafdiagram med egenskaperna ID och Titel

Graph RAG med LangChain och Neo4j

Relationer kopplar samman noder

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(





)

Två WRITTEN_BY-relationer från en boknod till två personnoder som representerar författarna

Graph RAG med LangChain och Neo4j

Relationer kopplar samman noder

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,



)

Källnoden för relationen WRITTEN_BY är boknoden

Graph RAG med LangChain och Neo4j

Relationer kopplar samman noder

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,


)

Målnoden för en WRITTEN_IN-relation är en Person

Graph RAG med LangChain och Neo4j

Relationer kopplar samman noder

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

Noddiagrammet med boken och två WRITTEN_BY-relationer till författare, vilket visar att noder kan ha många relationer.

Graph RAG med LangChain och Neo4j

Ansluta till 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 med LangChain och Neo4j

Spara grafdokument

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 med LangChain och Neo4j

Vad är GraphRAG?

Det tidigare diagrammet med kontext från dokument och deras inbäddningar

Graph RAG med LangChain och Neo4j

Vad är GraphRAG?

Det tidigare diagrammet med kontext från dokument, utökat med en kunskapsgraf som visar noder och relationer härledda från dokumenten

Graph RAG med LangChain och Neo4j

Nu kör vi en övning!

Graph RAG med LangChain och Neo4j

Preparing Video For Download...