Lexicale grafen combineren met vectorzoektocht

Graph RAG met LangChain en Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Relaties gebruiken in semantisch zoeken

Hoe is het om bij Neo4j te werken?

Een grafdiagram met een Review-node en de texteigenschap "Neo4j is a great place to work"

Graph RAG met LangChain en Neo4j

Relaties gebruiken in semantisch zoeken

Hoe is het om bij Neo4j te werken?

De review is geplaatst door een Person met de schermnaam @emileifrem

Graph RAG met LangChain en Neo4j

Relaties gebruiken in semantisch zoeken

Hoe is het om bij Neo4j te werken?

Emil Eifrem heeft een WORKS_AT-relatie met een Company-node met de naam Neo4j

Graph RAG met LangChain en Neo4j

Teksteigenschappen naar embeddings

 

  • Maak node-embeddings van de text-eigenschap

een scene met HAS_CHUNK-relaties naar Chunk-nodes met een tekenreeks-eigenschap

Graph RAG met LangChain en Neo4j

Teksteigenschappen naar embeddings

 

  • Maak node-embeddings van de text-eigenschap
  • Vectorzoektocht op embeddings
  • Gebruik relaties als context

De texteigenschappen op de nodes worden gebruikt om een embedding te maken

Graph RAG met LangChain en Neo4j

Neo4j als vectoropslag

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): Maak nodes en onderliggende index van Documents
  • Neo4jVector.from_existing_graph(): Maak index op bestaande combinaties van label en eigenschap
Graph RAG met LangChain en Neo4j

Bestaande node-eigenschappen chunken

Een knowledge graph-diagram dat de HAS_SCENE-relatie markeert van de Act-node naar de Scene-node

res = graph.query("""

MATCH (s:Scene)
WHERE NOT {(s)-[:HAS_LINE]->()}
RETURN s.id AS id, s.text AS text
""")
for scene in res: # Maak chunks van scene['text']
Graph RAG met LangChain en Neo4j

Bestaande node-eigenschappen chunken

  • Splits text op "\n\n"
  • Regieaanwijzingen hebben één regel
  • Gesproken regels beginnen met de naam van het personage
    • Volgende regels bevatten de gesproken tekst
 Enter Sampson and Gregory armed with swords..

SAMPSON.
Gregory, on my word...
GREGORY. No, for then we should...
SAMPSON. I mean, if we be in choler, we'll draw...
Graph RAG met LangChain en Neo4j

Bestaande node-eigenschappen chunken

# Split text into lines
lines = [
    line.strip() for line in text.split("\n\n")

if "\n" in line
]
for line in lines: parts = line.split("\n")
character = parts[0]
text = "\n".join(parts[1:])
Graph RAG met LangChain en Neo4j

Bestaande node-eigenschappen chunken

# ...Doorgaan met de loop over scenes

line_node = Node(type="Line", id=f"{scene.id}-line-{i}", properties={})
character_node = Node(type="Character", id=character, properties={})


# (:Scene)-[:HAS_LINE]->(:Line) graph_document.relationships.append( Relationship(source=scene, target=line_node, type="HAS_LINE"))
# (:Line)-[:SPOKEN_BY]->(:Character) graph_document.relationships.append(Relationship( source=line_node, target=characters[character], type="SPOKEN_BY"))
Graph RAG met LangChain en Neo4j

Vectorindex maken op een bestaand graaf

from langchain.embeddings import init_embeddings
store = Neo4jVector.from_existing_graph(

init_embeddings("openai:text-embedding-3-small"),
url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD,
node_label="Line",
text_node_properties=["text"],
embedding_node_property="embedding",
index_name="lines",
)
Graph RAG met LangChain en Neo4j

Vectoropvraging met LCEL

# Create retriever
retriever = store.as_retriever()

# Handmatig aanroepen retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
Graph RAG met LangChain en Neo4j

Laten we oefenen!

Graph RAG met LangChain en Neo4j

Preparing Video For Download...