Skip to content

Commit 67dd822

Browse files
update AI chatbot
1 parent d79a507 commit 67dd822

File tree

4 files changed

+195
-25
lines changed

4 files changed

+195
-25
lines changed

assets/index-hl7mlAME.js

Lines changed: 134 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/dist/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
}(window.location));
1717
</script>
1818
<script src="./runtime-config.js"></script>
19-
<script type="module" crossorigin src="./assets/index-PJc7HnBD.js"></script>
19+
<script type="module" crossorigin src="./assets/index-hl7mlAME.js"></script>
2020
<link rel="stylesheet" crossorigin href="./assets/index-D83N1gQE.css">
2121
</head>
2222
<body>

frontend/src/offlineStore.js

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2923,21 +2923,24 @@ async function generateNextQuestionWithLLM(conversationText, profile, pastBotMes
29232923

29242924
try {
29252925
const prompt = `
2926-
Bạn là một CHUYÊN GIA TƯ VẤN NGHỀ NGHIỆP tâm lý và sâu sắc.
2926+
Bạn là một CHUYÊN GIA TƯ VẤN TÂM LÝ VÀ HƯỚNG NGHIỆP cấp cao.
29272927
Hồ sơ người dùng: ${JSON.stringify(profile)}
29282928
Lịch sử hội thoại:
29292929
${conversationText || "Chưa có (đây là câu hỏi đầu tiên)"}
29302930
29312931
NHIỆM VỤ:
2932-
- Hãy dẫn dắt buổi tư vấn một cách tự nhiên.
2933-
- Nếu là câu đầu, hãy bắt đầu bằng một lời chào thân thiện và hỏi về đam mê, ước mơ hoặc một khó khăn họ đang gặp phải khi chọn nghề.
2934-
- Nếu đã trò chuyện, hãy phân tích câu trả lời trước đó để hỏi sâu hơn.
2935-
- Đừng chỉ hỏi về môn học, hãy hỏi về giá trị sống, môi trường làm việc mơ ước (trong nhà/ngoài trời, tự do/ổn định).
2932+
- Hãy dẫn dắt buổi tư vấn một cách cực kỳ sâu sắc, như một người bạn tri kỷ và chuyên gia.
2933+
- Đừng chỉ hỏi "Bạn thích gì?", hãy hỏi về:
2934+
* Những tình huống khiến họ thấy tự hào nhất.
2935+
* Cách họ đối mặt với áp lực hoặc giải quyết mâu thuẫn.
2936+
* Những giá trị họ muốn để lại cho thế giới (tiền bạc, danh tiếng, hay sự giúp đỡ?).
2937+
* Sở thích ẩn giấu mà họ chưa từng nói với ai.
2938+
- Nếu đã trò chuyện, hãy "đọc vị" tính cách của họ qua cách dùng từ để đặt câu hỏi tiếp theo thật "chạm".
29362939
29372940
YÊU CẦU:
2938-
1. KHÔNG lặp lại các câu hỏi đã hỏi: ${JSON.stringify(pastBotMessages.slice(-10))}
2939-
2. Ngôn ngữ ấm áp, khích lệ (dùng "mình", "bạn").
2940-
3. Câu hỏi ngắn gọn nhưng gợi mở.
2941+
1. KHÔNG lặp lại câu hỏi: ${JSON.stringify(pastBotMessages.slice(-10))}
2942+
2. Ngôn ngữ ấm áp, giàu hình ảnh, khích lệ (dùng "mình", "bạn").
2943+
3. Câu hỏi ngắn gọn nhưng đầy sức gợi.
29412944
29422945
TRẢ VỀ DUY NHẤT JSON:
29432946
{
@@ -2970,23 +2973,32 @@ async function generateNextQuestionWithLLM(conversationText, profile, pastBotMes
29702973
return null;
29712974
}
29722975

2973-
async function getFinalAIEvaluation(conversationText, profile, recommendations) {
2976+
async function getFinalAIResultsPure(conversationText, profile) {
29742977
const apiKey = localStorage.getItem('GEMINI_API_KEY') || 'AIzaSyBufWY4GjPYSXH9jkOD6pjDcdMAgSgA2gM';
2975-
if (!apiKey) return "Cảm ơn bạn đã tham gia tư vấn. Dưới đây là kết quả dựa trên số liệu phân tích.";
29762978

29772979
try {
29782980
const prompt = `
2979-
Bạn là chuyên gia tư vấn nghề nghiệp. Dựa vào:
2981+
Bạn là chuyên gia tư vấn nghề nghiệp cao cấp. Dựa vào cuộc hội thoại sau:
29802982
Hồ sơ: ${JSON.stringify(profile)}
29812983
Hội thoại: ${conversationText}
2982-
Gợi ý của hệ thống: ${JSON.stringify(recommendations.slice(0, 3))}
29832984
2984-
HÃY VIẾT:
2985-
1. Một đoạn tóm tắt về thế mạnh và định hướng của người dùng qua cuộc trò chuyện.
2986-
2. Giải thích tại sao 3 nghề nghiệp top đầu lại phù hợp với họ.
2987-
3. Một lời khuyên thực tế để họ bắt đầu (lộ trình học tập hoặc kỹ năng cần luyện).
2985+
NHIỆM VỤ:
2986+
1. Phân tích sâu sắc tính cách, thiên hướng và tiềm năng của người dùng.
2987+
2. Đề xuất 5 nghề nghiệp phù hợp NHẤT (không giới hạn trong database, hãy dùng kiến thức thực tế toàn cầu).
2988+
3. Với mỗi nghề, hãy cho biết:
2989+
- Tên nghề nghiệp.
2990+
- Phần trăm phù hợp (match_score) từ 60-98.
2991+
- 3 lý do cụ thể tại sao hợp.
2992+
4. Viết một bài đánh giá tổng quan (roadmap) truyền cảm hứng, giải thích logic đằng sau các lựa chọn này.
29882993
2989-
YÊU CẦU: Ngôn ngữ chuyên nghiệp nhưng truyền cảm hứng. Tối đa 250 từ. Trả về text thuần.
2994+
TRẢ VỀ DUY NHẤT JSON THEO CẤU TRÚC:
2995+
{
2996+
"summary": "đoạn văn tóm tắt đánh giá thế mạnh và lời khuyên",
2997+
"recommendations": [
2998+
{ "career_name": "...", "match_score": 95, "reasons": ["...", "...", "..."] },
2999+
...
3000+
]
3001+
}
29903002
`;
29913003

29923004
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${apiKey}`, {
@@ -2998,10 +3010,15 @@ async function getFinalAIEvaluation(conversationText, profile, recommendations)
29983010
});
29993011

30003012
const data = await response.json();
3001-
return data.candidates?.[0]?.content?.parts?.[0]?.text || "Gợi ý của chúng mình dựa trên các tiêu chí bạn đã chia sẻ.";
3013+
const text = data.candidates?.[0]?.content?.parts?.[0]?.text;
3014+
const jsonMatch = text.match(/\{[\s\S]*\}/);
3015+
if (jsonMatch) {
3016+
return JSON.parse(jsonMatch[0]);
3017+
}
30023018
} catch (e) {
3003-
return "Chúng mình đánh giá cao sự chia sẻ của bạn. Hãy xem qua danh sách gợi ý bên dưới nhé.";
3019+
console.error("Pure AI Results Error:", e);
30043020
}
3021+
return null;
30053022
}
30063023

30073024

@@ -3101,18 +3118,37 @@ export const offlineApi = {
31013118
}
31023119
}
31033120

3104-
const enoughInfo = state.answers.length >= 6;
3121+
const enoughInfo = state.answers.length >= 10;
31053122
if (enoughInfo && !request_more) {
3106-
const recs = scoreCareers(state);
3123+
const messages = getMessages(convId);
31073124
const conversationText = messages.map(m => `${m.sender}: ${m.message}`).join('\n');
3108-
const aiSummary = await getFinalAIEvaluation(conversationText, state.userProfile, recs);
31093125

3126+
// Call PURE AI results
3127+
const aiResult = await getFinalAIResultsPure(conversationText, state.userProfile);
3128+
3129+
if (aiResult) {
3130+
saveRecommendations(convId, aiResult.recommendations);
3131+
saveState(convId, state);
3132+
return {
3133+
success: true,
3134+
data: {
3135+
bot_reply: aiResult.summary,
3136+
recommendations: aiResult.recommendations,
3137+
next_node: null,
3138+
completed: true,
3139+
conversation_id: convId
3140+
}
3141+
};
3142+
}
3143+
3144+
// Fallback if AI fails
3145+
const recs = scoreCareers(state);
31103146
saveRecommendations(convId, recs);
31113147
saveState(convId, state);
31123148
return {
31133149
success: true,
31143150
data: {
3115-
bot_reply: aiSummary,
3151+
bot_reply: 'Đây là gợi ý nghề nghiệp dựa trên phân tích dữ liệu môn học:',
31163152
recommendations: recs,
31173153
next_node: null,
31183154
completed: true,

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
}(window.location));
1717
</script>
1818
<script src="./runtime-config.js"></script>
19-
<script type="module" crossorigin src="./assets/index-PJc7HnBD.js"></script>
19+
<script type="module" crossorigin src="./assets/index-hl7mlAME.js"></script>
2020
<link rel="stylesheet" crossorigin href="./assets/index-D83N1gQE.css">
2121
</head>
2222
<body>

0 commit comments

Comments
 (0)