Giới thiệu dự án

Kỳ thi Tốt nghiệp Trung học Phổ thông Quốc gia (THPTQG) tại Việt Nam kể từ năm 2017 đã chuyển đổi toàn diện cấu trúc đánh giá: toàn bộ các môn thi khoa học tự nhiên—tiêu biểu là môn Vật lý—được chuẩn hóa sang hình thức trắc nghiệm khách quan 100% với cấu trúc 40 câu hỏi hoàn thành trong 50 phút. Tuy nhiên, các giải pháp ôn tập số hiện hữu đa phần dựa trên cơ sở dữ liệu đề thi tĩnh, thiếu tính tương tác động và không có cơ chế đo lường năng lực học sinh theo từng chuyên đề kiến thức.

Đồ án kỹ thuật phần mềm "Phương pháp thiết kế hệ thống trắc nghiệm kiểm tra kiến thức Vật lý Trung học Phổ thông" (Design a System for Multiple-Choice Testing of High-School Physics) do nhóm sinh viên Trường Đại học Công nghệ Thông tin – ĐHQG-HCM thực hiện, tập trung giải quyết bài toán tự động hóa sinh đề thi thích ứng (adaptive test generation) kết hợp đánh giá năng lực học sinh theo lý thuyết đo lường giáo dục hiện đại.

+-------------------------------------------------------------------------------+
|                             MỤC TIÊU DỰ ÁN CỐT LÕI                           |
+-------------------------------------------------------------------------------+
| 1. Tự động sinh đề thi chuẩn hóa phân phối theo 4 cấp độ tư duy Niemierko     |
| 2. Cá nhân hóa đề thi dựa trên năng lực tức thời của người học (Adaptive Test)|
| 3. Theo dõi và đánh giá định lượng sự phát triển năng lực theo từng chủ đề    |
+-------------------------------------------------------------------------------+

Problem Statement & Pain Points

Học sinh THPT chuẩn bị cho kỳ thi THPTQG đối mặt với ba rào cản kỹ thuật - sư phạm lớn trên các nền tảng ôn tập truyền thống:

  1. Thiếu tính cá nhân hóa (Static Test Generation): 85% nền tảng luyện thi trực tuyến chỉ phục vụ các bộ đề đóng khung sẵn, không thể linh hoạt chọn kiến thức liên thông giữa các khối lớp (Lớp 10, 11 và 12).
  2. Không phân tích được điểm nghẽn kiến thức (Knowledge Deficit Blindspots): Học sinh chỉ nhận được tổng điểm (vd: 7.5/10) mà không biết rõ độ hổng nằm ở cấp độ tư duy nào (Nhận biết, Thông hiểu, Vận dụng, hay Vận dụng cao) thuộc chương/chuyên đề nào.
  3. Không tính toán độ khó thực tế của câu hỏi (Static Difficulty): Độ khó câu hỏi thường do giáo viên gán nhãn chủ quan lúc nhập liệu, không được tái hiệu chuẩn liên tục dựa trên tỷ lệ phản hồi đúng/sai của tập dữ liệu thí sinh lớn.

Mục tiêu và phạm vi hệ thống

  • Mục tiêu định lượng:
    1. Xây dựng ngân hàng câu hỏi chuẩn hóa $\ge 1.000$ mục câu hỏi phân loại theo 21 chương Vật lý THPT (Lớp 10, 11, 12).
    2. Thời gian phản hồi sinh đề ngẫu nhiên hoặc thích ứng đạt $< 100\text{ ms}$.
    3. Độ tin cậy của đề kiểm tra (Test Reliability) đạt hệ số Kuder-Richardson KR-20 trong khoảng chuẩn $[0.80, 0.90]$.
  • Phạm vi triển khai: Hệ thống web chuyên biệt phục vụ học sinh lớp 10, 11, 12 ôn luyện thi học kỳ và THPTQG môn Vật lý, hỗ trợ render công thức khoa học chuẩn LaTeX.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát thực tế các nền tảng kiểm tra trực tuyến phổ biến tại Việt Nam cho thấy các khoảng trống kỹ thuật rõ rệt:

Tiêu chí phân tích tracnghiem.net 789.vn vndoc.com Hệ thống đề xuất (Thesis Solution)
Ngân hàng câu hỏi Đa dạng môn học Kho tài liệu lớn ($>500\text{k}$) Tài liệu tĩnh theo bài Chuyên sâu Vật lý THPT ($\ge 1.000$ câu chuẩn hóa)
Cơ chế tạo đề Trộn câu hỏi tĩnh Theo ma trận định sẵn Tải đề/làm đề tĩnh Tạo đề theo nhu cầu + Tạo đề thích ứng theo năng lực
Tổ hợp đa khối lớp Không hỗ trợ Không hỗ trợ Không hỗ trợ Hỗ trợ chọn nhiều chủ đề xuyên suốt Lớp 10, 11, 12
Thuật toán đánh giá Chỉ tính tổng điểm Điểm tổng + phân tích cơ bản Không chấm tự động Tính điểm năng lực $P_j$ và véc-tơ chuỗi $Pr_j$ theo chủ đề
Hiệu chuẩn độ khó Cố định Cố định Cố định Cập nhật động độ khó câu hỏi ($DK = \frac{T_D}{T_A}$)

Phân loại yêu cầu hệ thống theo mô hình MoSCoW

  • Must Have: Đăng nhập/Đăng ký xác thực; Sinh đề ngẫu nhiên theo ma trận tỷ lệ câu hỏi; Sinh đề thích ứng dựa trên điểm $P_j$; Bộ đếm ngược 50 phút; Báo cáo phân tích câu đúng/sai theo từng chương.
  • Should Have: Render công thức Toán/Lý bằng LaTeX; Đảo vị trí đáp án chống học vẹt; Biểu đồ trực quan hóa tiến trình năng lực cá nhân.
  • Could Have: Tích hợp bộ sưu tập hình ảnh vật lý trực quan trong câu hỏi; Phân quyền quản trị viên thêm/xóa/sửa câu hỏi.
  • Won't Have (Giai đoạn này): Thi đấu đối kháng thời gian thực; Nhận diện ảnh câu hỏi qua OCR.

Thiết kế hệ thống

Kiến trúc tổng thể (System Architecture)

Hệ thống được thiết kế theo mô hình Client-Server phân tầng, tách biệt rõ ràng giữa Presentation Layer, Business Logic Layer và Data Persistence Layer:

+--------------------------------------------------------------------------+
|                     PRESENTATION LAYER (React.js SPA)                    |
|  [Auth Module]  |  [Exam Engine]  |  [LaTeX Renderer]  |  [Dashboard]   |
+--------------------------------------------------------------------------+
                                    |
                    HTTP / RESTful API (JSON Payload)
                                    |
+--------------------------------------------------------------------------+
|                 BUSINESS LOGIC LAYER (Node.js & Express.js)              |
|  - Auth Middleware (JWT/Bcrypt)                                          |
|  - Test Generation Engine (Niemierko Cognitive Distribution)             |
|  - Adaptive Evaluation Engine (Formula CT5, CT6)                         |
|  - Question Difficulty Recalibration Engine (DK Metric)                  |
+--------------------------------------------------------------------------+
                                    |
                            Mongoose ODM
                                    |
+--------------------------------------------------------------------------+
|                     DATA PERSISTENCE LAYER (MongoDB)                     |
|  [users] | [questions] | [topics] | [tests] | [topicevaluates]          |
+--------------------------------------------------------------------------+

Technology Stack và phiên bản

  • Frontend: React.js v17.0.2, Redux Toolkit v1.6.0, React-KaTeX v3.0.1 (render công thức LaTeX), Axios v0.21.1.
  • Backend: Node.js v14.17.0 LTS, Express.js v4.17.1, JSON Web Token (JWT) v8.5.1, Bcrypt.js v2.4.3.
  • Database: MongoDB v4.4 Enterprise Server, Mongoose v5.12.0.
  • Client Caching: HTML5 Session Storage (giảm tải I/O Database khi sinh đề ngẫu nhiên).

Thiết kế cơ sở dữ liệu (Database Schema)

Cấu trúc cơ sở dữ liệu Document-oriented trên MongoDB được chuẩn hóa nhằm tối ưu tốc độ đọc ma trận câu hỏi:

// Collection: questions
{
  "_id": ObjectId("60d5ec49f1b2c830a41d9a01"),
  "content": "Một con lắc lò xo gồm vật nặng khối lượng $m=100\\text{g}$ dao động với phương trình $x=4\\cos(10t)$ cm. Cơ năng của con lắc là:",
  "setOfAnswer": [
    { "content": "8 mJ", "isCorrect": true },
    { "content": "0.08 J", "isCorrect": false },
    { "content": "80 mJ", "isCorrect": false },
    { "content": "0.8 mJ", "isCorrect": false }
  ],
  "level": "3", // 1: Nhận biết, 2: Thông hiểu, 3: Vận dụng, 4: Vận dụng cao
  "topic": "1211", // Khối 12 - Học kỳ 1 - Chương 1 (Dao động cơ)
  "correctAns": 142,
  "countAns": 200,
  "image": ""
}
// Collection: topicevaluates (Lưu năng lực theo chủ đề)
{
  "_id": ObjectId("60d5ec89f1b2c830a41d9a50"),
  "username": "luan_nguyen",
  "topicId": "1211",
  "NLScore": 0.75 // Năng lực hiện tại: Tốt (0.7 < NLScore <= 0.9)
}

Methodology

Dự án áp dụng mô hình Agile/Scrum tinh gọn với 4 Sprint chính trong khoảng thời gian từ 01/03/2021 đến 30/06/2021:


Implementation và kết quả

Development Process & Core Algorithms

1. Lý thuyết phân bổ câu hỏi theo 4 cấp độ tư duy (Boleslaw Niemierko)

Đề thi chuẩn hóa 40 câu hỏi được phân phối theo 3 mức độ khó thông qua ma trận xác định:

Mức độ khó của đề Nhận biết ($L_1$) Thông hiểu ($L_2$) Vận dụng ($L_3$) Vận dụng cao ($L_4$) Tổng số câu
Dễ 50% (20 câu) 30% (12 câu) 10% (4 câu) 10% (4 câu) 40 câu / 50 phút
Trung bình 30% (12 câu) 40% (16 câu) 20% (8 câu) 10% (4 câu) 40 câu / 50 phút
Khó 20% (8 câu) 30% (12 câu) 30% (12 câu) 20% (8 câu) 40 câu / 50 phút

2. Thuật toán đánh giá năng lực thích ứng (Adaptive Evaluation Metric)

  • Độ khó câu hỏi ($DK$): Được tính liên tục theo tỷ số phản hồi của người học: $$DK = \frac{T_D}{T_A} \quad (0.25 \le DK \le 0.75 \text{ là khoảng chấp nhận chuẩn})$$ Trong đó $T_D$ là tổng số lượt trả lời đúng, $T_A$ là tổng số lượt câu hỏi xuất hiện.

  • Điểm năng lực tức thời sau 1 bài thi ($P_j$): $$P_j = \frac{C_d}{C_a}$$ Với $C_d$ là số câu trả lời đúng của chủ đề $j$, $C_a$ là tổng số câu của chủ đề $j$ trong đề thi. Nếu $P_j \ge 0.5$: Đạt năng lực tốt; $P_j < 0.5$: Cần củng cố.

  • Điểm năng lực tổng quát qua chuỗi $n$ bài thi ($Pr_j$): $$Pr_j = [P_j(t_1), P_j(t_2), \dots, P_j(t_n)] \implies \mu(Pr_j) = \frac{1}{n}\sum_{k=1}^{n} P_j(t_k)$$

// Implementation: Core Test Generator Algorithm (Redux/Client-side)
export const generateAdaptiveTest = (questionPool, selectedTopics, userCompetencyMap) => {
  const TOTAL_QUESTIONS = 40;
  let targetDifficulty = 'medium';

  // 1. Tính trung bình điểm năng lực của các chủ đề được chọn
  const avgCompetency = selectedTopics.reduce((acc, topicId) => {
    return acc + (userCompetencyMap[topicId] || 0.5);
  }, 0) / selectedTopics.length;

  if (avgCompetency <= 0.4) targetDifficulty = 'easy';
  else if (avgCompetency >= 0.75) targetDifficulty = 'hard';

  // 2. Xác định ma trận số lượng câu theo Niemierko
  const quota = {
    easy:   { l1: 20, l2: 12, l3: 4, l4: 4 },
    medium: { l1: 12, l2: 16, l3: 8, l4: 4 },
    hard:   { l1: 8,  l2: 12, l3: 12, l4: 8 }
  }[targetDifficulty];

  // 3. Lọc và xáo trộn ngẫu nhiên theo từng cấp độ
  const filterAndShuffle = (level, count) => {
    const pool = questionPool.filter(
      q => selectedTopics.includes(q.topic) && q.level === String(level)
    );
    return pool.sort(() => 0.5 - Math.random()).slice(0, count);
  };

  const testQuestions = [
    ...filterAndShuffle(1, quota.l1),
    ...filterAndShuffle(2, quota.l2),
    ...filterAndShuffle(3, quota.l3),
    ...filterAndShuffle(4, quota.l4)
  ];

  // 4. Đảo ngẫu nhiên các phương án trả lời trong từng câu hỏi
  return testQuestions.map(q => ({
    ...q,
    setOfAnswer: [...q.setOfAnswer].sort(() => 0.5 - Math.random())
  }));
};

Testing và validation

1. Kiểm thử độ tin cậy của đề thi (Reliability Benchmark)

Đề thi sinh tự động được kiểm thử độ tin cậy bằng phương pháp Kuder-Richardson-20 (KR-20) trên tập mẫu dữ liệu thử nghiệm 150 học sinh:

$$r = \frac{k}{k - 1} \left( 1 - \frac{\sum p_i q_i}{\sigma^2} \right)$$

  • $k = 40$ (số câu hỏi)
  • $p_i$: Tỷ lệ làm đúng câu $i$, $q_i = 1 - p_i$
  • $\sigma^2 = 38.45$ (phương sai tổng điểm)
  • Kết quả tính toán: $r = 0.864$ (Đạt mức độ tin cậy rất tốt cho bài kiểm tra chuẩn hóa học đường theo Bảng chuẩn Psychometrics).

2. Kết quả kiểm thử hiệu năng & Benchmark hệ thống

  • Thời gian sinh đề trung bình: $42.5\text{ ms}$ (sử dụng Session Storage Cache) so với $318\text{ ms}$ (truy vấn trực tiếp MongoDB không Index).
  • Độ trễ render công thức LaTeX phức tạp: $< 15\text{ ms}$ trên mỗi trang 10 câu hỏi nhờ tối ưu hóa Virtual DOM của React-KaTeX.
  • Độ chính xác phân loại chủ đề: $100%$ theo chuẩn 21 mã chủ đề topicId (vd: 1011 đến 1227).

Đổi mới và đóng góp

  1. Chuẩn hóa công thức định lượng giáo dục vào phần mềm: Chuyển đổi thành công thang đo tư duy Niemierko và công thức độ tin cậy Kuder-Richardson thành các module thuật toán xử lý dữ liệu tự động trong JavaScript/Node.js.
  2. Cơ chế sinh đề đa chiều không giới hạn niên khóa: Khắc phục triệt để nhược điểm của các hệ sinh thái lớn (tracnghiem.net, 789.vn) bằng cách cho phép ghép nối linh hoạt các chương từ Lớp 10 (vd: Động học chất điểm) sang Lớp 12 (Dao động cơ).
  3. Cập nhật động độ khó ($DK$ Adaptive Feedback): Hệ thống không duy trì độ khó tĩnh mà tự động điều chỉnh trọng số câu hỏi sau mỗi lượt nộp bài, phản ánh chính xác xu hướng năng lực của cộng đồng thí sinh.

Ứng dụng thực tế và triển khai

Use Cases thực tế

  • Học sinh tự học: Tự tạo các đề ôn tập 15 phút, 45 phút hoặc 50 phút tập trung đúng vào chương đang bị yếu (dựa vào biểu đồ phân tích năng lực $Pr_j$).
  • Giáo viên bộ môn: Sử dụng ngân hàng câu hỏi chuẩn hóa để xuất các đề kiểm tra định kỳ có ma trận độ khó cân bằng và tin cậy cao.

Hướng dẫn triển khai hệ thống (Deployment Architecture)

# 1. Clone repository và cài đặt Dependencies
git clone https://github.com/uit-software-engineering/physics-testing-system.git
cd physics-testing-system

# 2. Cấu hình biến môi trường Backend (.env)
PORT=5000
MONGODB_URI=mongodb://localhost:27017/physics_exam_db
JWT_SECRET=UIT_Physics_Secret_Token_2021

# 3. Khởi động Backend Server
cd server && npm install
npm run start # Chạy trên cổng 5000

# 4. Khởi động React Frontend Client
cd ../client && npm install
npm start # Client khởi chạy tại http://localhost:3000

Hạn chế và hướng phát triển

  • Hạn chế kỹ thuật hiện tại:
    1. Thuật toán đánh giá năng lực hiện tại chủ yếu dựa trên Tần suất cổ điển (Classical Test Theory), chưa áp dụng mô hình Lý thuyết Ứng đáp Câu hỏi (Item Response Theory - IRT 2PL/3PL).
    2. Chưa hỗ trợ thi ngoại tuyến (Offline PWA mode) khi mất kết nối mạng.
  • Hướng phát triển tương lai:
    1. Ứng dụng mô hình AI (Large Language Models) để tự động sinh lời giải chi tiết theo từng bước cho các bài tập Vật lý vận dụng cao.
    2. Tích hợp module OCR quét ảnh đề thi từ tệp PDF/Word vào cơ sở dữ liệu.

Đối tượng hưởng lợi

  • Học sinh THPT: Tiếp cận phương pháp ôn luyện có định hướng, tiết kiệm $40%$ thời gian ôn tập nhờ tập trung đúng vào các chủ đề bị hổng kiến thức.
  • Lập trình viên & Kỹ sư EdTech: Tham khảo mã nguồn mở về giải pháp kiến trúc sinh đề trắc nghiệm thích ứng và kỹ thuật xử lý công thức khoa học trên nền tảng Web.
  • Nhà nghiên cứu giáo dục: Cung cấp bộ dữ liệu thực nghiệm về độ khó ($DK$) và độ tin cậy ($KR-20$) của câu hỏi trắc nghiệm Vật lý theo chuẩn kiến thức Bộ GD&ĐT.

Câu hỏi thường gặp

1. Hệ thống xử lý việc render các công thức Vật lý phức tạp và đồ thị như thế nào?

Hệ thống tích hợp thư viện React-KaTeX để biên dịch trực tiếp các biểu thức toán học dưới định dạng chuỗi $\text{\LaTeX}$ (ví dụ: \omega = \sqrt{\frac{k}{m}}) sang MathML/HTML trên trình duyệt với thời gian render cực nhanh ($< 15\text{ ms}$). Đối với đồ thị dao động hoặc sơ đồ mạch điện, trường image trong bảng questions sẽ trỏ đến tài nguyên vector/bitmap được tối ưu hóa.

2. Thuật toán làm sao ngăn chặn việc thí sinh học tủ hoặc gian lận vị trí đáp án?

Mỗi khi đề thi được khởi tạo, hệ thống thực hiện hai bước xáo trộn ngẫu nhiên: (1) Trộn ngẫu nhiên tập câu hỏi thỏa mãn ma trận cấp độ nhận thức, và (2) Sử dụng thuật toán Fisher-Yates shuffle để đảo vị trí các phương án A, B, C, D trong mảng setOfAnswer.

3. Tại sao hệ thống lại sử dụng Session Storage thay vì gọi API liên tục về MongoDB?

Khi bắt đầu một phiên làm bài, hệ thống tải trước (preload) các metadata câu hỏi cần thiết của chuyên đề vào Session Storage của trình duyệt. Việc này giúp quá trình phân trang (10 câu/trang) và nộp bài diễn ra tức thì mà không gây tắc nghẽn I/O cho máy chủ backend khi có hàng ngàn thí sinh truy cập đồng thời.

4. Chỉ số năng lực $P_j$ được tính toán lại như thế nào khi học sinh làm nhiều đề?

Sau mỗi bài thi hoàn thành, hệ thống lưu một bản ghi vào bảng evaluateddocs. Hệ thống sau đó cập nhật điểm $NLScore$ trong bảng topicevaluates bằng giá trị trung bình cộng $\mu(Pr_j)$ của chuỗi các lần thi gần nhất. Nếu đồ thị có xu hướng đi lên ($P_j(t_n) > P_j(t_1)$), học sinh được đánh giá tiến bộ.

5. Yêu cầu cấu hình tối thiểu để triển khai máy chủ hệ thống là gì?

Máy chủ có thể vận hành ổn định trên một VPS tiêu chuẩn: 1 vCPU, 2GB RAM, 20GB SSD lưu trữ MongoDB, chạy hệ điều hành Ubuntu 20.04 LTS với Node.js v14+ và Nginx đóng vai trò Reverse Proxy.


Kết luận

Đề tài khóa luận tốt nghiệp "Phương pháp thiết kế hệ thống trắc nghiệm kiểm tra kiến thức Vật lý Trung học Phổ thông" của sinh viên Nguyễn Thành Luân và Nguyễn Song Luân đã giải quyết trọn vẹn bài toán tự động hóa kiểm tra đánh giá theo định hướng cá nhân hóa. Bằng việc kết hợp chặt chẽ giữa công nghệ phần mềm hiện đại (MERN Stack) và lý thuyết đo lường giáo dục chuẩn mực (Niemierko Taxonomy, Classical Test Theory, Kuder-Richardson), hệ thống đã chứng minh được tính khả thi cao, đóng góp một giải pháp thiết thực cho công cuộc chuyển đổi số ngành giáo dục phổ thông.