Xin chào.
Tôi xin giới thiệu một ứng dụng học tập trên iOS do tôi làm như một dự án cá nhân.
Lý do tạo ra
Khi hỏi ChatGPT hoặc Claude về các khái niệm Swift, bạn sẽ nhận được ngay câu trả lời gọn gàng.
Nhưng sau khi nhiều lần trải nghiệm việc vài ngày sau gặp lại cùng khái niệm đó mà đầu óc trống rỗng, tôi lại càng cảm nhận rõ rằng “học bằng cách nhận đáp án” và “học bằng cách tự tìm ra đáp án” là hai việc khác nhau.
Vì vậy, tôi đã thử hiện thực hóa phương pháp giảng dạy Socrates — tức là thay vì đưa ra đáp án, sẽ đặt câu hỏi để người học tự ngộ ra — thành một gia sư AI.
Thực ra đây là một ứng dụng được cố tình làm cho bất tiện.
Đây là ứng dụng như thế nào
- 50 khái niệm Swift (từ nhập môn → nâng cao, bao gồm async/await, Actor, Associated Types, v.v.)
- Dù người dùng đặt câu hỏi, AI cũng không đưa ra đáp án. Thay vào đó, nó dùng câu hỏi ngược để dẫn dắt tư duy
- Cấu trúc mỗi ngày một khái niệm, đạt được “mastery” thông qua đối thoại
- Trình soạn thảo tích hợp cho phép nhập trực tiếp mã Swift trong lúc trò chuyện (tô sáng cú pháp + tự động thụt lề)
- Lịch sử học tập (dạng cỏ), widget, dark mode
Tech stack
- iOS: SwiftUI + SwiftData, MVVM + @Observable, 0 phụ thuộc bên ngoài
- Backend: Node.js trên Vercel Functions (SSE streaming)
- LLM: Claude Haiku 4.5 qua OpenRouter. Đã trừu tượng hóa provider nên có thể thay bằng Gemini/OpenAI
- Curriculum: 50 concept dựa trên JSON, dùng prompt engineering phía server để ép ràng buộc “đặt câu hỏi thay vì đưa đáp án”
Trạng thái hiện tại
- Không đăng ký/đăng nhập — hiện chỉ lưu cục bộ trên thiết bị, dùng ẩn danh
- Không quảng cáo — vì tôi thấy không hợp với tông của một ứng dụng học tập
- Không thanh toán — hiện vẫn đang ở giai đoạn kiểm chứng nền tảng. Có cân nhắc mô hình thuê bao trong tương lai
Giới hạn hiện tại / điều đang suy nghĩ
- Có phản hồi rằng khó dùng khi đang trên đường đi làm, nên tôi đang thiết kế “chế độ 5 phút” để thời lượng phiên học dễ dự đoán hơn
- Phản hồi đầu tiên p99 khoảng 9 giây (theo số liệu quan sát từ OpenRouter). Mục tiêu ở phiên bản tiếp theo là 3–4 giây nhờ áp dụng prompt caching
- Chi phí token trên mỗi người dùng ở mức $0.005/DAU. Cần xem xét lại khi mở rộng quy mô
3 bình luận
Điều khiến tôi ngạc nhiên nhất khi làm app này là để tạo ra một "AI không đưa đáp án", tôi đã đưa các ràng buộc vào system prompt (phán định mức độ thành thạo dựa trên token
[MASTERY]), nhưng LLM cứ liên tục phá vỡ các ràng buộc đó, nên tôi đã phải dành nhiều thời gian cho prompt engineering hơn dự kiến.So với Claude Haiku, Gemini Flash tuân thủ ràng buộc này tốt hơn, nhưng ngược lại độ sâu của câu hỏi thì Claude tốt hơn. Hiện tại tôi đang dùng tổ hợp Claude + tinh chỉnh prompt.
Nếu ai từng có kinh nghiệm thiết kế prompt kiểu "kiềm chế LLM" tương tự, rất mong được chia sẻ bí quyết 🙏
Khi gán role cho agent và học bằng cách trực tiếp trò chuyện với agent, so với việc học bằng ứng dụng này thì có điểm khác biệt nào không?
Tôi cũng đã thử cả GPT lẫn Claude với custom prompt, nhưng làm vài ngày thì cuối cùng cũng thành kiểu "à thôi cứ nói đáp án luôn đi!"... Với lại càng dùng lâu thì những tình huống bị lộ đáp án lại xuất hiện khá thường xuyên.
Vì vậy cảm giác nó giống tra cứu hơn là học.
Ứng dụng tôi làm thì system prompt và phần đánh giá mức độ thành thạo nằm ở phía server nên chuyện đó bớt bị nới lỏng hơn. Thời điểm kết thúc phiên cũng được cố định, nên tôi nghĩ khá tiện để dùng lúc đi làm buổi sáng.
Thật ra đúng như bạn nói, bản thân phương pháp này hoàn toàn có thể làm được chỉ với GPT hay Claude. Nhưng bạn có thể hiểu đây là một format phù hợp với những người như tôi, một mình thì không thể duy trì đều đặn! :)