YashDave commited on
Commit
38848ec
·
verified ·
1 Parent(s): 2f8157f

Upload 8 files

Browse files
.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