Spaces:
Sleeping
Sleeping
File size: 4,452 Bytes
efa60b3 66128ac efa60b3 b35a08e 66128ac 0443ecd efa60b3 66128ac 0e52653 66128ac 0e52653 66128ac b35a08e 0e52653 b35a08e 66128ac b35a08e 6e13199 b35a08e 6e13199 b35a08e 66128ac b35a08e 66128ac b35a08e da8d9a8 b35a08e 6e13199 b35a08e 6e13199 b35a08e efa60b3 b35a08e efa60b3 b35a08e efa60b3 b35a08e 6e13199 b35a08e da8d9a8 0db3c6a b35a08e 66128ac b35a08e 66128ac da8d9a8 66128ac b35a08e 0e52653 b35a08e 0e52653 b35a08e da8d9a8 66128ac b35a08e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import streamlit as st
from transformers import pipeline
import re
# Load models
emotion_classifier = pipeline("text-classification", model="bhadresh-savani/distilbert-base-uncased-emotion", top_k=1)
intent_classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
text_generator = pipeline("text2text-generation", model="declare-lab/flan-alpaca-base", max_new_tokens=200)
# Candidate intents
candidate_tasks = [
"change mobile plan",
"top up balance",
"report service outage",
"ask for billing support",
"reactivate service",
"cancel subscription",
"check account status",
"upgrade device"
]
# Emotion scoring
urgent_emotions = {"anger", "annoyance", "disgust", "frustration", "sadness"}
moderate_emotions = {"confusion", "concern", "nervousness", "fear"}
def get_emotion_score(emotion):
if emotion in urgent_emotions:
return 1.0
elif emotion in moderate_emotions:
return 0.6
else:
return 0.2
def get_content_score(text, top_intents):
score = 0.0
trigger_words = ["out of service", "urgent", "not working", "stopped", "can't", "immediately"]
if any(kw in text.lower() for kw in trigger_words):
score += 0.3
if any(label in ["top up balance", "reactivate service", "report service outage"] for label in top_intents):
score += 0.4
if any(label in ["change mobile plan", "ask for billing support"] for label in top_intents):
score += 0.2
return min(score + 0.1, 1.0)
def generate_reply(input_text, intent):
prompt = (
f"Write a professional customer service response to the following customer request: '{input_text}'\n"
f"The request is related to: '{intent}'.\n"
f"Start with a polite sentence, then provide a clear solution, and end with a kind question offering further help."
)
return text_generator(prompt)[0]['generated_text']
# UI
st.set_page_config(page_title="Customer Support Assistant", layout="centered")
st.title("π Smart Customer Support Assistant (for Agents Only)")
user_input = st.text_area("Enter customer's message or complaint:", height=150)
if st.button("Analyze Message"):
if user_input.strip() == "":
st.warning("Please enter a customer message.")
else:
with st.spinner("Processing..."):
# Emotion detection
emotion_result = emotion_classifier(user_input)
emotion_data = emotion_result[0][0] if isinstance(emotion_result[0], list) else emotion_result[0]
emotion_label = emotion_data['label']
emotion_score = get_emotion_score(emotion_label)
# Intent detection
intent_result = intent_classifier(user_input, candidate_tasks)
top_intents = [label for label, score in zip(intent_result['labels'], intent_result['scores']) if score > 0.15][:3]
# Content score
content_score = get_content_score(user_input, top_intents)
# Final decision score
final_score = (0.5 * emotion_score) + (0.5 * content_score)
st.subheader("π§Ύ System Summary")
if final_score < 0.5:
st.markdown("### π’ This message was handled automatically.")
if top_intents:
auto_intent = top_intents[0]
auto_reply = generate_reply(user_input, auto_intent)
st.markdown("#### π€ Auto-Response Sent to User:")
st.success(auto_reply)
else:
st.info("No clear intent detected. A general auto-reply was used.")
else:
st.markdown("### π΄ Human Support Required")
# Customer Profile Summary
st.markdown("#### π€ Customer Status:")
st.write(f"- **Emotion detected**: {emotion_label.capitalize()}")
st.write(f"- **Tone**: {'Urgent' if emotion_score > 0.8 else 'Concerned' if emotion_score > 0.5 else 'Calm'}")
if top_intents:
st.markdown("#### π§© Detected Customer Needs:")
for intent in top_intents:
reply = generate_reply(user_input, intent)
st.markdown(f"**β’ {intent.capitalize()}**")
st.write(reply)
else:
st.warning("No clear intent detected. Manual review recommended.")
|