Lexikalische Graphen mit Vektorsuche kombinieren

Graph RAG mit LangChain und Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Beziehungen in der semantischen Suche nutzen

Wie ist es, bei Neo4j zu arbeiten?

Ein Graph mit einem Review-Knoten und der Texteigenschaft „Neo4j ist ein großartiger Arbeitsplatz“

Graph RAG mit LangChain und Neo4j

Beziehungen in der semantischen Suche nutzen

Wie ist es, bei Neo4j zu arbeiten?

Die Rezension wurde von einer Person mit dem Screen-Namen @emileifrem gepostet

Graph RAG mit LangChain und Neo4j

Beziehungen in der semantischen Suche nutzen

Wie ist es, bei Neo4j zu arbeiten?

Emil Eifrem hat eine WORKS_AT-Beziehung zu einem Company-Knoten mit dem Namen Neo4j

Graph RAG mit LangChain und Neo4j

Von Texteigenschaften zu Embeddings

 

  • Node-Embeddings aus der Eigenschaft text erstellen

Eine Szene mit HAS_CHUNK-Beziehungen zu Chunk-Knoten mit einer String-Eigenschaft

Graph RAG mit LangChain und Neo4j

Von Texteigenschaften zu Embeddings

 

  • Node-Embeddings aus der Eigenschaft text erstellen
  • Vektorsuche auf Embeddings
  • Beziehungen als Kontext nutzen

Die Texteigenschaften der Knoten werden genutzt, um ein Embedding zu erstellen

Graph RAG mit LangChain und Neo4j

Neo4j als Vektorspeicher

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): Knoten und Index aus Documents erstellen
  • Neo4jVector.from_existing_graph(): Index für vorhandene Label-/Property-Kombis erstellen
Graph RAG mit LangChain und Neo4j

Vorhandene Knoteneigenschaften chunken

Ein Knowledge-Graph mit der Beziehung HAS_SCENE vom Act-Knoten zum Scene-Knoten

res = graph.query("""

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

Vorhandene Knoteneigenschaften chunken

  • text per "\n\n" trennen
  • Regieanweisungen stehen in einer Zeile
  • Gesprochene Zeilen beginnen mit dem Charakternamen
    • Folgende Zeilen enthalten den gesprochenen Text
 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 mit LangChain und Neo4j

Vorhandene Knoteneigenschaften chunken

# Text in Zeilen aufteilen
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 mit LangChain und Neo4j

Vorhandene Knoteneigenschaften chunken

# ...Schleife über Szenen fortsetzen

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

Vektorindex auf bestehendem Graph erstellen

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

Vektor-Retrieval mit LCEL

# Retriever erstellen
retriever = store.as_retriever()

# Manuell aufrufen retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
Graph RAG mit LangChain und Neo4j

Lass uns üben!

Graph RAG mit LangChain und Neo4j

Preparing Video For Download...