godsastray commited on
Commit
e29e7eb
·
verified ·
1 Parent(s): aea8c20

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +166 -107
app.py CHANGED
@@ -1,14 +1,39 @@
1
  import gradio as gr
2
  import google.generativeai as genai
3
  from typing import Dict, List
 
4
 
5
  # Cấu hình API key cho Gemini
6
- GOOGLE_API_KEY = "AIzaSyAnZ-wajwMF6Uy66FmkC4MOugA2fA66kMA"
7
  genai.configure(api_key=GOOGLE_API_KEY)
8
 
9
  # Khởi tạo model
10
  model = genai.GenerativeModel('gemini-1.5-flash-latest')
11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  # Định nghĩa đầy đủ các kiểu MBTI và đặc điểm nghề nghiệp
13
  MBTI_CAREER_TRAITS = {
14
  "ISTJ": {
@@ -113,71 +138,125 @@ class CareerAdvisor:
113
  def __init__(self):
114
  self.chat_history = []
115
  self.system_prompt = """Bạn là một chuyên gia tư vấn nghề nghiệp có nhiều năm kinh nghiệm.
116
- Nhiệm vụ của bạn là giúp người dùng định hướng nghề nghiệp, đưa ra lời khuyên phù hợp và thiết thực.
117
- Hãy trả lời một cách chuyên nghiệp, đồng cảm và chi tiết."""
118
 
119
- def get_career_advice(self, user_input: str, mbti_type: str) -> str:
120
- mbti_info = MBTI_CAREER_TRAITS[mbti_type]
 
 
121
 
122
- prompt = f"""
123
- Dựa trên thông tin người dùng có:
124
- - Kiểu tính cách MBTI: {mbti_type}
125
- - Đặc điểm tính cách: {mbti_info['traits']}
126
- - Điểm mạnh: {mbti_info['strengths']}
127
- - Điểm cần cải thiện: {mbti_info['weaknesses']}
128
- - Ngành nghề phù hợp: {mbti_info['careers']}
129
 
130
- Thông tin bổ sung từ người dùng: {user_input}
 
 
 
131
 
132
- Hãy đưa ra phân tích chi tiết và tư vấn về:
133
- 1. Phân tích điểm mạnh và cách phát huy trong công việc
134
- 2. Điểm cần cải thiện cách khắc phục
135
- 3. Top 3 ngành nghề phù hợp nhất và lý do
136
- 4. Lộ trình phát triển cụ thể cho từng ngành (3-5 năm)
137
- 5. Các kỹ năng cần phát triển và cách thức phát triển
138
-
139
- Hãy trả lời một cách cấu trúc, chi tiết và thực tế.
140
- """
141
-
142
- response = model.generate_content(prompt)
143
- return response.result.text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  def chat_with_advisor(self, message: str, history: List[Dict[str, str]]) -> List[Dict[str, str]]:
146
- # Tạo prompt cho cuộc trò chuyện
147
- context = f"""
148
- {self.system_prompt}
149
-
150
- Dựa trên cuộc trò chuyện trước đó và câu hỏi mới của người dùng:
151
- "{message}"
152
-
153
- Hãy đưa ra lời khuyên chuyên nghiệp, cụ thể và có tính thực tiễn cao.
154
- Nếu cần thêm thông tin để tư vấn tốt hơn, hãy đặt câu hỏi phù hợp.
155
- """
156
-
157
- response = model.generate_content(context)
158
- history.append({"role": "user", "content": message})
159
- history.append({"role": "assistant", "content": response.result.text})
160
- return history
 
 
 
161
 
162
  def create_interface():
163
  advisor = CareerAdvisor()
164
 
165
- with gr.Blocks(title="AI Career Advisor") as interface:
166
  gr.Markdown("""
167
- # AI Career Advisor - Tư vấn nghề nghiệp thông minh
168
 
169
- Chào mừng bạn đến với hệ thống tư vấn nghề nghiệp AI. Hệ thống hai chức năng chính:
170
- 1. Tư vấn dựa trên tính cách MBTI
171
- 2. Tư vấn 1-1 với chuyên gia AI
172
  """)
173
 
174
- with gr.Tab("Tư vấn theo MBTI"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  mbti_input = gr.Dropdown(
176
  choices=list(MBTI_CAREER_TRAITS.keys()),
177
- label="Chọn kiểu tính cách MBTI của bạn"
 
178
  )
179
 
180
- # Hiển thị thông tin MBTI
181
  mbti_info = gr.Markdown(visible=False)
182
 
183
  def update_mbti_info(mbti_type):
@@ -186,27 +265,34 @@ def create_interface():
186
  return gr.Markdown.update(
187
  visible=True,
188
  value=f"""
189
- ### Thông tin về kiểu tính cách {mbti_type}:
190
- - **Đặc điểm**: {info['traits']}
191
- - **Điểm mạnh**: {info['strengths']}
192
- - **Điểm cần cải thiện**: {info['weaknesses']}
193
- - **Ngành nghề phù hợp**: {info['careers']}
 
 
 
 
 
 
 
 
194
  """
195
  )
196
  return gr.Markdown.update(visible=False)
197
 
198
  user_info = gr.Textbox(
199
- label="Chia sẻ thêm về bản thân (sở thích, kỹ năng, mong muốn...)",
200
  lines=5,
201
  placeholder="Ví dụ: Tôi thích làm việc với số liệu, có kỹ năng phân tích tốt, mong muốn một công việc ổn định..."
202
  )
203
 
204
- get_advice_btn = gr.Button("Nhận tư vấn", variant="primary")
205
 
206
- advice_output = gr.Textbox(
207
  label="Kết quả tư vấn",
208
- lines=15,
209
- interactive=False
210
  )
211
 
212
  # Kết nối các components
@@ -222,24 +308,24 @@ def create_interface():
222
  outputs=advice_output
223
  )
224
 
225
- with gr.Tab("Tư vấn 1-1 với Chuyên gia"):
 
226
  gr.Markdown("""
227
- ### Trò chuyện với Chuyên gia Tư vấn AI
228
 
229
  Bạn có thể đặt câu hỏi về:
230
- - Định hướng nghề nghiệp
231
- - Phát triển kỹ năng
232
- - Chuyển đổi công việc
233
- - Lộ trình sự nghiệp
234
- - Và các vấn đề nghề nghiệp khác
235
  """)
236
 
237
  chatbot = gr.Chatbot(
238
  label="Cuộc trò chuyện",
239
  height=400,
240
  bubble_full_width=False,
241
- avatar_images=(None, "🧑‍💼"),
242
- type='messages' # Chỉ định kiểu 'messages'
243
  )
244
 
245
  msg = gr.Textbox(
@@ -248,7 +334,7 @@ def create_interface():
248
  lines=3
249
  )
250
 
251
- clear = gr.Button("Xóa lịch sử")
252
 
253
  def respond(message, chat_history):
254
  bot_message = advisor.chat_with_advisor(message, chat_history)
@@ -260,54 +346,27 @@ def create_interface():
260
  msg.submit(respond, [msg, chatbot], [msg, chatbot])
261
  clear.click(clear_history, None, chatbot)
262
 
263
- # Thêm phần footer với thông tin và hướng dẫn
264
- with gr.Accordion("Hướng dẫn sử dụng", open=False):
265
- gr.Markdown("""
266
- ### Cách sử dụng AI Career Advisor:
267
-
268
- 1. **Tư vấn theo MBTI**:
269
- - Chọn kiểu tính cách MBTI của bạn
270
- - Xem thông tin chi tiết về kiểu tính cách
271
- - Chia sẻ thêm thông tin về bản thân
272
- - Nhấn "Nhận tư vấn" để nhận phân tích chi tiết
273
-
274
- 2. **Tư vấn 1-1 với Chuyên gia**:
275
- - Đặt câu hỏi cụ thể về nghề nghiệp
276
- - Trò chuyện tự nhiên với AI
277
- - Có thể hỏi thêm để làm rõ các vấn đề
278
- - Xóa lịch sử để bắt đầu cuộc trò chuyện mới
279
-
280
- 3. **Lưu ý**:
281
- - Càng cung cấp nhiều thông tin, tư vấn càng chính xác
282
- - Có thể kết hợp cả hai hình thức tư vấn
283
- - Lưu lại kết quả tư vấn để tham khảo sau
284
- """)
285
-
286
- with gr.Accordion("Thông tin thêm", open=False):
287
- gr.Markdown("""
288
- ### Về AI Career Advisor:
289
-
290
- Hệ thống sử dụng AI tiên tiến để cung cấp tư vấn nghề nghiệp cá nhân hóa.
291
- Kết hợp giữa phân tích tính cách MBTI và tư vấn chuyên sâu để giúp bạn:
292
-
293
- - Hiểu rõ điểm mạnh và điểm cần phát triển
294
- - Khám phá các ngành nghề phù hợp
295
- - Xây dựng lộ trình phát triển sự nghiệp
296
- - Đưa ra quyết định nghề nghiệp đúng đắn
297
-
298
- *Lưu ý: Đây là công cụ hỗ trợ tham khảo. Quyết định cuối cùng vẫn nên dựa trên đánh giá cá nhân và tham khảo ý kiến của các chuyên gia thực tế.*
299
- """)
300
 
301
  return interface
302
 
303
  def main():
304
- # Khởi chạy ứng dụng
305
  interface = create_interface()
306
  interface.launch(
307
  share=True,
308
  server_name="0.0.0.0",
309
  server_port=7860
310
- # Loại bỏ tham số 'enable_queue'
311
  )
312
 
313
  if __name__ == "__main__":
 
1
  import gradio as gr
2
  import google.generativeai as genai
3
  from typing import Dict, List
4
+ import json
5
 
6
  # Cấu hình API key cho Gemini
7
+ GOOGLE_API_KEY = "AIzaSyAnZ-wajwMF6Uy66FmkC4MOugA2fA66kMA" # Thay thế bằng API key của bạn
8
  genai.configure(api_key=GOOGLE_API_KEY)
9
 
10
  # Khởi tạo model
11
  model = genai.GenerativeModel('gemini-1.5-flash-latest')
12
 
13
+ # Định nghĩa câu hỏi MBTI test
14
+ MBTI_QUESTIONS = [
15
+ {
16
+ "question": "Bạn thích làm việc theo cách nào hơn?",
17
+ "options": ["Một mình (I)", "Trong nhóm (E)"],
18
+ "dimension": "IE"
19
+ },
20
+ {
21
+ "question": "Khi tiếp nhận thông tin, bạn thiên về:",
22
+ "options": ["Các sự kiện và chi tiết cụ thể (S)", "Ý tưởng và khái niệm trừu tượng (N)"],
23
+ "dimension": "SN"
24
+ },
25
+ {
26
+ "question": "Khi đưa ra quyết định, bạn dựa vào:",
27
+ "options": ["Logic và phân tích khách quan (T)", "Cảm xúc và giá trị cá nhân (F)"],
28
+ "dimension": "TF"
29
+ },
30
+ {
31
+ "question": "Trong cuộc sống, bạn thích:",
32
+ "options": ["Lập kế hoạch và tổ chức (J)", "Linh hoạt và thích nghi (P)"],
33
+ "dimension": "JP"
34
+ }
35
+ ]
36
+
37
  # Định nghĩa đầy đủ các kiểu MBTI và đặc điểm nghề nghiệp
38
  MBTI_CAREER_TRAITS = {
39
  "ISTJ": {
 
138
  def __init__(self):
139
  self.chat_history = []
140
  self.system_prompt = """Bạn là một chuyên gia tư vấn nghề nghiệp có nhiều năm kinh nghiệm.
141
+ Nhiệm vụ của bạn là giúp người dùng định hướng nghề nghiệp, đưa ra lời khuyên phù hợp và thiết thực."""
 
142
 
143
+ def calculate_mbti(self, answers):
144
+ """Tính toán kiểu MBTI dựa trên câu trả lời của người dùng"""
145
+ result = ""
146
+ dimensions = {"IE": [], "SN": [], "TF": [], "JP": []}
147
 
148
+ for answer, question in zip(answers, MBTI_QUESTIONS):
149
+ dim = question["dimension"]
150
+ dimensions[dim].append(0 if answer == 0 else 1)
 
 
 
 
151
 
152
+ result += "I" if sum(dimensions["IE"]) < len(dimensions["IE"])/2 else "E"
153
+ result += "S" if sum(dimensions["SN"]) < len(dimensions["SN"])/2 else "N"
154
+ result += "T" if sum(dimensions["TF"]) < len(dimensions["TF"])/2 else "F"
155
+ result += "J" if sum(dimensions["JP"]) < len(dimensions["JP"])/2 else "P"
156
 
157
+ return result
158
+
159
+ def get_career_advice(self, user_input: str, mbti_type: str) -> str:
160
+ try:
161
+ mbti_info = MBTI_CAREER_TRAITS[mbti_type]
162
+
163
+ prompt = f"""
164
+ Dựa trên thông tin người dùng có:
165
+ - Kiểu tính cách MBTI: {mbti_type}
166
+ - Đặc điểm tính cách: {mbti_info['traits']}
167
+ - Điểm mạnh: {mbti_info['strengths']}
168
+ - Điểm cần cải thiện: {mbti_info['weaknesses']}
169
+ - Ngành nghề phù hợp: {mbti_info['careers']}
170
+
171
+ Thông tin bổ sung từ người dùng: {user_input}
172
+
173
+ Hãy đưa ra phân tích chi tiết và tư vấn về:
174
+ 1. Phân tích điểm mạnh và cách phát huy trong công việc
175
+ 2. Điểm cần cải thiện và cách khắc phục
176
+ 3. Top 3 ngành nghề phù hợp nhất và lý do
177
+ 4. Lộ trình phát triển cụ thể cho từng ngành (3-5 năm)
178
+ 5. Các kỹ năng cần phát triển và cách thức phát triển
179
+
180
+ Hãy trả lời một cách có cấu trúc, chi tiết và thực tế.
181
+ """
182
+
183
+ response = model.generate_content(prompt)
184
+ return response.result.text
185
+ except Exception as e:
186
+ return f"Đã xảy ra lỗi khi tạo tư vấn: {str(e)}"
187
 
188
  def chat_with_advisor(self, message: str, history: List[Dict[str, str]]) -> List[Dict[str, str]]:
189
+ try:
190
+ context = f"""
191
+ {self.system_prompt}
192
+
193
+ Dựa trên cuộc trò chuyện trước đó và câu hỏi mới của người dùng:
194
+ "{message}"
195
+
196
+ Hãy đưa ra lời khuyên chuyên nghiệp, cụ thể và có tính thực tiễn cao.
197
+ Nếu cần thêm thông tin để tư vấn tốt hơn, hãy đặt câu hỏi phù hợp.
198
+ """
199
+
200
+ response = model.generate_content(context)
201
+ history.append({"role": "user", "content": message})
202
+ history.append({"role": "assistant", "content": response.result.text})
203
+ return history
204
+ except Exception as e:
205
+ history.append({"role": "assistant", "content": f"Đã xảy ra lỗi: {str(e)}"})
206
+ return history
207
 
208
  def create_interface():
209
  advisor = CareerAdvisor()
210
 
211
+ with gr.Blocks(title="AI Career Advisor", theme=gr.themes.Soft()) as interface:
212
  gr.Markdown("""
213
+ # 🎯 AI Career Advisor - Tư vấn nghề nghiệp thông minh
214
 
215
+ Chào mừng bạn đến với hệ thống tư vấn nghề nghiệp AI. Hãy bắt đầu bằng việc cho chúng tôi biết về tính cách MBTI của bạn.
 
 
216
  """)
217
 
218
+ # Tab chọn trạng thái biết/không biết MBTI
219
+ with gr.Tab("🎯 Bắt đầu"):
220
+ know_mbti = gr.Radio(
221
+ choices=["Tôi đã biết kiểu tính cách MBTI của mình", "Tôi chưa biết kiểu tính cách MBTI của mình"],
222
+ label="Trạng thái",
223
+ type="index"
224
+ )
225
+
226
+ # Tab làm bài test MBTI
227
+ with gr.Tab("📝 Khám phá tính cách MBTI") as mbti_test_tab:
228
+ gr.Markdown("""### Hãy trả lời các câu hỏi sau để xác định tính cách MBTI của bạn""")
229
+
230
+ questions = []
231
+ for q in MBTI_QUESTIONS:
232
+ questions.append(
233
+ gr.Radio(
234
+ choices=q["options"],
235
+ label=q["question"],
236
+ type="index"
237
+ )
238
+ )
239
+
240
+ test_submit = gr.Button("Xác định tính cách MBTI", variant="primary")
241
+ mbti_result = gr.Textbox(label="Kết quả tính cách MBTI của bạn", interactive=False)
242
+
243
+ def calculate_mbti_result(*answers):
244
+ return advisor.calculate_mbti(answers)
245
+
246
+ test_submit.click(
247
+ fn=calculate_mbti_result,
248
+ inputs=questions,
249
+ outputs=mbti_result
250
+ )
251
+
252
+ # Tab tư vấn nghề nghiệp
253
+ with gr.Tab("💼 Tư vấn nghề nghiệp"):
254
  mbti_input = gr.Dropdown(
255
  choices=list(MBTI_CAREER_TRAITS.keys()),
256
+ label="Kiểu tính cách MBTI của bạn",
257
+ info="Chọn kiểu tính cách MBTI đã xác định"
258
  )
259
 
 
260
  mbti_info = gr.Markdown(visible=False)
261
 
262
  def update_mbti_info(mbti_type):
 
265
  return gr.Markdown.update(
266
  visible=True,
267
  value=f"""
268
+ ### 📊 Thông tin về kiểu tính cách {mbti_type}:
269
+
270
+ #### 🎯 Đặc điểm chính:
271
+ {info['traits']}
272
+
273
+ #### 💪 Điểm mạnh:
274
+ {info['strengths']}
275
+
276
+ #### 🔄 Điểm cần cải thiện:
277
+ {info['weaknesses']}
278
+
279
+ #### 👔 Ngành nghề phù hợp:
280
+ {info['careers']}
281
  """
282
  )
283
  return gr.Markdown.update(visible=False)
284
 
285
  user_info = gr.Textbox(
286
+ label="Chia sẻ thêm về bản thân",
287
  lines=5,
288
  placeholder="Ví dụ: Tôi thích làm việc với số liệu, có kỹ năng phân tích tốt, mong muốn một công việc ổn định..."
289
  )
290
 
291
+ get_advice_btn = gr.Button("📋 Nhận tư vấn chi tiết", variant="primary")
292
 
293
+ advice_output = gr.Markdown(
294
  label="Kết quả tư vấn",
295
+ value="Kết quả tư vấn sẽ hiển thị ở đây..."
 
296
  )
297
 
298
  # Kết nối các components
 
308
  outputs=advice_output
309
  )
310
 
311
+ # Tab chat với chuyên gia
312
+ with gr.Tab("💬 Tư vấn 1-1 với Chuyên gia"):
313
  gr.Markdown("""
314
+ ### 💬 Trò chuyện với Chuyên gia Tư vấn AI
315
 
316
  Bạn có thể đặt câu hỏi về:
317
+ - 🎯 Định hướng nghề nghiệp
318
+ - 📚 Phát triển kỹ năng
319
+ - 🔄 Chuyển đổi công việc
320
+ - 📈 Lộ trình sự nghiệp
321
+ - 💼 Và các vấn đề nghề nghiệp khác
322
  """)
323
 
324
  chatbot = gr.Chatbot(
325
  label="Cuộc trò chuyện",
326
  height=400,
327
  bubble_full_width=False,
328
+ avatar_images=(None, "🧑‍💼")
 
329
  )
330
 
331
  msg = gr.Textbox(
 
334
  lines=3
335
  )
336
 
337
+ clear = gr.Button("🗑️ Xóa lịch sử")
338
 
339
  def respond(message, chat_history):
340
  bot_message = advisor.chat_with_advisor(message, chat_history)
 
346
  msg.submit(respond, [msg, chatbot], [msg, chatbot])
347
  clear.click(clear_history, None, chatbot)
348
 
349
+ # Show/hide tabs based on MBTI knowledge
350
+ def update_tabs(know_mbti):
351
+ if know_mbti == 0: # Đã biết MBTI
352
+ return gr.Tabs.update(selected="💼 vấn nghề nghiệp")
353
+ else: # Chưa biết MBTI
354
+ return gr.Tabs.update(selected="📝 Khám phá tính cách MBTI")
355
+
356
+ know_mbti.change(
357
+ fn=update_tabs,
358
+ inputs=[know_mbti],
359
+ outputs=[interface]
360
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
361
 
362
  return interface
363
 
364
  def main():
 
365
  interface = create_interface()
366
  interface.launch(
367
  share=True,
368
  server_name="0.0.0.0",
369
  server_port=7860
 
370
  )
371
 
372
  if __name__ == "__main__":