chukbert's picture
Update app.py
5fc43de verified
import pandas as pd
import openai
import faiss
import numpy as np
import time
import os
import pickle
import gradio as gr
from langchain.embeddings.openai import OpenAIEmbeddings
from io import StringIO
from huggingface_hub import hf_hub_download
from huggingface_hub import login
openai.api_key = os.getenv("OPENAI_API_KEY")
hf_token = os.getenv("HF_TOKEN")
login(token=hf_token)
def load_embeddings_and_faiss():
embeddings_path = hf_hub_download(repo_id="chukbert/embedding-faq-medquad", filename="embeddings.pkl",repo_type="dataset", token=hf_token)
faiss_index_path = hf_hub_download(repo_id="chukbert/embedding-faq-medquad", filename="faiss.index",repo_type="dataset", token=hf_token)
faiss_index = faiss.read_index(faiss_index_path)
with open(embeddings_path, 'rb') as f:
question_embeddings = pickle.load(f)
return faiss_index, question_embeddings
def retrieve_answer(question, faiss_index, embedding_model, answers, log_output, threshold=0.2):
question_embedding = embedding_model.embed_query(question)
distances, indices = faiss_index.search(np.array([question_embedding]), k=1)
closest_distance = distances[0][0]
closest_index = indices[0][0]
log_output.write(f"closest_distance: {closest_distance}")
if closest_distance > threshold:
return "No good match found in dataset. Using GPT-4o-mini to generate an answer."
return answers[closest_index]
def ask_openai_gpt4(question):
response = openai.chat.completions.create(
messages=[
{"role": "user", "content": f"Answer the following medical question: {question}"}
],
model="gpt-4o-mini",
max_tokens=150
)
return response.choices[0].message.content
def chatbot(user_input):
log_output = StringIO()
faiss_index, question_embeddings = load_embeddings_and_faiss()
embedding_model = OpenAIEmbeddings(openai_api_key=openai.api_key)
start_time = time.time()
log_output.write("Retrieving answer from FAISS...\n")
response_text = retrieve_answer(user_input, faiss_index, embedding_model, answers, log_output, threshold=0.3)
if response_text == "No good match found in dataset. Using GPT-4o-mini to generate an answer.":
log_output.write("No good match found in dataset. Using GPT-4o-mini to generate an answer.\n")
response_text = ask_openai_gpt4(user_input)
end_time = time.time()
response_time = end_time - start_time
return response_text, f"Response time: {response_time:.4f} seconds", log_output.getvalue()
demo = gr.Interface(
fn=chatbot,
inputs="text",
outputs=[
gr.Textbox(label="Chatbot Response"),
gr.Textbox(label="Response Time"),
gr.Textbox(label="Logs")
],
title="Medical Chatbot with Custom Knowledge About Medical FAQ",
description="A chatbot with custom knowledge using FAISS for quick responses or fallback to GPT-4o-mini when no relevant answer is found. Response time is also tracked."
)
if __name__ == "__main__":
df = pd.read_csv("medquad.csv")
questions = df['question'].tolist()
answers = df['answer'].tolist()
print(f"Loaded questions and answers. Number of questions: {len(questions)}, Number of answers: {len(answers)}")
demo.launch()