File size: 5,032 Bytes
4cf7340
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio
from langchain.embeddings import HuggingFaceBgeEmbeddings
from langchain.vectorstores import FAISS
from langchain import OpenAI, ConversationChain, LLMChain, PromptTemplate
from langchain.chains.conversation.memory import ConversationBufferMemory

def chat(question, vehicle, k=10, temperature=0.01):
    chatgpt_chain = create_chatgpt_chain(temperature=temperature)
    response = ask_question(question=question, vehicle=vehicle, k=k, embeddings=model_norm, chatgpt_chain=chatgpt_chain)
    return response

def create_chatgpt_chain(temperature):
    template = """
    {chat_history}
    Human: {question}
    AI:
    """
    prompt_template = PromptTemplate(input_variables=["chat_history", "question"], template=template)
    return LLMChain(llm=OpenAI(temperature=temperature,model_name="gpt-3.5-turbo"),prompt=prompt_template,verbose=True,memory=ConversationBufferMemory(memory_key="chat_history"))

def ask_question(question, vehicle, k, embeddings, chatgpt_chain):
    index = FAISS.load_local(folder_path=db_paths[vehicle], embeddings=embeddings)
    prompt = get_prompt(question=question, vehicle=vehicle, k=k)
    response = chatgpt_chain.run(question=prompt)
    return response

def get_prompt(question, vehicle, k):
    prompt = f"""
    I need information from my {vehicle} manual.
    I will provide an excerpt from the manual. Use the excerpt and nothing else to answer the question.
    You must refer to the excerpt as "{vehicle} Manual" in your response. Here is the excerpt:
    """
    
    index = FAISS.load_local(folder_path=db_paths[vehicle], embeddings=model_norm)
    similar_docs = index.similarity_search(query=question, k=k)
    context = []
    for d in similar_docs:
        content = d.page_content
        context.append(content)
        
    user_input = prompt + '\n[EXCERPT]' + '\n'.join(context[:k]) + '\nQuestion: ' + question
    return user_input

db_paths = {
  "2023 AMG C-Coupe-Cab": "data/amg_c_coupe_cab",
  "2023 AMG C-Sedan": "data/amg_c_sedan",
  "2023 AMG E-Coupe-Cab": "data/amg_e_coupe_cab",
  "2023 AMG E-Sedan_wagon": "data/amg_e_sedan_wagon",
  "2023 AMG_EQE-Sedan": "data/amg_eqe_sedan",
  "2023 AMG_GLE-suv": "data/amg_gle_suv",
  "2023 AMG_GLS SUV": "data/amg_gls_suv",
  "2023 C-Cab": "data/c_cab",
  "2023 C-Coupe": "data/c_coupe",
  "2023 C-Sedan": "data/c_sedan",
  "2023 CLA": "data/cla",
  "2023 E-Cab": "data/e_cab",
  "2023 E-Coupe": "data/e_coupe",
  "2023 E-Sedan": "data/e_sedan",
  "2023 E-wagon": "data/e_wagon",
  "2023 eqb SUV": "data/eqb_suv",
  "2023 EQE-Sedan": "data/eqe_sedan",
  "2023 EQS_Sedan": "data/eqs_sedan",
  "2023 EQS SUV": "data/eqs_suv",
  "2023 GLA": "data/gla",
  "2023 GLB": "data/glb",
  "2023 GLC-Coupe": "data/glc_coupe",
  "2023 GLE-Coupe": "data/gle_coupe",
  "2023 GLE-suv": "data/gle_suv",
  "2023 GLS SUV": "data/gls_suv"
}

vehicle_options = [
    "2023 AMG C-Coupe-Cab",
    "2023 AMG C-Sedan",
    "2023 AMG E-Coupe-Cab",
    "2023 AMG E-Sedan_wagon",
    "2023 AMG_EQE-Sedan",
    "2023 AMG_GLE-suv",
    "2023 AMG_GLS SUV",
    "2023 C-Cab",
    "2023 C-Coupe",
    "2023 C-Sedan",
    "2023 CLA",
    "2023 E-Cab",
    "2023 E-Coupe",
    "2023 E-Sedan",
    "2023 E-wagon",
    "2023 eqb SUV",
    "2023 EQE-Sedan",
    "2023 EQS SUV",
    "2023 EQS_Sedan",
    "2023 GLA",
    "2023 GLB",
    "2023 GLC-Coupe",
    "2023 GLE-Coupe",
    "2023 GLE-suv",
    "2023 GLS SUV",
]

model_name = "BAAI/bge-large-en"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model_norm = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

def start_ui():
    chatbot_interface = gradio.Interface(
        fn=chat,
        inputs=["text",
                gradio.inputs.Dropdown(vehicle_options, label="Select Mercedes-Benz Owner's Manual")
                #gradio.inputs.Slider(minimum=1, maximum=10, step=1, label="k")
        ],
        outputs="text",
        title="Mercedes-Benz Owner's Manual",
        description="Ask a question and get answers from Mercedes-Benz Owner's Manual.<u>Disclaimer:</u> THIS IS NOT OFFICIAL AND MAY NOT BE AVAILABLE ALL THE TIME. ALWAYS LOOK AT THE OFFICIAL DOCUMENTATION at https://www.mbusa.com/en/owners/manuals",
        examples=[["What are the different features of the dashboard console?", "2023 S-Class", 10, 0.01],
                  ["What is flacon? Which page has that information? Show me all the exact content from that page", "2023 S-Class", 10, 0.01],
                  ["What is hyperscreen?", "2023 EQS", 10, 0.01],
                  ["Where can I find my vin?", "2023 EQS", 10, 0.01],
                  ["Does it take more than 30 minutes to charge? Which page has that information? Show me all the exact content from that page", "2023 EQE", 10, 0.01]],
        article = '<center><img src="https://visitor-badge.glitch.me/badge?page_id=kaushikdatta.owner-manual" alt="visitor badge"/></center>'
    )

    chatbot_interface.launch()