1177_chatbot / RAG_class.py
hassano94's picture
Update RAG_class.py
dd82736 verified
#import recurive textsplitter
from sentence_transformers import SentenceTransformer
import chromadb
import uuid
import os
from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
class RAG_1177:
def __init__(self):
self.db_name = "RAG_1177"
self.model = SentenceTransformer('KBLab/sentence-bert-swedish-cased')
self.client = chromadb.PersistentClient(path="RAG_1177_db")
self.db = self.client.get_or_create_collection(self.db_name)
self.example_questions = [
"hur kan jag lindra min huvudvärk?",
"Vad är symptomen för covid-19?",
"Vilka läkemedel finns det för smärtlindring?",
"Hur kan jag bäst lindra mina symtom på pollenallergi?",
"Vad kan jag göra för att förbättra min sömn?",
"vad kan jag göra om mitt barn får magsjuka?"]
def get_embeddings(self, text):
embeddings = self.model.encode(text)
return (embeddings.tolist())
def get_ids(self, num_ids):
ids = [str(uuid.uuid4()) for _ in range(num_ids)]
return ids
def delete_collection(self):
self.client.delete_collection(self.db_name)
return
def retrieve(self, query, num_results):
query_emb = self.get_embeddings(query)
result = self.db.query(query_embeddings=query_emb, n_results=num_results, include=['documents', 'metadatas'])
result_urls = result['metadatas'][0]
result_docs = result['documents'][0]
url_list = set([item['url'] for item in result_urls])
result_urls = "Läs mer på:\n"
for i, url in enumerate(url_list, start=1):
result_urls += f"{i}: {url}\n"
return result_docs, result_urls
def insert(self,docs, emb, urls, ids):
self.db.add(documents=docs, embeddings=emb, metadatas=urls, ids=ids)
return
def relevant_question(self, query):
history = []
system_prompt = """Du ska bedömma frågor och svara endast JA eller NEJ.
Om frågan är relaterad till 1177.se sjukrådgivningsdatabas, hälsa, vård, välmående, sjukrådgivning ska du svara "JA".
Om frågan inte är relaterad till ovanämnde ämnen ska du svara NEJ"""
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
Frågan är: {query}"""
history.append({"role": "system", "content": system_prompt})
history.append({"role": "user", "content": user_prompt})
client = OpenAI()
response = client.chat.completions.create(
model='gpt-4o',
messages=history,
temperature=0.4,
stream=False
)
return (response.choices[0].message.content)
def rag_user_prompt(self, query, num_docs):
documents, urls = self.retrieve(query, num_docs)
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.
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.
Fråga: {query}
Information från 1177.se:
{documents[0]}
Referenser:
{urls}
"""
return user_prompt
def system_prompt(self):
prompt = """
Välkommen till 1177 AI-chatbot!
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å:
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.
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."
Låt mig veta hur jag kan hjälpa dig!"""
return prompt
def get_description(self):
description = """<ul>
<li><strong>Specialiserad:</strong> Designad för att endast ge svar på sjukvårdsfrågor som man ofta besöker 1177 för.</li>
<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>
<p>För frågor & feedback: hassan.saado94@gmail.com, <a href="https://www.linkedin.com/in/hassan-saado/">Linkedin</a></li></p>"""
return description