dine24's picture
Update app.py
a894a91 verified
raw
history blame
3.38 kB
import gradio as gr
import numpy as np
import pandas as pd
import faiss
import torch
from transformers import AutoTokenizer, AutoModel, pipeline, AutoModelForCausalLM
from huggingface_hub import login
import os
from datetime import datetime
# Authenticate Hugging Face token securely
login(token=os.getenv("HF_TOKEN"))
# Load FAISS index and product data
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")
# Load Falcon 1B for text generation
llm_model_name = "tiiuae/falcon-rw-1b"
llm_tokenizer = AutoTokenizer.from_pretrained(llm_model_name)
llm_model = AutoModelForCausalLM.from_pretrained(llm_model_name)
llm_pipeline = pipeline("text-generation", model=llm_model, tokenizer=llm_tokenizer, device=-1)
log_path = "query_logs.txt"
def generate_embeddings(queries):
tokens = deberta_tokenizer(queries, 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
def generate_response(user_query):
with open(log_path, "a") as log_file:
log_file.write(f"{datetime.now()} - {user_query}\n")
query_embedding = generate_embeddings([user_query])
faiss.normalize_L2(query_embedding)
distances, indices = index.search(query_embedding, k=5)
retrieved_docs = [text_data[i] for i in indices[0]]
context = ", ".join(set(retrieved_docs))
prompt = f"""
Using the following product descriptions:
{context}
Carefully craft a well-structured response to the following question:
**Question:** {user_query}
**Instructions:**
1. Incorporate **all** retrieved product descriptions.
2. Use a **formal yet engaging** tone.
3. Provide **practical & creative** luxury decor ideas.
4. Ensure a **cohesive & detailed response.**
**Your response:**
"""
result = llm_pipeline(prompt, max_new_tokens=300, do_sample=True, truncation=True, pad_token_id=llm_tokenizer.eos_token_id)[0]["generated_text"]
return result
# Gradio UI with branding
with gr.Blocks(css="""
#logo-img {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 5px;
margin-bottom: 5px;
border-radius: 12px;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.05);
}
""", theme=gr.themes.Soft()) as demo:
with gr.Column():
with gr.Row():
gr.Image(
value="OnlineRetail.png",
show_label=False,
show_download_button=False,
height=100,
width=100,
elem_id="logo-img"
)
gr.Markdown("### 🛋️ Luxury Decor Assistant")
gr.Markdown("Ask your decor questions based on real product descriptions. <br> Powered by **DeBERTa + FAISS + Falcon 1B**.")
with gr.Row():
input_box = gr.Textbox(label="Textbox", placeholder="e.g. Suggest cozy decor for a small bedroom")
output_box = gr.Textbox(label="Response")
submit_btn = gr.Button("✨ Generate Suggestion")
submit_btn.click(fn=generate_response, inputs=input_box, outputs=output_box)
demo.launch()