godsastray commited on
Commit
6dcb856
·
verified ·
1 Parent(s): 43f4eb8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +476 -64
app.py CHANGED
@@ -4,7 +4,7 @@ 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
@@ -33,10 +33,421 @@ MBTI_QUESTIONS = [
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
- # ... (định nghĩa giữ nguyên)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
 
42
  class CareerAdvisor:
@@ -46,7 +457,6 @@ class CareerAdvisor:
46
  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."""
47
 
48
  def calculate_mbti(self, answers):
49
- """Tính toán kiểu MBTI dựa trên câu trả lời của người dùng"""
50
  result = ""
51
  dimensions = {"IE": [], "SN": [], "TF": [], "JP": []}
52
 
@@ -59,7 +469,8 @@ class CareerAdvisor:
59
  result += "T" if sum(dimensions["TF"]) < len(dimensions["TF"])/2 else "F"
60
  result += "J" if sum(dimensions["JP"]) < len(dimensions["JP"])/2 else "P"
61
 
62
- return result
 
63
 
64
  def get_career_advice(self, user_input: str, mbti_type: str) -> str:
65
  try:
@@ -81,8 +492,6 @@ class CareerAdvisor:
81
  3. Top 3 ngành nghề phù hợp nhất và lý do
82
  4. Lộ trình phát triển cụ thể cho từng ngành (3-5 năm)
83
  5. Các kỹ năng cần phát triển và cách thức phát triển
84
-
85
- Hãy trả lời một cách có cấu trúc, chi tiết và thực tế.
86
  """
87
 
88
  response = model.generate_content(prompt)
@@ -90,7 +499,7 @@ class CareerAdvisor:
90
  except Exception as e:
91
  return f"Đã xảy ra lỗi khi tạo tư vấn: {str(e)}"
92
 
93
- def chat_with_advisor(self, message: str, history: List[List[str]]) -> List[List[str]]:
94
  try:
95
  context = f"""
96
  {self.system_prompt}
@@ -99,19 +508,18 @@ class CareerAdvisor:
99
  "{message}"
100
 
101
  Hãy đưa ra lời khuyên chuyên nghiệp, cụ thể và có tính thực tiễn cao.
102
- 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.
103
  """
104
 
105
  response = model.generate_content(context)
106
- history.append(["user", message])
107
- history.append(["assistant", response.result.text])
108
  return history
109
  except Exception as e:
110
- history.append(["assistant", f"Đã xảy ra lỗi: {str(e)}"])
111
  return history
112
 
113
  def create_interface():
114
  advisor = CareerAdvisor()
 
115
 
116
  with gr.Blocks(title="AI Career Advisor", theme=gr.themes.Soft()) as interface:
117
  gr.Markdown("""
@@ -120,16 +528,20 @@ def create_interface():
120
  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.
121
  """)
122
 
123
- # Tab chọn trạng thái biết/không biết MBTI
124
- with gr.Tab("🎯 Bắt đầu"):
 
 
 
125
  know_mbti = gr.Radio(
126
- 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"],
127
- label="Trạng thái",
 
128
  type="index"
129
  )
130
 
131
- # Tab làm bài test MBTI
132
- with gr.Tab("📝 Khám phá tính cách MBTI") as mbti_test_tab:
133
  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""")
134
 
135
  questions = []
@@ -144,20 +556,24 @@ def create_interface():
144
 
145
  test_submit = gr.Button("Xác định tính cách MBTI", variant="primary")
146
  mbti_result = gr.Textbox(label="Kết quả tính cách MBTI của bạn", interactive=False)
 
147
 
148
- def calculate_mbti_result(*answers):
149
- mbti_type = advisor.calculate_mbti(answers)
150
- mbti_info = MBTI_CAREER_TRAITS[mbti_type]
151
- return f"{mbti_type}\n\nĐặc điểm: {mbti_info['traits']}\nNgành nghề phù hợp: {mbti_info['careers']}"
 
 
 
152
 
153
  test_submit.click(
154
- fn=calculate_mbti_result,
155
  inputs=questions,
156
- outputs=mbti_result
157
  )
158
 
159
  # Tab tư vấn nghề nghiệp
160
- with gr.Tab("💼 Tư vấn nghề nghiệp"):
161
  mbti_input = gr.Dropdown(
162
  choices=list(MBTI_CAREER_TRAITS.keys()),
163
  label="Kiểu tính cách MBTI của bạn",
@@ -169,10 +585,13 @@ def create_interface():
169
  def update_mbti_info(mbti_type):
170
  if mbti_type:
171
  info = MBTI_CAREER_TRAITS[mbti_type]
 
172
  return gr.Markdown.update(
173
  visible=True,
174
  value=f"""
175
- ### 📊 Thông tin về kiểu tính cách {mbti_type}:
 
 
176
 
177
  #### 🎯 Đặc điểm chính:
178
  {info['traits']}
@@ -192,17 +611,12 @@ def create_interface():
192
  user_info = gr.Textbox(
193
  label="Chia sẻ thêm về bản thân",
194
  lines=5,
195
- 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..."
196
  )
197
 
198
  get_advice_btn = gr.Button("📋 Nhận tư vấn chi tiết", variant="primary")
 
199
 
200
- advice_output = gr.Markdown(
201
- label="Kết quả tư vấn",
202
- value="Kết quả tư vấn sẽ hiển thị ở đây..."
203
- )
204
-
205
- # Kết nối các components
206
  mbti_input.change(
207
  fn=update_mbti_info,
208
  inputs=mbti_input,
@@ -216,18 +630,7 @@ def create_interface():
216
  )
217
 
218
  # Tab chat với chuyên gia
219
- with gr.Tab("💬 Tư vấn 1-1 với Chuyên gia"):
220
- gr.Markdown("""
221
- ### 💬 Trò chuyện với Chuyên gia Tư vấn AI
222
-
223
- Bạn có thể đặt câu hỏi về:
224
- - 🎯 Định hướng nghề nghiệp
225
- - 📚 Phát triển kỹ năng
226
- - 🔄 Chuyển đổi công việc
227
- - 📈 Lộ trình sự nghiệp
228
- - 💼 Và các vấn đề nghề nghiệp khác
229
- """)
230
-
231
  chatbot = gr.Chatbot(
232
  label="Cuộc trò chuyện",
233
  height=400,
@@ -235,36 +638,45 @@ def create_interface():
235
  avatar_images=(None, "🧑‍💼")
236
  )
237
 
238
- msg = gr.Textbox(
239
- label="Nhập câu hỏi của bạn",
240
- placeholder=" dụ: Làm thế nào để tôi có thể chuyển sang ngành IT khi đã có 3 năm kinh nghiệm trong ngành kế toán?",
241
- lines=3
242
- )
 
 
243
 
244
- send_button = gr.Button("Gửi", variant="primary")
245
  clear = gr.Button("🗑️ Xóa lịch sử")
246
 
247
  def respond(message, chat_history):
248
- bot_message = advisor.chat_with_advisor(message, chat_history)
249
- return "", bot_message
250
 
251
- def clear_history():
252
- return []
 
 
 
 
 
 
 
 
 
253
 
254
- send_button.click(respond, [msg, chatbot], [msg, chatbot])
255
- clear.click(clear_history, None, chatbot)
256
 
257
- # Show/hide tabs based on MBTI knowledge
258
- def update_tabs(know_mbti):
259
- if know_mbti == 0: # Đã biết MBTI
260
- return gr.Tabs.update(selected="💼 vấn nghề nghiệp")
261
  else: # Chưa biết MBTI
262
- return gr.Tabs.update(selected="📝 Khám phá tính cách MBTI")
263
 
264
  know_mbti.change(
265
- fn=update_tabs,
266
  inputs=[know_mbti],
267
- outputs=[interface]
268
  )
269
 
270
  return interface
@@ -278,4 +690,4 @@ def main():
278
  )
279
 
280
  if __name__ == "__main__":
281
- main()
 
4
  import json
5
 
6
  # Cấu hình API key cho Gemini
7
+ GOOGLE_API_KEY = "YOUR_API_KEY" # 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
 
33
  "dimension": "JP"
34
  }
35
  ]
36
+ MBTI_DESCRIPTIONS = {
37
+ "ISTJ": """
38
+ 💡 ISTJ - "The Inspector" (Người Kiểm tra)
39
+
40
+ Đặc điểm nổi bật:
41
+ - Cẩn thận, có trách nhiệm và thực tế
42
+ - Làm việc có tổ chức và phương pháp
43
+ - Đáng tin cậy và kiên định
44
+
45
+ Điểm mạnh trong công việc:
46
+ - Chú ý đến chi tiết
47
+ - Làm việc có hệ thống
48
+ - Đáng tin cậy và chăm chỉ
49
+
50
+ Nghề nghiệp phù hợp tiêu biểu:
51
+ 1. Kế toán/Kiểm toán
52
+ 2. Quản lý dự án
53
+ 3. Kỹ sư phần mềm
54
+ 4. Thanh tra/Kiểm soát chất lượng
55
+ 5. Quản trị hành chính
56
+ """,
57
+
58
+ "INTJ": """
59
+ 💡 INTJ - "The Architect" (Kiến trúc sư)
60
+
61
+ Đặc điểm nổi bật:
62
+ - Độc lập, tự tin và lý trí
63
+ - Thích phân tích và lập kế hoạch dài hạn
64
+ - Có tầm nhìn chiến lược và sáng tạo
65
+
66
+ Điểm mạnh trong công việc:
67
+ - Khả năng lãnh đạo dựa trên chiến lược
68
+ - Tư duy logic và giải quyết vấn đề hiệu quả
69
+ - Tự định hướng và tự chủ cao
70
+
71
+ Nghề nghiệp phù hợp tiêu biểu:
72
+ 1. Quản lý chiến lược
73
+ 2. Nhà phân tích dữ liệu
74
+ 3. Kỹ sư hệ thống
75
+ 4. Nhà phát triển phần mềm
76
+ 5. Chuyên gia tư vấn
77
+ """,
78
+
79
+ "INFJ": """
80
+ 💡 INFJ - "The Advocate" (Người biện hộ)
81
+
82
+ Đặc điểm nổi bật:
83
+ - Sáng tạo, nhạy cảm và lý tưởng
84
+ - Đồng cảm với người khác và luôn quan tâm đến cộng đồng
85
+ - Tập trung vào ý nghĩa sâu sắc và mục tiêu lớn
86
+
87
+ Điểm mạnh trong công việc:
88
+ - Khả năng lắng nghe và thấu hiểu sâu sắc
89
+ - Tạo động lực và truyền cảm hứng cho người khác
90
+ - Khả năng nhìn nhận và giải quyết vấn đề từ góc độ nhân văn
91
+
92
+ Nghề nghiệp phù hợp tiêu biểu:
93
+ 1. Nhà tâm lý học
94
+ 2. Cố vấn nghề nghiệp
95
+ 3. Nhà văn
96
+ 4. Giáo viên
97
+ 5. Nhà hoạt động xã hội
98
+ """,
99
+
100
+ "ENTJ": """
101
+ 💡 ENTJ - "The Commander" (Người chỉ huy)
102
+
103
+ Đặc điểm nổi bật:
104
+ - Quyết đoán, năng động và có khả năng lãnh đạo
105
+ - Tư duy logic và có tầm nhìn xa
106
+ - Có khả năng giải quyết vấn đề phức tạp và ra quyết định nhanh
107
+
108
+ Điểm mạnh trong công việc:
109
+ - Kỹ năng lãnh đạo mạnh mẽ
110
+ - Tư duy chiến lược và định hướng kết quả
111
+ - Khả năng đưa ra quyết định sáng suốt và hiệu quả
112
+
113
+ Nghề nghiệp phù hợp tiêu biểu:
114
+ 1. Quản lý cấp cao
115
+ 2. Doanh nhân
116
+ 3. Chuyên gia tư vấn chiến lược
117
+ 4. Luật sư
118
+ 5. Nhà hoạch định chính sách
119
+ """,
120
+
121
+ "ENFP": """
122
+ 💡 ENFP - "The Campaigner" (Người cổ động)
123
+
124
+ Đặc điểm nổi bật:
125
+ - Nhiệt huyết, sáng tạo và hướng ngoại
126
+ - Thích khám phá những ý tưởng mới và tìm kiếm sự kết nối với người khác
127
+ - Có khả năng truyền cảm hứng và thuyết phục
128
+
129
+ Điểm mạnh trong công việc:
130
+ - Sự sáng tạo và linh hoạt trong giải quyết vấn đề
131
+ - Tạo mối quan hệ tốt và dễ dàng giao tiếp với mọi người
132
+ - Khả năng truyền động lực cho người khác
133
+
134
+ Nghề nghiệp phù hợp tiêu biểu:
135
+ 1. Nhà văn
136
+ 2. Nhà marketing
137
+ 3. Cố vấn nghề nghiệp
138
+ 4. Huấn luyện viên
139
+ 5. Diễn giả
140
+ """,
141
+
142
+ "ISFJ": """
143
+ 💡 ISFJ - "The Protector" (Người bảo vệ)
144
+
145
+ Đặc điểm nổi bật:
146
+ - Quan tâm, tận tụy và đáng tin cậy
147
+ - Hướng nội và thích giúp đỡ người khác
148
+ - Tận tâm trong công việc và luôn chu đáo
149
+
150
+ Điểm mạnh trong công việc:
151
+ - Khả năng chăm sóc và làm việc với những chi tiết nhỏ
152
+ - Trung thực và đáng tin cậy
153
+ - Có trách nhiệm và làm việc chăm chỉ
154
+
155
+ Nghề nghiệp phù hợp tiêu biểu:
156
+ 1. Y tá
157
+ 2. Giáo viên
158
+ 3. Nhân viên hành chính
159
+ 4. Công tác xã hội
160
+ 5. Quản lý nhân sự
161
+ """,
162
+
163
+ "ESFJ": """
164
+ 💡 ESFJ - "The Caregiver" (Người chăm sóc)
165
+
166
+ Đặc điểm nổi bật:
167
+ - Thân thiện, đồng cảm và quan tâm đến người khác
168
+ - Thích làm việc nhóm và giúp đỡ mọi người
169
+ - Có tr��ch nhiệm và luôn nỗ lực tạo môi trường hòa đồng
170
+
171
+ Điểm mạnh trong công việc:
172
+ - Khả năng giao tiếp và làm việc nhóm tốt
173
+ - Dễ dàng thích nghi với nhu cầu của người khác
174
+ - Tổ chức và chăm chỉ
175
+
176
+ Nghề nghiệp phù hợp tiêu biểu:
177
+ 1. Nhân viên chăm sóc khách hàng
178
+ 2. Giáo viên
179
+ 3. Nhân viên tư vấn
180
+ 4. Nhân viên nhân sự
181
+ 5. Quản lý dịch vụ khách hàng
182
+ """,
183
+
184
+ "INFP": """
185
+ 💡 INFP - "The Mediator" (Người hòa giải)
186
+
187
+ Đặc điểm nổi bật:
188
+ - Lý tưởng, sáng tạo và nhạy cảm
189
+ - Đồng cảm và quan tâm sâu sắc đến những giá trị nhân văn
190
+ - Tập trung vào sự phát triển cá nhân và ý nghĩa trong cuộc sống
191
+
192
+ Điểm mạnh trong công việc:
193
+ - Khả năng sáng tạo và thể hiện cảm xúc
194
+ - Thấu hiểu và hỗ trợ người khác
195
+ - Linh hoạt trong tư duy và tìm kiếm giải pháp sáng tạo
196
+
197
+ Nghề nghiệp phù hợp tiêu biểu:
198
+ 1. Nhà văn
199
+ 2. Nhà trị liệu tâm lý
200
+ 3. Nhà giáo dục
201
+ 4. Nghệ sĩ
202
+ 5. Chuyên viên tư vấn
203
+ """,
204
+
205
+ "ENFJ": """
206
+ 💡 ENFJ - "The Teacher" (Người giáo viên)
207
+
208
+ Đặc điểm nổi bật:
209
+ - Thân thiện, đồng cảm và hướng dẫn người khác
210
+ - Khả năng truyền cảm hứng và tạo động lực
211
+ - Tập trung vào sự phát triển của cá nhân và tập thể
212
+
213
+ Điểm mạnh trong công việc:
214
+ - Khả năng lãnh đạo và thúc đẩy người khác
215
+ - Kỹ năng giao tiếp và xây dựng mối quan hệ tốt
216
+ - Tận tụy và làm việc có tổ chức
217
+
218
+ Nghề nghiệp phù hợp tiêu biểu:
219
+ 1. Giáo viên
220
+ 2. Nhà tư vấn
221
+ 3. Nhà hoạt động xã hội
222
+ 4. Quản lý nhân sự
223
+ 5. Nhà tâm lý học
224
+ """,
225
+
226
+ "ISTP": """
227
+ 💡 ISTP - "The Virtuoso" (Người nghệ sĩ thực dụng)
228
+
229
+ Đặc điểm nổi bật:
230
+ - Thích khám phá và thử nghiệm với công cụ và quy trình
231
+ - Hướng tới thực hành và giải quyết vấn đề
232
+ - Độc lập và linh hoạt trong tư duy
233
+
234
+ Điểm mạnh trong công việc:
235
+ - Khả năng làm việc với tay nghề kỹ thuật cao
236
+ - Giải quyết vấn đề hiệu quả và nhanh chóng
237
+ - Tự tin và thích ứng với môi trường biến đổi
238
+
239
+ Nghề nghiệp phù hợp tiêu biểu:
240
+ 1. Kỹ sư
241
+ 2. Thợ máy
242
+ 3. Nhà thiết kế
243
+ 4. Lập trình viên
244
+ 5. Phi công
245
+ """,
246
+
247
+ "ISFP": """
248
+ 💡 ISFP - "The Artist" (Người nghệ sĩ)
249
+
250
+ Đặc điểm nổi bật:
251
+ - Sáng tạo, nhẹ nhàng và sống nội tâm
252
+ - Tận hưởng cái đẹp và thích làm việc với nghệ thuật
253
+ - Hướng tới trải nghiệm cá nhân và cảm xúc
254
+
255
+ Điểm mạnh trong công việc:
256
+ - Khả năng sáng tạo và cảm nhận nghệ thuật
257
+ - Linh hoạt và làm việc độc lập
258
+ - Tập trung vào chi tiết và thẩm mỹ
259
+
260
+ Nghề nghiệp phù hợp tiêu biểu:
261
+ 1. Nhà thiết kế
262
+ 2. Nhiếp ảnh gia
263
+ 3. Nghệ sĩ
264
+ 4. Nhà làm phim
265
+ 5. Nhà tạo mẫu
266
+ """,
267
+
268
+ "ESTP": """
269
+ 💡 ESTP - "The Entrepreneur" (Người kinh doanh)
270
+
271
+ Đặc điểm nổi bật:
272
+ - Năng động, tự tin và sống thực tế
273
+ - Thích hành động và ra quyết định nhanh chóng
274
+ - Thích mạo hiểm và khám phá những cơ hội mới
275
+
276
+ Điểm mạnh trong công việc:
277
+ - Khả năng ra quyết định nhanh và chính xác
278
+ - Tính linh hoạt và thích ứng tốt
279
+ - Sự tự tin và khả năng giao tiếp mạnh mẽ
280
+
281
+ Nghề nghiệp phù hợp tiêu biểu:
282
+ 1. Doanh nhân
283
+ 2. Nhà bán hàng
284
+ 3. Nhà đầu tư
285
+ 4. Quản lý dự án
286
+ 5. Cố vấn kinh doanh
287
+ """,
288
+
289
+ "ESFP": """
290
+ 💡 ESFP - "The Entertainer" (Người biểu diễn)
291
+
292
+ Đặc điểm nổi bật:
293
+ - Thân thiện, hòa đồng và lạc quan
294
+ - Yêu thích sự vui vẻ và thích tạo niềm vui cho người khác
295
+ - Sống hướng ngoại và tìm kiếm trải nghiệm mới
296
+
297
+ Điểm mạnh trong công việc:
298
+ - Khả năng giao tiếp và kết nối xã hội mạnh mẽ
299
+ - Tạo môi trường làm việc vui vẻ và năng động
300
+ - Linh hoạt và sáng tạo trong giải quyết vấn đề
301
+
302
+ Nghề nghiệp phù hợp tiêu biểu:
303
+ 1. Diễn viên
304
+ 2. Nhân viên bán hàng
305
+ 3. Hướng dẫn viên du lịch
306
+ 4. Nhạc sĩ
307
+ 5. Người làm truyền thông
308
+ """,
309
+
310
+ "INTP": """
311
+ 💡 INTP - "The Thinker" (Người tư duy)
312
+
313
+ Đặc điểm nổi bật:
314
+ - Tò mò, sáng tạo và yêu thích nghiên cứu
315
+ - Th��ch khám phá các lý thuyết và tư duy trừu tượng
316
+ - Độc lập và có tư duy phản biện
317
+
318
+ Điểm mạnh trong công việc:
319
+ - Khả năng phân tích và suy nghĩ sâu sắc
320
+ - Giải quyết vấn đề bằng cách tiếp cận sáng tạo
321
+ - Tư duy logic và không ngừng học hỏi
322
+
323
+ Nghề nghiệp phù hợp tiêu biểu:
324
+ 1. Nhà nghiên cứu
325
+ 2. Nhà phát triển phần mềm
326
+ 3. Chuyên viên phân tích dữ liệu
327
+ 4. Nhà triết học
328
+ 5. Chuyên gia tư vấn
329
+ """,
330
+
331
+ "ENTP": """
332
+ 💡 ENTP - "The Debater" (Người tranh luận)
333
+
334
+ Đặc điểm nổi bật:
335
+ - Thông minh, tự tin và sáng tạo
336
+ - Thích thử thách ý tưởng và tranh luận
337
+ - Tìm kiếm các giải pháp sáng tạo và đổi mới
338
+
339
+ Điểm mạnh trong công việc:
340
+ - Khả năng suy nghĩ linh hoạt và nhanh nhạy
341
+ - Giải quyết vấn đề bằng cách sáng tạo
342
+ - Khả năng thuyết phục và giao tiếp tốt
343
+
344
+ Nghề nghiệp phù hợp tiêu biểu:
345
+ 1. Luật sư
346
+ 2. Nhà tư vấn
347
+ 3. Doanh nhân
348
+ 4. Chuyên gia marketing
349
+ 5. Nhà đầu tư
350
+ """
351
+ }
352
 
353
  # Định nghĩa đầy đủ các kiểu MBTI và đặc điểm nghề nghiệp
354
  MBTI_CAREER_TRAITS = {
355
+ "ISTJ": {
356
+ "traits": "Tỉ mỉ, có tổ chức, thực tế, đáng tin cậy, trách nhiệm",
357
+ "careers": "Kế toán, Quản trị, Công nghệ thông tin, Kỹ sư, Quân đội",
358
+ "strengths": "Làm việc có tổ chức, chi tiết, đáng tin cậy, thực tế",
359
+ "weaknesses": "Đôi khi cứng nhắc, khó thích nghi với thay đổi"
360
+ },
361
+ "ISFJ": {
362
+ "traits": "Chu đáo, trách nhiệm, kiên nhẫn, thực tế, tận tụy",
363
+ "careers": "Y tá, Giáo viên, Quản trị văn phòng, Nhân viên xã hội, Kế toán",
364
+ "strengths": "Quan tâm đến người khác, đáng tin cậy, chi tiết",
365
+ "weaknesses": "Khó nói 'không', có thể quá lo lắng"
366
+ },
367
+ "INFJ": {
368
+ "traits": "Sáng tạo, có tầm nhìn, đồng cảm, kiên định",
369
+ "careers": "Tư vấn tâm lý, Giáo viên, Nhà văn, Nghệ sĩ, Nhà thiết kế",
370
+ "strengths": "Sáng tạo, hiểu người khác sâu sắc, có tầm nhìn",
371
+ "weaknesses": "Dễ kiệt sức, đôi khi quá lý tưởng"
372
+ },
373
+ "INTJ": {
374
+ "traits": "Chiến lược, độc lập, phân tích, sáng tạo",
375
+ "careers": "Kiến trúc sư, Nhà khoa học, Kỹ sư, Quản lý cấp cao, Tư vấn chiến lược",
376
+ "strengths": "Tư duy chiến lược, độc lập, sáng tạo",
377
+ "weaknesses": "Có thể quá hoàn hảo, đôi khi khó giao tiếp"
378
+ },
379
+ "ISTP": {
380
+ "traits": "Linh hoạt, thực tế, logic, phiêu lưu",
381
+ "careers": "Kỹ sư cơ khí, Thợ thủ công, Lập trình viên, Phi công, Vận động viên",
382
+ "strengths": "Giải quyết vấn đề thực tế, linh hoạt, logic",
383
+ "weaknesses": "Khó cam kết lâu dài, có thể thiếu kiên nhẫn"
384
+ },
385
+ "ISFP": {
386
+ "traits": "Nghệ sĩ, nhạy cảm, linh hoạt, hòa đồng",
387
+ "careers": "Nghệ sĩ, Nhà thiết kế, Nhiếp ảnh gia, Nhà tạo mẫu, Bác sĩ thú y",
388
+ "strengths": "Sáng tạo, thẩm mỹ cao, linh hoạt",
389
+ "weaknesses": "Khó lập kế hoạch dài hạn, dễ bị tổn thương"
390
+ },
391
+ "INFP": {
392
+ "traits": "Lý tưởng, sáng tạo, đồng cảm, trung thực",
393
+ "careers": "Nhà văn, Nghệ sĩ, Tư vấn tâm lý, Giáo viên, Nhà thiết kế",
394
+ "strengths": "Sáng tạo, hiểu người khác, có giá trị mạnh mẽ",
395
+ "weaknesses": "Quá lý tưởng, khó đưa ra quyết định"
396
+ },
397
+ "INTP": {
398
+ "traits": "Logic, sáng tạo, phân tích, độc lập",
399
+ "careers": "Lập trình viên, Nhà khoa học, Kỹ sư, Nhà phân tích, Kiến trúc sư",
400
+ "strengths": "Tư duy logic, sáng tạo, giải quyết vấn đề phức tạp",
401
+ "weaknesses": "Có thể quá lý thuyết, khó hoàn thành công việc"
402
+ },
403
+ "ESTP": {
404
+ "traits": "Năng động, thực tế, linh hoạt, phiêu lưu",
405
+ "careers": "Doanh nhân, Môi giới, Quản lý dự án, Vận động viên, Nhà thầu",
406
+ "strengths": "Giải quyết vấn đề nhanh, thích ứng tốt, năng động",
407
+ "weaknesses": "Có thể thiếu kiên nhẫn, khó tập trung lâu"
408
+ },
409
+ "ESFP": {
410
+ "traits": "Nhiệt tình, hòa đồng, thực tế, vui vẻ",
411
+ "careers": "Nghệ sĩ biểu diễn, Bán hàng, Quản lý sự kiện, Nhà thiết kế, Huấn luyện viên",
412
+ "strengths": "Giao tiếp tốt, năng động, thích ứng nhanh",
413
+ "weaknesses": "Khó tập trung, không thích lý thuyết"
414
+ },
415
+ "ENFP": {
416
+ "traits": "Nhiệt tình, sáng tạo, linh hoạt, truyền cảm hứng",
417
+ "careers": "Nhà báo, Marketing, Tư vấn, Nghệ sĩ, Giáo viên",
418
+ "strengths": "Sáng tạo, giao tiếp tốt, truyền cảm hứng",
419
+ "weaknesses": "Khó tập trung, dễ phân tâm"
420
+ },
421
+ "ENTP": {
422
+ "traits": "Sáng tạo, logic, năng động, thông minh",
423
+ "careers": "Doanh nhân, Luật sư, Nhà phát minh, Nhà tư vấn, Nhà marketing",
424
+ "strengths": "Sáng tạo, logic, giải quyết vấn đề tốt",
425
+ "weaknesses": "Có thể tranh luận quá nhiều, khó hoàn thành"
426
+ },
427
+ "ESTJ": {
428
+ "traits": "Tổ chức, thực tế, logic, quyết đoán",
429
+ "careers": "Quản lý, Quân đội, Luật sư, Tài chính, Kinh doanh",
430
+ "strengths": "Tổ chức tốt, quyết đoán, thực tế",
431
+ "weaknesses": "Có thể quá cứng nhắc, thiếu nhạy cảm"
432
+ },
433
+ "ESFJ": {
434
+ "traits": "Quan tâm, có tổ chức, hòa đồng, trách nhiệm",
435
+ "careers": "Giáo viên, Y tá, Quản lý nhân sự, Bán hàng, Chăm sóc khách hàng",
436
+ "strengths": "Giao tiếp tốt, có tổ chức, quan tâm người khác",
437
+ "weaknesses": "Quá phụ thuộc vào ý kiến người khác"
438
+ },
439
+ "ENFJ": {
440
+ "traits": "Lãnh đạo, đồng cảm, có tổ chức, truyền cảm hứng",
441
+ "careers": "Giáo viên, Tư vấn, Nhà lãnh đạo, Marketing, Nhà báo",
442
+ "strengths": "Lãnh đạo tốt, hiểu người khác, truyền cảm hứng",
443
+ "weaknesses": "Quá lo lắng về người khác, dễ kiệt sức"
444
+ },
445
+ "ENTJ": {
446
+ "traits": "Lãnh đạo, quyết đoán, chiến lược, tự tin",
447
+ "careers": "Lãnh đạo doanh nghiệp, Tư vấn quản lý, Luật sư, Quản lý dự án, Chính trị gia",
448
+ "strengths": "Lãnh đạo tốt, tư duy chiến lược, quyết đoán",
449
+ "weaknesses": "Có thể quá áp đặt, thiếu kiên nhẫn"
450
+ }
451
  }
452
 
453
  class CareerAdvisor:
 
457
  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."""
458
 
459
  def calculate_mbti(self, answers):
 
460
  result = ""
461
  dimensions = {"IE": [], "SN": [], "TF": [], "JP": []}
462
 
 
469
  result += "T" if sum(dimensions["TF"]) < len(dimensions["TF"])/2 else "F"
470
  result += "J" if sum(dimensions["JP"]) < len(dimensions["JP"])/2 else "P"
471
 
472
+ # Trả về cả kết quả và mô tả
473
+ return result, MBTI_DESCRIPTIONS.get(result, "Chưa có mô tả chi tiết cho kiểu tính cách này.")
474
 
475
  def get_career_advice(self, user_input: str, mbti_type: str) -> str:
476
  try:
 
492
  3. Top 3 ngành nghề phù hợp nhất và lý do
493
  4. Lộ trình phát triển cụ thể cho từng ngành (3-5 năm)
494
  5. Các kỹ năng cần phát triển và cách thức phát triển
 
 
495
  """
496
 
497
  response = model.generate_content(prompt)
 
499
  except Exception as e:
500
  return f"Đã xảy ra lỗi khi tạo tư vấn: {str(e)}"
501
 
502
+ def chat_with_advisor(self, message: str, history: List) -> List:
503
  try:
504
  context = f"""
505
  {self.system_prompt}
 
508
  "{message}"
509
 
510
  Hãy đưa ra lời khuyên chuyên nghiệp, cụ thể và có tính thực tiễn cao.
 
511
  """
512
 
513
  response = model.generate_content(context)
514
+ history.append([message, response.result.text])
 
515
  return history
516
  except Exception as e:
517
+ history.append([message, f"Đã xảy ra lỗi: {str(e)}"])
518
  return history
519
 
520
  def create_interface():
521
  advisor = CareerAdvisor()
522
+ current_tab = gr.State("start")
523
 
524
  with gr.Blocks(title="AI Career Advisor", theme=gr.themes.Soft()) as interface:
525
  gr.Markdown("""
 
528
  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.
529
  """)
530
 
531
+ # Tab container
532
+ tabs = gr.Tabs(selected=0)
533
+
534
+ # Tab bắt đầu
535
+ with tabs.Tab("🎯 Bắt đầu", id=0) as start_tab:
536
  know_mbti = gr.Radio(
537
+ choices=[", tôi đã biết kiểu tính cách MBTI của mình",
538
+ "Không, tôi chưa biết kiểu tính cách MBTI của mình"],
539
+ label="Bạn đã biết kiểu tính cách MBTI của mình chưa?",
540
  type="index"
541
  )
542
 
543
+ # Tab khảo sát MBTI
544
+ with tabs.Tab("📝 Khám phá tính cách MBTI", id=1) as test_tab:
545
  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""")
546
 
547
  questions = []
 
556
 
557
  test_submit = gr.Button("Xác định tính cách MBTI", variant="primary")
558
  mbti_result = gr.Textbox(label="Kết quả tính cách MBTI của bạn", interactive=False)
559
+ mbti_description = gr.Markdown(visible=False)
560
 
561
+ def on_test_submit(*answers):
562
+ mbti_type, description = advisor.calculate_mbti(answers)
563
+ return {
564
+ mbti_result: mbti_type,
565
+ mbti_description: gr.Markdown.update(visible=True, value=description),
566
+ tabs: gr.Tabs.update(selected=2) # Chuyển sang tab tư vấn
567
+ }
568
 
569
  test_submit.click(
570
+ fn=on_test_submit,
571
  inputs=questions,
572
+ outputs=[mbti_result, mbti_description, tabs]
573
  )
574
 
575
  # Tab tư vấn nghề nghiệp
576
+ with tabs.Tab("💼 Tư vấn nghề nghiệp", id=2) as advice_tab:
577
  mbti_input = gr.Dropdown(
578
  choices=list(MBTI_CAREER_TRAITS.keys()),
579
  label="Kiểu tính cách MBTI của bạn",
 
585
  def update_mbti_info(mbti_type):
586
  if mbti_type:
587
  info = MBTI_CAREER_TRAITS[mbti_type]
588
+ description = MBTI_DESCRIPTIONS.get(mbti_type, "")
589
  return gr.Markdown.update(
590
  visible=True,
591
  value=f"""
592
+ {description}
593
+
594
+ ### 📊 Thông tin chi tiết:
595
 
596
  #### 🎯 Đặc điểm chính:
597
  {info['traits']}
 
611
  user_info = gr.Textbox(
612
  label="Chia sẻ thêm về bản thân",
613
  lines=5,
614
+ 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..."
615
  )
616
 
617
  get_advice_btn = gr.Button("📋 Nhận tư vấn chi tiết", variant="primary")
618
+ advice_output = gr.Markdown(label="Kết quả tư vấn")
619
 
 
 
 
 
 
 
620
  mbti_input.change(
621
  fn=update_mbti_info,
622
  inputs=mbti_input,
 
630
  )
631
 
632
  # Tab chat với chuyên gia
633
+ with tabs.Tab("💬 Tư vấn 1-1 với Chuyên gia", id=3) as chat_tab:
 
 
 
 
 
 
 
 
 
 
 
634
  chatbot = gr.Chatbot(
635
  label="Cuộc trò chuyện",
636
  height=400,
 
638
  avatar_images=(None, "🧑‍💼")
639
  )
640
 
641
+ with gr.Row():
642
+ msg = gr.Textbox(
643
+ label="Nhập câu hỏi của bạn",
644
+ placeholder="Ví dụ: Làm thế nào để tôi có thể chuyển sang ngành IT?",
645
+ lines=3
646
+ )
647
+ send_btn = gr.Button("📤 Gửi", variant="primary")
648
 
 
649
  clear = gr.Button("🗑️ Xóa lịch sử")
650
 
651
  def respond(message, chat_history):
652
+ updated_history = advisor.chat_with_advisor(message, chat_history or [])
653
+ return "", updated_history
654
 
655
+ send_btn.click(
656
+ fn=respond,
657
+ inputs=[msg, chatbot],
658
+ outputs=[msg, chatbot]
659
+ )
660
+
661
+ msg.submit(
662
+ fn=respond,
663
+ inputs=[msg, chatbot],
664
+ outputs=[msg, chatbot]
665
+ )
666
 
667
+ clear.click(lambda: None, None, chatbot, queue=False)
 
668
 
669
+ # Xử chuyển tab
670
+ def handle_know_mbti(choice):
671
+ if choice == 0: # Đã biết MBTI
672
+ return gr.Tabs.update(selected=2) # Chuyển đến tab tư vấn
673
  else: # Chưa biết MBTI
674
+ return gr.Tabs.update(selected=1) # Chuyển đến tab khảo sát
675
 
676
  know_mbti.change(
677
+ fn=handle_know_mbti,
678
  inputs=[know_mbti],
679
+ outputs=[tabs]
680
  )
681
 
682
  return interface
 
690
  )
691
 
692
  if __name__ == "__main__":
693
+ main()