AIThink là ứng dụng web AI tiên tiến, được thiết kế để trở thành người đồng hành đáng tin cậy cho học sinh, sinh viên và những ai đam mê toán học. Sử dụng công nghệ Chain of Thought reasoning từ mô hình DeepSeek-R1:8b, AIThink không chỉ đưa ra đáp án mà còn giải thích chi tiết từng bước suy luận, giúp người học hiểu sâu bản chất của vấn đề.
Ứng dụng được triển khai trên Mac mini M2 với Ollama, kết hợp hệ thống queue thông minh để xử lý đồng thời tối đa 8 requests, đảm bảo trải nghiệm mượt mà ngay cả khi có nhiều người dùng cùng lúc. Hỗ trợ hiển thị công thức toán học với LaTeX (KaTeX), vẽ hình minh họa SVG tự động, và streaming real-time qua WebSocket để người dùng thấy AI "suy nghĩ" từng bước.
🌐 Demo: aithink.truyenthong.edu.vn (Cloudflare Tunnel)
Điểm đặc biệt:
- 🧠 Giải thích logic toán học từng bước như một gia sư thật
- ⚡ Real-time streaming với typing animation tự nhiên
- 📊 Hệ thống queue thông minh, hiển thị trạng thái online/queued
- 🎨 Tự động vẽ hình minh họa cho bài toán hình học
- 🔒 GPU auto-abort khi user disconnect để tiết kiệm tài nguyên
- 📱 Responsive design, hoạt động tốt trên mobile
| Thành phần | Công nghệ | Mục đích |
|---|---|---|
| Mô hình Cơ sở | deepseek-r1:8b (qua Ollama) |
Cung cấp khả năng suy luận và giải toán cốt lõi. |
| Backend API | Node.js (Express/NestJS) | Xử lý yêu cầu người dùng, giao tiếp với Ollama, quản lý Hàng đợi (Queue). |
| Hàng đợi | Redis (hoặc một giải pháp Node.js Queue đơn giản) | Quản lý tải, giới hạn số lượng yêu cầu đồng thời tới Ollama để bảo vệ Mac mini. |
| Frontend | React/Vue (với TypeScript) | Xây dựng giao diện người dùng tương tác, thân thiện. |
| Render Toán học | KaTeX/MathJax | Hiển thị công thức toán học đẹp mắt, hỗ trợ input và output LaTeX. |
| Triển khai | Mac mini M2 (Headless) + Cloudflare Tunnel | Hosting cục bộ an toàn và truy cập toàn cầu. |
aithink/
├── backend/
│ ├── src/
│ │ ├── api/
│ │ │ └── chat.js (Xử lý request chat, gọi Queue)
│ │ ├── services/
│ │ │ ├── ollamaService.js (Giao tiếp với Ollama API)
│ │ │ ├── queueService.js (Quản lý hàng đợi Redis/Local)
│ │ │ └── promptTemplates/
│ │ │ └── system_tutor_role.txt (File ràng buộc AI - Dễ dàng cập nhật)
│ │ ├── middleware/
│ │ │ └── errorHandler.js (Xử lý lỗi)
│ │ └── server.js (Khởi tạo server Node.js + WebSockets)
│ ├── package.json
│ ├── .env.example
│ └── .env (chưa theo dõi)
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── ChatInterface.vue/tsx
│ │ │ ├── MathInput.vue/tsx (Hỗ trợ nhập LaTeX)
│ │ │ ├── MathRenderer.vue/tsx (Hiển thị KaTeX)
│ │ │ └── QueueStatus.vue/tsx (Hiển thị trạng thái hàng đợi)
│ │ ├── pages/
│ │ │ └── Index.vue/tsx
│ │ ├── styles/
│ │ │ └── main.css
│ │ └── main.ts
│ ├── package.json
│ ├── vite.config.js
│ └── index.html
├── docker-compose.yml (Tùy chọn: để chạy Redis)
├── .gitignore
└── README.md
- Cài đặt Ollama: Tải và cài đặt Ollama trên Mac mini.
- Tải mô hình: Chạy lệnh sau trong Terminal để tải mô hình Deepseek-R1:
ollama pull deepseek-r1:8b
- Xác minh API: Đảm bảo Ollama đang chạy và API có thể truy cập tại
http://127.0.0.1:11434.
-
Cài đặt dependencies: Di chuyển vào thư mục
backendvà chạy:npm install express axios ioredis # (ioredis cho hàng đợi) -
Định hình vai trò trợ lý (
backend/src/services/promptTemplates/system_tutor_role.txt):File này là cốt lõi để đảm bảo AI hoạt động như một gia sư chuyên nghiệp.
Bạn là một trợ lý toán học chuyên nghiệp và kiên nhẫn. Nhiệm vụ của bạn là hỗ trợ người học bằng cách cung cấp lời giải chi tiết theo từng bước logic. Hướng dẫn chính: 1. Trả lời luôn ở định dạng Markdown. 2. Phân tích bài toán, sau đó đưa ra lời giải **từng bước** (Chain of Thought). 3. **Không bao giờ** chỉ đưa ra đáp án cuối cùng. 4. Trình bày tất cả các công thức toán học và biểu thức phức tạp bằng định dạng LaTeX, bao quanh bởi dấu `$inline$` hoặc `$$display$$`. 5. Ví dụ: "Áp dụng công thức $a^2 + b^2 = c^2$..." -
Cơ chế Hàng đợi (Queue):
- Sử dụng WebSockets (ví dụ: Socket.io) để kết nối giữa Backend và Frontend.
- Khi yêu cầu đến,
queueService.jssẽ kiểm tra số lượng yêu cầu đang được xử lý. - Nếu vượt quá giới hạn (ví dụ: 5), yêu cầu được thêm vào hàng đợi. WebSockets sẽ thông báo cho người dùng về vị trí hiện tại của họ.
- Khi một yêu cầu được xử lý xong, yêu cầu tiếp theo trong hàng đợi sẽ được kích hoạt.
- Cài đặt dependencies: Di chuyển vào thư mục
frontendvà chạy:npm install react vue typescript vite katex socket.io-client
- Xử lý Giao diện:
- Sử dụng KaTeX/MathJax để render output LaTeX từ AI.
- Triển khai Streaming (truyền tải từng phần dữ liệu) từ Ollama qua Backend sử dụng WebSockets để hiển thị trên giao diện người dùng, mang lại trải nghiệm chat mượt mà.
- Thêm QueueStatus component để hiển thị số lượng yêu cầu đang chờ xử lý.
- Các thư viện cần thiết:
katex: Render công thức toán họcsocket.io-client: Kết nối WebSocketaxios: Gửi request HTTP
- Cài đặt
cloudflared: Cài đặt Cloudflare Tunnel trên Mac mini của bạn.brew install cloudflare/cloudflare/cloudflared cloudflared login
- Tạo Tunnel: Tạo một tunnel mới và định cấu hình để trỏ tên miền
aithink.truyenthong.edu.vntới cổng mà Node.js Backend của bạn đang chạy (ví dụ:http://localhost:3000).cloudflared tunnel create aithink cloudflared tunnel route dns aithink aithink.truyenthong.edu.vn
- Cấu hình: Tạo file
~/.cloudflared/config.ymlvới nội dung:tunnel: aithink credentials-file: /Users/mac/.cloudflared/<tunnel-id>.json ingress: - hostname: aithink.truyenthong.edu.vn service: http://localhost:3000 - service: http_status:404
- Lợi ích: Điều này cho phép bạn công khai ứng dụng mà không cần mở cổng trên router, đảm bảo an toàn cho mạng nội bộ.
- Chat Hỗ trợ Toán học: Sử dụng Deepseek-R1 cho khả năng suy luận toán học tiên tiến.
- Giao diện Tương tác: Hỗ trợ người dùng nhập liệu bằng cú pháp LaTeX.
- Hiển thị Chuyên nghiệp: Render công thức toán học bằng KaTeX/MathJax.
- Hàng đợi Tải (Load Queue): Quản lý tải hệ thống để đảm bảo Mac mini không bị quá tải, cung cấp thông báo trạng thái hàng đợi cho người dùng.
- Streaming Response: Hiển thị câu trả lời từ từ để cải thiện trải nghiệm người dùng.
- Triển khai An toàn: Sử dụng Cloudflare Tunnel để công khai ứng dụng mà không cần mở cổng.
| Rủi ro / Hạn chế | Mức độ | Giải pháp |
|---|---|---|
| Tài nguyên hệ thống (Mac mini M2) | Trung bình | Cần theo dõi sử dụng CPU/RAM. Deepseek-R1:8b đòi hỏi ~8GB RAM. Giới hạn số request đồng thời (2-5 yêu cầu). |
| Thời gian phản hồi chậm | Trung bình | Deepseek-R1 có thể mất 10-30 giây/câu hỏi. Cân nhắc sử dụng mô hình nhẹ hơn nếu cần (ví dụ: llama2:7b). |
| Độ tin cậy của máy chủ (24/7) | Cao | Cần script khởi động tự động, monitoring, và restart policy cho Ollama. |
| Xác thực người dùng | Cao | Chưa có - Cần thêm JWT/OAuth để bảo vệ API. |
| Quản lý dữ liệu đầu vào | Cao | Cần validate và sanitize input từ người dùng để tránh prompt injection. |
| Chi phí Cloudflare | Thấp | Tunnel miễn phí, nhưng cần account Cloudflare với tên miền. |
- Mac mini M2 (hoặc máy tính tương đương) với ít nhất 16GB RAM
- macOS 12+
- Node.js v18+
- Ollama v0.1+
- Redis (hoặc sử dụng queue cục bộ)
- Cloudflare account (với tên miền đã xác thực)
- Thêm xác thực: Implement JWT hoặc OAuth2 cho API.
- Rate limiting: Giới hạn số request/IP/hour để tránh lạm dụng.
- Input validation: Sanitize các query của người dùng để tránh prompt injection attacks.
- Logging & Monitoring: Theo dõi các request, error, và tài nguyên hệ thống.
- HTTPS: Đảm bảo tất cả traffic qua Cloudflare Tunnel được mã hóa.
- Backup: Sao lưu cấu hình Cloudflare Tunnel và prompt templates.
- Thiết lập Ollama + Deepseek-R1
- Xây dựng Backend API (chat endpoint + queue system)
- Xây dựng Frontend (chat UI + KaTeX rendering)
- Triển khai Cloudflare Tunnel
- Thêm xác thực người dùng
- Implement rate limiting & input validation
- Thêm monitoring & logging
- Test performance dưới tải cao
- Lưu lịch sử chat cho người dùng
- Thêm các mô hình AI khác