Graph RAG with LangChain and 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(""" あなたは『ロミオとジュリエット』に関する質問に答える有用なアシスタントです。 質問とコンテキストが与えられます。 質問: {input} """),
...
SystemMessagePromptTemplate.from_template("""
次のコンテキストは、ベクトル検索でデータベースから取得しました。質問への回答に利用してください。
{vectors}
"""),
...
SystemMessagePromptTemplate.from_template("""
次のデータは、Cypher を用いてナレッジグラフから取得しました。質問に回答してください。
{records}
ナレッジグラフ内の情報は信頼できるものとして扱ってください。
この回答に情報がなければ、ベクトル検索結果にフォールバックしてください。
どちらにもなければ、知らないとだけ述べ、既存知識には依拠しないでください。"""),
# 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?"})
ロミオの親友はマキューシオとベンヴォーリオです。
Graph RAG with LangChain and Neo4j