-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
121 lines (111 loc) · 4.11 KB
/
app.py
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
"""A Simple chatbot that uses the LangChain and Gradio UI to answer questions about manuals."""
import os
from types import SimpleNamespace
from typing import List, Tuple, Union
import gradio as gr
import wandb
from chain import get_answer, load_chain, load_vector_store
from config import default_config
class Chat:
"""A chatbot interface that persists the vectorstore and chain between calls."""
def __init__(
self,
config: SimpleNamespace,
):
"""Initialize the chatbot.
Args:
config (SimpleNamespace): The configuration.
"""
self.config = config
self.wandb_run = wandb.init(
project=self.config.project,
entity=self.config.entity,
job_type=self.config.job_type,
config=self.config,
)
self.vector_store = None
self.chain = None
def __call__(
self,
question: str,
history: Union[List[Tuple[str, str]], None] = None,
openai_api_key: str = None,
):
"""Answer a question about manuals documentation using the LangChain QA chain and vector store retriever.
Args:
question (str): The question to answer.
history (list[tuple[str, str]] | None, optional): The chat history. Defaults to None.
openai_api_key (str, optional): The OpenAI API key. Defaults to None.
Returns:
list[tuple[str, str]], list[tuple[str, str]]: The chat history before and after the question is answered.
"""
if openai_api_key is not None:
openai_key = openai_api_key
elif os.environ["OPENAI_API_KEY"]:
openai_key = os.environ["OPENAI_API_KEY"]
else:
raise ValueError(
"Please provide your OpenAI API key as an argument or set the OPENAI_API_KEY environment variable"
)
if self.vector_store is None:
self.vector_store = load_vector_store(
wandb_run=self.wandb_run, openai_api_key=openai_key
)
if self.chain is None:
self.chain = load_chain(
self.wandb_run, self.vector_store, openai_api_key=openai_key
)
history = history or []
question = question.lower()
response = get_answer(
chain=self.chain,
question=question,
chat_history=history,
)
history.append((question, response))
return history, history
with gr.Blocks() as demo:
gr.HTML(
f"""<div style="text-align: center; max-width: 700px; margin: 0 auto;">
<div
style="
display: inline-flex;
align-items: center;
gap: 0.8rem;
font-size: 1.75rem;
"
>
<h1 style="font-weight: 900; margin-bottom: 7px; margin-top: 5px;">
Ask Manual(s) About Everything
</h1>
</div>
<p style="margin-bottom: 10px; font-size: 94%">
Hi, I'm an AMAE bot, start by typing in your OpenAI API key, questions you have related to your home appliances and the car usage and then press enter.<br>
OpenAI model used to generate answers: {default_config.model_name}<br>
Built using <a href="https://langchain.readthedocs.io/en/latest/" target="_blank">LangChain</a> and <a href="https://github.com/gradio-app/gradio" target="_blank">Gradio Github repo</a>
</p>
</div>"""
)
with gr.Row():
question = gr.Textbox(
label="Type in your questions here and press Enter!",
placeholder="How can I signal a right turn?",
)
openai_api_key = gr.Textbox(
type="password",
label="Enter your OpenAI API key here",
)
state = gr.State()
chatbot = gr.Chatbot()
question.submit(
Chat(
config=default_config,
),
[question, state, openai_api_key],
[chatbot, state],
)
# go to http://localhost:8885 in your browser to access the interface
if __name__ == "__main__":
demo.queue().launch(
share=False, server_name="0.0.0.0", server_port=8885, show_error=True
)