[UrCheckin] Tích hợp AI để chấm công tự động trên ứng dụng Base 🪲 (Phần 2/3)
Phải làm tốt nhất có thể 🥸
GitHub Repository: UrCheckin-Check-Timeoff
Xem nhiều hơn tại: https://devvui.one
Lại là tớ đây, ở bài blog trước, tớ đã kể về hành trình xây dựng UrCheckin - con bot tự động check-in/check-out trên ứng dụng Base để giải phóng khỏi nỗi ám ảnh "quên chấm công" trong team 🤪
Sau vài tháng triển khai, UrCheckin đã phát huy tốt vai trò của nó, nhưng vẫn còn một vấn đề lớn chưa được giải quyết.
Khi tự động hóa chưa đủ tự động ⚙️
Hiện tại UrCheckin đã tự động checkin/checkout hàng ngày cho các thành viên, nhưng khi off/remote phải vào bot để tạo request để ngày đó bot không thực hiện checkin/checkout, cái này để nhân sự khỏi thắc mắc 😅️️ cũng như tạo cho hệ thống minh bạch hơn
Nhưng nó vẫn mất thời gian thao tác nhỉ??
Nhưng may mắn thay team mình có 1 group Timeoff để mọi người nhắn vào xin nghỉ/remote. Điều này mình nảy ra ý tưởng liền, dựa vào những tin nhắn của các thành viên để biết được cần checkin/checkout ngày đó hay không?
Thử thách: Tin nhắn tự nhiên quá đa dạng và phức tạp 🔄
Đây là ví dụ một số tin nhắn thực tế trong group Timeoff:
"anh abc ơi, nay bạn gái em ốm, cho em xin wfh 1 ngày chăm sóc bạn ấy nha hiuhiu 😷"
"dạ chị xyz cho em xin remote buổi sáng do em cảm thấy hơi chán nản khi lên công ty :("
Những tin nhắn này chứa đầy thông tin phi cấu trúc, đa dạng về cách diễn đạt, và nhiều khi còn chứa thông tin không liên quan.
Đây chính là lúc AI có thể tỏa sáng 🌟
Sử dụng 1 model AI nào đó sẽ dễ dàng phân tích được tin nhắn và phân loại cụ thể, vậy là đã có lối đi rồi ^^
Rào cản
Bây giờ đầu tiên phải đọc được tin nhắn của Group Timeoff, ban đầu mình nghĩ ra giải pháp sử dụng Bot Telegram.
Nhưng để Bot đọc được tin nhắn mình cần phải add vào group
và set quyền Admin cho Bot để bot có thể lắng nghe được tin nhắn. Tớ
thấy khá phiền và muốn tìm giải pháp khác hiệu quả hơn )))
Ngồi suy nghĩ một lúc thì bế tắc, đột nhiên bạn đồng nghiệp gợi ý có thể dùng chính tài khoản cá nhân để đọc tin nhắn tất cả các Group, trước giờ tớ hay dùng Bot thôi nên cũng khá ngạc nhiên. Tìm hiểu một chút thì thấy có thư viện gramjs hỗ trợ. Vậy thì có hướng đi rồi, chắc chắn khả thi
Tuy nhiên biết được tính năng hay ho này của Telegram với GramJs thì mình không sử dụng trực tiếp GramJs mà mình xây dựng một service UrTelegram(mình sẽ nói ở bài sau nhé), UrTelegram sẽ chịu trách nhiệm lắng nghe message, mình chỉ cần call api để lấy những tin nhắn mới. Flow sẽ như sau
Kiến trúc giải pháp: 2 microservices độc lập 🏗️
Sau khi brainstorm, tớ quyết định xây dựng hai microservices hoàn toàn tách biệt:
1. Message Collector 📪
Service này đóng vai trò "đôi tai", lắng nghe mọi tin nhắn trong group Timeoff và lưu trữ chúng vào MongoDB. Nó có nhiệm vụ:
- Call API đến UrTelegram để lấy tin nhắn mới
- Định danh người gửi và thời gian
- Lưu trữ tin nhắn gốc vào MongoDB để xử lý sau
2. Message Analyzer 🧠
Service thứ hai đóng vai trò "bộ não", phân tích tin nhắn để trích xuất ý định xin nghỉ/remote.
Service này sẽ:
- Quét MongoDB để tìm tin nhắn mới chưa phân tích
- Gửi tin nhắn đến OpenAI API để phân tích
- Chuyển đổi kết quả phân tích thành các request nghỉ/remote
- Lưu trữ kết quả để UrCheckin sử dụng
Sức mạnh của OpenAI GPT-4o và Prompt Engineering 🔥
Để GPT-4o có thể "hiểu" chính xác tin nhắn xin nghỉ, tớ đã dành rất nhiều thời gian cho Prompt Engineering - một kỹ thuật thiết kế yêu cầu giúp AI hiểu đúng và trả về kết quả chính xác.
Đây là System Prompt tớ đã viết cho GPT-4o:
Bạn là một trợ lý phân tích tin nhắn xin nghỉ phép. Nhiệm vụ của bạn là trích xuất thông tin nghỉ phép từ tin nhắn và định dạng chúng thành cấu trúc JSON cụ thể.
OUTPUT FORMAT: { "results": [ { "date": "YYYY-MM-DD", "status": "off|remote", "type": "full-day|morning|afternoon" } ] }
QUY TẮC XỬ LÝ NGÀY THÁNG:
1. "hôm nay" = ngày trong currentDate
2. "ngày mai" = currentDate + 1 ngày
3. "chiều nay", "sáng nay" = ngày trong currentDate
4. Với ngày cụ thể như "thứ 6 (17/1)" = sử dụng ngày được đề cập (17/1)
5. Khoảng thời gian (vd: "20/01 - 24/01") = tạo entry cho mỗi ngày trong khoảng
6. Các ngày trong tương lai (vd: "sau tết") = sử dụng ngày được đề cập cụ thể
7. "về sớm" = off/remote afternoon của ngày hiện tại
QUY TẮC STATUS:
1. "off", "nghỉ", "về" = status "off"
2. "wfh", "remote", "làm remote" = status "remote"
3. Nếu tin nhắn đề cập cả off và remote = ưu tiên "off"
4. Nếu "về sớm" = "remote" cho afternoon
5. "Xin về" = "off" cho phần còn lại của ngày
QUY TẮC TYPE:
1. Default = "full-day" nếu không đề cập thời gian cụ thể
2. "sáng" = "morning"
3. "chiều" = "afternoon"
4. Nếu xin nghỉ không đề cập = "full-day"
...
Kết luận: Khi AI trở thành đồng nghiệp ảo 🤖
UrCheckin đã phát triển từ một bot đơn giản thành một hệ thống AI thông minh, giúp tiết kiệm hàng chục giờ làm việc mỗi năm cho team chúng tớ.
Dự án này là một minh chứng cho thấy AI là công cụ thực sự hữu ích khi được áp dụng vào các vấn đề thực tế hàng ngày.
Và có lẽ điều quan trọng nhất: mọi người trong team giờ đây có thể tập trung vào công việc thực sự quan trọng, thay vì lo lắng về việc chấm công hay xin nghỉ phép 😎
"Sự khác biệt giữa một developer tầm thường và một developer xuất sắc không phải là họ viết code nhanh hơn, mà là họ biết tự động hóa những công việc lặp đi lặp lại." - Không nhớ ai đã nói, nhưng nó đúng! 😄
Bạn nghĩ sao về ý tưởng cùa mình, cùng bình luận nhé ^^
GitHub Repository: dongitran/UrCheckin-Check-Timeoff
All rights reserved