File size: 5,184 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
e3db4d0
b35a08e
e3db4d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
109
110
111
112
113
114
115
116
117
118
119
120
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)

# Updated reply generator with intent-specific follow-up
def generate_reply(input_text, intent):
    # Defined intent-specific closing prompts
    intent_closings = {
        "top up balance": "Would you like to see recharge options and prices?",
        "reactivate service": "Shall I help you reactivate your number now?",
        "report service outage": "Would you like me to file a service report for you?",
        "change mobile plan": "Need me to compare available plans for you?",
        "ask for billing support": "Would you like me to check your latest bill details?",
        "cancel subscription": "Should I guide you through the cancellation process?",
        "check account status": "Would you like an overview of your account status?",
        "upgrade device": "Would you like me to show available upgrade options?"
    }

    closing = intent_closings.get(intent.lower(), "Is there anything else I can help you with?")
    opening = "Thanks for reaching out. I understand your concern."
    action = f"Here's how we can assist with '{intent.lower()}'."
    reply = f"{opening} {action} {closing}"
    return reply

# 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.")