Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -56,101 +56,114 @@ def analyze_dominant_emotion(user_review):
|
|
56 |
dominant_emotion = max(emotion_results, key=lambda x: x['score']) # Identify the emotion with the highest confidence
|
57 |
return dominant_emotion # Return the dominant emotion (label and score)
|
58 |
|
|
|
59 |
##########################################
|
60 |
-
# Step 2
|
61 |
##########################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
def response_gen(user_review):
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
),
|
80 |
-
"disgust": (
|
81 |
-
f"'{user_review}'\n\n"
|
82 |
-
"As a customer service representative, craft a response that:\n"
|
83 |
-
"- Immediately acknowledges the product issue\n"
|
84 |
-
"- Explains quality control measures being taken\n"
|
85 |
-
"- Provides clear return/replacement instructions\n"
|
86 |
-
"- Offers goodwill gesture (3-4 sentences)\n\n"
|
87 |
-
"Response:"
|
88 |
-
),
|
89 |
-
"fear": (
|
90 |
-
f"'{user_review}'\n\n"
|
91 |
-
"As a customer service representative, craft a reassuring response that:\n"
|
92 |
-
"- Directly addresses the safety worries\n"
|
93 |
-
"- References relevant certifications/standards\n"
|
94 |
-
"- Offers dedicated support contact\n"
|
95 |
-
"- Provides satisfaction guarantee (3-4 sentences)\n\n"
|
96 |
-
"Response:"
|
97 |
-
),
|
98 |
-
"joy": (
|
99 |
-
f"'{user_review}'\n\n"
|
100 |
-
"As a customer service representative, craft a concise and enthusiastic response that:\n"
|
101 |
-
"- Thanks the customer for their feedback\n"
|
102 |
-
"- Acknowledges both positive and constructive comments\n"
|
103 |
-
"- Invites them to explore loyalty programs\n\n"
|
104 |
-
"Response:"
|
105 |
-
),
|
106 |
-
"neutral": (
|
107 |
-
f"'{user_review}'\n\n"
|
108 |
-
"As a customer service representative, craft a balanced response that:\n"
|
109 |
-
"- Provides additional relevant product information\n"
|
110 |
-
"- Highlights key service features\n"
|
111 |
-
"- Politely requests more detailed feedback\n"
|
112 |
-
"- Maintains professional tone (3-4 sentences)\n\n"
|
113 |
-
"Response:"
|
114 |
-
),
|
115 |
-
"sadness": (
|
116 |
-
f"'{user_review}'\n\n"
|
117 |
-
"As a customer service representative, craft an empathetic response that:\n"
|
118 |
-
"- Shows genuine understanding of the issue\n"
|
119 |
-
"- Proposes personalized recovery solution\n"
|
120 |
-
"- Offers extended support options\n"
|
121 |
-
"- Maintains positive outlook (3-4 sentences)\n\n"
|
122 |
-
"Response:"
|
123 |
-
),
|
124 |
-
"surprise": (
|
125 |
-
f"'{user_review}'\n\n"
|
126 |
-
"As a customer service representative, craft a response that:\n"
|
127 |
-
"- Matches customer's positive energy appropriately\n"
|
128 |
-
"- Highlights unexpected product benefits\n"
|
129 |
-
"- Invites to user community/events\n"
|
130 |
-
"- Maintains brand voice (3-4 sentences)\n\n"
|
131 |
-
"Response:"
|
132 |
-
)
|
133 |
-
}
|
134 |
-
|
135 |
-
prompt = emotion_prompts.get(
|
136 |
-
emotion_label,
|
137 |
-
f"Neutral feedback: '{user_review}'\n\nWrite a professional and concise response (50-200 words max).\n\nResponse:"
|
138 |
-
) # Default to neutral if emotion is not found
|
139 |
-
|
140 |
-
# Load the tokenizer and language model for response generation
|
141 |
-
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B") # Load tokenizer for text processing
|
142 |
-
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-0.5B") # Load language model for response generation
|
143 |
-
|
144 |
-
inputs = tokenizer(prompt, return_tensors="pt") # Tokenize the input prompt
|
145 |
-
outputs = model.generate(
|
146 |
-
**inputs,
|
147 |
-
max_new_tokens=150, # Limit generated tokens to ensure concise responses
|
148 |
-
min_length=50, # Ensure the generated response is logical and complete
|
149 |
-
no_repeat_ngram_size=2, # Avoid repetitive phrases
|
150 |
-
temperature=0.7 # Add randomness for more natural responses
|
151 |
-
)
|
152 |
-
response = tokenizer.decode(outputs[0], skip_special_tokens=True) # Decode the generated response
|
153 |
-
return response # Return the response
|
154 |
|
155 |
##########################################
|
156 |
# Step 3: Text-to-Speech Conversion Function
|
|
|
56 |
dominant_emotion = max(emotion_results, key=lambda x: x['score']) # Identify the emotion with the highest confidence
|
57 |
return dominant_emotion # Return the dominant emotion (label and score)
|
58 |
|
59 |
+
|
60 |
##########################################
|
61 |
+
# Step 2:Response Generation Function
|
62 |
##########################################
|
63 |
+
|
64 |
+
def prompt_gen(user_review):
|
65 |
+
dominant_emotion = analyze_dominant_emotion(user_review)
|
66 |
+
emotion_strategies = {
|
67 |
+
"anger": {
|
68 |
+
"prompt": (
|
69 |
+
"Customer complaint: '{review}'\n\n"
|
70 |
+
"As a customer service representative, craft a professional response that:\n"
|
71 |
+
"- Begins with sincere apology and acknowledgment\n"
|
72 |
+
"- Clearly explains solution process with concrete steps\n"
|
73 |
+
"- Offers appropriate compensation/redemption\n"
|
74 |
+
"- Keeps tone humble and solution-focused (3-4 sentences)\n\n"
|
75 |
+
"Response:"
|
76 |
+
)
|
77 |
+
},
|
78 |
+
"disgust": {
|
79 |
+
"prompt": (
|
80 |
+
"Customer quality concern: '{review}'\n\n"
|
81 |
+
"As a customer service representative, craft a response that:\n"
|
82 |
+
"- Immediately acknowledges the product issue\n"
|
83 |
+
"- Explains quality control measures being taken\n"
|
84 |
+
"- Provides clear return/replacement instructions\n"
|
85 |
+
"- Offers goodwill gesture (3-4 sentences)\n\n"
|
86 |
+
"Response:"
|
87 |
+
)
|
88 |
+
},
|
89 |
+
"fear": {
|
90 |
+
"prompt": (
|
91 |
+
"Customer safety concern: '{review}'\n\n"
|
92 |
+
"As a customer service representative, craft a reassuring response that:\n"
|
93 |
+
"- Directly addresses the safety worries\n"
|
94 |
+
"- References relevant certifications/standards\n"
|
95 |
+
"- Offers dedicated support contact\n"
|
96 |
+
"- Provides satisfaction guarantee (3-4 sentences)\n\n"
|
97 |
+
"Response:"
|
98 |
+
)
|
99 |
+
},
|
100 |
+
"joy": {
|
101 |
+
"prompt": (
|
102 |
+
"Customer review: '{review}'\n\n"
|
103 |
+
"As a customer service representative, craft a concise response that:\n"
|
104 |
+
"- Specifically acknowledges both positive and constructive feedback\n"
|
105 |
+
"- Briefly mentions loyalty/referral programs\n"
|
106 |
+
"- Ends with shopping invitation (3-4 sentences)\n\n"
|
107 |
+
"Response:"
|
108 |
+
)
|
109 |
+
},
|
110 |
+
"neutral": {
|
111 |
+
"prompt": (
|
112 |
+
"Customer feedback: '{review}'\n\n"
|
113 |
+
"As a customer service representative, craft a balanced response that:\n"
|
114 |
+
"- Provides additional relevant product information\n"
|
115 |
+
"- Highlights key service features\n"
|
116 |
+
"- Politely requests more detailed feedback\n"
|
117 |
+
"- Maintains professional tone (3-4 sentences)\n\n"
|
118 |
+
"Response:"
|
119 |
+
)
|
120 |
+
},
|
121 |
+
"sadness": {
|
122 |
+
"prompt": (
|
123 |
+
"Customer disappointment: '{review}'\n\n"
|
124 |
+
"As a customer service representative, craft an empathetic response that:\n"
|
125 |
+
"- Shows genuine understanding of the issue\n"
|
126 |
+
"- Proposes personalized recovery solution\n"
|
127 |
+
"- Offers extended support options\n"
|
128 |
+
"- Maintains positive outlook (3-4 sentences)\n\n"
|
129 |
+
"Response:"
|
130 |
+
)
|
131 |
+
},
|
132 |
+
"surprise": {
|
133 |
+
"prompt": (
|
134 |
+
"Customer enthusiastic feedback: '{review}'\n\n"
|
135 |
+
"As a customer service representative, craft a response that:\n"
|
136 |
+
"- Matches customer's positive energy appropriately\n"
|
137 |
+
"- Highlights unexpected product benefits\n"
|
138 |
+
"- Invites to user community/events\n"
|
139 |
+
"- Maintains brand voice (3-4 sentences)\n\n"
|
140 |
+
"Response:"
|
141 |
+
)
|
142 |
+
}
|
143 |
+
}
|
144 |
+
|
145 |
+
template = emotion_strategies[dominant_emotion['label'].lower()]["prompt"]
|
146 |
+
prompt = template.format(review=user_review)
|
147 |
+
print(prompt)
|
148 |
+
return prompt
|
149 |
+
|
150 |
def response_gen(user_review):
|
151 |
+
prompt = prompt_gen(user_review)
|
152 |
+
# Load model directly
|
153 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
154 |
+
|
155 |
+
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B")
|
156 |
+
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen1.5-0.5B")
|
157 |
+
|
158 |
+
inputs = tokenizer(prompt, return_tensors="pt")
|
159 |
+
outputs = model.generate(**inputs, max_new_tokens=200)
|
160 |
+
|
161 |
+
input_length = inputs.input_ids.shape[1]
|
162 |
+
response = tokenizer.decode(outputs[0][input_length:], skip_special_tokens=True)
|
163 |
+
# print(response)
|
164 |
+
return response
|
165 |
+
|
166 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
|
168 |
##########################################
|
169 |
# Step 3: Text-to-Speech Conversion Function
|