harshith1411 commited on
Commit
d54576a
·
verified ·
1 Parent(s): bc79fe0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +50 -36
app.py CHANGED
@@ -1,65 +1,79 @@
1
  import streamlit as st
2
  import os
3
- from langchain_community.document_loaders import TextLoader # ✅ FIXED
 
 
 
 
 
4
  from langchain.text_splitter import CharacterTextSplitter
5
- from langchain_openai import OpenAIEmbeddings, ChatOpenAI
6
  from langchain.vectorstores import FAISS
7
  from langchain.prompts import ChatPromptTemplate
8
  from langchain_core.output_parsers import StrOutputParser
9
 
10
- # HF Spaces secrets
11
- os.environ["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"] = st.secrets["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"]
12
-
13
  @st.cache_resource
14
- def load_retriever():
 
15
  if not os.path.exists("faiss_index"):
16
- st.info("Creating vector index... (first run)")
17
- loader = TextLoader("knowledge.txt")
18
- docs = loader.load()
19
- splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
20
- chunks = splitter.split_documents(docs)
 
 
21
  embeddings = OpenAIEmbeddings()
22
- vectorstore = FAISS.from_documents(chunks, embeddings)
23
  vectorstore.save_local("faiss_index")
24
 
 
25
  embeddings = OpenAIEmbeddings()
26
  vectorstore = FAISS.load_local("faiss_index", embeddings, allow_dangerous_deserialization=True)
27
- return vectorstore.as_retriever(search_kwargs={"k": 3})
28
-
29
- # Load components
30
- retriever = load_retriever()
31
- llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
32
- prompt = ChatPromptTemplate.from_template(
33
- "Use this context only: {context}\n\nQuestion: {question}\nAnswer:"
34
- )
35
-
36
- def get_response(query):
37
- context_docs = retriever.invoke(query)
38
- context = "\n".join([doc.page_content for doc in context_docs])
39
- chain = (
40
- {"context": lambda _: context, "question": lambda _: query}
41
- | prompt
42
- | llm
43
- | StrOutputParser()
44
  )
45
- return chain.invoke(query)
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
  # UI
48
  st.title("🧠 RAG Chatbot")
 
 
49
  if "messages" not in st.session_state:
50
  st.session_state.messages = []
51
 
52
- for msg in st.session_state.messages:
53
- with st.chat_message(msg["role"]):
54
- st.markdown(msg["content"])
 
55
 
56
- if prompt := st.chat_input("Ask about your documents..."):
 
 
57
  st.session_state.messages.append({"role": "user", "content": prompt})
58
  with st.chat_message("user"):
59
  st.markdown(prompt)
60
 
 
61
  with st.chat_message("assistant"):
62
- with st.spinner("Thinking..."):
63
- response = get_response(prompt)
64
  st.markdown(response)
 
65
  st.session_state.messages.append({"role": "assistant", "content": response})
 
1
  import streamlit as st
2
  import os
3
+
4
+ # HF Spaces secret
5
+ os.environ["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"] = st.secrets["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"]
6
+
7
+ from langchain_openai import ChatOpenAI, OpenAIEmbeddings
8
+ from langchain_community.document_loaders import TextLoader
9
  from langchain.text_splitter import CharacterTextSplitter
 
10
  from langchain.vectorstores import FAISS
11
  from langchain.prompts import ChatPromptTemplate
12
  from langchain_core.output_parsers import StrOutputParser
13
 
 
 
 
14
  @st.cache_resource
15
+ def get_chatbot():
16
+ # Load or create vector store
17
  if not os.path.exists("faiss_index"):
18
+ with open("knowledge.txt", "r") as f:
19
+ content = f.read()
20
+ docs = [content] # Simple doc
21
+
22
+ text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
23
+ splits = text_splitter.create_documents([content])
24
+
25
  embeddings = OpenAIEmbeddings()
26
+ vectorstore = FAISS.from_documents(splits, embeddings)
27
  vectorstore.save_local("faiss_index")
28
 
29
+ # Load retriever
30
  embeddings = OpenAIEmbeddings()
31
  vectorstore = FAISS.load_local("faiss_index", embeddings, allow_dangerous_deserialization=True)
32
+ retriever = vectorstore.as_retriever()
33
+
34
+ # LLM
35
+ llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
36
+
37
+ prompt = ChatPromptTemplate.from_template(
38
+ "Answer using ONLY this context:\n{context}\n\nQuestion: {question}\n\nAnswer:"
 
 
 
 
 
 
 
 
 
 
39
  )
40
+
41
+ def rag_chain(query):
42
+ context_docs = retriever.invoke(query)
43
+ context = "\n".join([doc.page_content for doc in context_docs])
44
+ chain = (
45
+ {"context": lambda x: context, "question": lambda x: query}
46
+ | prompt
47
+ | llm
48
+ | StrOutputParser()
49
+ )
50
+ return chain.invoke(query)
51
+
52
+ return rag_chain
53
 
54
  # UI
55
  st.title("🧠 RAG Chatbot")
56
+ chatbot = get_chatbot()
57
+
58
  if "messages" not in st.session_state:
59
  st.session_state.messages = []
60
 
61
+ # Show chat history
62
+ for message in st.session_state.messages:
63
+ with st.chat_message(message["role"]):
64
+ st.markdown(message["content"])
65
 
66
+ # Chat input
67
+ if prompt := st.chat_input("Ask about your knowledge base..."):
68
+ # Add user message
69
  st.session_state.messages.append({"role": "user", "content": prompt})
70
  with st.chat_message("user"):
71
  st.markdown(prompt)
72
 
73
+ # Generate response
74
  with st.chat_message("assistant"):
75
+ with st.spinner("Searching knowledge base..."):
76
+ response = chatbot(prompt)
77
  st.markdown(response)
78
+
79
  st.session_state.messages.append({"role": "assistant", "content": response})