Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 6 — Cá nhân hóa lộ trình và sinh câu hỏi luyện tập

Đã đọc 0/8 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Giá trị lớn nhất của agent giáo dục là cá nhân hóa: mỗi học viên nhận lộ trình và bài luyện tập phù hợp với điểm yếu của riêng mình. Bài này kết nối dữ liệu kết quả (từ agent chấm bài ở Bài 5) với agent lập lộ trình và sinh câu hỏi.

Vòng lặp cá nhân hóa

Đánh giá → Chẩn đoán điểm yếu → Đề xuất nội dung → Luyện tập →
Đánh giá lại → (lặp)

Agent không đoán mò. Nó dựa trên hồ sơ học tập (learner profile): kỹ năng nào đã vững, kỹ năng nào còn yếu, đã học đến đâu. Không có hồ sơ này, cái gọi là "cá nhân hóa" chỉ là ảo giác — agent sẽ giao bài như nhau cho mọi người và gắn nhãn cá nhân hóa. Hồ sơ học tập chính là bộ nhớ dài hạn biến một chuỗi lời khuyên rời rạc thành một lộ trình có định hướng, bám sát tiến bộ thật của từng học viên qua thời gian.

Xây hồ sơ học tập

  • Gắn thẻ kỹ năng cho mỗi câu hỏi/bài: ví dụ câu này kiểm tra "phương trình bậc nhất", câu kia "phân số".
  • Cập nhật mức thành thạo sau mỗi bài: đúng thì tăng, sai thì giảm điểm kỹ năng liên quan.
  • Lưu lịch sử để agent thấy xu hướng tiến bộ, không chỉ ảnh chụp một thời điểm.
def update_profile(profile, question_skill, is_correct):
    s = profile.setdefault(question_skill, {"mastery": 0.5, "attempts": 0})
    delta = 0.15 if is_correct else -0.20
    s["mastery"] = max(0.0, min(1.0, s["mastery"] + delta))
    s["attempts"] += 1
    return profile

def weakest_skills(profile, n=2):
    return sorted(profile, key=lambda k: profile[k]["mastery"])[:n]

Sinh câu hỏi luyện tập nhắm điểm yếu

Sau khi biết kỹ năng yếu nhất, agent sinh câu hỏi đúng mức độ. Yêu cầu agent tạo câu hỏi kèm đáp án và giải thích, và bám tài liệu khóa học (dùng RAG từ Bài 4).

def gen_practice(skill, level, context):
    prompt = f"""Tạo 3 câu hỏi luyện tập cho kỹ năng '{skill}', độ khó '{level}'.
Bám nội dung: {context}
Mỗi câu trả JSON: {{"cau_hoi":"","dap_an":"","giai_thich":"",
  "ky_nang":"{skill}"}}
Câu hỏi phải VẬN DỤNG, không hỏi định nghĩa suông."""
    return parse_json(call_llm(prompt, temperature=0.6))

Ví dụ cụ thể

Học viên An chấm bài xong: mạnh về "phân số" (mastery 0.85), yếu "phương trình bậc nhất" (0.35). Agent lộ trình bỏ qua bài phân số (An đã vững, tránh nhàm chán), đưa An vào 3 câu luyện phương trình bậc nhất mức cơ bản, kèm gợi ý xem lại Bài 5 giáo trình. Sau khi An làm đúng 3/3, mastery tăng lên 0.5, agent nâng độ khó.

Nguyên tắc sư phạm khi cá nhân hóa

  • Vùng phát triển gần (ZPD): giao bài khó vừa đủ — không quá dễ (chán) hay quá khó (nản).
  • Lặp lại ngắt quãng: kỹ năng đã vững vẫn ôn lại định kỳ để không quên.
  • Đa dạng dạng bài: cùng kỹ năng nhưng đổi ngữ cảnh để tránh học vẹt.

Checklist cá nhân hóa

  • [ ] Mỗi câu hỏi được gắn thẻ kỹ năng.
  • [ ] Hồ sơ cập nhật sau mỗi lần làm bài.
  • [ ] Agent chọn bài theo kỹ năng yếu nhất + độ khó phù hợp.
  • [ ] Câu hỏi sinh ra bám giáo trình, có đáp án + giải thích.
  • [ ] Có lặp lại ngắt quãng cho kỹ năng đã học.
  • [ ] Học viên thấy được lý do vì sao được giao bài này.

Sai lầm thường gặp

  • Chỉ dựa một bài kiểm tra để kết luận điểm yếu: dữ liệu quá ít, chẩn đoán sai.
  • Giao bài quá khó ngay: học viên nản, bỏ cuộc.
  • Không cập nhật hồ sơ: agent mãi giao lại thứ học viên đã thạo.
  • Sinh câu hỏi hỏi định nghĩa suông: không rèn được khả năng vận dụng.
  • Bỏ qua RAG khi sinh câu hỏi: câu hỏi lệch giáo trình, học viên hoang mang.
Sau bài này, agent của bạn tạo được trải nghiệm học cá nhân hóa khép kín. Bài 7 sẽ ghép các agent lại thành một hệ thống nhiều agent phối hợp.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi