RaghuCourage9605 commited on
Commit
9fbd1f3
·
verified ·
1 Parent(s): ae93aae

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +132 -0
app.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from langchain_community.chat_message_histories import Neo4jChatMessageHistory
3
+ from langchain_core.runnables.history import RunnableWithMessageHistory
4
+ from langchain.prompts import ChatPromptTemplate
5
+ from langchain.schema import StrOutputParser
6
+ from langchain_community.graphs import Neo4jGraph
7
+ from langchain_huggingface import HuggingFaceEmbeddings
8
+ from langchain_core.prompts.chat import MessagesPlaceholder
9
+ from langchain.vectorstores import Neo4jVector
10
+ from langchain_google_genai import ChatGoogleGenerativeAI
11
+ from uuid import uuid4
12
+ import os
13
+ from dotenv import load_dotenv
14
+ import asyncio
15
+
16
+ # Load environment variables
17
+ load_dotenv()
18
+
19
+ # Initialize variables
20
+ SESSION_ID = str(uuid4())
21
+ print(f"Session ID: {SESSION_ID}")
22
+
23
+ # Neo4j graph setup
24
+ graph = Neo4jGraph(
25
+ url="neo4j+s://6682e6ce.databases.neo4j.io",
26
+ username="neo4j",
27
+ password=os.getenv("NEO4J_PASSWORD")
28
+ )
29
+
30
+ # HuggingFace embeddings
31
+ embeddings = HuggingFaceEmbeddings(
32
+ model_name="sentence-transformers/all-MiniLM-L6-v2",
33
+ model_kwargs={'device': 'cpu'},
34
+ encode_kwargs={'normalize_embeddings': False}
35
+ )
36
+
37
+ # Create Neo4j VectorStore
38
+ graph_store = Neo4jVector.from_existing_index(
39
+ embeddings,
40
+ graph=graph,
41
+ index_name="vector",
42
+ embedding_node_property="Embedding",
43
+ text_node_property="text",
44
+ retrieval_query="""
45
+ // get the document
46
+ MATCH (node)-[:PART_OF]->(d:Document)
47
+ WITH node, score, d
48
+
49
+ // get the entities and relationships for the document
50
+ MATCH (node)-[:HAS_ENTITY]->(e)
51
+ MATCH p = (e)-[r]-(e2)
52
+ WHERE (node)-[:HAS_ENTITY]->(e2)
53
+
54
+ // unwind the path, create a string of the entities and relationships
55
+ UNWIND relationships(p) as rels
56
+ WITH
57
+ node,
58
+ score,
59
+ d,
60
+ collect(apoc.text.join(
61
+ [labels(startNode(rels))[0], startNode(rels).id, type(rels), labels(endNode(rels))[0], endNode(rels).id]
62
+ ," ")) as kg
63
+ RETURN
64
+ node.text as text, score,
65
+ {
66
+ document: d.id,
67
+ entities: kg
68
+ } AS metadata
69
+ """)
70
+ retriever = graph_store.as_retriever()
71
+
72
+ # Define Cypher Prompt
73
+ CYPHER_PROMPT = """
74
+ (
75
+ "Use the given context to provide an in-depth and structured response."
76
+ "Your answer should include:"
77
+ "- A clear and concise introduction to the topic."
78
+ "- Detailed explanation or relevant steps to address the query."
79
+ "- Practical examples or applications where possible."
80
+ "- A conclusion summarizing the main points."
81
+ "Format your response in sections with appropriate headings for clarity."
82
+ "Context: {context}"
83
+ )
84
+ """
85
+ prompt = ChatPromptTemplate.from_messages([
86
+ ("system", CYPHER_PROMPT),
87
+ MessagesPlaceholder(variable_name="chat_history"),
88
+ ("human", "{question}")
89
+ ])
90
+
91
+ # Helper function to retrieve context
92
+ def get_retrieved_context(query: str) -> str:
93
+ retrieved_documents = retriever.get_relevant_documents(query)
94
+ context = "\n".join(doc.page_content for doc in retrieved_documents)
95
+ return context
96
+
97
+ def get_memory(session_id):
98
+ return Neo4jChatMessageHistory(session_id=session_id, graph=graph)
99
+
100
+ def ReturnResponse(query: str) -> str:
101
+ llm = ChatGoogleGenerativeAI(
102
+ model='gemini-2.0-flash-exp',
103
+ api_key=os.getenv("GOOGLE_AI_STUDIO_API_KEY")
104
+ )
105
+ chat_chain = prompt | llm | StrOutputParser()
106
+
107
+ chat_with_message_history = RunnableWithMessageHistory(
108
+ chat_chain,
109
+ get_memory,
110
+ input_messages_key="question",
111
+ history_messages_key="chat_history",
112
+ )
113
+
114
+ context = get_retrieved_context(query)
115
+ response = chat_with_message_history.invoke({
116
+ "question": query,
117
+ "context": context,
118
+ }, config={
119
+ "configurable": {"session_id": SESSION_ID}
120
+ })
121
+
122
+ return gr.Markdown(response)
123
+
124
+
125
+ iface = gr.Interface(
126
+ fn=ReturnResponse,
127
+ inputs=gr.Textbox(label="Enter your query:", placeholder="Type your question here..."),
128
+ outputs=gr.Markdown(label="Chatbot Response"),
129
+ title="GraphRAG with conversational Memory 🤖💬"
130
+ )
131
+
132
+ iface.launch()