Graph RAG with LangChain and Neo4j
Adam Cowley
Manager, Developer Education at Neo4j
from langchain_core.runnables import RunnableLambda
double_chain = RunnableLambda( lambda input: input["input"] * 2 )
double_chain.invoke({"input": 2})
4
from langchain_core.runnables import RunnablePassthrough
double_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(""" You are a helpful assistant answering questions about the play Romeo and Juliet. You are given a question and a context. Question: {input} """),
...
SystemMessagePromptTemplate.from_template("""
The following context has been retrieved from the database using vector search to help
you answer the question:
{vectors}
"""),
...
SystemMessagePromptTemplate.from_template("""
The following data has been retrieved from the knowledge graph using Cypher to
answer the question.
{records}
You can treat any information contained from the knowledge graph as authoritative.
If the information does not exist in this answer, fall back to vector search results.
If the answer is not included in either just say that you don't know and don't rely
on pre-existing knowledge."""),
# 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?"})
Romeo's best friends are Mercutio and Benvolio.
Graph RAG with LangChain and Neo4j