Xây dựng Hệ thống Automated Invoice Processing trên VPS: Giải pháp Trích xuất Dữ liệu Hóa đơn Tự động bằng Donut Transformer Model trên CPU
Giới thiệu về Xu hướng Automated Invoice Processing trong Doanh nghiệp
Trong kỷ nguyên chuyển đổi số, tối ưu hóa quy trình vận hành và cắt giảm chi phí nhân sự luôn là ưu tiên hàng đầu của mọi doanh nghiệp. Xử lý hóa đơn (Invoice Processing) truyền thống là một trong những tác vụ tốn thời gian, dễ sai sót và tiêu tốn nhiều nguồn lực nhất của bộ phận tài chính - kế toán. Nhân viên phải nhập liệu thủ công từng trường thông tin từ hình ảnh hoặc tệp PDF vào hệ thống quản trị (ERP/CRM).
Sự ra đời của trí tuệ nhân tạo (AI) đã mở ra một chương mới với giải pháp Automated Invoice Processing (Xử lý hóa đơn tự động). Thay vì phụ thuộc vào con người, hệ thống AI có khả năng tự động đọc, hiểu và trích xuất các thông tin quan trọng như mã số thuế, ngày lập, tổng tiền, danh sách mặt hàng sang định dạng dữ liệu cấu trúc (JSON, CSV). Bài viết này sẽ hướng dẫn bạn cách xây dựng một hệ thống xử lý hóa đơn AI-driven hoàn chỉnh, triển khai trực tiếp trên máy chủ ảo cá nhân (VPS) sử dụng cấu hình CPU thông thường thông qua kiến trúc mô hình đột phá mang tên Donut Transformer.
Thách thức của OCR Truyền thống và Sự Trỗi Dậy của Donut Transformer
Hạn chế từ các giải pháp OCR cổ điển
Trước đây, việc trích xuất dữ liệu từ tài liệu thường dựa vào quy trình hai bước (Two-stage Pipeline):
- Optical Character Recognition (OCR): Sử dụng công cụ (như Tesseract, EasyOCR) để nhận diện toàn bộ ký tự văn bản trong ảnh và trả về tọa độ (bounding boxes).
- Information Extraction (IE): Sử dụng biểu thức chính quy (Regex) hoặc các mô hình NLP để phân tích ngữ cảnh, gán nhãn dữ liệu và gom cụm thành các trường mong muốn.
Quy trình này gặp phải những rào cản lớn khi đối mặt với hóa đơn thực tế: lỗi nhận diện ký tư do ảnh mờ, nhiễu, cấu trúc hóa đơn thay đổi liên tục khiến hệ thống Regex bị vỡ, và chi phí tính toán tăng gấp đôi do phải chạy hai mô hình độc lập.
Donut Transformer là gì?
Donut (Document Understanding Transformer) là một kiến trúc mạng học sâu đột phá được giới thiệu bởi NAVER CLOVA. Khác với phương pháp cũ, Donut tiếp cận theo hướng End-to-End (Đầu-cuối-đầu) dựa trên mô hình Vision-Encoder-Decoder. Nó loại bỏ hoàn toàn module OCR trung gian.
- Input (Đầu vào): Một bức ảnh chụp hóa đơn thô (JPEG/PNG).
- Output (Đầu ra): Chuỗi văn bản được định dạng sẵn cấu trúc (Structured Text) như JSON.
Mô hình "nhìn" vào bức ảnh thông qua một bộ mã hóa thị giác (Swin Transformer) và trực tiếp "dịch" nội dung ngữ nghĩa đó thành cây dữ liệu có cấu trúc nhờ bộ giải mã ngôn ngữ (BART). Nhờ cơ chế này, Donut hoạt động cực kỳ hiệu quả, giảm thiểu sai số tích lũy và đặc biệt là cực kỳ tiết kiệm tài nguyên khi chạy kiểm chứng (Inference) trên CPU.
Kiến trúc Hệ thống Triển khai trên VPS (CPU-Only)
Để tối ưu hóa chi phí vận hành cho các doanh nghiệp vừa và nhỏ (SMEs), chúng ta sẽ thiết kế hệ thống chạy hoàn toàn trên môi trường VPS với cấu hình CPU (ví dụ: 4 vCPU, 8GB RAM) thay vì các máy chủ GPU đắt đỏ. Sơ đồ kiến trúc bao gồm các thành phần cốt lõi:
Hóa đơn (Image) → API Gateway (FastAPI) → Preprocessing Pipeline → Donut Inference Engine (ONNX/PyTorch CPU) → Structured JSON → Webhook/Database.
Trong kiến trúc này, FastAPI đóng vai trò tiếp nhận yêu cầu tải ảnh lên từ phía client. Sau đó, module xử lý ảnh (PIL/OpenCV) sẽ chuẩn hóa kích thước ảnh về chuẩn đầu vào của Donut (thường là 2560x1920 hoặc 1280x960). Khối xử lý trung tâm là mô hình Donut đã được tối ưu hóa trọng số sang định dạng nhẹ hơn để tăng tốc độ xử lý trên CPU.
Hướng dẫn Từng bước Xây dựng Hệ thống
Bước 1: Chuẩn bị Môi trường trên VPS
Đầu tiên, bạn cần kết nối SSH vào VPS và cập nhật các gói hệ thống, sau đó thiết lập môi trường ảo Python để tránh xung đột thư viện:
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv libgl1-mesa-glx -y
python3 -m venv venv
source venv/bin/activateBước 2: Cài đặt các thư viện cần thiết
Chúng ta cần cài đặt Framework PyTorch phiên bản tối ưu cho CPU, thư viện Transformers của Hugging Face và FastAPI để dựng Web API:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install transformers sentencepiece pillow fastapi uvicorn pydanticBước 3: Khởi tạo Script Inference và FastAPI App
Dưới đây là cấu trúc mã nguồn Python cơ bản để tải mô hình Donut và trích xuất dữ liệu từ một hình ảnh hóa đơn:
import re
from fastapi import FastAPI, UploadFile, File
from PIL import Image
import io
from transformers import DonutProcessor, VisionEncoderDecoderModel
import torch
app = FastAPI()
# Tải mô hình và processor từ Hugging Face (hoặc thư mục local)
model_name = "naver-clova-ix/donut-base-finetuned-cord-v2"
processor = DonutProcessor.from_pretrained(model_name)
model = VisionEncoderDecoderModel.from_pretrained(model_name)
model.to("cpu")
model.eval()
@app.post("/process-invoice/")
async def process_invoice(file: UploadFile = File(...)):
# Đọc ảnh từ request
image_data = await file.read()
image = Image.open(io.BytesIO(image_data)).convert("RGB")
# Chuẩn bị dữ liệu cho mô hình
task_prompt = ""
decoder_input_ids = processor.tokenizer(task_prompt, add_special_tokens=False, return_tensors="pt").input_ids
pixel_values = processor(image, return_tensors="pt").pixel_values
# Chạy mô hình trên CPU
with torch.no_grad():
outputs = model.generate(
pixel_values.to("cpu"),
decoder_input_ids=decoder_input_ids.to("cpu"),
max_length=model.config.decoder.max_position_embeddings,
pad_token_id=processor.tokenizer.pad_token_id,
eos_token_id=processor.tokenizer.eos_token_id,
use_cache=True,
bad_words_ids=[[processor.tokenizer.unk_token_id]],
return_dict_in_generate=True,
)
# Giải mã kết quả sang JSON
sequence = processor.batch_decode(outputs.sequences)[0]
sequence = sequence.replace(processor.tokenizer.eos_token, "").replace(processor.tokenizer.pad_token, "")
sequence = re.sub(r"<\/?.+?>", "", sequence).strip()
parsed_json = processor.token2json(sequence)
return {"status": "success", "data": parsed_json} Chiến lược Tối ưu hóa Tốc độ Xử lý trên CPU cho Môi trường Production
Mặc dù Donut gọn nhẹ hơn nhiều mô hình OCR+NLP kết hợp, việc chạy Deep Learning trên CPU mặc định vẫn có thể gặp hiện tượng nghẽn cổ chai (Latency cao, khoảng 5-10 giây/hóa đơn). Để đưa hệ thống vào vận hành thực tế mượt mà, doanh nghiệp cần áp dụng các kỹ thuật tối ưu hóa sau:
- Chuyển đổi sang định dạng Open Neural Network Exchange (ONNX Runtime): Xuất mô hình PyTorch sang ONNX cho phép tận dụng tối đa tập lệnh toán học chuyên dụng của CPU (như AVX-512 hoặc Intel MKL). Việc này có thể tăng tốc độ xử lý gấp 2 đến 3 lần.
- Kỹ thuật Lượng tử hóa (Quantization): Chuyển đổi trọng số mô hình từ kiểu dữ liệu Float32 sang Int8. Quá trình này giúp giảm dung lượng RAM tiêu thụ lên tới 75% và đẩy nhanh tốc độ tính toán mà tỷ lệ chính xác (Accuracy) hầu như không suy giảm đáng kể.
- Cơ chế Hàng đợi (Message Queue): Với các hệ thống nhận hóa đơn hàng loạt (Bulk Upload), không nên xử lý đồng thời (Synchronous) gây tràn RAM VPS. Hãy kết hợp Celery và Redis để tạo hàng đợi xử lý bất đồng bộ (Asynchronous Task Processing).
Kết luận và Định hướng Phát triển
Xây dựng một hệ thống Automated Invoice Processing bằng mô hình Donut Transformer trên VPS CPU là một giải pháp thực tiễn, dung hòa hoàn hảo giữa yếu tố công nghệ tiên tiến và bài toán chi phí doanh nghiệp. Hệ thống loại bỏ sự cồng kềnh của công nghệ OCR cũ, mang lại khả năng trích xuất dữ liệu trực tiếp, nhất quán và dễ dàng bảo trì.
Để nâng cao hơn nữa hiệu quả cho doanh nghiệp Việt Nam, bước tiếp theo bạn cần thực hiện là tiến hành Fine-tuning (Huấn luyện lại) mô hình Donut với tập dữ liệu hóa đơn đặc thù theo quy chuẩn của Tổng cục Thuế Việt Nam. Điều này đảm bảo tỷ lệ chính xác tối đa đối với các định dạng hóa đơn điện tử phổ biến hiện nay.
