File size: 10,198 Bytes
9921884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a7e3700
9921884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
import os

os.environ["GOOGLE_API_KEY"] = "AIzaSyAGoYnNPu__70AId7EJS7F_61i69Qmn-wM"
os.environ["OPENAI_API_TYPE"] = "azure"
# os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
# # os.environ["OPENAI_API_KEY"] = "5b624f6b71884a488560a86b1fffbf42"
# os.environ["OPENAI_API_KEY"] = "9e337d6696ce4a22a9a1b901e2ebb5fb"


from embedder import CustomEmbeddings
from langchain.chat_models import AzureChatOpenAI, ChatOpenAI
from langchain.prompts.chat import (ChatPromptTemplate,
                                    HumanMessagePromptTemplate,
                                    SystemMessagePromptTemplate)
from langchain_google_genai import ChatGoogleGenerativeAI
from search import SimilaritySearch

embeddings = CustomEmbeddings(
    model="text-embedding-ada-002", 
    model_url="https://year-embedding-ada-002-aiservices-2136192926.openai.azure.com//openai/deployments/fresh-embedding-ada-002/embeddings?api-version=2023-10-01-preview",
    api_key="6eed3006cdd3445cb3f422a7358ce461"
)
vector_store = SimilaritySearch.load_from_disk(
    embedding_function=embeddings, 
    data_dir="./indexs/text-embedding-ada-002/"
    # data_dir="../indexs/basic-fno-text-embedding-ada-002/"
)

class Model:
    def __init__(self, model_name: str, **kwargs) -> None:
        self.model_name = model_name
        self.llm = self.load_llm(model_name=model_name, **kwargs)
    
    def load_llm(self, model_name: str, **kwargs):
        if self.model_name == "gemini-pro":
            self.retriever = vector_store.as_retriever(search_kwargs={"k": 2}, search_type="similarity")
            return ChatGoogleGenerativeAI(model=model_name, temperature=0, max_tokens=4096)
        elif self.model_name == "gpt-3.5-turbo":
            self.retriever = vector_store.as_retriever(search_kwargs={"k": 2}, search_type="similarity")
            return AzureChatOpenAI(
                deployment_name="latest-gpt-35-turbo-16k", 
                temperature=0, 
                max_tokens=4096, 
                # azure_endpoint="https://high-gpt4-32k-0613-aiservices336365459.openai.azure.com/",
                openai_api_key="9e337d6696ce4a22a9a1b901e2ebb5fb",
                # openai_api_base="https://jan-2024-gpt35-turbo16k-aiservices800630185.openai.azure.com/",
                openai_api_base = "https://fresh-gpt35-turbo-aiservices-2112150452.openai.azure.com/",
                openai_api_version="2023-07-01-preview"
            )
        elif self.model_name == "gpt4":
            self.retriever = vector_store.as_retriever(search_kwargs={"k": kwargs.get("k", 2)}, search_type="similarity")
            return AzureChatOpenAI(
                deployment_name="gpt-4-32k", 
                temperature=0, 
                max_tokens=4096, 
                # azure_endpoint="https://high-gpt4-32k-0613-aiservices336365459.openai.azure.com/",
                openai_api_key="e91a341abb2f4646ab7b0acd3b9d461e",
                openai_api_base="https://jan-2024-gpt4-ai-aiservices-1959882301.openai.azure.com/",
                openai_api_version="2023-07-01-preview"
            )

        self.retriever = vector_store.as_retriever(search_kwargs={"k": kwargs.get("k", 1)}, search_type="similarity")
        return ChatOpenAI(
            model=model_name,
            openai_api_key="EMPTY",
            openai_api_base="http://localhost:8000/v1",
            max_tokens=1024,
            temperature=0,
            model_kwargs={"stop": ["<|im_end|>", "Query:", "Question:"], "top_p": 0.95}
        )
        
        
    def run_qa_result(self, query: str):
        support_docs = self.retriever.get_relevant_documents(query)
        sources = list({d.metadata['source'] for d in support_docs})
        context = "\n\n".join([f"{i + 1}. {d.page_content}" for i, d in enumerate(support_docs)])
        return context, sources

    def return_prompt(self, system_prompt: str, query: str, context: str):
        
        # human_template = "Context:\n\n{context}\n\nQuery: {query}"
        # human_template = "E-Book:\n\n{context}\n\nQuestion: {query}"

        human_template = "\n\nContext:\n\n{context}\n\nQuestion: {query}"
        # human_template = "\n\nBook:\n\n{context}\n\nQuestion: {query}"

        messages = []
        if self.model_name in [
            "gemini-pro",
            "TheBloke/Mistral-7B-Instruct-v0.2-AWQ",
        ]:
            human_template = system_prompt + "\n\n" + human_template
            human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
            messages.append(human_message_prompt)
        else:
            system_message_prompt = SystemMessagePromptTemplate.from_template(system_prompt)
            human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
            messages.extend([system_message_prompt, human_message_prompt])

        chat_prompt = ChatPromptTemplate.from_messages(messages)
        return chat_prompt.format_prompt(context=context, query=query).to_messages()
        
    def run(self, system_prompt: str, query: str):
        context, sources = self.run_qa_result(query=query)
        chat_prompt = self.return_prompt(system_prompt=system_prompt, query=query, context=context)
        # text = "".join(resp.content for resp in self.llm.stream(chat_prompt))
        # text += "\nSources: \n" + "\n".join([f"{i + 1}. {d}" for i, d in enumerate(sources)])
        # return text, sources
        for resp in self.llm.stream(chat_prompt):
            yield resp.content.replace("$", "₹")
        
        yield sources
        # text = "".join(resp.content for resp in self.llm.stream(chat_prompt))
        # text += "\nSources: \n" + "\n".join([f"{i + 1}. {d}" for i, d in enumerate(sources)])
        # return text, sources
   
def get_sources(query):
    results = vector_store.similarity_search_with_relevance_scores(query, k=2)
    return [
        {
            "score": r[-1],
            "source": r[0].metadata['source']
        }
        for r in results
    ]     

if __name__ == "__main__":
    # model = Model(model_name="phi2")
    # model = Model(model_name="gpt-3.5-turbo")       
    # model = Model(model_name="gemini-pro")    
    # model = Model(model_name="TheBloke/zephyr-7B-beta-AWQ")
    # model = Model(model_name="TheBloke/neural-chat-7B-v3-3-AWQ")
    model = Model(model_name="TheBloke/Mistral-7B-Instruct-v0.2-AWQ")
    model = Model(model_name="gpt4")
    model = Model(model_name="gpt-3.5-turbo") 
    
    # query = "what is reliance?"
    # print("results: ", get_sources(query))
    
    # query = "explain FNO trading?"
    # print("results: ", get_sources(query))
      
#     query="What is FNO trading?"
#     query = "Describe ITM, ATM and OTM"
#     query = "give formula to calculate intrinsic value in Put and provide an example"
#     query = "what is the order of delta, theta, gamma and vega amongst options in a given options chain"
#     query = "Explain apple stock and nasdaq"
    
#     query = "generate a table with long and short in F&O instruments"
#     query = "how can we calculate intrinsic value and time value"
#     query = "give formula to calculate intrinsic value in Put"
    
    query = "explain exit from a put trade"
    # 
    # query = "what will be buying cost if I long tesla CE"
    
    
#     system_prompt="""Use the following pieces of context to answer the question in detail. Provide example only if it is in provided context and make sure to use them in rupees.""", 
    
#     system_prompt = """Use the following pieces of context to answer the question in detail. Provide example only if it is in context and make sure to use them in ₹.
# If you don't know the answer, just say 'Please rephrase the question I am unable to answer'"""

#     system_prompt = """Answer the question using the context. Provide examples only from the context and use only Rupees (₹) in examples. If you don't know the answer, just say 'Please rephrase the question I am unable to answer'"""
    
#     system_prompt = """Your task is to answer the question using the given context. 

# Follow the below rules while answering the question:
# - Only create example using the context
# - Use only Rupees '₹' to represent currency. 
# - If you don't know the answer, just say 'Please rephrase the question I am unable to answer'"""

#     system_prompt = """You are an Indian Stock Market Assistant. Your task is to answer the question using the given context. Only create example from the given context and don't use '$'."""
    
    # query = "what is reliance?"    
    # query = "what is python?"    
    query = "what is an apple stock and nasdq"
    query = "Generate a tabular format on playing long and short through options"
    query = "What is FNO Trading?"
    
    system_prompt = """Answer the question only from context. 
Provide examples only from the context. 
If you don't know the answer, just say 'Please rephrase the question I am unable to answer'"""
    
    system_prompt = "Answer the question only from the e-book. If it is not sufficient then respond as \"Unknown\""
    system_prompt = """Use the following pieces of book to answer the question at the end. \nIf you don't know the answer, please think rationally and answer from the book"""
    # system_prompt = """Answer the question using the context. Provide examples only from the context and use only Rupees (₹) in examples. If you don't know the answer, just say 'Please rephrase the question I am unable to answer'"""
    
    # system_prompt = """Answer the question from the context. Provide examples only from the context. If you don't know the answer, just say 'Please rephrase the question'"""
    # system_prompt = """Answer the question from the book. Provide examples only from the book. If you don't know the answer, just say 'Please rephrase the question'"""
    
    response = model.run(
        system_prompt=system_prompt,
        query=query
    )
    text = ""
    for resp in response:
        if isinstance(resp, list):
            sources = resp
            break
        text += resp
    
    text = text.split("Question")[0].strip("\n")
        
    print("text: ", text)
    open("./text.txt", "w").write(text)