File size: 6,588 Bytes
60728e8
dfde03d
60728e8
bc01ca0
dfde03d
60728e8
 
3cf608b
60728e8
 
 
 
 
 
 
 
cdb7f2e
74fb9ff
7b38e4b
74fb9ff
fe78a4e
74fb9ff
cdb7f2e
60728e8
 
 
74fb9ff
7b38e4b
74fb9ff
fe78a4e
74fb9ff
fe78a4e
04b135b
60728e8
cdb7f2e
f8cb3ee
 
7b38e4b
fe78a4e
74fb9ff
f8cb3ee
 
7b38e4b
fe78a4e
74fb9ff
f8cb3ee
60728e8
7b38e4b
cdb7f2e
74fb9ff
dfde03d
60728e8
 
04b135b
 
cdb7f2e
60728e8
f8cb3ee
60728e8
7b38e4b
cdb7f2e
74fb9ff
cdb7f2e
60728e8
7b38e4b
cdb7f2e
74fb9ff
bc01ca0
 
7b38e4b
 
 
fe78a4e
 
7b38e4b
 
fe78a4e
 
7b38e4b
 
fe78a4e
7b38e4b
fe78a4e
7b38e4b
fe78a4e
 
 
 
7b38e4b
 
 
 
 
 
fe78a4e
 
 
 
 
 
74fb9ff
7b38e4b
 
bc01ca0
dfde03d
8a67e48
 
 
 
74fb9ff
61785ea
74fb9ff
 
 
 
dfde03d
74fb9ff
95411fa
ea130e2
b212fdf
 
 
 
80fc091
b212fdf
 
 
 
 
 
 
 
 
 
 
 
 
 
dfde03d
 
95411fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# generic libraries
import gradio as gr
import os
import re

# for embeddings and indexing
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS

# for data retrieval
from langchain.chains import RetrievalQA

# for huggingface llms
from langchain_community.llms import HuggingFaceHub

# define constants
# Embedding models
#EMB_MODEL_bge_base = 'BAAI/bge-base-en-v1.5'
#EMB_MODEL_bge_large = 'BAAI/bge-large-en-v1.5'
#EMB_MODEL_gtr_t5_base = 'sentence-transformers/gtr-t5-base'
EMB_MODEL_gtr_t5_large = 'sentence-transformers/gtr-t5-large'
#EMB_MODEL_e5_base = 'intfloat/e5-large-v2'
# Chat app model
MISTRAL_MODEL1 = 'mistralai/Mixtral-8x7B-Instruct-v0.1'
HF_MODEL1 = 'HuggingFaceH4/zephyr-7b-beta'
# define paths
#vector_path_bge_base = 'vectorDB/faiss_index_bge_base' 
#vector_path_bge_large = 'vectorDB/faiss_index_bge_large'
#vector_path_gtr_t5_base = 'vectorDB/faiss_index_gtr_t5_base'
vector_path_gtr_t5_large = 'vectorDB/faiss_index_gtr_t5_large'
#vector_path_e5_base = 'vectorDB/faiss_index_e5_base'

hf_token = os.environ["HUGGINGFACEHUB_API_TOKEN"]

def respond(message, history):
    
    # Initialize your embedding model
    #embedding_model_bge = HuggingFaceEmbeddings(model_name=EMB_MODEL_bge_large)
    embedding_model_gtr_t5 = HuggingFaceEmbeddings(model_name=EMB_MODEL_gtr_t5_large)
    #embedding_model_e5 = HuggingFaceEmbeddings(model_name=EMB_MODEL_e5_base)
    
    # Load FAISS from relative path
    #vectordb_bge = FAISS.load_local(vector_path_bge_large, embedding_model_bge, allow_dangerous_deserialization=True)
    vectordb_gtr_t5 = FAISS.load_local(vector_path_gtr_t5_large, embedding_model_gtr_t5, allow_dangerous_deserialization=True)
    #vectordb_e5 = FAISS.load_local(vector_path_e5_base, embedding_model_e5, allow_dangerous_deserialization=True)
    
    # define retriever object
    #retriever_bge = vectordb_bge.as_retriever(search_type="similarity", search_kwargs={"k": 5})
    retriever_gtr_t5 = vectordb_gtr_t5.as_retriever(search_type="similarity", search_kwargs={"k": 5})
    #retriever_e5 = vectordb_e5.as_retriever(search_type="similarity", search_kwargs={"k": 5})

    # initialse chatbot llm
    llm = HuggingFaceHub(
        repo_id=MISTRAL_MODEL1, 
        huggingfacehub_api_token=hf_token,
        model_kwargs={"temperature": 0.7, "max_new_tokens": 512}
        )
    
    # create a RAG pipeline
    #qa_chain_bge = RetrievalQA.from_chain_type(llm=llm, retriever=retriever_bge)
    qa_chain_gtr_t5 = RetrievalQA.from_chain_type(llm=llm, retriever=retriever_gtr_t5)
    #qa_chain_e5 = RetrievalQA.from_chain_type(llm=llm, retriever=retriever_e5)
    
    #generate results
    #responce_bge = qa_chain_bge.invoke(message)['result']
    responce_gtr_t5 = qa_chain_gtr_t5.invoke(message)['result']
    #responce_e5 = qa_chain_e5.invoke(message)['result']

    # remove the top instructions
    instruction_prefix = (
    "Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer."
    )
    #if responce_bge.strip().startswith(instruction_prefix):
    #    responce_bge = responce_bge.strip()[len(instruction_prefix):].strip()
    if responce_gtr_t5.strip().startswith(instruction_prefix):
        responce_gtr_t5 = responce_gtr_t5.strip()[len(instruction_prefix):].strip()
    #if responce_e5.strip().startswith(instruction_prefix):
    #    responce_e5 = responce_e5.strip()[len(instruction_prefix):].strip()
        
    # Split question, Helpful Answer and Reason
    #match_bge = re.search(r"^(.*?)(?:\n+)?Question:\s*(.*?)(?:\n+)?Helpful Answer:\s*(.*)", responce_bge, re.DOTALL)
    match_gtr_t5 = re.search(r"^(.*?)(?:\n+)?Question:\s*(.*?)(?:\n+)?Helpful Answer:\s*(.*)", responce_gtr_t5, re.DOTALL)
    #match_e5 = re.search(r"^(.*?)(?:\n+)?Question:\s*(.*?)(?:\n+)?Helpful Answer:\s*(.*)", responce_e5, re.DOTALL)
    
    #if match_bge:
    #    #original_text_bge = match_bge.group(1).strip()
    #    question_bge = match_bge.group(2).strip()
    #    answer_bge = match_bge.group(3).strip()
        
    if match_gtr_t5:
        original_text_gtr_t5 = match_gtr_t5.group(1).strip()
        #question_gtr_t5 = match_gtr_t5.group(2).strip()
        answer_gtr_t5 = match_gtr_t5.group(3).strip()
        
    #if match_e5:
    #    #original_text_e5 = match_e5.group(1).strip()
    #    #question_e5 = match_e5.group(2).strip()
    #    answer_e5 = match_e5.group(3).strip()
    #
    #formatted_responce = f'Question:{question_bge}\nHelpful Answer Type 1:\n{answer_bge}\nHelpful Answer Type 2:\n{answer_gtr_t5}\nHelpful Answer Type 3:\n{answer_e5}'
    #formatted_responce = f'\n*************  BAAI/bge-large-en-v1.5  ****************\n{responce_bge}\n**************  sentence-transformers/gtr-t5-large  ***************\n{responce_gtr_t5}\n************  intfloat/e5-large-v2  **************\n{responce_e5}'
    #formatted_responce = f'\n*************  BAAI/bge-large-en-v1.5  ****************\n{responce_bge}\n**************  sentence-transformers/gtr-t5-large  ***************\n{responce_gtr_t5}'
    formatted_responce = f'\n*************  sentence-transformers/gtr-t5-large  ****************\n Helpful Answer:{answer_gtr_t5}\n Reasoning:\n{original_text_gtr_t5}'
    yield formatted_responce

# Read the content of the README.md file
with open("about.md", "r") as file:
    about_lines = file.read()
    
with gr.Blocks() as demo:
    gr.Markdown("# Intelligent Financial Document Q&A App")
    
    # About the App
    with gr.Tab("About the App"):
        gr.Markdown(about_lines)

    # Document Chatbot
    with gr.Tab("Market Prediction"):
        with gr.Column(variant="panel", scale=2):
            gr.ChatInterface(
                respond,
                fill_width=True,
                fill_height=True,
                type="messages",
                autofocus=False #,
                #additional_inputs=[
                #    gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
                #    gr.Slider(minimum=128, maximum=1024, value=512, step=128, label="Max new tokens"),
                #    gr.Slider(minimum=0.1, maximum=1.0, value=0.7, step=0.1, label="Temperature"),
                #    gr.Slider(
                #        minimum=0.1,
                #        maximum=1.0,
                #        value=0.95,
                #        step=0.05,
                #        label="Top-p (nucleus sampling)",
                #    ),
                #],
            )

if __name__ == "__main__":
    demo.launch()