Giới thiệu dự án

Trong bối cảnh du lịch tự túc ngày càng phát triển tại Việt Nam — với hơn 90% người Việt ưa thích tự tổ chức hành trình thay vì đặt tour qua công ty truyền thống — một khoảng trống thị trường đáng kể đang tồn tại: thiếu một nền tảng trung gian uy tín, được xây dựng cho người Việt, giúp kết nối người có đam mê và kinh nghiệm với những du khách muốn trải nghiệm thực tế. Khóa luận tốt nghiệp của sinh viên Trần Minh Phát (MSSV: 17520882), Trường Đại học Công nghệ Thông tin — ĐHQG TP. HCM, giải quyết trực tiếp bài toán này.

Problem statement cụ thể: Các nền tảng phổ biến như TripAdvisor và Expedia chủ yếu phục vụ khách du lịch quốc tế, thiếu ngữ cảnh văn hóa Việt Nam và không tích hợp các cơ chế tăng tương tác người dùng dài hạn. Người tổ chức hoạt động trải nghiệm trong nước không có kênh phân phối hiệu quả, trong khi người tham gia phải tự tìm kiếm qua mạng xã hội rời rạc.

Mục tiêu dự án (đánh số theo độ ưu tiên):

  1. Xây dựng nền tảng web kết nối hai nhóm người dùng: Người tổ chức trải nghiệmNgười tham gia trải nghiệm
  2. Tích hợp Hệ thống đề xuất thông minh sử dụng Collaborative Filtering và Content-based Filtering
  3. Ứng dụng cơ chế Gamification (Game hóa) để tăng tỉ lệ giữ chân người dùng
  4. Xây dựng giao diện thân thiện, hướng đến người dùng Việt Nam
  5. Hỗ trợ thanh toán trực tuyến, xác thực số điện thoại và quản lý ảnh tích hợp

Technology stack:

  • Database: MongoDB (NoSQL document store)
  • Back-end: Node.js + Express.js + Mongoose ODM
  • Front-end: ReactJS + Material UI + TailwindCSS
  • Third-party services: Cloudinary (lưu ảnh), Vonage/Vongo (OTP SMS), Stripe (thanh toán), Akin (Collaborative Filtering engine)
  • Maps: Mapbox APIs

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát được tiến hành trên mẫu người dùng đại diện tại Việt Nam nhằm đánh giá nhu cầu thực tế. Kết quả khảo sát cho thấy đa số người tham gia đều cảm thấy hứng thú với các hoạt động trải nghiệm nhưng gặp khó khăn trong việc tìm kiếm thông tin.

So sánh các nền tảng hiện có:

Tiêu chí TripAdvisor Expedia Nền tảng đề xuất
Ngôn ngữ giao diện Tiếng Anh Tiếng Anh Tiếng Việt
Đối tượng mục tiêu Quốc tế Quốc tế Người Việt Nam
Hệ thống đề xuất Có (cơ bản) Có (cơ bản) CF + CBF kết hợp
Gamification Không Không Điểm tích lũy + Danh hiệu
Kết nối cộng đồng Hạn chế Hạn chế Tính năng mạng xã hội
Thanh toán nội địa Không tối ưu Không tối ưu Stripe tích hợp

Phân tích yêu cầu theo MoSCoW:

  • Must have: Đăng ký/đăng nhập, quản lý trải nghiệm, đặt chỗ, thanh toán, thông báo
  • Should have: Hệ thống đề xuất, tìm kiếm theo địa điểm/thời gian, đánh giá & bình luận
  • Could have: Gamification (điểm, danh hiệu), bảng điều khiển thống kê cho host
  • Won't have (V1): Mobile app native, AR/VR experiences

Thiết kế hệ thống

Kiến trúc hệ thống theo mô hình Client-Server 3 tầng:

  • Presentation Layer: ReactJS SPA (Single Page Application)
  • Application Layer: RESTful API với Express.js
  • Data Layer: MongoDB với Mongoose ODM

Thiết kế cơ sở dữ liệu — các Collection chính:

Collection Thuộc tính chính Mục đích
Experiences title, theme, location, price, duration, language Lưu thông tin trải nghiệm
Activities experienceId, date, slots, status Quản lý lịch hoạt động
Users email, phone, role, points Tài khoản người dùng
Profiles userId, avatar, bio, badges Hồ sơ cá nhân
Receipts userId, activityId, paymentStatus Hóa đơn đặt chỗ
Reviews userId, experienceId, rating, comment Đánh giá trải nghiệm
Notifications userId, type, message, isRead Hệ thống thông báo
Themes name, description, badgeImage Danh mục chủ đề

API Design (REST endpoints):

GET    /api/experiences          # Danh sách trải nghiệm (filter, pagination)
GET    /api/experiences/:id      # Chi tiết trải nghiệm
POST   /api/experiences          # Tạo trải nghiệm mới (host)
PUT    /api/experiences/:id      # Cập nhật (host)
DELETE /api/experiences/:id      # Xóa (host)
POST   /api/activities/:id/book  # Đặt chỗ
POST   /api/reviews              # Gửi đánh giá
GET    /api/recommendations/:uid  # Lấy danh sách đề xuất
GET    /api/users/:id/profile    # Xem hồ sơ

Phân quyền hệ thống: Hệ thống có 3 role chính — Admin (quản trị toàn hệ thống), Host (người tổ chức), Guest (người tham gia).

Methodology

Dự án được thực hiện theo phương pháp phát triển lặp (Iterative Development) kết hợp nguyên tắc Agile, chia thành các giai đoạn:

  1. Giai đoạn 1 (Tuần 1–3): Phân tích đề tài, khảo sát nhu cầu, nghiên cứu nền tảng tương tự
  2. Giai đoạn 2 (Tuần 4–6): Thiết kế hệ thống — use-case, sơ đồ tuần tự, sơ đồ lớp, ERD
  3. Giai đoạn 3 (Tuần 7–12): Phát triển core features (auth, CRUD trải nghiệm, booking)
  4. Giai đoạn 4 (Tuần 13–16): Tích hợp Recommendation System và Gamification
  5. Giai đoạn 5 (Tuần 17–18): Testing, bug fix, hoàn thiện UI

Implementation và kết quả

Development process

Hệ thống đề xuất — Collaborative Filtering với thư viện Akin:

Thư viện Akin (open source, Node.js) được tích hợp vào back-end để triển khai Collaborative Filtering. Thuật toán hoạt động theo các bước:

  1. Thu thập hành vi người dùng: Ghi nhận khi người dùng "yêu thích" hoặc "đánh giá" một trải nghiệm
  2. Xây dựng Utility Matrix: Ma trận người dùng × trải nghiệm với giá trị là rating
  3. Chuẩn hóa dữ liệu: Trừ giá trị trung bình đánh giá của mỗi user để tạo normalized utility matrix, lưu dưới dạng sparse matrix để tối ưu bộ nhớ
  4. Tính Cosine Similarity: Đo mức độ tương quan giữa hai người dùng u₁, u₂:
cosine_similarity(u1, u2) = (u1 · u2) / (||u1|| × ||u2||)
  1. K-Nearest-Neighbor Prediction: Dự đoán rating của user u cho experience i:
predicted_rating(u, i) = mean(u) + 
  Σ [normalized_rating(neighbor, i) × sim(u, neighbor)] /
  Σ |sim(u, neighbor)|

Ví dụ: Với k=2 nearest neighbors, hệ thống xác định 2 người dùng có độ tương quan cao nhất với user hiện tại, rồi dựa vào rating của họ để dự đoán mức độ quan tâm.

Hệ thống đề xuất — Content-based Filtering với TF-IDF:

Mỗi trải nghiệm được biểu diễn như một văn bản gồm tiêu đề, thể loại và nội dung mô tả. Thuật toán TF-IDF (Term Frequency–Inverse Document Frequency) được áp dụng:

// Quy trình xử lý trong Content-based Recommender library
// 1. Tiền xử lý văn bản
const tokens = preprocessText(experience.title + ' ' + experience.content);

// 2. Tính TF (Term Frequency)
// TF(t) = count(t in doc) / total_terms_in_doc

// 3. Tính IDF (Inverse Document Frequency)  
// IDF(t) = log(N / df(t))  -- N: tổng số tài liệu, df(t): số tài liệu chứa t

// 4. Tính TF-IDF vector và chuẩn hóa
// Normalized TF-IDF = TF-IDF / ||vector||

// 5. Tính Cosine Similarity giữa các vector
// cos(A1, A2) ≈ 0.2 (ví dụ từ nghiên cứu)

Cơ chế Gamification triển khai:

Hệ thống Game hóa bao gồm 3 thành phần cốt lõi:

  • Điểm tích lũy (Experience Points): Sau khi hoàn thành một hoạt động, hệ thống quy đổi độ khó của trải nghiệm thành điểm thưởng và cộng vào hồ sơ người dùng (hiển thị qua pop-up thông báo)
  • Danh hiệu (Badges): Khi tích lũy đủ điểm trong một chủ đề (Theme) cụ thể, người dùng được trao danh hiệu tương ứng với chủ đề đó — ví dụ danh hiệu "Người leo núi kỳ cựu" sau khi hoàn thành đủ số điểm ở nhóm chủ đề Outdoor
  • Kết nối cộng đồng: Người dùng có cùng sở thích (cùng theme yêu thích) có thể kết nối với nhau

Testing và validation

Hệ thống được kiểm thử thông qua các kịch bản use-case chính:

Use-case Kết quả Ghi chú
Đăng ký tài khoản ✅ Pass Xác thực OTP SMS qua Vonage
Đăng nhập ✅ Pass JWT token authentication
Tạo trải nghiệm (Host) ✅ Pass Upload ảnh qua Cloudinary
Đặt chỗ + Thanh toán ✅ Pass Stripe payment gateway
Hủy tham gia ✅ Pass Trong thời hạn cho phép
Nhận đề xuất CF ✅ Pass Cần ít nhất 1 hành vi người dùng
Nhận đề xuất CBF ✅ Pass Hoạt động ngay từ đầu (cold start)
Nhận điểm + Danh hiệu ✅ Pass Trigger sau "Hoàn thành tổ chức"

Điểm mạnh của hybrid approach: Content-based Filtering giải quyết vấn đề cold-start (người dùng mới chưa có lịch sử tương tác), trong khi Collaborative Filtering cho kết quả chính xác hơn khi đã có đủ dữ liệu hành vi.

Kết quả đạt được

  • Hoàn thành 100% core features theo kế hoạch
  • ✅ Tích hợp thành công 2 cơ chế đề xuất (Collaborative + Content-based)
  • ✅ Triển khai hệ thống Gamification với điểm, danh hiệu theo chủ đề
  • ✅ Giao diện responsive hỗ trợ đa thiết bị
  • ✅ Tích hợp 4 external services (Cloudinary, Vonage, Stripe, Mapbox)

Đổi mới và đóng góp

1. Hybrid Recommendation Engine cho thị trường Việt Nam

Không như TripAdvisor hay Expedia chỉ sử dụng popularity-based ranking đơn giản, nền tảng này triển khai hybrid recommender kết hợp CF (dựa trên hành vi người dùng tương tự) và CBF (dựa trên nội dung trải nghiệm), cho phép đề xuất cá nhân hóa ngay cả với người dùng mới.

2. Gamification tích hợp vào domain trải nghiệm

Trong khi các ứng dụng du lịch hiện tại chỉ dừng ở mức review và rating thụ động, nền tảng này biến quá trình tham gia trải nghiệm thành hành trình tích điểm có cấu trúc, tương tự mô hình của Duolingo trong giáo dục hay Strava trong fitness — nhưng áp dụng cho lĩnh vực trải nghiệm thực tế (experiential activities).

3. Dashboard phân tích dành cho Host

Host được cung cấp bảng điều khiển với thống kê đặt chỗ, phản hồi từ người tham gia và xu hướng theo thời gian — một tính năng thiếu hoàn toàn trên các nền tảng cạnh tranh trong nước.


Ứng dụng thực tế và triển khai

Các kịch bản sử dụng thực tế:

  • Hướng dẫn viên địa phương tạo tour nấu ăn truyền thống, kết nối với du khách trong nước và quốc tế
  • Nhiếp ảnh gia tổ chức workshop chụp ảnh phong cảnh theo nhóm nhỏ
  • Người có kinh nghiệm leo núi, kayak đăng tải hoạt động trải nghiệm ngoài trời

Yêu cầu triển khai:

  • Node.js v14+, MongoDB Atlas (cloud) hoặc on-premise
  • Environment variables: API keys cho Cloudinary, Vonage, Stripe, Mapbox
  • Frontend: Build ReactJS và serve qua Nginx hoặc Vercel
  • Backend: Deploy trên Heroku, Railway hoặc VPS Linux

Tiềm năng mở rộng:

  • Tích hợp thêm cơ chế Session-based Recommender cho đề xuất theo thời gian thực
  • Mở rộng sang Mobile app (React Native tận dụng lại business logic)
  • Tích hợp Mobile Recommender dựa trên vị trí địa lý (geolocation-based)

Hạn chế và hướng phát triển

Hạn chế kỹ thuật:

  • Collaborative Filtering gặp vấn đề cold-start với người dùng và trải nghiệm mới; hiện được giải quyết bằng Content-based Filtering nhưng chưa có mechanism tự động chuyển đổi
  • Sparse matrix lưu trong MongoDB có thể gặp bottleneck khi số lượng user và experience tăng đến hàng triệu — cần xem xét giải pháp như Apache Spark MLlib ở scale lớn
  • Chưa có cơ chế A/B testing để đánh giá hiệu quả của từng thuật toán đề xuất

Hướng phát triển:

  • Tích hợp Deep Learning (Neural Collaborative Filtering) để cải thiện độ chính xác đề xuất
  • Phát triển Mobile app (iOS/Android) với tính năng push notification và GPS-based discovery
  • Thêm tính năng video preview cho trải nghiệm, tích hợp với Cloudinary video API
  • Xây dựng hệ thống đánh giá host và cơ chế kiểm duyệt nội dung tự động

Đối tượng hưởng lợi

  • Sinh viên CNTT/Hệ thống Thông tin: Đồ án cung cấp mô hình triển khai thực tế của Recommendation System (CF + CBF) bằng Node.js, có thể tham khảo trực tiếp để học về Collaborative Filtering, TF-IDF và Cosine Similarity trong bối cảnh thực tế
  • Lập trình viên back-end: Code pattern rõ ràng với Express.js + MongoDB + Mongoose; cách tích hợp third-party services (Stripe, Cloudinary, Vonage) vào hệ thống sản xuất
  • Product Manager / Startup: Tài liệu use-case, user flow và MoSCoW prioritization là blueprint sẵn dùng cho nền tảng marketplace dạng 2-sided
  • Nhà nghiên cứu: Phương pháp kết hợp Hybrid Recommender với Gamification trong domain trải nghiệm du lịch là hướng nghiên cứu ít được khai thác tại Việt Nam
  • Người tổ chức trải nghiệm (Host): Có thêm kênh tiếp cận khách hàng mà không cần chi phí marketing lớn; dashboard giúp tối ưu hoạt động dựa trên dữ liệu thực

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật để deploy? Node.js v14+, MongoDB v4.4+, tài khoản Cloudinary (free tier đủ cho prototype), Stripe test keys, Vonage API credentials và Mapbox public token. Frontend build với npm run build và deploy static files.

2. Hệ thống đề xuất có giới hạn scale không? Akin library lưu trữ toàn bộ ma trận tương quan trong MongoDB, phù hợp với quy mô vài nghìn người dùng. Khi cần scale lên hàng triệu user, nên xem xét giải pháp distributed như Apache Spark MLlib hoặc AWS Personalize.

3. Tích hợp với hệ thống thanh toán khác (VNPay, MoMo)? Hiện tại chỉ hỗ trợ Stripe. Tích hợp VNPay/MoMo cần thêm adapter layer trong payment module — kiến trúc modular của Express.js cho phép mở rộng mà không ảnh hưởng core logic.

4. Nhu cầu bảo trì và vận hành? Cần monitoring cho MongoDB (Atlas có built-in dashboard), log rotation cho Express server, và định kỳ chạy lại Collaborative Filtering job khi có đủ dữ liệu mới (có thể dùng node-cron để schedule).

5. Chi phí vận hành ước tính?

  • MongoDB Atlas M0 (free): $0/tháng cho prototype
  • Cloudinary free: 25 GB storage + 25 GB bandwidth
  • Heroku Eco: ~$5/tháng cho backend
  • Stripe: 2.9% + $0.30/giao dịch thành công
  • Tổng chi phí cố định: ~$5–15/tháng ở giai đoạn MVP

Kết luận

Khóa luận đã thành công xây dựng một nền tảng web hoàn chỉnh giải quyết bài toán kết nối người tổ chức và người tham gia hoạt động trải nghiệm tại Việt Nam. Điểm nổi bật về mặt kỹ thuật là việc tích hợp Hybrid Recommendation Engine — kết hợp Collaborative Filtering (qua thư viện Akin/Node.js) và Content-based Filtering (qua TF-IDF + Cosine Similarity) — cùng cơ chế Gamification với hệ thống điểm tích lũy và danh hiệu theo chủ đề.

Về giá trị thực tiễn, nền tảng lấp đầy khoảng trống thị trường mà các giải pháp nước ngoài như TripAdvisor hay Expedia bỏ ngỏ — đó là một sân chơi thuần Việt, nơi những người có đam mê và kinh nghiệm có thể tạo thêm thu nhập, còn người tham gia được khám phá những trải nghiệm phù hợp với sở thích cá nhân qua thuật toán đề xuất thông minh.

Với kiến trúc MERN-adjacent stack (MongoDB, Express.js, ReactJS, Node.js) và thiết kế module hóa rõ ràng, nền tảng có thể tiếp tục được mở rộng với mobile app, deep learning recommender hoặc tính năng livestream trải nghiệm trong các giai đoạn phát triển tiếp theo. Đây là một blueprint tham khảo có giá trị cho bất kỳ ai muốn xây dựng two-sided marketplace platform cho lĩnh vực trải nghiệm và du lịch tại Việt Nam.