Bài 2: Từ CV ĐẾN DATABASE - Workflow Phân Tích CV Cùng n8n
Trong bài này, chúng ta sẽ dùng n8n low code để đưa dữ liệu trong file CV của ứng viên vào trong database. Ngày nay CV ứng viên rất đa dạng về mẫu mã, đặc biệt là những bạn bên Marketing, Media họ thường có cách trang trí CV rất đẹp, nhiều hình, chưa kể các link kết ngoài để HR có thể tham khảo các project đã làm. Việc sử dụng từ khóa để phân tích CV như trước gặp rất nhiều khó khăn. Nhưng từ ngày AI xuất hiện thì việc đọc CV lại trở nên nhẹ nhàng và chính xác hơn.
Bài này chúng ta sẽ tập trung vào Workflow:
- CV Intake: "Bóc tách" thông tin từ file CV thô và lưu trữ có cấu trúc vào database.
Workflow 1: Biến CV Hỗn Độn Thành Dữ Liệu Vàng (Có Cấu Trúc)
Đây là workflow nền tảng, chịu trách nhiệm chuyển đổi một file CV (PDF, DOCX) thành các hàng dữ liệu sạch sẽ trong Supabase. Tại sao mình gọi là dữ liệu vàng, vì một khi đã lưu được vào database thì mọi hệ thống đều có thể xử lý chính xác dữ liệu đó.
Node 1: Kích Hoạt (Trigger) - Email - Google Drive - Webhook …
Đây sẽ là bước khởi đầu của quy trình, ở bước này có nhiều cách để tiếp cận:
- Email: Có thể trigger email (cụ thể là Gmail), HR có thể yêu cầu ứng viên đặt tiêu đề email, tên file CV theo 1 tiêu chuẩn nhất định. Và mình sẽ trigger theo chuẩn đó. Cách này sẽ giúp AI mapping JD chính xác nhất, nhờ đọc được nội dung email ứng tuyển của ứng viên.
- Google Drive: Cách này cũng hay, file CV được HR upload lên Drive, và khi có file mới thì sẽ kích hoạt workflow chạy.
- Webhook: Cách này thì CV sẽ được lưu trên server n8n. Chỉ cần nhớ xác thực webhook thôi.
Node 2: Đọc File
Việc đọc file thì n8n hỗ trợ hầu hết những định dạng cơ bản, bản thân file PDF dạng hình không được hỗ trợ, những file của Microsoft thì có các node liên quan. Nhưng nếu chúng ta quá tham (muốn đọc nhiều kiểu file) thì sẽ làm cho việc đọc trở nên nặng nhọc, vì phải điều hướng liên tục. Ở đây mình chỉ đọc duy nhất file PDF và gọi API bên ngoài để xử lý file PDF OCR:
Kết quả của node này là một chuỗi văn bản (plain text) chứa toàn bộ nội dung của CV.
Node 3: AI và Sự Khác Biệt
Đây là trái tim của workflow, nơi phép màu AI xảy ra. Chúng ta sẽ gửi toàn bộ văn bản thô từ CV đến Gemini và yêu cầu nó "hiểu" và cấu trúc lại thông tin, và trả ra theo cấu trúc ta mong muốn (nhưng vẫn là plain text)
Prompt yêu cầu:
Chất lượng đầu ra phụ thuộc hoàn toàn vào chất lượng của câu lệnh (prompt) đầu vào. Chúng ta không chỉ yêu cầu tóm tắt, mà yêu cầu Gemini đóng vai một chuyên viên tuyển dụng và trả về dữ liệu dưới dạng JSON với một cấu trúc định sẵn. Tại sao lại là JSON? Vì đó là định dạng mà máy tính có thể đọc và phân tích một cách dễ dàng, giúp cho việc xử lý ở các bước sau trở nên cực kỳ đơn giản
Bạn là một chuyên viên tuyển dụng (HR Specialist) chuyên nghiệp với nhiệm vụ trích xuất thông tin từ nội dung CV dưới đây.
Hãy phân tích toàn bộ văn bản và trả về một đối tượng JSON DUY NHẤT.
JSON phải tuân thủ nghiêm ngặt cấu trúc sau:
- `full_name`: Họ và tên đầy đủ của ứng viên.
- `email`: Địa chỉ email.
- `phone_number`: Số điện thoại.
- `linkedin_url`: URL đến trang LinkedIn (nếu có).
- `summary`: Một đoạn văn ngắn (2-3 câu) tóm tắt về bản thân và mục tiêu nghề nghiệp của ứng viên.
- `skills`: Một mảng (array) các chuỗi (string), mỗi chuỗi là một kỹ năng nổi bật (ví dụ: "JavaScript", "Project Management", "SQL").
- `experiences`: Một mảng các đối tượng (object), mỗi đối tượng đại diện cho một kinh nghiệm làm việc và có cấu trúc:
- `job_title`: Chức danh công việc.
- `company_name`: Tên công ty.
- `duration`: Thời gian làm việc (ví dụ: "Tháng 8/2021 - Hiện tại").
- `description`: Mô tả ngắn gọn về các công việc và thành tựu chính.
- `education`: Một mảng các đối tượng, mỗi đối tượng đại diện cho một bằng cấp và có cấu trúc:
- `degree`: Tên bằng cấp, chuyên ngành.
- `university`: Tên trường đại học/tổ chức.
- `graduation_year`: Năm tốt nghiệp.
LƯU Ý QUAN TRỌNG:
- Chỉ trả lời bằng JSON, không thêm bất kỳ văn bản giải thích nào trước hoặc sau đó.
- Nếu một trường thông tin không có trong CV, hãy trả về giá trị `null` cho trường đó.
- Đảm bảo JSON hợp lệ.
Nội dung CV cần phân tích:
"""
{{$json["cv_text"]}}
"""
Cấu trúc JSON mong muốn
Với prompt trên, chúng ta kỳ vọng Gemini sẽ trả về một đoạn JSON có cấu trúc rõ ràng như sau:
JSON
{
"full_name": "Nguyễn Văn An",
"email": "nguyen.van.an@email.com",
"phone_number": "0987654321",
"linkedin_url": "https://linkedin.com/in/nguyenvanan",
"summary": "Software Engineer với 5 năm kinh nghiệm phát triển các ứng dụng web sử dụng React và Node.js. Có kinh nghiệm làm việc trong môi trường Agile và đam mê xây dựng các sản phẩm có khả năng mở rộng.",
"skills": [
"JavaScript",
"TypeScript",
"React",
"Node.js",
"Express.js",
"MongoDB",
"SQL",
"Docker",
"Git"
],
"experiences": [
{
"job_title": "Senior Software Engineer",
"company_name": "ABC Tech Corp",
"duration": "Tháng 8/2021 - Hiện tại",
"description": "Dẫn dắt team phát triển tính năng mới cho sản phẩm X, tối ưu hiệu năng hệ thống backend, tăng tốc độ phản hồi 30%. Mentor các thành viên mới trong team."
},
{
"job_title": "Software Engineer",
"company_name": "XYZ Solutions",
"duration": "Tháng 6/2018 - Tháng 7/2021",
"description": "Tham gia phát triển và bảo trì hệ thống quản lý khách hàng (CRM). Xây dựng các API RESTful cho ứng dụng di động."
}
],
"education": [
{
"degree": "Cử nhân Kỹ thuật Phần mềm",
"university": "Đại học Bách Khoa Hà Nội",
"graduation_year": "2018"
}
]
}
Node 4: Phân Loại & Lưu Trữ
Khi đã có JSON, công việc còn lại là ghi dữ liệu vào các bảng tương ứng trên Supabase:
- Parse JSON: Sử dụng node Code hoặc Set của n8n để phân tích chuỗi JSON nhận được từ Gemini.
- Insert Candidate: Node này tùy chúng ta thêm vào 1 hay nhiều bảng mà sử dụng node Supabase riêng hoặc Postgresql.
Vậy là chúng ta đã có thông tin ứng viên trong database. Với thông tin này thì những bước sau sẽ nhẹ nhàng hơn rất nhiều.



0 Nhận xét