Câu chuyện mở bài (SCQA)
Mỗi Unit và mỗi Lesson mở bằng một câu chuyện bốn đoạn. Đây là chỗ người học make meaning trước khi được dạy: họ gặp một người thật đang mắc đúng cái lỗi mà bài sắp chữa.
Người học không thấy bốn cái nhãn Situation / Complication / Question / Answer, họ chỉ đọc bốn đoạn liền mạch. Nhãn học thuật ở đầu mỗi đoạn phá đúng cái mạch truyện đang cần, và cũng là phơi tên mô hình giảng dạy ra.
Bốn đoạn
| Đoạn | Việc của nó | Trần |
|---|---|---|
| Tình huống | Dựng cảnh, có người có việc | tối đa 3 câu · 120–340 ký tự |
| Nút thắt | Chuyện xấu đi ĐÚNG VÌ nhân vật dính một hiểu lầm phổ biến | tối đa 3 câu · 80–300 ký tự |
| Câu hỏi | Câu chính nhân vật tự bật ra | đúng 1 câu · 15–180 ký tự |
| Lời giải | Khoảnh khắc nhận ra, rồi làm khác đi, rồi kết quả đổi | tối đa 4 câu · 100–460 ký tự |
Cả bốn đoạn cộng lại đọc trong khoảng một phút.
Nhân vật và bối cảnh do MÃ giao, không để mô hình tự nghĩ
Đây là luật quan trọng nhất, và nó ra đời từ một lỗi thật: thả tự do thì ba unit liền nhau đều mở bằng "Thảo dẫn buổi họp", mô hình chép luôn cái tên trong ví dụ của prompt. Đọc bài thứ hai là nhận ra công thức.
Nay castFor(id) băm mã của unit hoặc bài để chọn ra một cặp cố định:
Nhân vật, lấy từ thế giới Conan, đúng tên trường:
Ran · Mori · Agasa · Shinichi · Conan · Sonoko · Heiji · Kogoro · Haibara · Genta · Ayumi · Mitsuhiko
Bối cảnh, công ty có thật, ai cũng biết họ bán gì:
Starbucks Việt Nam · Techcombank · Vinamilk · Apple Store · Honda Việt Nam · Thế Giới Di Động
Bối cảnh phải dùng đúng thứ công ty đó thật sự làm: Starbucks bán cà phê ở cửa hàng, Techcombank làm ngân hàng, Vinamilk làm sữa, Apple Store bán iPhone và MacBook, Honda bán ô tô xe máy, Thế Giới Di Động bán điện thoại.
Cấm bối cảnh chung chung kiểu "một công ty phần mềm", "một doanh nghiệp", chúng làm mọi câu chuyện giống nhau và không gợi được gì cụ thể trong đầu người đọc.
Vì băm theo mã đối tượng nên chạy lại vẫn ra cùng nhân vật, còn hai unit khác nhau thì gần như chắc chắn khác.
Tám luật chốt bằng mã
Chữ trong prompt không giữ được, đã thử nhiều lần và mỗi lần đều thua. Tám luật dưới đây kiểm bằng mã trước khi ghi vào D1, vi phạm là sinh lại (tối đa 4 lượt, mỗi lượt được cho biết lượt trước hỏng vì gì).
| Luật | Chặn gì | Đã bắt được gì thật |
|---|---|---|
| Đúng nhân vật đã giao | Mô hình quay về cái tên nó thích | , |
| Đúng bối cảnh đã giao | Mô hình dồn hết chuyện về công ty nó thích | Chỉ ép khi bối cảnh là thương hiệu (một token dài viết hoa); bối cảnh mô tả thì được diễn đạt lại |
| Không kể lại tình huống | Lời giải hoặc nút thắt kể lại từ đầu | So trùng chuỗi 9 từ, bỏ qua tên và bối cảnh đã giao |
| Có khoảnh khắc đổi cách làm | Lời giải chỉ kể tiếp bối cảnh | Thiếu mọi từ như "nhận ra", "thay vì", "hoá ra" |
| Không phải đoạn dựng cảnh | Lời giải mở bằng <Tên> đang… | Mô hình viết ngược: lời giải thành đoạn mở |
| Không tên giả lập | Nguyễn Văn A, ông C | Ranh giới từ phải dùng lookahead Unicode, và chữ nhãn [A-E] phải viết hoa THẬT, bật /i cho cả regex thì "chị e rằng" bị bắt oan |
| Không mở bằng cụm công thức | "Cách nghĩ cũ…", "Vấn đề ở chỗ…" | 93/93 lời giải từng mở bằng đúng một cụm |
| Không đứt giữa câu | Chạm trần token | Một lời giải kết thúc bằng "chứ không chỉ là" |
Thêm hai luật chung cho mọi nội dung: không dấu gạch ngang dài (cắt ngay ở đường ghi, không chỉ dặn trong prompt), và không lẫn ký tự Hán/Nhật/Hàn giữa câu tiếng Việt (chuyện này xảy ra thật).
Ba chi tiết cài đặt đáng nhớ, đều từ lỗi thật:
- Toàn bộ luật sống ở một hàm duy nhất
scqaViolations()(content-rules.ts): máy sinh ném vi phạm đầu tiên để retry kèm lý do, máy kiểm ghi tất cả thành finding, cùng một cài đặt nên hai cửa không thể trôi lệch nhau như thời mỗi bên một bản chép tay. - Phép đếm câu phải gỡ dấu ngăn nghìn trước: "1.000.000 đồng" mà đếm mỗi dấu chấm một câu thì văn đúng cũng vỡ trần số câu.
- Luật "câu đầu phải có tên riêng" kiểm bằng
\p{Lu}thật, dải[A-ZÀ-Ỹ]cũ phủ luôn chữ thường có dấu nên luật từng chết im lặng, câu nào cũng qua.
Khoá có course_metadata.scenes thì bối cảnh lấy từ scenes của chính khoá đó (quầy giao dịch, buổi họp duyệt ngân sách…) thay cho danh sách công ty chung, bối cảnh đúng lĩnh vực thắng bối cảnh chung.
Cấm tuyệt đối trong lời giải
Mở đầu bằng những cụm phân tích, "Cách nghĩ cũ…", "Vấn đề ở chỗ…", "Điều quan trọng là…", "Bài học ở đây là…". Hãy mở bằng chính nhân vật và việc họ làm.
Sinh lại
POST /authoring/units/:unitId/scqa # SCQA cấp Unit
POST /authoring/concepts/:conceptId/scqa # SCQA cấp Lesson, giữ nguyên phần còn lại của bàiCả hai chỉ chạy khi TEST_MODE=true.