import openai
import numpy as np
import pandas as pd
from sentence_transformers import SentenceTransformer, CrossEncoder
import re
import gradio as gr
import json
import ast
from llm import OpenAILLM
from qa import QuestionAnswerer

df = pd.read_csv("carotid_embeddings_sentence_transformers_061123.csv")
df["embeddings"] = df.embeddings.apply(ast.literal_eval)

qa = QuestionAnswerer(df, SentenceTransformer('thenlper/gte-base'), OpenAILLM('gpt-3.5-turbo-1106'), CrossEncoder('cross-encoder/ms-marco-TinyBERT-L-2-v2'))

def gradio_answer(input):
    return qa.answer_question(input, n=5)

desc_string = """
In dieser Demo kannst du einer KI Fragen zum Inhalt der ['S3-Leitlinie Diagnostik, Therapie und Nachsorge der extracraniellen Carotisstenose'](https://register.awmf.org/de/leitlinien/detail/004-028) stellen. Ein paar Beispiel-Fragen findest du unten. 

## Wie funktioniert das?

1. Die Frage wird durch ein neuronalen Netzwerk in eine Vektor-Repräsentation ('Embedding') umgewandelt. 
2. Die Ähnlichkeit des 'Frage-Vektors' wird mit den genauso erzeugten Vektoren von Textpassagen der Leitlinie verglichen. 
3. Ein ‚Large Language Model (LLM)‘ beantwortet nun mit Hilfe der ähnlichsten Textpassagen die gestellte Frage. 

Diese Technik heißt [‚Retrieval-augmented Generation (RAG)'](https://research.ibm.com/blog/retrieval-augmented-generation-RAG). Hierdurch kann verhindert werden, dass LLMs Fakten einfach erfinden.
"""

demo = gr.Interface(
   fn=gradio_answer, 
   inputs=gr.Textbox(lines=1, placeholder="Frage hier...", label="Frage"), 
   outputs=gr.Textbox(lines=4, placeholder="Antwort hier...", label="Antwort"), 
   title="🧠 Q&A S3 Leitlinie Carotisstenose", 
   description=desc_string,
   examples=[
      "Welche Sensitivität hatte die Transcranielle Doppler-Sonographie (TCD) bei der Detektion eines perioperativen Schlaganfalls?",
      "Ist eine ambulante Therapie der Carotisstenose mittels CEA oder CAS möglich und sinnvoll?",
      "Wie viele zerebrale Ischämien in Deutschland werden durch >50%ige Stenosen oder Verschlüsse der extracraniellen A. carotis verursacht?",
      "Welche Symptome können durch Stenosen der A. carotis verursacht werden?"
      ]
)
    
demo.launch()