Thiết kế và implement một hệ thống xử lý tài liệu thông minh — từ ingestion đến retrieval và generation.
Vidtory đang build các AI SaaS product cho mảng media & e-commerce. Một trong những bài toán cốt lõi là giúp các SME tìm kiếm và khai thác thông tin từ kho tài liệu nội bộ của họ — product spec, hợp đồng, catalog — thay vì phải mò mẫm từng file.
Challenge này mô phỏng một phần bài toán đó. Bạn sẽ build một RAG (Retrieval-Augmented Generation) pipeline hoàn chỉnh: upload tài liệu, xử lý + embedding, lưu vector, và trả lời câu hỏi dựa trên nội dung tài liệu — với nguồn trích dẫn rõ ràng.
Không có đáp án duy nhất. Chúng tôi quan tâm đến cách bạn tư duy, research, vibe code và tổ chức hệ thống.
Hệ thống bao gồm hai luồng chính: Ingestion Pipeline (xử lý và lưu trữ tài liệu) và Query Pipeline (truy vấn và tổng hợp câu trả lời).
Đây là gợi ý, không phải yêu cầu bắt buộc. Bạn có thể thay thế bất kỳ layer nào nếu có lý do chính đáng — hãy giải thích trong README.
Nhận file upload (PDF, DOCX, TXT). Validate format, extract raw text bằng parser phù hợp. Lưu file gốc vào storage và metadata vào DB (tên file, size, mime type, created_at, status).
Chia văn bản thành các chunks nhỏ. Gợi ý: chunk_size ~500 tokens, overlap ~50 tokens. Lưu ý giữ nguyên ngữ cảnh đoạn — tránh cắt giữa câu. Đây là bước ảnh hưởng lớn đến chất lượng retrieval.
Gọi Embedding API (OpenAI text-embedding-3-small hoặc Gemini) cho từng chunk. Lưu vector (1536-dim) cùng với chunk_id, document_id, chunk_index, và nội dung text gốc vào vector store.
Khi nhận query, embed câu hỏi rồi thực hiện cosine similarity search trong vector store. Lấy top-K chunks (K = 3–5). Filter theo document_id nếu user muốn search trong file cụ thể.
Build prompt: "Based on the following context, answer the question. If the answer is not in the context, say so." + inject các chunks retrieved. Gọi LLM (GPT-4o-mini hoặc Gemini Flash). Trả về answer kèm danh sách chunk sources (document name, page, snippet).
Đây là interface contract tối thiểu. Bạn có thể thêm fields hoặc endpoints nếu cần — miễn là backward compatible.
data: {"token": "..."}
| Tiêu chí | Mô tả | Điểm |
|---|---|---|
| System Thinking | Kiến trúc rõ ràng, tách biệt concerns, dễ mở rộng | |
| Code Quality | TypeScript types, error handling, clean structure, naming | |
| RAG Quality | Chunking strategy, retrieval accuracy, citation quality | |
| Documentation | README chất lượng, giải thích quyết định kỹ thuật | |
| Delivery | Demo chạy được, setup dễ, UX có thể dùng |
Không bắt buộc — nhưng nếu bạn có thời gian hoặc hứng thú, đây là những điểm cộng đáng kể.
Stream answer từng token realtime thay vì chờ response hoàn chỉnh.
Kết hợp vector search với full-text search (BM25) để tăng accuracy.
Lưu conversation history, support multi-turn với context từ lượt trước.
Xử lý tốt tài liệu tiếng Việt — tokenize, chunking phù hợp ngữ pháp.
Log latency, token usage, retrieval score. Có thể là simple table trong DB.
JWT auth đơn giản. Mỗi user chỉ thấy documents của mình (multi-tenant).
✅ Được phép: Dùng tất cả AI tools (Cursor, Claude Code, Copilot, ChatGPT...). Đây là môi trường AI-first — chúng tôi khuyến khích điều này.
✅ Được phép: Dùng bất kỳ thư viện open-source nào. LangChain, LlamaIndex, Haystack đều ổn.
⚠️ Lưu ý: Bạn cần hiểu code mình viết. Reviewer sẽ hỏi về các quyết định kỹ thuật trong buổi interview. Vibe code thì ok, nhưng không phải copy-paste không hiểu.
⚠️ Lưu ý: Không cần hoàn hảo 100%. Một hệ thống 80% hoàn thiện nhưng có README giải thích tốt "trade-offs và next steps" còn tốt hơn một system hoàn hảo nhưng không documented.
Gửi link GitHub repo + link demo về địa chỉ email bên dưới kèm subject [Challenge] Tên của bạn.
gửi bài → vidtory.ai@gmail.com