Tạo chatbot xin nghỉ phép với AI Agent trong n8n: hướng dẫn từng bước
Dùng Chat Trigger, AI Agent, Google Sheets và Gmail để chatbot tiếp nhận đơn nghỉ, hỏi thông tin còn thiếu, tra cứu phép, ghi đơn và báo quản lý sau khi nhân viên xác nhận.
Một nhân viên chỉ cần nhắn: “Mai em xin nghỉ ốm 1 ngày.” Chatbot sẽ hỏi thông tin còn thiếu, tra cứu ngày phép, tóm tắt đơn và chỉ ghi đơn sau khi nhân viên xác nhận.
Đây là workflow phù hợp cho đội HR hoặc vận hành đang dùng n8n: AI Agent xử lý ngôn ngữ tự nhiên, còn Google Sheets lưu dữ liệu và Gmail gửi thông báo cho quản lý.
Workflow gồm những gì?
Luồng chính gồm:
Chat Trigger nhận tin nhắn từ khung chat.
AI Agent quyết định cần hỏi gì và khi nào gọi công cụ.
Chat Model là mô hình ngôn ngữ bạn sử dụng.
Simple Memory giúp bot nhớ nội dung trong cuộc trò chuyện.
Ba tool cho AI Agent:
Google Sheets Tool tracuungayphep
Google Sheets Tool ghidonnghi
Gmail Tool guiemailquanly
Ví dụ hội thoại:
> Nhân viên: Mai em xin nghỉ phép nhé.
> Bot: Bạn cho mình xin mã nhân viên để kiểm tra số ngày phép còn lại nhé.
> Nhân viên: NV015
> Bot: Bạn Nguyễn Văn A còn 7 ngày phép năm. Bạn nghỉ cả ngày hay nửa ngày? Lý do nghỉ là gì?
> Nhân viên: Cả ngày, việc gia đình.
> Bot: Mình tóm tắt lại: nghỉ phép năm 1 ngày, lý do việc gia đình. Bạn xác nhận gửi đơn nhé?
> Nhân viên: Ok
> Bot: Đã ghi đơn và gửi email cho quản lý của bạn.
Chuẩn bị trước khi làm
Bạn cần:
n8n, bản cloud hoặc tự cài.
API key của một nhà cung cấp LLM.
Credential Google Sheets và Gmail trong n8n.
Một file Google Sheet có hai trang.
Trang NhanVien:
text
manv | hoten | email | emailquanly | phepconlai
Trang DonNghi:
text
thoigiantao | manv | hoten | loainghi | tungay | denngay | songay | lydo | trangthai
Bước 1: Tạo Chat Trigger
Tạo workflow mới, thêm node Chat Trigger — trong danh sách có thể hiển thị là When chat message received.
Bạn có thể:
Bật Make Chat Publicly Available nếu muốn gửi link chat.
Chọn Hosted Chat để n8n tạo sẵn trang chat.
Chọn Embedded Chat nếu muốn nhúng chat vào website nội bộ.
Ở phần Initial Message(s), thêm lời chào như:
text
Chào bạn 👋 Mình là trợ lý nghỉ phép. Bạn muốn xin nghỉ ngày nào?
Nếu dùng nội bộ, nên bật Authentication để hạn chế người ngoài gửi đơn.
Bước 2: Thêm AI Agent và System Message
Nối node AI Agent ngay sau Chat Trigger. Phần nguồn prompt có thể để mặc định để lấy tin nhắn từ Chat Trigger.
Trong Options → System Message, thêm hướng dẫn cho bot. Bạn có thể dùng mẫu sau và thay chính sách công ty cho phù hợp:
text
Bạn là trợ lý xin nghỉ phép của phòng Nhân sự công ty ABC.
Hôm nay là {{ $now.format('dd/MM/yyyy') }} ({{ $now.setLocale('vi').format('cccc') }}).
Nhiệm vụ: giúp nhân viên tạo đơn xin nghỉ.
Trả lời ngắn gọn, thân thiện, bằng tiếng Việt.
Quy trình bắt buộc:
Hỏi mã nhân viên nếu chưa có, sau đó dùng công cụ tracuungayphep để lấy họ tên và số ngày phép còn lại.
Thu thập đủ: loại nghỉ (phép năm / nghỉ ốm / không lương), ngày bắt đầu, ngày kết thúc, nghỉ cả ngày hay nửa ngày, lý do.
Tự đổi các cách nói như "mai", "thứ 6 tuần này" thành ngày cụ thể dạng dd/MM/yyyy.
Tóm tắt lại toàn bộ thông tin và hỏi nhân viên xác nhận.
Chỉ sau khi nhân viên xác nhận mới dùng ghidonnghi, rồi dùng guiemailquanly.
Quy định công ty:
Nghỉ phép năm phải báo trước ít nhất 1 ngày làm việc.
Nghỉ từ 3 ngày trở lên phải báo trước 7 ngày.
Không tính thứ 7, chủ nhật vào số ngày nghỉ.
Nếu số ngày xin nghỉ phép năm vượt số ngày phép còn lại, thông báo và gợi ý chuyển phần dư sang nghỉ không lương.
Nghỉ ốm từ 2 ngày trở lên cần bổ sung giấy của cơ sở y tế sau khi đi làm lại.
Giới hạn:
Bạn không có quyền duyệt đơn. Chỉ nói "đơn đã được gửi cho quản lý".
Không trả lời các câu hỏi ngoài chủ đề nghỉ phép, hãy hướng dẫn liên hệ phòng Nhân sự.
Không bịa số ngày phép, luôn lấy từ công cụ.
Phần ngày hiện tại rất quan trọng: nó giúp agent có mốc để hiểu các cách nói như “ngày mai” hoặc “thứ 6 tuần này”.
Bước 3: Gắn Chat Model
Bấm dấu + ở ô Chat Model dưới AI Agent, sau đó chọn model và credential bạn đang có, chẳng hạn OpenAI, Anthropic hoặc Gemini.
Không nhất thiết phải dùng model lớn nhất. Bạn có thể đặt temperature thấp, khoảng 0,2–0,3, để câu trả lời ổn định hơn.
Bước 4: Gắn Simple Memory
Bấm dấu + ở ô Memory và chọn Simple Memory.
Session ID có thể để mặc định từ Chat Trigger.
Tăng Context Window Length từ 5 lên khoảng 10–15 tin.
Một đơn nghỉ thường cần nhiều lượt hỏi đáp. Memory giúp bot không hỏi lại những thông tin nhân viên đã cung cấp.
Lưu ý: Simple Memory lưu trong bộ nhớ n8n. Nếu n8n khởi động lại, hội thoại đang diễn ra có thể mất. Khi vận hành thực tế, có thể chuyển sang Postgres Chat Memory hoặc Redis Chat Memory.
Bước 5: Tạo tool tra cứu ngày phép
Bấm dấu + ở ô Tool của AI Agent, chọn Google Sheets Tool.
Đặt tên node:
text
tracuungayphep
Mô tả tool:
text
Tra cứu họ tên, email, email quản lý và số ngày phép còn lại của nhân viên theo mã nhân viên.
Cấu hình:
Operation: Get Row(s)
Chọn file Google Sheet và trang NhanVien.
Thêm bộ lọc theo cột manv.
Ở phần giá trị lọc, bạn có thể bật Let the model define this parameter hoặc nhập:
text
{{ $fromAI('manv', 'Mã nhân viên, ví dụ NV015', 'string') }}
$fromAI cho phép AI Agent điền giá trị dựa trên nội dung cuộc trò chuyện. Mô tả càng rõ, agent càng dễ truyền đúng dữ liệu.
Bước 6: Tạo tool ghi đơn nghỉ
Thêm Google Sheets Tool thứ hai và đặt tên:
text
ghidonnghi
Mô tả:
text
Ghi đơn xin nghỉ vào bảng DonNghi. Chỉ dùng sau khi nhân viên đã xác nhận thông tin.
Cấu hình:
Operation: Append Row
Chọn trang DonNghi
Ánh xạ các cột như sau:
text
thoigiantao:
{{ $now.format('dd/MM/yyyy HH:mm') }}
manv:
{{ $fromAI('manv', 'Mã nhân viên', 'string') }}
hoten:
{{ $fromAI('hoten', 'Họ tên nhân viên', 'string') }}
loainghi:
{{ $fromAI('loainghi', 'Một trong: phepnam, nghiom, khongluong', 'string') }}
tungay:
{{ $fromAI('tungay', 'Ngày bắt đầu nghỉ, dạng dd/MM/yyyy', 'string') }}
denngay:
{{ $fromAI('denngay', 'Ngày kết thúc nghỉ, dạng dd/MM/yyyy', 'string') }}
songay:
{{ $fromAI('songay', 'Số ngày nghỉ, nửa ngày ghi 0.5', 'number') }}
lydo:
{{ $fromAI('lydo', 'Lý do nghỉ', 'string') }}
trangthai:
Chờ duyệt
Với các giá trị cố định như Chờ duyệt, hãy nhập trực tiếp thay vì để AI tự điền.
Bước 7: Tạo tool gửi email cho quản lý
Thêm Gmail Tool và đặt tên:
text
guiemailquanly
Mô tả tool:
text
Gửi email thông báo đơn nghỉ mới cho quản lý trực tiếp. Dùng ngay sau khi ghi đơn thành công.
Cấu hình:
Operation: Send
Các trường có thể dùng:
text
To:
{{ $fromAI('emailquanly', 'Email quản lý lấy từ kết quả tra cứu nhân viên', 'string') }}
Subject:
{{ $fromAI('tieude', 'Ví dụ: [Đơn nghỉ] Nguyễn Văn A - 16/10', 'string') }}
Message:
{{ $fromAI('noidung', 'Nội dung email gồm đủ thông tin đơn nghỉ, lịch sự, ngắn gọn', 'string') }}
Khi thử nghiệm, nên điền cứng email của chính bạn vào trường To để tránh gửi nhầm email cho quản lý.
Bước 8: Chạy thử và kiểm tra execution