carotis_chatbot / app.py
rasmus1610's picture
polished it
d02f3a9
raw
history blame
3.26 kB
import openai
import numpy as np
import pandas as pd
from sentence_transformers import SentenceTransformer
import re
import gradio as gr
import json
import requests
# Calculate the cosine similarity
def cos_sim(vector1, vector2):
cosine_similarity = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))
return cosine_similarity
def sim_search(df, query, n=3, dot=False):
embedding = model.encode(query)
if dot:
df['similarities'] = df.embeddings.apply(lambda x: x@embedding)
print("using dot product")
else:
df['similarities'] = df.embeddings.apply(lambda x: cos_sim(x, embedding))
print("using cosine similarity")
res = df.sort_values('similarities', ascending=False).head(n)
return res
def create_prompt(context, question):
return f"""
Context information is below.
---------------------
{context}
---------------------
Given the context information and not prior knowledge, answer the query.
Query: {question}
Answer: \
"""
def answer_question(question, model="gpt-3.5-turbo",n=3):
r = sim_search(df, question,n=n)
context = "\n\n".join(r.chunks)
prompt = create_prompt(context, question)
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant answering questions in german. You answer only in german. If you do not know an answer you say it. You do not fabricate answers."},
{"role": "user", "content": prompt},
]
)
return response.choices[0].message.content
df = pd.read_csv("carotid_embeddings_sentence_transformers.csv")
df["embeddings"] = df.embeddings.apply(json.loads)
model = SentenceTransformer('thenlper/gte-base')
def gradio_answer(input):
return answer_question(input, n=2)
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 Beispiele findest du unten.
### Wie funktioniert das?
Mit Hilfe eines neuronalen Netzwerkes werden die Fragen in eine Vektor-Repräsentation ('Embedding') umgewandelt. Dann wird die Ähnlichkeit des 'Frage-Vektors' mit genauso erstellten Vektoren von Textpassagen der Leitlinie berechnet. Die Textpassagen, die am ähnlichsten sind, werden dann einem 'Large Language Model (LLM)' zur Beantwortung der Frage als Context gegeben. Diese Technik heißt ['retrieval-augmented Generation (RAG)'](https://research.ibm.com/blog/retrieval-augmented-generation-RAG).
"""
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=[
"In welchen Intervallen ist eine Nachuntersuchung nach Carotis-Stent (CAS) angezeigt?",
"Ist eine ambulante Therapie der Carotisstenose mittels CEA oder CAS möglich und sinnvoll?",
"Was sollte man als Bradykardie-Therapie bei Nachdilatation eines Stents einsetzen?"]
)
demo.launch()