使用 LangChain 與 Neo4j 的 Graph RAG
Adam Cowley
Manager, Developer Education at Neo4j
在 Neo4j 工作是什麼感覺?

在 Neo4j 工作是什麼感覺?

在 Neo4j 工作是什麼感覺?

text 屬性建立節點嵌入
text 屬性建立節點嵌入
from langchain_neo4j import Neo4jVector
Neo4jVector.from_documents(): 從 Document 建立節點與底層索引Neo4jVector.from_existing_graph(): 在既有標籤與屬性組合上建立索引
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']
"\n\n" 切分 textEnter 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...
# 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:])
# ...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"))
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",)
# Create retriever retriever = store.as_retriever()# Invoke manually retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
使用 LangChain 與 Neo4j 的 Graph RAG