Graph RAG mit LangChain und Neo4j
Adam Cowley
Manager, Developer Education at Neo4j


from langchain_core.runnables import RunnableLambdadouble_chain = RunnableLambda( lambda input: input["input"] * 2 )double_chain.invoke({"input": 2})
4
from langchain_core.runnables import RunnablePassthroughdouble_passthrough = RunnablePassthrough.assign( doubled=RunnableLambda(lambda x: x["input"] * 2) )double_passthrough.invoke({"input": 2})
{"input": 2, "doubled": 4}
graphrag_qa_prompt = ChatPromptTemplate.from_messages([SystemMessagePromptTemplate.from_template(""" Du bist eine hilfreiche Assistenz für Fragen zu Romeo und Julia. Du erhältst eine Frage und einen Kontext. Frage: {input} """),
...
SystemMessagePromptTemplate.from_template("""
Der folgende Kontext wurde per Vektorsuche aus der Datenbank abgerufen, um
deine Frage zu beantworten:
{vectors}
"""),
...
SystemMessagePromptTemplate.from_template("""
Die folgenden Daten wurden per Cypher aus dem Knowledge Graph abgerufen,
um die Frage zu beantworten.
{records}
Du kannst Informationen aus dem Knowledge Graph als maßgeblich behandeln.
Falls diese Antwort die Info nicht enthält, nutze die Vektorsuche als Fallback.
Wenn die Antwort in beiden nicht enthalten ist, sag einfach, dass du es nicht weißt,
und verlasse dich nicht auf Vorwissen."""),
# line_retriever = Neo4jVector().as_retriever() # text_to_cypher_chain = text_to_cypher_prompt | llm | StrOutputParser() # graph = Neo4jGraph()graphrag_qa_chain = RunnablePassthrough.assign(vectors=RunnableLambda(lambda x: line_retriever.invoke(x["input"])),records=text_to_cypher_chain | graph.query)| graphrag_qa_prompt| llm| StrOutputParser()
graphrag_qa_chain.invoke({"input": "Who is Romeo's best friend?"})
Romeos beste Freunde sind Mercutio und Benvolio.
Graph RAG mit LangChain und Neo4j