dine24's picture
Update app.py
e58330f verified
raw
history blame contribute delete
3.52 kB
import os
import gradio as gr
import pandas as pd
import faiss
import torch
from transformers import AutoTokenizer, AutoModel
from openai import OpenAI
from huggingface_hub import login
# βœ… Load environment secrets securely
login(token=os.getenv("HF_TOKEN")) # Hugging Face login
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # OpenAI GPT-3.5 auth
# βœ… Load FAISS index and product descriptions
index = faiss.read_index("deberta_faiss.index")
text_data = pd.read_csv("deberta_text_data.csv")["Retrieved Text"].tolist()
# βœ… Load DeBERTa for embedding
deberta_model_name = "microsoft/deberta-v3-base"
deberta_tokenizer = AutoTokenizer.from_pretrained(deberta_model_name)
deberta_model = AutoModel.from_pretrained(deberta_model_name).to("cpu")
# βœ… Embedding function
def generate_embeddings(texts):
tokens = deberta_tokenizer(texts, return_tensors="pt", padding=True, truncation=True).to("cpu")
with torch.no_grad():
embeddings = deberta_model(**tokens).last_hidden_state.mean(dim=1).cpu().numpy().astype("float32")
return embeddings
# βœ… RAG-based response using OpenAI
def generate_response(message, history):
# Embed and retrieve context
query_embedding = generate_embeddings([message])
faiss.normalize_L2(query_embedding)
_, indices = index.search(query_embedding, k=5)
retrieved_docs = [text_data[i] for i in indices[0]]
context = "\n- " + "\n- ".join(set(retrieved_docs))
# Format history for OpenAI
chat_history = [{"role": "system", "content": "You're a helpful luxury interior design assistant."}]
for user, bot in history:
chat_history.append({"role": "user", "content": user})
chat_history.append({"role": "assistant", "content": bot})
# Append latest query
chat_history.append({
"role": "user",
"content": f"Here are related product descriptions:{context}\n\nUser Question: {message}\n\nAnswer:"
})
# Call OpenAI GPT-3.5
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=chat_history,
temperature=0.7,
max_tokens=500
)
response = completion.choices[0].message.content.strip()
# Generate a follow-up question
followup_prompt = f"Based on this interior decor answer: '{response}', suggest a helpful follow-up question the user might ask next."
followup_completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": followup_prompt}],
temperature=0.7,
max_tokens=60
)
followup = followup_completion.choices[0].message.content.strip()
final_output = f"πŸͺ‘ **Decor Response:** {response}\n\nπŸ”„ **Suggested Follow-Up:** {followup}"
return final_output
# βœ… Gradio Chat UI
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("## πŸͺ‘ Luxury Decor Assistant (RAG)")
gr.Markdown("πŸ’¬ Ask your interior design questions using real product descriptions. Powered by **DeBERTa + FAISS + OpenAI GPT-3.5**.")
chatbot = gr.Chatbot(label="Chatbot")
msg = gr.Textbox(label="Textbox", placeholder="e.g. Suggest cozy decor for a small bedroom", scale=8)
clear = gr.Button("Clear")
def respond(message, chat_history):
response = generate_response(message, chat_history)
chat_history.append((message, response))
return "", chat_history
msg.submit(respond, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot, queue=False)
demo.launch()