Combinarea grafurilor lexicale cu căutarea vectorială

Graph RAG cu LangChain și Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Folosirea relațiilor în căutarea semantică

Cum este să lucrezi la Neo4j?

Un grafic cu un nod Review și proprietatea text "Neo4j is a great place to work"

Graph RAG cu LangChain și Neo4j

Folosirea relațiilor în căutarea semantică

Cum este să lucrezi la Neo4j?

Recenzia este postată de un nod Person cu numele de utilizator @emileifrem

Graph RAG cu LangChain și Neo4j

Folosirea relațiilor în căutarea semantică

Cum este să lucrezi la Neo4j?

Emil Eifrem are o relație WORKS_AT cu un nod Company cu numele Neo4j

Graph RAG cu LangChain și Neo4j

De la proprietăți text la embeddings

 

  • Creează embeddings pentru noduri din proprietatea text

o scenă cu relații HAS_CHUNK către noduri Chunk cu o proprietate de tip string

Graph RAG cu LangChain și Neo4j

De la proprietăți text la embeddings

 

  • Creează embeddings pentru noduri din proprietatea text
  • Căutare vectorială pe embeddings
  • Folosește relații pentru context

Proprietățile text ale nodurilor sunt folosite pentru a crea un embedding

Graph RAG cu LangChain și Neo4j

Neo4j ca vector store

from langchain_neo4j import Neo4jVector

 

  • Neo4jVector.from_documents(): Creează noduri și indexul aferent din Documente
  • Neo4jVector.from_existing_graph(): Creează un index pe combinații existente de etichete și proprietăți
Graph RAG cu LangChain și Neo4j

Împărțirea proprietăților existente ale nodurilor în fragmente

Diagramă a unui graf de cunoaștere care evidențiază relația HAS_SCENE de la nodul Act la nodul Scene

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 cu LangChain și Neo4j

Împărțirea proprietăților existente ale nodurilor în fragmente

  • Împarte text după "\n\n"
  • Indicațiile scenice au o singură linie
  • Replicile încep cu numele personajului
    • Liniile următoare conțin textul rostit
 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 cu LangChain și Neo4j

Împărțirea proprietăților existente ale nodurilor în fragmente

# 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 cu LangChain și Neo4j

Împărțirea proprietăților existente ale nodurilor în fragmente

# ...Continuing 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 cu LangChain și Neo4j

Crearea unui index vectorial pe un graf existent

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 cu LangChain și Neo4j

Recuperare vectorială cu LCEL

# Create retriever
retriever = store.as_retriever()

# Invoke manually retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
Graph RAG cu LangChain și Neo4j

Hai să exersăm!

Graph RAG cu LangChain și Neo4j

Preparing Video For Download...