Tự động hóa công việc lặp lại với AI
Dùng AI đề xuất phân loại ticket, kiểm tra kết quả bằng Python và tạo một batch xử lý có thể chạy lại.
Tổng quan
Dành cho người học muốn tự hoàn thành bài thực hành tự động hóa công việc lặp lại với ai, với dữ liệu mẫu có thể kiểm tra.
- Chọn một phần việc nhỏ để tự động hóa trước.
- Tách đề xuất AI khỏi thao tác thực thi.
- Dùng ID và validation để tránh bỏ sót hoặc trùng lặp.
Bạn sẽ hoàn thành: Một file triage.json gồm ba đề xuất hợp lệ, chưa tự động áp dụng vào hệ thống hỗ trợ.
Chuẩn bị
- Python 3.10+, trình soạn thảo và trợ lý AI có text chat.
Script chạy offline; có thể dán dữ liệu giả lập vào công cụ AI đã có quyền sử dụng. Không cần API hoặc tự động gửi tin nhắn.
Thực hành từng bước
Bước 1. Chọn batch có ID ổn định
Bắt đầu bằng phân loại ba ticket giả lập trong code dưới, không chọn thao tác xóa file hoặc gửi email làm bước tự động đầu tiên. Xác định các loại cho phép: access, billing, other. Ticket thiếu thông tin phải chuyển người kiểm tra chứ không tự quyết định chắc chắn.
Bước 2. Yêu cầu AI tạo đề xuất có cấu trúc
Phân loại dữ liệu sau. Chỉ trả JSON array với đúng ba trường mỗi item: id, category (access/billing/other), needs_review (boolean). Giữ mọi ID, không trùng lặp; thiếu thông tin thì other và needs_review=true. Không viết câu trả lời khách hàng.
T1: Cannot sign in after password reset
T2: Please explain my sample invoice
T3: I have a questionLưu kết quả thật vào proposals.json. Nếu bạn muốn thử script trước khi dùng AI, dùng fixture dưới; đây là dữ liệu mẫu do tác giả viết, không phải kết quả chạy model đã được đo.
[{"id":"T1","category":"access","needs_review":false},
{"id":"T2","category":"billing","needs_review":false},
{"id":"T3","category":"other","needs_review":true}]Bước 3. Kiểm tra trước khi ghi kết quả
Lưu code thành triage.py cạnh proposals.json. Nó kiểm tra cấu trúc và ID, không xác minh category có đúng nghĩa của ticket không. Người thực hành vẫn phải đối chiếu ba nhãn với nguồn trước khi dùng thật.
import json
from pathlib import Path
TICKETS = [{"id": "T1", "text": "Cannot sign in after password reset"},
{"id": "T2", "text": "Please explain my sample invoice"},
{"id": "T3", "text": "I have a question"}]
ALLOWED = {"access", "billing", "other"}
def validate(proposals):
expected = {item["id"] for item in TICKETS}
if not isinstance(proposals, list) or len(proposals) != len(expected):
raise ValueError("wrong batch size")
seen = set()
for item in proposals:
if not isinstance(item, dict) or set(item) != {"id", "category", "needs_review"}:
raise ValueError("invalid fields")
if item["id"] not in expected or item["id"] in seen:
raise ValueError("unknown or duplicate id")
if item["category"] not in ALLOWED or type(item["needs_review"]) is not bool:
raise ValueError("invalid classification")
seen.add(item["id"])
return sorted(proposals, key=lambda item: item["id"])
if __name__ == "__main__":
proposals = json.loads(Path("proposals.json").read_text(encoding="utf-8"))
result = validate(proposals)
Path("triage.json").write_text(json.dumps(result, indent=2) + "\n", encoding="utf-8")
print("Validated", len(result), "proposals; no messages sent")python3 triage.pyBước 4. Thử lỗi và chạy lại an toàn
Nhân đôi T1 hoặc đổi một category thành admin: script phải từ chối và không ghi kết quả mới. Sau khi sửa, chạy hai lần cùng input, so sánh nội dung triage.json phải giống nhau. Chỉ giữ bản đã kiểm tra để nhập vào công cụ hỗ trợ bằng bước riêng được phép.
Kiểm tra kết quả
- Ba ID xuất hiện đúng một lần, T3 có needs_review=true.
- Batch sai bị chặn trước thao tác ghi; không có thao tác gửi.
Xử lý lỗi thường gặp
AI bọc JSON trong Markdown
Nguyên nhân: Đầu ra không đúng hợp đồng máy đọc.
Cách xử lý: Yêu cầu JSON thuần hoặc bỏ đúng hàng rào code khi sao chép; không dùng eval để đọc.
Script chạy đúng nhưng nhãn sai
Nguyên nhân: Validation cấu trúc không thay thế kiểm tra ý nghĩa.
Cách xử lý: Đối chiếu ticket và sửa đề xuất; lưu các trường hợp sai vào tập kiểm tra prompt.
Bài tập & mở rộng
- Thêm ticket nhiều nghĩa và kiểm tra được đưa vào review.
- Chuyển các bước thành workflow n8n ở bài tiếp theo.
Không tích hợp CRM thật và không xử lý dữ liệu khách hàng. Idempotency ở đây chỉ là nội dung output ổn định, không phải bảo đảm giao dịch phân tán.
