File size: 2,951 Bytes
b1ac1a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
from langchain_community.vectorstores import FAISS
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings

from langchain_core.runnables.passthrough import RunnableAssign, RunnablePassthrough
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import get_buffer_string
from langchain_nvidia_ai_endpoints import ChatNVIDIA, NVIDIAEmbeddings

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser


embedder = NVIDIAEmbeddings(model="nvolveqa_40k", model_type=None)
db = FAISS.load_local("vms_faiss_index", embedder, allow_dangerous_deserialization=True)

# docs = new_db.similarity_search(query)

nvidia_api_key = os.environ.get("NVIDIA_API_KEY", "")


from operator import itemgetter


# available models names
# mixtral_8x7b
# llama2_13b
llm = ChatNVIDIA(model="mixtral_8x7b") | StrOutputParser()

initial_msg = (
    "Hello! I am VMS bot here to help you with your academic issues!"
    f"\nHow can I help you?"
)

context_prompt = ChatPromptTemplate.from_messages([
    ('system',
        "You are a VMS chatbot, and you are helping students with their academic issues."
        "Answer the question using only the context provided. Do not include based on the context or based on the documents provided in your answer."
        "Please help them with their question. Remember that your job is to represent Vicent Mary School of Science and Technology (VMS) at Assumption University."
        "Do not hallucinate any details, and make sure the knowledge base is not redundant."
        "Please say you do not know if you do not know or you cannot find the information needed."
        "\n\nQuestion: {question}\n\nContext: {context}"),
        ('user', "{question}"
)])

chain = (
    {
        'context': db.as_retriever(search_type="similarity"),
        'question': (lambda x:x)
    }
    | context_prompt
    # | RPrint()
    | llm
    | StrOutputParser()
)

conv_chain = (
    context_prompt
    # | RPrint()
    | llm
    | StrOutputParser()
)

def chat_gen(message, history, return_buffer=True):
    buffer = ""

    doc_retriever = db.as_retriever(search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.2})
    retrieved_docs = doc_retriever.invoke(message)
    print(len(retrieved_docs))
    print(retrieved_docs)

    if len(retrieved_docs) > 0:
        state = {
                'question': message,
                'context': retrieved_docs
        }
        for token in conv_chain.stream(state):
            buffer += token
            yield buffer
    else:
      passage = "I am sorry. I do not have relevant information to answer on that specific topic. Please try another question."
      buffer += passage
      yield buffer if return_buffer else passage


chatbot = gr.Chatbot(value = [[None, initial_msg]])
iface = gr.ChatInterface(chat_gen, chatbot=chatbot).queue()
iface.launch()