Spaces:
Sleeping
Sleeping
Upload 8 files
Browse files- .gitattributes +4 -0
- app.py +75 -0
- app_config.py +80 -0
- chroma_db/chroma.sqlite3 +3 -0
- data/National_Insurance_Company.pdf +3 -0
- data/icici.pdf +3 -0
- data/tata_aig.pdf +3 -0
- data/uiic.pdf +0 -0
- requirements.txt +11 -0
.gitattributes
CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
chroma_db/chroma.sqlite3 filter=lfs diff=lfs merge=lfs -text
|
37 |
+
data/icici.pdf filter=lfs diff=lfs merge=lfs -text
|
38 |
+
data/National_Insurance_Company.pdf filter=lfs diff=lfs merge=lfs -text
|
39 |
+
data/tata_aig.pdf filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import random
|
3 |
+
from app_config import SYSTEM_PROMPT, NLP_MODEL_NAME, NUMBER_OF_VECTORS_FOR_RAG, NLP_MODEL_TEMPERATURE, NLP_MODEL_MAX_TOKENS, VECTOR_MAX_TOKENS, my_vector_store, chat, tiktoken_len
|
4 |
+
from langchain.memory import ConversationSummaryBufferMemory
|
5 |
+
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
|
6 |
+
from langchain.chains.summarize import load_summarize_chain
|
7 |
+
from langchain.prompts import PromptTemplate
|
8 |
+
from langchain_groq import ChatGroq
|
9 |
+
from dotenv import load_dotenv
|
10 |
+
from pathlib import Path
|
11 |
+
import os
|
12 |
+
|
13 |
+
env_path = Path('.') / '.env'
|
14 |
+
load_dotenv(dotenv_path=env_path)
|
15 |
+
|
16 |
+
# Initialize vector store and LLM outside session state
|
17 |
+
retriever = my_vector_store.as_retriever(k=NUMBER_OF_VECTORS_FOR_RAG)
|
18 |
+
llm = ChatGroq(temperature=NLP_MODEL_TEMPERATURE, groq_api_key=str(os.getenv('GROQ_API_KEY')), model_name=NLP_MODEL_NAME)
|
19 |
+
|
20 |
+
def response_generator(prompt: str) -> str:
|
21 |
+
try:
|
22 |
+
docs = retriever.invoke(prompt)
|
23 |
+
my_context = [doc.page_content for doc in docs]
|
24 |
+
my_context = '\n\n'.join(my_context)
|
25 |
+
system_message = SystemMessage(content=SYSTEM_PROMPT.format(context=my_context, previous_message_summary=st.session_state.rag_memory.moving_summary_buffer))
|
26 |
+
print(system_message)
|
27 |
+
chat_messages = (system_message + st.session_state.rag_memory.chat_memory.messages + HumanMessage(content=prompt)).messages
|
28 |
+
print("total tokens: ", tiktoken_len(str(chat_messages)))
|
29 |
+
response = llm.invoke(chat_messages)
|
30 |
+
return response.content
|
31 |
+
except Exception as error:
|
32 |
+
print(error, "ERROR")
|
33 |
+
return "Oops! something went wrong, please try again."
|
34 |
+
|
35 |
+
st.markdown(
|
36 |
+
"""
|
37 |
+
<style>
|
38 |
+
.st-emotion-cache-janbn0 {
|
39 |
+
flex-direction: row-reverse;
|
40 |
+
text-align: right;
|
41 |
+
}
|
42 |
+
</style>
|
43 |
+
""",
|
44 |
+
unsafe_allow_html=True,
|
45 |
+
)
|
46 |
+
|
47 |
+
# Initialize session state
|
48 |
+
if "messages" not in st.session_state:
|
49 |
+
st.session_state.messages = [{"role": "system", "content": SYSTEM_PROMPT}]
|
50 |
+
if "rag_memory" not in st.session_state:
|
51 |
+
st.session_state.rag_memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=5000)
|
52 |
+
if "retriever" not in st.session_state:
|
53 |
+
st.session_state.retriever = retriever
|
54 |
+
|
55 |
+
st.title("Insurance Bot")
|
56 |
+
container = st.container(height=600)
|
57 |
+
for message in st.session_state.messages:
|
58 |
+
if message["role"] != "system":
|
59 |
+
with container.chat_message(message["role"]):
|
60 |
+
st.write(message["content"])
|
61 |
+
|
62 |
+
if prompt := st.chat_input("Enter your query here... "):
|
63 |
+
with container.chat_message("user"):
|
64 |
+
st.write(prompt)
|
65 |
+
st.session_state.messages.append({"role": "user", "content": prompt})
|
66 |
+
|
67 |
+
with container.chat_message("assistant"):
|
68 |
+
response = response_generator(prompt=prompt)
|
69 |
+
print("******************************************************** Response ********************************************************")
|
70 |
+
print("MY RESPONSE IS:", response)
|
71 |
+
st.write(response)
|
72 |
+
|
73 |
+
print("Response is:", response)
|
74 |
+
st.session_state.rag_memory.save_context({'input': prompt}, {'output': response})
|
75 |
+
st.session_state.messages.append({"role": "assistant", "content": response})
|
app_config.py
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import tiktoken
|
2 |
+
from langchain_text_splitters import RecursiveCharacterTextSplitter
|
3 |
+
from langchain_chroma import Chroma
|
4 |
+
from langchain_huggingface import HuggingFaceEmbeddings # Updated import
|
5 |
+
from langchain_community.document_loaders import PyPDFLoader # Updated import
|
6 |
+
from langchain.memory import ConversationSummaryBufferMemory # Remains the same for now
|
7 |
+
from langchain_groq import ChatGroq
|
8 |
+
import os
|
9 |
+
from dotenv import load_dotenv
|
10 |
+
|
11 |
+
# Load environment variables from .env file
|
12 |
+
load_dotenv()
|
13 |
+
tokenizer = tiktoken.get_encoding('cl100k_base')
|
14 |
+
FILE_NAMEs = os.listdir('data')
|
15 |
+
|
16 |
+
SYSTEM_PROMPT = """
|
17 |
+
You are an insurance policy expert bot. You have different policies which can be found in company list.
|
18 |
+
Here is the list of companies providing these policies
|
19 |
+
Your tasks when user asks question:
|
20 |
+
1. Familiarize themselves with the policy terms and conditions.
|
21 |
+
2. Clear any doubts they may have about the policy.
|
22 |
+
3. Compare different policies provided by different companies.
|
23 |
+
|
24 |
+
Your response should be clear, concise and within the given context. If needed you can give detail response. If you can't find the answer in context just say 'I don't know'. Do not try to make up answers by yourself.
|
25 |
+
context: {context}
|
26 |
+
previous message summary: {previous_message_summary}
|
27 |
+
"""
|
28 |
+
|
29 |
+
human_template = "{question}"
|
30 |
+
|
31 |
+
NLP_MODEL_NAME = "llama3-70b-8192"
|
32 |
+
REASONING_MODEL_NAME = "mixtral-8x7b-32768"
|
33 |
+
REASONING_MODEL_TEMPERATURE = 0
|
34 |
+
NLP_MODEL_TEMPERATURE = 0
|
35 |
+
NLP_MODEL_MAX_TOKENS = 5400
|
36 |
+
VECTOR_MAX_TOKENS = 100
|
37 |
+
VECTORS_TOKEN_OVERLAP_SIZE = 20
|
38 |
+
NUMBER_OF_VECTORS_FOR_RAG = 7
|
39 |
+
|
40 |
+
# Create the length function
|
41 |
+
def tiktoken_len(text):
|
42 |
+
tokens = tokenizer.encode(text, disallowed_special=())
|
43 |
+
return len(tokens)
|
44 |
+
|
45 |
+
def get_vectorstore():
|
46 |
+
model_name = "BAAI/bge-small-en"
|
47 |
+
model_kwargs = {"device": "cpu"}
|
48 |
+
encode_kwargs = {"normalize_embeddings": True}
|
49 |
+
hf = HuggingFaceEmbeddings(
|
50 |
+
model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs
|
51 |
+
)
|
52 |
+
persist_directory = "./chroma_db" # Directory to save the vector store
|
53 |
+
all_splits = []
|
54 |
+
for file_name in FILE_NAMEs:
|
55 |
+
if file_name.endswith(".pdf"):
|
56 |
+
loader = PyPDFLoader(os.path.join("data", file_name))
|
57 |
+
data = loader.load()[0].page_content
|
58 |
+
else:
|
59 |
+
with open(os.path.join("data", file_name), "r") as f:
|
60 |
+
data = f.read()
|
61 |
+
text_splitter = RecursiveCharacterTextSplitter(
|
62 |
+
chunk_size=VECTOR_MAX_TOKENS,
|
63 |
+
chunk_overlap=VECTORS_TOKEN_OVERLAP_SIZE,
|
64 |
+
length_function=tiktoken_len,
|
65 |
+
separators=["\n\n\n", "\n\n", "\n", " ", ""]
|
66 |
+
)
|
67 |
+
all_splits = all_splits + text_splitter.split_text(data)
|
68 |
+
|
69 |
+
# Check if the vector store already exists
|
70 |
+
if os.path.exists(persist_directory):
|
71 |
+
vectorstore = Chroma(persist_directory=persist_directory, embedding_function=hf)
|
72 |
+
else:
|
73 |
+
vectorstore = Chroma.from_texts(
|
74 |
+
texts=all_splits, embedding=hf, persist_directory=persist_directory
|
75 |
+
)
|
76 |
+
return vectorstore
|
77 |
+
|
78 |
+
chat = ChatGroq(temperature=0, groq_api_key=os.getenv("GROQ_API_KEY"), model_name="llama3-8b-8192", streaming=True)
|
79 |
+
rag_memory = ConversationSummaryBufferMemory(llm=chat, max_token_limit=3000)
|
80 |
+
my_vector_store = get_vectorstore()
|
chroma_db/chroma.sqlite3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:fa3d2ef293a0d915ff569d570e0f50429fff15441baa462a027307d51c2b486a
|
3 |
+
size 167936
|
data/National_Insurance_Company.pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:42b34c48a89b3418928edfb45aa4ef438bc6214ab670eaf5cbf4fa5e0768ab7f
|
3 |
+
size 227604
|
data/icici.pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0ce1ba9471f27d4b4bb134482410fa20d766172913088d908ed11645270422f0
|
3 |
+
size 242568
|
data/tata_aig.pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:161e464b1d71cb3cb54601b60fb639b3c75c052077df1fcba53cfcdb332355e2
|
3 |
+
size 223400
|
data/uiic.pdf
ADDED
Binary file (71.4 kB). View file
|
|
requirements.txt
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
langchain
|
2 |
+
transformers
|
3 |
+
tiktoken
|
4 |
+
langchain-groq
|
5 |
+
langchain-community
|
6 |
+
langchain-text-splitters
|
7 |
+
langchain-chroma
|
8 |
+
sentence_transformers
|
9 |
+
pypdf
|
10 |
+
torch
|
11 |
+
streamlit
|