Gemini Multimodal API: Trích xuất dữ liệu từ tài liệu phức tạp không còn là “ác mộng”

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Khi OCR truyền thống và Regex “đầu hàng”

Xử lý dữ liệu từ PDF, hóa đơn hay sơ đồ kỹ thuật vốn là bài toán gây đau đầu cho dân Dev. Trước đây, quy trình thường là: dùng Tesseract OCR đọc chữ, sau đó viết hàng tá dòng Regex để bóc tách thông tin. Thực tế phũ phàng cho thấy chỉ cần hóa đơn bị lệch 5 độ hoặc bảng biểu có format lạ, hệ thống sẽ lập tức báo lỗi.

Sự xuất hiện của Gemini 1.5 Pro và Flash với khả năng Multimodal (đa phương thức) đã thay đổi hoàn toàn cuộc chơi. Thay vì chỉ đọc mặt chữ, AI hiện tại đã hiểu được cấu trúc không gian của tài liệu. Trong một dự án thực tế về quản lý chi tiêu, mình đã nâng độ chính xác từ 65% lên hơn 95% ngay sau khi chuyển sang dùng Gemini API, loại bỏ hoàn toàn các bước debug logic bóc tách thủ công.

Tại sao Gemini lại xử lý tài liệu tốt hơn?

Khác với các LLM thuần văn bản phải “mượn mắt” từ một model OCR bên thứ ba, Gemini được huấn luyện để hiểu trực tiếp dữ liệu hình ảnh. Hai điểm mấu chốt tạo nên sự khác biệt bao gồm:

  • Native Multimodal: Model nhìn trực tiếp vào từng pixel ảnh, giúp nhận diện chính xác vị trí các trường dữ liệu ngay cả khi ảnh bị mờ hoặc nghiêng.
  • JSON Mode: Khả năng ép đầu ra về cấu trúc JSON chuẩn. Bạn có thể ném thẳng kết quả vào database mà không cần viết thêm hàm parse phức tạp.

Thực hành: Bóc tách hóa đơn sang JSON với Python

Đầu tiên, hãy lấy API Key tại Google AI Studio. Hiện tại, bản Flash đang miễn phí với hạn mức khá dư dả cho anh em test thử.

1. Cài đặt môi trường

Chỉ cần một dòng lệnh để cài đặt bộ SDK chính thức:

pip install -U google-generativeai Pillow

2. Script bóc tách dữ liệu

Dưới đây là đoạn code mình tối ưu để xử lý hóa đơn. Điểm quan trọng nhất là cấu hình response_mime_type để đảm bảo output luôn là JSON sạch.

import google.generativeai as genai
import PIL.Image
import os

genai.configure(api_key="YOUR_GEMINI_API_KEY")

# Gemini 1.5 Flash: Tốc độ cực nhanh, giá chỉ khoảng $0.075/1M token
model = genai.GenerativeModel("gemini-1.5-flash")

def extract_invoice_data(image_path):
    img = PIL.Image.open(image_path)
    
    prompt = """
    Phân tích hóa đơn và trả về JSON gồm các field: 
    store_name, date (YYYY-MM-DD), items (danh sách: name, qty, price), total_amount.
    Chỉ trả về JSON, không kèm lời dẫn.
    """
    
    response = model.generate_content(
        [prompt, img],
        generation_config={"response_mime_type": "application/json"}
    )
    return response.text

print(extract_invoice_data("receipt.jpg"))

Lưu ý từ thực tế: Nếu tài liệu có nhiều chữ viết tay loằng ngoằng, hãy ưu tiên gemini-1.5-pro. Dù chi phí cao hơn và tốc độ chậm hơn Flash khoảng 2-3 giây, nhưng khả năng suy luận của bản Pro vượt trội rõ rệt khi gặp ca khó.

Xử lý sơ đồ và bảng biểu phức tạp

Bảng biểu có ô gộp (merged cells) thường là “khắc tinh” của OCR. Với Gemini, mình thường áp dụng kỹ thuật Prompt Engineering để ép model suy nghĩ trước khi trích xuất:

prompt = """
1. Phân tích cấu trúc các cột và hàng trong bảng này.
2. Chú ý các ô bị gộp và xác định dữ liệu thuộc về hàng nào.
3. Trả về cấu trúc JSON phân cấp minh bạch.
"""

Gemini hỗ trợ context window lên tới 2 triệu token. Bạn có thể gửi file PDF dài hàng trăm trang, nhưng để đạt độ chính xác cao nhất cho bảng biểu, việc cắt PDF thành ảnh chất lượng cao (300 DPI) vẫn là lựa chọn tối ưu hơn.

3 mẹo để tối ưu độ chính xác và chi phí

Sau nhiều tháng triển khai trên production, đây là những kinh nghiệm giúp mình tiết kiệm tài nguyên và tránh lỗi vặt:

1. Đừng nén ảnh quá đà

Ảnh quá nhỏ sẽ khiến AI bị “ảo giác” (hallucination) và tự bịa ra con số. Hãy giữ chiều rộng ảnh tối thiểu 2000px. Độ phân giải tốt giúp AI đọc được cả những dòng chú thích nhỏ xíu ở chân trang.

2. Tận dụng System Instruction

Thiết lập vai trò cho AI ngay từ đầu giúp output ổn định hơn. Điều này cực kỳ quan trọng khi bạn cần xử lý hàng nghìn tài liệu với định dạng đồng nhất.

model = genai.GenerativeModel(
    model_name="gemini-1.5-flash",
    system_instruction="Bạn là chuyên gia bóc tách dữ liệu tài chính. Chỉ trả về JSON, không giải thích."
)

3. Khóa nhiệt độ (Temperature) về 0

Khi làm việc với dữ liệu cấu trúc, tính nhất quán là ưu tiên số một. Hãy set temperature=0 để đảm bảo cùng một tấm ảnh sẽ luôn cho ra một kết quả JSON giống nhau qua mỗi lần gọi API.

Kết luận

Gemini Multimodal API không chỉ là một công cụ mới, nó là cách tiếp cận hoàn toàn khác cho bài toán xử lý dữ liệu. Nó giúp giảm bớt hàng nghìn dòng code xử lý hậu kỳ và cho phép chúng ta xử lý những loại giấy tờ không có form cố định một cách dễ dàng.

Nếu bạn đang xây dựng bot quản lý chi tiêu hoặc hệ thống nhập liệu tự động, hãy thử bản Flash ngay hôm nay. Hiệu quả mang lại chắc chắn sẽ khiến bạn bất ngờ so với mức chi phí cực thấp mà Google đang áp dụng.

Share: