Đầu ra có cấu trúc và kiểm định
Contract validation, server-authoritative fields, fail closed, fallback và tính tất định.
1. Mục tiêu
Output có cấu trúc ngăn mô hình hoặc client tạo field sai kiểu, thiếu trường bắt buộc hoặc làm sai semantics của Knowledge State.
Pipeline bắt buộc cho mọi output LLM:
schema-constrained generation
→ validation
→ retry
→ repair
→ validation lần nữa
→ deterministic fallbackKhông dùng json.loads() trần như lớp bảo vệ duy nhất.
2. Contract validation hiện hành
Các Pydantic model chính đặt extra="forbid". Hệ quả:
- client gửi thêm
score,masteryhoặcevidence_confidencetrong answer payload bị từ chối; - câu hỏi trả cho client không chứa
expected_answerhoặc rubric; not_assessed/unverifiedkhông được mang mastery;partial/verifiedphải có mastery, confidence và evidence IDs;question_bank_versionphải có khi kết luận dựa trên evidence;generated_disclaimerkhông được rỗng.
3. Server-authoritative fields — trường do server làm chủ
Client không được quyết định:
question order
expected answer
rubric
score
misconception severity
mastery
evidence confidence
diagnostic status
Need / Importance / Urgency
Priority score / rank
Capacity ratio / status4. LLM usage — ba đường đang bật
| Đường | Trạng thái | Ai được ghi |
|---|---|---|
Rubric-AI cho high_information | Mở 2026-08-29 (ADR 15) | validate_rubric_proposal |
| Priority advisory (Agent 3) | Mở (ADR 10), narrative-only | advisory_guardrails.py |
| Planner advisory (Agent 4) | ĐÓNG — không nằm trong request path (ADR 11/16) | không ai |
| Study Workspace content | Mở | _validate_and_normalize_study_content |
Mọi đường đều dùng chung một LLM factory: get_llm() (src/services/llm.py) gọi
NVIDIA NIM API với temperature=0.0 và model đọc động từ NVIDIA_LLM_MODEL
(ví dụ nemotron-3-nano-30b-a3b, nemotron-3-super-120b-a12b). Key LLM và key
embedding là hai biến môi trường riêng, không fallback cho nhau.
Trình tự parse hiện hành, đúng theo thứ tự trong src/services/llm.py:
raise_if_truncated # response bị cắt ≠ response rác
→ parse_json_response # chịu được ```json fence và text bao quanh
→ cắt từ "{" đầu tới "}" cuối
→ escape_stray_backslashes # repair CÚ PHÁP, chỉ sau khi parse chặt vỡ
→ Pydantic model validate
→ guardrail validator: nhận hoặc TỪ CHỐI
→ bị từ chối → baseline tất định nguyên khốiescape_stray_backslashes chỉ nhân đôi các \ không mở đầu một escape JSON hợp
lệ — ký hiệu toán kiểu LaTeX (\Theta, \log) trong nội dung tiếng Việt từng
làm cả một đề xuất đúng bị đọc thành rác. Nó không phải repair ở tầng
guardrail: không chữ nào trong đề xuất bị sửa nghĩa. Hybrid §2 luật 1 vẫn nguyên —
validator từ chối, không bao giờ viết lại.
parse_json_response thất bại tường minh bằng ValueError, không trả dict
rỗng: nuốt lỗi ở đây sẽ thành điểm 0 oan cho người học.
5. Fail closed và fallback
- Fail closed — đóng khi lỗi: thiếu tín hiệu ưu tiên thì không rank.
- Fallback — phương án dự phòng: Study Workspace có thể dùng nội dung tối thiểu hoặc dataset frontend.
- No fabrication — không bịa dữ liệu: không thay mastery/deadline/importance thiếu bằng 0.
6. Determinism — tính tất định
Agent 2 MCQ, toàn bộ phần chấm điểm của Agent 3 và toàn bộ allocator của Agent 4
không dùng randomness hoặc LLM. Bất biến bao trùm: đặt
ai_enrichment_enabled = false thì hệ thống vẫn hoạt động đầy đủ và cho kết quả
giống từng byte với baseline — kill switch không phải chế độ suy giảm.
Để tái tạo kết quả, request Agent 3 nên truyền evaluated_at; nếu bỏ trống, server
dùng thời gian hiện tại, làm urgency thay đổi giữa hai lần gọi. Lượt gọi thứ hai lấy
advisory phải dùng lại đúng evaluated_at của lượt đầu, nếu không narrative sẽ
mô tả một Priority Set khác. Agent 4 không đọc đồng hồ server: mốc duy nhất là
plan_start_date trong request.
7. Disclaimer
Hai contract chẩn đoán và ưu tiên đều phải mang generated_disclaimer. Disclaimer
không biến kết quả sai thành đúng; nó làm rõ đây là khuyến nghị hỗ trợ học tập,
không phải đánh giá hay lịch chính thức của giảng viên.
8. Thuật ngữ
- Schema-constrained — bị ràng buộc bởi schema: output chỉ được có hình dạng đã định nghĩa.
- Validation — kiểm định: kiểm tra kiểu, miền giá trị và bất biến nghiệp vụ.
- Retry — thử lại: gọi lại khi output sai.
- Repair — sửa cấu trúc: đưa output về schema rồi validate lại.
- Fallback — dự phòng: kết quả an toàn khi luồng chính thất bại.
- Server-authoritative — server có thẩm quyền: client không thể ghi đè.
9. Tham chiếu code
src/agents/schemas/knowledge_state.pysrc/agents/schemas/diagnostic_io.pysrc/agents/schemas/learning_priority.pysrc/agents/nodes/study_generator.pysrc/agents/diagnostic/guardrails.pysrc/agents/priority/advisory_guardrails.pysrc/services/llm.py