Een hybride retrieval-chain bouwen

Graph RAG met LangChain en Neo4j

Adam Cowley

Manager, Developer Education at Neo4j

Retrieval combineren

gecombineerde_retrieval1.jpg

Graph RAG met LangChain en Neo4j

Retrieval combineren

gecombineerde_retrieval2.jpg

Graph RAG met LangChain en Neo4j

Functies runnable maken

from langchain_core.runnables import RunnableLambda


double_chain = RunnableLambda( lambda input: input["input"] * 2 )
double_chain.invoke({"input": 2})
4
Graph RAG met LangChain en Neo4j

Runnable passthroughs

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}
Graph RAG met LangChain en Neo4j

Een Q&A-prompt bouwen

graphrag_qa_prompt = ChatPromptTemplate.from_messages([

SystemMessagePromptTemplate.from_template(""" Je bent een behulpzame assistent die vragen over het stuk Romeo en Julia beantwoordt. Je krijgt een vraag en een context. Vraag: {input} """),
Graph RAG met LangChain en Neo4j

Een Q&A-prompt bouwen

    ...
    SystemMessagePromptTemplate.from_template("""
    De volgende context is met vector search uit de database opgehaald om je
    te helpen de vraag te beantwoorden: 

    {vectors}
    """),
Graph RAG met LangChain en Neo4j

Een Q&A-prompt bouwen

    ...
    SystemMessagePromptTemplate.from_template("""
    De volgende data is met Cypher uit de knowledge graph gehaald om de vraag
    te beantwoorden.  

    {records}

    Je kunt info uit de knowledge graph als gezaghebbend zien.

    Als dit antwoord de info niet bevat, val dan terug op vector search-resultaten.

    Staat het in geen van beide, zeg dan dat je het niet weet en vertrouw niet
    op voorkennis."""),
Graph RAG met LangChain en Neo4j

Een Q&A-chain bouwen

# 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()
Graph RAG met LangChain en Neo4j

De Q&A-chain aanroepen

graphrag_qa_chain.invoke({"input": "Who is Romeo's best friend?"})
Romeo's beste vrienden zijn Mercutio en Benvolio.
Graph RAG met LangChain en Neo4j

Laten we oefenen!

Graph RAG met LangChain en Neo4j

Preparing Video For Download...