Giới thiệu dự án

Thị trường tuyển dụng ngành Công nghệ Thông tin (CNTT) đang trải qua giai đoạn biến động mạnh mẽ với tỷ lệ cạnh tranh hồ sơ tăng vọt. Theo các báo cáo thống kê nhân sự giai đoạn 2023–2024, trung bình một vị trí tuyển dụng lập trình viên tiếp nhận từ 300 đến 500 hồ sơ ứng tuyển (Curriculum Vitae - CV). Đứng trước khối lượng hồ sơ khổng lồ này, bộ phận tuyển dụng (HR) đối mặt với tình trạng quá tải nghiêm trọng, dẫn đến hiện tượng "bỏ sót ứng viên tiềm năng" (candidate drop-off) do thời gian duyệt thủ công kéo dài từ 3–5 phút cho mỗi CV.

Đề tài "Xây dựng website tích hợp AI hỗ trợ doanh nghiệp sàng lọc ứng viên" được thực hiện bởi sinh viên Đặng Văn Thiện (Lớp 19T2, Khoa Công nghệ Số, Trường Đại học Sư phạm Kỹ thuật – Đại học Đà Nẵng) dưới sự hướng dẫn của ThS. Lê Vũ. Đồ án tập trung giải quyết bài toán tự động hóa trích xuất và xếp hạng hồ sơ ứng viên bằng các kỹ thuật Trí tuệ Nhân tạo (AI) và Xử lý Ngôn ngữ Tự nhiên (Natural Language Processing - NLP) tiên tiến.

+------------------+      +--------------------+      +--------------------+
|  Ứng viên tải CV | ---> | Trích xuất thực thể| ---> | Tính tương đồng    |
| (PDF/DOCX)       |      | (OpenAI / NLP API) |      | Vector Embedding   |
+------------------+      +--------------------+      +--------------------+
                                                                |
                                                                v
+------------------+      +--------------------+      +--------------------+
| Xuất báo cáo     | <--- | Lọc đa tiêu chí    | <--- | Xếp hạng ứng viên  |
| (PDF / Excel)    |      | (FastAPI + SQL)    |      | (Cosine Similarity)|
+------------------+      +--------------------+      +--------------------+

Mục tiêu của dự án

  1. Xây dựng Pipeline trích xuất tự động: Chuyển đổi toàn bộ dữ liệu phi cấu trúc từ các định dạng file CV (PDF, DOCX) thành dữ liệu có cấu trúc (JSON Schema) chuẩn xác.
  2. Triển khai Semantic Matching Engine: Tích hợp mô hình SentenceTransformer và OpenAI API để biểu diễn hồ sơ và tiêu chí tuyển dụng dưới dạng không gian vector ngữ nghĩa (Vector Embedding), loại bỏ nhược điểm của phương pháp tìm kiếm từ khóa truyền thống.
  3. Phát triển nền tảng quản trị hoàn chỉnh: Xây dựng hệ thống web application cho phép quản lý hồ sơ theo thư mục chuyên môn, lọc tự động theo đa tiêu chí (kỹ năng, học vấn, kinh nghiệm, dự án) và xuất báo cáo trực quan.
  4. Tối ưu hiệu năng sàng lọc: Rút ngắn thời gian xử lý hồ sơ xuống dưới 3 giây/CV, đạt độ chính xác sàng lọc ngữ nghĩa trên 90%.

Phạm vi và giới hạn

  • Phạm vi nghiên cứu: Ứng dụng chuyên sâu cho quy trình tuyển dụng nhân sự các vị trí kỹ thuật trong ngành Công nghệ Thông tin (Software Engineer, Data Engineer, DevOps, Frontend/Backend Developer).
  • Giới hạn kỹ thuật: Hệ thống tập trung xử lý CV văn bản (Text-based PDF/DOCX), chưa hỗ trợ giải mã các CV dạng ảnh quét (Scanned Image PDF) cần qua module Optical Character Recognition (OCR) chuyên sâu.

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

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

Các phương pháp sàng lọc ứng viên truyền thống bộc lộ nhiều điểm hạn chế khi xử lý dữ liệu lớn:

Tiêu chí Sàng lọc thủ công (Manual HR) ATS truyền thống (Keyword Match) Hệ thống tích hợp AI (Đồ án)
Cơ chế xử lý Đọc từng CV thủ công Tìm kiếm chuỗi ký tự (Exact match / Regex) Nhúng ngữ nghĩa (Semantic Embedding) & LLM Parsing
Thời gian/100 CV 5 – 8 giờ làm việc 2 – 3 phút 1 – 2 phút (xử lý song song)
Hiểu ngữ cảnh Tốt nhưng phụ thuộc cảm tính Hoàn toàn không (bỏ sót từ đồng nghĩa) Xuất sắc (hiểu quan hệ giữa các công nghệ)
Chi phí vận hành Rất cao (chi phí nhân sự) Trung bình Tối ưu (chi phí API theo lượt dùng)
Khả năng mở rộng Kém (O(n) nhân lực) Tốt Tốt (Scale ngang theo kiến trúc Microservices)

Ma trận ưu tiên yêu cầu người dùng (MoSCoW)

  • Must have: Đăng thực thể CV vào cơ sở dữ liệu có cấu trúc; Vector hóa kỹ năng, chức danh; Lọc ứng viên theo độ tương đồng ngữ nghĩa; Quản lý thư mục lưu trữ CV.
  • Should have: Tính năng phân tích kinh nghiệm dự án chi tiết; Hệ thống cảnh báo CV trùng lặp qua hàm băm file (SHA-256 hash); Xuất báo cáo thống kê danh sách trúng tuyển.
  • Could have: Xem trực tiếp bản xem trước (Thumbnail/Preview) của CV trên giao diện web; Tùy chỉnh trọng số điểm giữa kỹ năng và số năm kinh nghiệm.
  • Won't have (phiên bản hiện tại): Phỏng vấn tự động qua Voice Bot; Tích hợp cổng gửi email tự động tới ứng viên.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc phân tầng (Tiered Architecture), tách biệt giữa tầng hiển thị, tầng xử lý logic/AI và tầng cơ sở dữ liệu.

+-------------------------------------------------------------------+
|                  Client Layer (ReactJS 18.x)                      |
|   - Quản lý Folder      - Upload File Drag & Drop  - Lọc CV & Báo cáo |
+---------------------------------+---------------------------------+
                                  | RESTful API (JSON)
+---------------------------------v---------------------------------+
|               Backend Logic & AI Layer (FastAPI)                 |
|   - Resume Parser Module        - Vector Embedding Engine         |
|   - Semantic Matching (Cosine)  - Data Validation (Pydantic)     |
+---------------------------------+---------------------------------+
                                  | Supabase Client / SQL Driver
+---------------------------------v---------------------------------+
|               Database & Storage Layer (PostgreSQL)               |
|   - Supabase Auth               - Supabase Storage (Files)        |
|   - Relational Tables           - pgvector Extension (Embeddings) |
+-------------------------------------------------------------------+

Technology Stack và phiên bản

  • Frontend: ReactJS 18.2.0, React Router DOM 6.x, Axios, Tailwind CSS.
  • Backend API: FastAPI 0.104.1 (Python 3.10), Uvicorn ASGI Server.
  • AI & NLP Engine: OpenAI API (gpt-3.5-turbo), sentence-transformers 2.2.2 (Mô hình all-MiniLM-L6-v2), NLTK 3.8.1.
  • Database & Storage: PostgreSQL 15 tích hợp trên nền tảng Supabase, hỗ trợ kiểu dữ liệu VECTOR qua pgvector.

Thiết kế cơ sở dữ liệu chi tiết

Cơ sở dữ liệu quan hệ được chuẩn hóa cao nhằm lưu trữ chi tiết các thành phần bóc tách từ hồ sơ ứng viên:

  • users: Lưu trữ thông tin tài khoản nhà tuyển dụng (id, email, encrypted_password).
  • folders: Quản lý danh mục tuyển dụng (folder_id, folder_name, user_id, created_at, updated_at).
  • resumes: Bảng trung tâm chứa thông tin tổng quát (resume_id, full_name, email, phone_number, address, job_title, job_title_embedding kiểu VECTOR, resume_file_hash, resume_file_path, folder_id).
  • resume_skills: Lưu trữ kỹ năng kỹ thuật (resume_skill_id, skill_name, skill_name_embedding kiểu VECTOR, resume_id).
  • resume_educations: Học vấn (resume_education_id, name, major, gpa, education_name_embedding, start_date, end_date, resume_id).
  • resume_work_experiences: Lịch sử làm việc (resume_work_experience_id, company_name, job_title, job_summary, start_date, resume_id).
  • resume_project_experiences: Dự án thực tế (resume_project_experience_id, project_name, project_technologies, responsibilities, repository_url, demo_or_live_url, resume_id).
  • resume_certifications & resume_awards: Chứng chỉ và giải thưởng kèm vector embedding tương ứng.

Methodology

Dự án áp dụng mô hình phát triển phần mềm Agile/Scrum rút gọn với 4 giai đoạn thực thi:

  1. Sprint 1 (Tuần 1-2): Khảo sát tài liệu, thiết kế ERD, xây dựng bộ khung API trên FastAPI và thiết lập Database trên Supabase.
  2. Sprint 2 (Tuần 3-4): Xây dựng Pipeline xử lý văn bản, tích hợp OpenAI API để trích xuất thực thể và tích hợp SentenceTransformer vector hóa dữ liệu.
  3. Sprint 3 (Tuần 5-6): Lập trình giao diện người dùng ReactJS (Upload CV, quản lý thư mục, bộ lọc tìm kiếm) và kết nối API.
  4. Sprint 4 (Tuần 7-8): Kiểm thử hộp đen, đánh giá độ chính xác thuật toán lọc, đo đạc hiệu năng và đóng gói ứng dụng.

Implementation và kết quả

Development process

Cốt lõi của hệ thống nằm ở 2 thuật toán: Trích xuất thông tin có cấu trúcTính toán độ tương đồng ngữ nghĩa (Cosine Similarity).

                              QUY TRÌNH VECTOR EMBEDDING
                              
+-------------------+      +-----------------------+      +--------------------+
| Chuỗi truy vấn    | ---> | SentenceTransformer   | ---> | Query Vector       |
| (VD: "React Dev") |      | (all-MiniLM-L6-v2)    |      | [0.12, -0.98, ...] |
+-------------------+      +-----------------------+      +--------------------+
                                                                    |
                                                                    v
+-------------------+      +-----------------------+      +--------------------+
| Database Skill    | ---> | pgvector Database     | ---> | Cosine Similarity  |
| Vectors (Stored)  |      | Cosine Distance Index |      | Score: 0.93        |
+-------------------+      +-----------------------+      +--------------------+

Công thức toán học tính khoảng cách ngữ nghĩa giữa vector truy vấn tuyển dụng ($A$) và vector thuộc tính hồ sơ ứng viên ($B$):

$$\text{Cosine Similarity}(A, B) = \frac{A \cdot B}{|A| |B|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$

Đoạn mã triển khai tính toán vector và sàng lọc ứng viên trên FastAPI:

from fastapi import FastAPI, Depends, HTTPException, status
from sentence_transformers import SentenceTransformer
import numpy as np
from pydantic import BaseModel
from typing import List

app = FastAPI(title="AI Resume Screening Service", version="1.0.0")

# Load model SentenceTransformer tối ưu hóa cho semantic search
embedding_model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')

class FilterRequest(BaseModel):
    required_job_title: str
    required_skills: List[str]
    folder_id: str

def compute_cosine_similarity(vec_a: np.ndarray, vec_b: np.ndarray) -> float:
    dot_product = np.dot(vec_a, vec_b)
    norm_a = np.linalg.norm(vec_a)
    norm_b = np.linalg.norm(vec_b)
    if norm_a == 0 or norm_b == 0:
        return 0.0
    return float(dot_product / (norm_a * norm_b))

@app.post("/api/v1/resumes/filter")
async def filter_candidates(payload: FilterRequest):
    # 1. Vector hóa tiêu chí tìm kiếm từ nhà tuyển dụng
    query_title_vec = embedding_model.encode(payload.required_job_title)
    
    # 2. Giả lập truy vấn dữ liệu ứng viên từ Supabase DB
    # Trong thực tế, pgvector thực hiện so khớp trực tiếp trong database qua toán tử <=>
    # SELECT resume_id, 1 - (job_title_embedding <=> query_title_vec) AS score FROM resumes
    
    candidate_sample_vec = embedding_model.encode("Frontend Software Engineer with ReactJS")
    similarity_score = compute_cosine_similarity(query_title_vec, candidate_sample_vec)
    
    return {
        "status": "success",
        "matched_candidates": [
            {
                "resume_id": "res_1911505310261",
                "match_score": round(similarity_score * 100, 2),
                "is_qualified": similarity_score >= 0.75
            }
        ]
    }

Testing và validation

Hệ thống đã trải qua kiểm thử hộp trắng (Unit Testing với PyTest) và kiểm thử hộp đen (UAT) trên tập dữ liệu gồm 150 CV ngành CNTT với các cấu trúc trình bày khác nhau.

  • Hiệu năng trích xuất dữ liệu: Tỷ lệ bóc tách chính xác các trường thông tin cơ bản (Họ tên, Số điện thoại, Email) đạt 98.6%. Tỷ lệ trích xuất kỹ năng kỹ thuật (Skills) và dự án đạt 91.3%.
  • Tốc độ xử lý (Latency Benchmark):
    • Thời gian trích xuất & cấu trúc hóa CV: 1.8 giây/CV.
    • Thời gian sinh Vector Embedding: 42 mili-giây/trường dữ liệu.
    • Tốc độ phản hồi truy vấn tìm kiếm lọc hồ sơ: < 150 mili-giây cho tập dữ liệu 1.000 CV.
  • Kiểm thử tính toàn vẹn: Thuật toán SHA-256 chặn hoàn toàn 100% các file CV bị tải lên trùng lặp vào cùng một thư mục tuyển dụng.

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

  1. Khắc phục triệt để rào cản "Từ khóa chính xác" (Keyword Mismatch): Các hệ thống ATS cũ sẽ loại ứng viên nếu CV ghi "React" trong khi JD yêu cầu "ReactJS", hoặc CV ghi "Node.js" khi JD cần "Backend Javascript". Nhờ không gian vector 384 chiều của all-MiniLM-L6-v2, hệ thống tự động nhận diện độ tương đồng ngữ nghĩa giữa các khái niệm này với độ chính xác đạt trên 93%.
  2. Cơ chế phân tách Vector đa tầng (Multi-layered Vector Partitioning): Thay vì biến toàn bộ văn bản CV thành 1 vector duy nhất (dễ làm loãng thông tin), hệ thống vector hóa độc lập từng thực thể: job_title_embedding, skill_name_embedding, education_name_embedding. Điều này cho phép nhà tuyển dụng gán trọng số linh hoạt khi lọc hồ sơ.
  3. Tiết kiệm 85% thời gian sơ tuyển: Giúp doanh nghiệp giảm tải từ 4 giờ duyệt sơ bộ 100 hồ sơ xuống còn 36 phút (chỉ tập trung phỏng vấn các ứng viên đạt điểm Match Score > 80%).

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

Kịch bản ứng dụng thực tế

  • Doanh nghiệp gia công phần mềm (Software Outsourcing): Tiếp nhận các đợt tuyển dụng hàng loạt (Mass Recruitment) vị trí Fresher/Junior. Hệ thống tự động phân loại ứng viên vào các thư mục công nghệ: Java, .NET, React, Python chỉ sau một lần tải lên hàng loạt.
  • Bộ phận Talent Acquisition tại các Tech Product: Lọc nhanh các ứng viên có kinh nghiệm thực hiện các dự án đặc thù (microservices, fintech, AI) thông qua việc phân tích vector mô tả dự án (resume_project_experiences).

Hướng dẫn triển khai (Deployment Strategy)

  1. Hạ tầng Cơ sở dữ liệu: Khởi tạo Project trên Supabase, kích hoạt Extension pgvector và chạy file Migration SQL chứa 11 bảng quan hệ.
  2. Backend Engine: Đóng gói ứng dụng FastAPI bằng Docker:
    docker build -t ai-resume-screening:v1 .
    docker run -d -p 8000:8000 --env-file .env ai-resume-screening:v1
    
  3. Frontend Application: Triển khai bản build ReactJS tĩnh trên nền tảng Vercel hoặc Nginx Server, cấu hình CORS trỏ về Endpoint của FastAPI.

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

Hạn chế hiện tại

  • Phụ thuộc vào kết nối Internet và chi phí định ngạch token của OpenAI API đối với module bóc tách thông tin phức tạp.
  • Độ chính xác của việc trích xuất văn bản giảm nhẹ đối với các mẫu CV có thiết kế đồ họa phức tạp (nhiều cột không chuẩn, biểu đồ cột đo mức độ kỹ năng bằng hình ảnh).

Hướng phát triển

  • Tích hợp OCR On-premise: Tích hợp PaddleOCR hoặc Tesseract OCR để đọc trực tiếp các CV dạng ảnh quét hoặc PDF phi chuẩn.
  • Fine-tuning mô hình ngôn ngữ tiếng Việt: Huấn luyện bổ sung mô hình PhoBERT hoặc vi-sentence-transformer chuyên sâu cho thuật ngữ tuyển dụng tiếng Việt.
  • Xây dựng hệ thống gợi ý 2 chiều (Bi-directional Recommendation System): Tự động gợi ý ứng viên phù hợp cho JD và ngược lại, gợi ý vị trí tuyển dụng phù hợp cho ứng viên.

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

  • Nhà tuyển dụng & Doanh nghiệp: Cắt giảm hơn 80% thời gian sàng lọc ban đầu, chuẩn hóa quy trình tuyển dụng, nâng cao trải nghiệm ứng viên nhờ phản hồi nhanh chóng.
  • Lập trình viên & Kỹ sư hệ thống: Cung cấp tài liệu tham khảo chi tiết về cách kết hợp giữa kiến trúc ứng dụng web hiện đại (ReactJS, FastAPI) và kỹ thuật tìm kiếm vector ngữ nghĩa (Vector Search / pgvector).
  • Sinh viên & Nhà nghiên cứu: Tài liệu thực tế về ứng dụng Xử lý ngôn ngữ tự nhiên (NLP) và Mô hình ngôn ngữ lớn (LLM) trong bài toán quản trị nguồn nhân lực (HR Tech).

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

1. Yêu cầu phần cứng để triển khai hệ thống là gì?

Hệ thống tận dụng nền tảng Cloud của Supabase và OpenAI API nên yêu cầu tài nguyên máy chủ rất thấp: 1 máy chủ ảo (VPS) cấu hình tối thiểu 2 vCPU, 4GB RAM có thể đáp ứng tốt cho hàng nghìn lượt truy vấn mỗi ngày.

2. Hệ thống xử lý CV tiếng Việt hay tiếng Anh tốt hơn?

Mô hình nhúng SentenceTransformer và OpenAI API được huấn luyện đa ngôn ngữ, hỗ trợ xử lý mượt mà cả CV tiếng Anh và tiếng Việt.

3. Làm sao để đảm bảo an toàn thông tin cá nhân của ứng viên?

Hệ thống triển khai xác thực JWT cho nhà tuyển dụng, phân quyền cấp dữ liệu (Row Level Security - RLS) trên Supabase và mã hóa các thông tin nhạy cảm.

4. Nếu ứng viên cố tình "nhồi nhét" từ khóa vào CV thì AI có bị đánh lừa không?

Không. Do hệ thống sử dụng thuật toán Vector Semantic Matching để phân tích mối quan hệ ngữ cảnh và cấu trúc câu trong từng dự án thực tế, các từ khóa đặt sai ngữ cảnh sẽ không tạo ra điểm tương đồng cao.

5. Chi phí vận hành AI cho mỗi hồ sơ là bao nhiêu?

Chi phí ước tính khoảng 0.0015 – 0.003 USD cho mỗi lần bóc tách CV qua OpenAI API, cực kỳ tối ưu so với chi phí nhân sự truyền thống.


Kết luận

Đồ án tốt nghiệp "Xây dựng website tích hợp AI hỗ trợ doanh nghiệp sàng lọc ứng viên" của sinh viên Đặng Văn Thiện đã giải quyết thành công bài toán cấp thiết trong ngành tuyển dụng thời đại số. Bằng việc kết hợp hài hòa giữa các công nghệ nền tảng (ReactJS, FastAPI, Supabase) và các giải pháp AI đột phá (SentenceTransformer, OpenAI API, Vector Search), hệ thống mang lại giải pháp toàn diện, tối ưu hóa chi phí và nâng cao chất lượng tuyển dụng cho doanh nghiệp.