Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline | |
| from sentence_transformers import SentenceTransformer | |
| import faiss | |
| import torch | |
| # ------------------------------- | |
| # Load dataset | |
| # ------------------------------- | |
| file_path = "marketing-campaigns.csv" | |
| df = pd.read_csv(file_path) | |
| # Combine text for embeddings | |
| df = df.dropna(subset=["campaign_name", "description"]) | |
| df["text"] = df["campaign_name"] + ": " + df["description"] | |
| # ------------------------------- | |
| # Embeddings + FAISS index | |
| # ------------------------------- | |
| embed_model = SentenceTransformer("all-MiniLM-L6-v2") | |
| embeddings = embed_model.encode(df["text"].tolist(), convert_to_tensor=True, show_progress_bar=True) | |
| embeddings_np = embeddings.detach().cpu().numpy() | |
| # Build FAISS index | |
| d = embeddings_np.shape[1] | |
| index = faiss.IndexFlatL2(d) | |
| index.add(embeddings_np) | |
| # ------------------------------- | |
| # Load LLM (Phi-4-mini) | |
| # ------------------------------- | |
| model_name = "microsoft/phi-4-mini" | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float32, device_map="auto") | |
| # ------------------------------- | |
| # RAG functions | |
| # ------------------------------- | |
| def retrieve_context(query, k=3): | |
| query_vec = embed_model.encode([query], convert_to_tensor=True).cpu().numpy() | |
| D, I = index.search(query_vec, k) | |
| results = [df.iloc[i]["text"] for i in I[0]] | |
| return results | |
| def generate_with_rag(prompt): | |
| # Step 1: Retrieve top campaigns | |
| context = retrieve_context(prompt, k=3) | |
| context_str = "\n".join(context) | |
| # Step 2: Build final prompt | |
| rag_prompt = f""" | |
| You are an AI marketing assistant. | |
| Here are some past campaigns for reference:\n{context_str}\n | |
| Based on these, generate a new campaign idea for: {prompt} | |
| """ | |
| # Step 3: Generate with Phi-4 | |
| inputs = tokenizer(rag_prompt, return_tensors="pt").to(model.device) | |
| outputs = model.generate(**inputs, max_length=200, temperature=0.7, top_p=0.9) | |
| return tokenizer.decode(outputs[0], skip_special_tokens=True) | |
| # ------------------------------- | |
| # Gradio UI | |
| # ------------------------------- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## π€ RAG-powered AI Marketing Campaign Generator") | |
| with gr.Row(): | |
| query = gr.Textbox(label="Enter campaign idea or analysis query") | |
| output = gr.Textbox(label="Generated Campaign") | |
| btn = gr.Button("Generate with RAG") | |
| btn.click(generate_with_rag, inputs=query, outputs=output) | |
| if __name__ == "__main__": | |
| demo.launch() |