Spaces:
Runtime error
Runtime error
HassanSaado
commited on
Commit
·
ff97556
1
Parent(s):
f6ab3ac
added proper history
Browse files- .gitignore +2 -0
- RAG_class.py +47 -10
- __pycache__/RAG_class.cpython-311.pyc +0 -0
- app.py +18 -69
- test_notebook.ipynb +32 -0
.gitignore
CHANGED
@@ -1,2 +1,4 @@
|
|
1 |
.env
|
|
|
|
|
2 |
|
|
|
1 |
.env
|
2 |
+
*.ipynb
|
3 |
+
test_notebook.ipynb
|
4 |
|
RAG_class.py
CHANGED
@@ -15,16 +15,21 @@ class RAG_1177:
|
|
15 |
self.client = chromadb.PersistentClient(path="RAG_1177_db")
|
16 |
self.db = self.client.get_or_create_collection(self.db_name)
|
17 |
|
18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
def get_embeddings(self, text):
|
20 |
embeddings = self.model.encode(text)
|
21 |
return (embeddings.tolist())
|
22 |
|
23 |
-
|
24 |
def get_ids(self, num_ids):
|
25 |
ids = [str(uuid.uuid4()) for _ in range(num_ids)]
|
26 |
return ids
|
27 |
-
|
28 |
|
29 |
def delete_collection(self):
|
30 |
self.client.delete_collection(self.db_name)
|
@@ -47,25 +52,21 @@ class RAG_1177:
|
|
47 |
self.db.add(documents=docs, embeddings=emb, metadatas=urls, ids=ids)
|
48 |
return
|
49 |
|
50 |
-
|
51 |
def relevant_question(self, query):
|
52 |
-
|
53 |
history = []
|
54 |
system_prompt = """Du ska bedömma frågor och svara endast JA eller NEJ.
|
55 |
|
56 |
-
Om frågan är relaterad till 1177 sjukrådgivningsdatabas, hälsa,vård, välmående, sjukrådgivning ska du svara "JA".
|
57 |
|
58 |
Om frågan inte är relaterad till ovanämnde ämnen ska du svara NEJ"""
|
59 |
|
60 |
-
user_prompt = f"""Svara endast JA eller NEJ ifall följande fråga är är relevant till 1177, sjukrådgivning, hälsa, vård och välmående
|
61 |
|
62 |
Frågan är: {query}"""
|
63 |
-
|
64 |
|
65 |
history.append({"role": "system", "content": system_prompt})
|
66 |
history.append({"role": "user", "content": user_prompt})
|
67 |
|
68 |
-
|
69 |
client = OpenAI()
|
70 |
response = client.chat.completions.create(
|
71 |
model='gpt-3.5-turbo',
|
@@ -76,4 +77,40 @@ class RAG_1177:
|
|
76 |
return (response.choices[0].message.content)
|
77 |
|
78 |
|
79 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
self.client = chromadb.PersistentClient(path="RAG_1177_db")
|
16 |
self.db = self.client.get_or_create_collection(self.db_name)
|
17 |
|
18 |
+
self.example_questions = [
|
19 |
+
"hur kan jag lindra min huvudvärk?",
|
20 |
+
"Vad är symptomen för covid-19?",
|
21 |
+
"Vilka läkemedel finns det för smärtlindring?",
|
22 |
+
"Hur kan jag bäst lindra mina symtom på pollenallergi?",
|
23 |
+
"Vad kan jag göra för att förbättra min sömn?",
|
24 |
+
"vad kan jag göra om mitt barn får magsjuka?"]
|
25 |
+
|
26 |
def get_embeddings(self, text):
|
27 |
embeddings = self.model.encode(text)
|
28 |
return (embeddings.tolist())
|
29 |
|
|
|
30 |
def get_ids(self, num_ids):
|
31 |
ids = [str(uuid.uuid4()) for _ in range(num_ids)]
|
32 |
return ids
|
|
|
33 |
|
34 |
def delete_collection(self):
|
35 |
self.client.delete_collection(self.db_name)
|
|
|
52 |
self.db.add(documents=docs, embeddings=emb, metadatas=urls, ids=ids)
|
53 |
return
|
54 |
|
|
|
55 |
def relevant_question(self, query):
|
|
|
56 |
history = []
|
57 |
system_prompt = """Du ska bedömma frågor och svara endast JA eller NEJ.
|
58 |
|
59 |
+
Om frågan är relaterad till 1177.se sjukrådgivningsdatabas, hälsa, vård, välmående, sjukrådgivning ska du svara "JA".
|
60 |
|
61 |
Om frågan inte är relaterad till ovanämnde ämnen ska du svara NEJ"""
|
62 |
|
63 |
+
user_prompt = f"""Svara endast JA eller NEJ ifall följande fråga är är relevant till 1177.se, sjukrådgivning, hälsa, vård och välmående
|
64 |
|
65 |
Frågan är: {query}"""
|
|
|
66 |
|
67 |
history.append({"role": "system", "content": system_prompt})
|
68 |
history.append({"role": "user", "content": user_prompt})
|
69 |
|
|
|
70 |
client = OpenAI()
|
71 |
response = client.chat.completions.create(
|
72 |
model='gpt-3.5-turbo',
|
|
|
77 |
return (response.choices[0].message.content)
|
78 |
|
79 |
|
80 |
+
def rag_user_prompt(self, query, num_docs):
|
81 |
+
documents, urls = self.retrieve(query, num_docs)
|
82 |
+
|
83 |
+
user_prompt = f"""Ge detaljerade och tydliga svar på frågan baserat på informationen ovan och ange länkarna snyggt formaterat i slutet av svaret.
|
84 |
+
Om frågan är en uppföljningsfråga kan du strunta i den givna informationen. Svara inte på frågan om det inte är relaterat till hälsa och sjukvård.
|
85 |
+
|
86 |
+
Fråga: {query}
|
87 |
+
|
88 |
+
Information från 1177.se:
|
89 |
+
{documents[0]}
|
90 |
+
|
91 |
+
Referenser:
|
92 |
+
{urls}
|
93 |
+
"""
|
94 |
+
return user_prompt
|
95 |
+
|
96 |
+
def system_prompt(self):
|
97 |
+
prompt = """
|
98 |
+
Välkommen till 1177 AI-chatbot!
|
99 |
+
|
100 |
+
Jag är här för att hjälpa dig med sjukvårdsfrågor genom att ge detaljerade svar baserade på dokumentation från 1177.se. Nedan ser du de olika typerna av frågor jag kan svara på:
|
101 |
+
|
102 |
+
1. **Relevanta frågor med svar från 1177:** Jag kan ge detaljerade svar och inkludera tydliga länkar när frågan kan besvaras med information från 1177.se.
|
103 |
+
|
104 |
+
2. **Relevanta följdfrågor:** Om du har uppföljningsfrågor kan jag använda tidigare svar som kontext för att ge mer information."
|
105 |
+
|
106 |
+
|
107 |
+
Låt mig veta hur jag kan hjälpa dig!"""
|
108 |
+
return prompt
|
109 |
+
|
110 |
+
def get_description(self):
|
111 |
+
description = """<ul>
|
112 |
+
<li><strong>Specialiserad:</strong> Designad för att endast ge svar på sjukvårdsfrågor som man ofta besöker 1177 för.</li>
|
113 |
+
<li><strong>Svar med referenser:</strong> Alla svar är baserade på data från <a href="https://www.1177.se/" target="_blank">1177-hemsidan</a> och innehåller källhänvisningar.</li>
|
114 |
+
|
115 |
+
<p>För frågor & feedback: [email protected], <a href="https://www.linkedin.com/in/hassan-saado/">Linkedin</a></li></p>"""
|
116 |
+
return description
|
__pycache__/RAG_class.cpython-311.pyc
CHANGED
Binary files a/__pycache__/RAG_class.cpython-311.pyc and b/__pycache__/RAG_class.cpython-311.pyc differ
|
|
app.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1 |
from openai import OpenAI
|
2 |
from gradio.chat_interface import ChatInterface
|
3 |
-
import os
|
4 |
from dotenv import load_dotenv
|
5 |
from gradio.themes.soft import Soft
|
6 |
from gradio.themes import colors
|
@@ -8,84 +7,36 @@ from gradio.components import Textbox
|
|
8 |
from gradio.components import Chatbot
|
9 |
from RAG_class import RAG_1177
|
10 |
load_dotenv()
|
|
|
11 |
|
|
|
12 |
textbox = Textbox(placeholder="Skriv ditt fråga här...",scale=4)
|
13 |
-
chatbot = Chatbot(placeholder=" <strong>Tips:</strong> Var så specifik som möjligt
|
14 |
-
|
15 |
new_primary_color = colors.red
|
16 |
new_secondary_color = colors.red
|
17 |
-
|
18 |
my_custom_theme = Soft(
|
19 |
primary_hue=new_primary_color,
|
20 |
secondary_hue=new_secondary_color
|
21 |
)
|
22 |
|
23 |
-
# System prompt
|
24 |
-
system_prompt = """
|
25 |
-
Välkommen till 1177 AI-chatbot!
|
26 |
-
|
27 |
-
Jag är här för att hjälpa dig med sjukvårdsfrågor genom att ge svar baserade på dokumentation från 1177.se. Nedan ser du de olika typerna av frågor jag kan svara på:
|
28 |
-
|
29 |
-
1. **Relevanta frågor med svar från 1177:** Jag kan ge detaljerade svar och inkludera tydliga länkar när frågan kan besvaras med information från 1177.se.
|
30 |
-
|
31 |
-
2. **Relevanta följdfrågor:** Om du har uppföljningsfrågor kan jag använda tidigare svar som kontext för att ge mer information."
|
32 |
-
|
33 |
-
|
34 |
-
Låt mig veta hur jag kan hjälpa dig!
|
35 |
-
|
36 |
-
"""
|
37 |
-
|
38 |
-
examples = [
|
39 |
-
"hur kan jag lindra min huvudvärk?",
|
40 |
-
"Vad är symptomen för covid-19?",
|
41 |
-
"Vilka läkemedel finns det för smärtlindring?",
|
42 |
-
"Hur kan jag bäst lindra mina symtom på pollenallergi?",
|
43 |
-
"Vad kan jag göra för att förbättra min sömn?",
|
44 |
-
"vad kan jag göra om mitt barn får magsjuka?"
|
45 |
-
]
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
description = """<ul>
|
50 |
-
<li><strong>Specialiserad:</strong> Designad för att endast ge svar på sjukvårdsfrågor som man ofta besöker 1177 för.</li>
|
51 |
-
<li><strong>Svar med referenser:</strong> Alla svar är baserade på data från <a href="https://www.1177.se/" target="_blank">1177-hemsidan</a> och innehåller källhänvisningar.</li>
|
52 |
-
|
53 |
-
<p>Du är varmt välkommen med frågor eller feedback: [email protected], <a href="https://www.linkedin.com/in/hassan-saado/">Linkedin</a></li></p>"""
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
def predict(message, history):
|
58 |
-
|
59 |
-
rag = RAG_1177()
|
60 |
-
relevance_check = rag.relevant_question(message)
|
61 |
-
|
62 |
-
# Prepare history in OpenAI format
|
63 |
history_openai_format = []
|
64 |
-
|
65 |
-
history_openai_format.append({"role": "user", "content": human})
|
66 |
-
history_openai_format.append({"role": "assistant", "content": assistant})
|
67 |
-
|
68 |
-
documents, urls = rag.retrieve(message, 3)
|
69 |
-
|
70 |
-
if not history:
|
71 |
-
history_openai_format.append({"role": "system", "content": system_prompt})
|
72 |
|
73 |
-
|
74 |
-
|
|
|
|
|
|
|
75 |
|
76 |
-
|
|
|
|
|
|
|
77 |
|
78 |
-
Information från 1177.se:
|
79 |
-
{documents}
|
80 |
-
|
81 |
-
Referenser:
|
82 |
-
{urls}
|
83 |
-
|
84 |
-
Svara på frågan baserat på informationen ovan och ange länkarna snyggt formaterat i slutet av svaret.
|
85 |
-
Om frågan är en uppföljningsfråga kan du strunta i den givna informationen. Svara inte på frågan om det inte är relaterat till hälsa och sjukvård.
|
86 |
-
"""
|
87 |
history_openai_format.append({"role": "user", "content": user_prompt})
|
88 |
-
|
89 |
client = OpenAI()
|
90 |
response = client.chat.completions.create(
|
91 |
model='gpt-3.5-turbo',
|
@@ -93,21 +44,19 @@ def predict(message, history):
|
|
93 |
temperature=0.4,
|
94 |
stream=True
|
95 |
)
|
96 |
-
|
97 |
partial_message = ""
|
98 |
for chunk in response:
|
99 |
if chunk.choices[0].delta.content is not None:
|
100 |
partial_message = partial_message + chunk.choices[0].delta.content
|
101 |
yield partial_message
|
102 |
|
103 |
-
history_openai_format.append({"role": "assistant", "content": partial_message})
|
104 |
yield partial_message
|
105 |
|
106 |
def main():
|
107 |
-
|
108 |
-
ChatInterface(predict, textbox=textbox, chatbot=chatbot, title="Välkommen till 1177 AI-chatbot! 🔍🤒", theme=my_custom_theme,submit_btn="Skicka",
|
109 |
retry_btn="🔄Försök igen", undo_btn="↩️ Ångra", clear_btn="🗑️ Rensa",
|
110 |
-
examples=
|
111 |
|
112 |
if __name__ == "__main__":
|
113 |
main()
|
|
|
1 |
from openai import OpenAI
|
2 |
from gradio.chat_interface import ChatInterface
|
|
|
3 |
from dotenv import load_dotenv
|
4 |
from gradio.themes.soft import Soft
|
5 |
from gradio.themes import colors
|
|
|
7 |
from gradio.components import Chatbot
|
8 |
from RAG_class import RAG_1177
|
9 |
load_dotenv()
|
10 |
+
rag = RAG_1177()
|
11 |
|
12 |
+
#Gradio chatbot interface changes
|
13 |
textbox = Textbox(placeholder="Skriv ditt fråga här...",scale=4)
|
14 |
+
chatbot = Chatbot(placeholder=" <strong>Tips:</strong> Var så specifik som möjligt och använd gärna exempelfrågorna nedanför.</li>",scale=3, height=250, show_copy_button=True, label="1177 chatbot")
|
|
|
15 |
new_primary_color = colors.red
|
16 |
new_secondary_color = colors.red
|
|
|
17 |
my_custom_theme = Soft(
|
18 |
primary_hue=new_primary_color,
|
19 |
secondary_hue=new_secondary_color
|
20 |
)
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
def predict(message, history):
|
23 |
+
|
|
|
|
|
|
|
|
|
24 |
history_openai_format = []
|
25 |
+
history_openai_format.append({"role": "system", "content": rag.system_prompt()})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
|
27 |
+
#formatt chatbot history
|
28 |
+
if len(history) > 0:
|
29 |
+
for human, assistant in history:
|
30 |
+
history_openai_format.append({"role": "user", "content": human})
|
31 |
+
history_openai_format.append({"role": "assistant", "content": assistant})
|
32 |
|
33 |
+
if rag.relevant_question(message) == "NEJ":
|
34 |
+
user_prompt = "Denna fråga är helt orrelevant och håller sig inte till ämnet. Ge inga referenser"
|
35 |
+
else:
|
36 |
+
user_prompt = rag.rag_user_prompt(message, 3)
|
37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
history_openai_format.append({"role": "user", "content": user_prompt})
|
39 |
+
|
40 |
client = OpenAI()
|
41 |
response = client.chat.completions.create(
|
42 |
model='gpt-3.5-turbo',
|
|
|
44 |
temperature=0.4,
|
45 |
stream=True
|
46 |
)
|
47 |
+
#streaming
|
48 |
partial_message = ""
|
49 |
for chunk in response:
|
50 |
if chunk.choices[0].delta.content is not None:
|
51 |
partial_message = partial_message + chunk.choices[0].delta.content
|
52 |
yield partial_message
|
53 |
|
|
|
54 |
yield partial_message
|
55 |
|
56 |
def main():
|
57 |
+
ChatInterface(predict, textbox=textbox, chatbot=chatbot, title="Välkommen till 1177 AI-chatbot!🔍", theme=my_custom_theme,submit_btn="Skicka",
|
|
|
58 |
retry_btn="🔄Försök igen", undo_btn="↩️ Ångra", clear_btn="🗑️ Rensa",
|
59 |
+
examples=rag.example_questions, cache_examples=False, description=rag.get_description).launch(share=False)
|
60 |
|
61 |
if __name__ == "__main__":
|
62 |
main()
|
test_notebook.ipynb
CHANGED
@@ -105,6 +105,38 @@
|
|
105 |
"print(svar)\n",
|
106 |
"\n"
|
107 |
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
}
|
109 |
],
|
110 |
"metadata": {
|
|
|
105 |
"print(svar)\n",
|
106 |
"\n"
|
107 |
]
|
108 |
+
},
|
109 |
+
{
|
110 |
+
"cell_type": "code",
|
111 |
+
"execution_count": 28,
|
112 |
+
"metadata": {},
|
113 |
+
"outputs": [
|
114 |
+
{
|
115 |
+
"name": "stdout",
|
116 |
+
"output_type": "stream",
|
117 |
+
"text": [
|
118 |
+
"Fråga: Jag har huvudvärk\n",
|
119 |
+
"\n",
|
120 |
+
" Information från 1177.se:\n",
|
121 |
+
" ['Du tar läkemedel mot huvudvärk flera gånger i veckan.\\nDu har huvudvärk som känns annorlunda än vid tidigare tillfällen.\\nDu har huvudvärk, är över 50 år och har inte haft huvudvärk tidigare.\\nDu har huvudvärk och förändrad personlighet.\\nDu har huvudvärk och samtidig cancer.\\nDu har huvudvärk och har minskat i vikt.\\nDu har huvudvärk och yrsel, synförändringar eller ont i ena tinningen.\\nOm det är helg kan du vänta tills det blir vardag. Många mottagningar kan du kontakta genom attlogga in.\\nRing telefonnummer 1177 om du vill hasjukvårdsrådgivning. Då kan du få hjälp att bedöma symtom eller hjälp med var du kan söka vård.\\nOm det är bråttom\\nKontakta genast envårdcentraleller enjouröppen mottagningom något av följande stämmer:\\nDu har huvudvärk och feber och känner dig sjuk och är stel i nacken.\\nDu har plötsligt fått en intensiv huvudvärk.\\nDu har huvudvärk som ökar när du krystar eller hostar.\\nDu har huvudvärk och svaghet eller förlorad känsel i någon del av kroppen.\\nDu har huvudvärk och skakningar eller ryckningar i någon del av kroppen.\\nDu har huvudvärk och använder blodförtunnande läkemedel.\\nDu har fått huvudvärk efter ett slag mot huvudet och du känner dig slö.\\nOm det är stängt på vårdcentralen eller den jouröppna mottagningen, sök vård på en akutmottagning.\\nUndersökningar och utredningar\\nSpänningshuvudvärk kan ibland förväxlas medmigränoch det är vanligt att få båda typerna av huvudvärk. Det är viktigt att skilja på de båda typerna av huvudvärk eftersom de behandlas på olika sätt. Därför behöver du få en bedömning av en läkare för att få veta vilken typ av huvudvärk du har. Bedömningen görs genom att analysera dina svar på frågor om dina symtom.\\nDet är bra om du har information i en huvudvärkskalender eller i andra anteckningar. Läkaren brukar ställa följande frågor:\\nHur många dagar i månaden har du huvudvärk?\\nNär hade du huvudvärk de senaste gångerna? Ange tidpunkt på dygnet och veckodag, om det går.\\nKan huvudvärken utlösas av stress eller oro?\\nBrukar du ha huvudvärk i hela huvudet eller på den ena sidan av huvudet?\\nBrukar huvudvärken kännas tryckande, molande eller pulserande?\\nBrukar huvudvärken vara lätt eller svår?\\nHur länge brukar den hålla i sig?\\nBlir du känslig mot ljus och ljud i samband med huvudvärken?\\nMår du illa och kräks i samband med huvudvärken?\\nBehöver du lägga dig ner när huvudvärken är som värst?\\nKan huvudvärken öka av lätt fysisk aktivitet?\\nHar huvudvärken förändrats från hur den tidigare har känts?']\n",
|
122 |
+
"\n",
|
123 |
+
" Referenser:\n",
|
124 |
+
" Läs mer på:\n",
|
125 |
+
"1: https://www.1177.se/sjukdomar--besvar/hjarna-och-nerver/huvudvark-och-migran/spanningshuvudvark/\n",
|
126 |
+
"\n",
|
127 |
+
"\n",
|
128 |
+
" Svara på frågan baserat på informationen ovan och ange länkarna snyggt formaterat i slutet av svaret.\n",
|
129 |
+
" Om frågan är en uppföljningsfråga kan du strunta i den givna informationen. Svara inte på frågan om det inte är relaterat till hälsa och sjukvård.\n",
|
130 |
+
" \n"
|
131 |
+
]
|
132 |
+
}
|
133 |
+
],
|
134 |
+
"source": [
|
135 |
+
"from RAG_class import RAG_1177\n",
|
136 |
+
"rag = RAG_1177()\n",
|
137 |
+
"\n",
|
138 |
+
"print(rag.rag_user_prompt(\"Jag har huvudvärk\", 1))\n"
|
139 |
+
]
|
140 |
}
|
141 |
],
|
142 |
"metadata": {
|