Nhân dịp mô hình Gemini 2.5 pro vừa mới được ra mắt thì mình cũng muốn dùng thử xem nó cải tiến như thế nào, vì thực sự thì các mô hình Gemini trước đây vẫn tương đối kém so với ChatGPT và Claude.
Thử thách: Xây dựng một Công cụ xử lý hóa đơn tự động
Mình quyết định đặt ra một nhiệm vụ thực tế: xây dựng một ứng dụng web có thể tự động hóa quy trình trích xuất thông tin tẻ nhạt từ hóa đơn. Các yêu cầu cụ thể của mình là:
- Giao diện: Một ứng dụng web Streamlit chạy dễ dàng trong môi trường Google Colab.
- Đầu vào: Chấp nhận tệp hình ảnh hoặc PDF của hóa đơn.
- OCR: Thực hiện Nhận dạng Ký tự Quang học (OCR) để trích xuất văn bản thô từ tệp đầu vào.
- Trích xuất bằng LLM: Kết nối với API của một Mô hình Ngôn ngữ Lớn (LLM) để lấy ra một cách thông minh các trường dữ liệu chính (tên người mua, địa chỉ, ngày tháng, các mặt hàng, tổng số tiền, v.v.) từ văn bản OCR.
- Xác thực: Hiển thị các trường đã trích xuất để người dùng xem xét và xác nhận thủ công.
- Xuất dữ liệu: Lưu dữ liệu đã xác nhận vào một Google Sheet được chỉ định.
Công việc này bao gồm thiết kế giao diện người dùng, xử lý tệp, tích hợp OCR, tạo prompt cho LLM, cấu trúc dữ liệu và kết nối API bên ngoài – một nhiệm vụ tương đối phức tạp cho một prompt ban đầu.

Ấn Tượng Đầu Tiên Về Gemini 2.5 Pro: Khả Năng Đáng Kinh Ngạc
Mình đã trình bày yêu cầu của mình (bằng tiếng Anh), nêu rõ các tính năng ở trên và gửi nó cho Gemini 2.5 Pro. Kết quả từ phản hồi ngay lần đầu tiên thực sự gây ngạc nhiên và ấn tượng. Thay vì một phác thảo mơ hồ hoặc các đoạn mã không hoàn chỉnh, Gemini đã cung cấp bốn khối mã Python riêng biệt, có cấu trúc tốt, được thiết kế cho Google Colab:
- Cài đặt dependencies: Một cell để apt-get các gói Linux cần thiết (như tesseract, poppler cho PDF) và pip install tất cả các thư viện Python bắt buộc (streamlit, pytesseract, paddleocr, OpenAI, Gspread, v.v.).
- Nhập credentials: Một cell để nhắc người dùng cung cấp khóa API (OpenAI, có thể là các khóa khác) và chi tiết cấu hình Google Sheet một cách an toàn, lưu trữ chúng trong tệp .env.
- Code ứng dụng Streamlit (app.py): Logic cốt lõi của ứng dụng, được ghi vào một tệp. Điều này bao gồm các hàm để tải lên tệp, xử lý OCR (ban đầu đề xuất Tesseract/Paddle), gọi LLM để trích xuất, hiển thị dữ liệu để xác nhận và kết nối với Google Sheets.
- Triển khai/Thực thi: Một cell sử dụng pyngrok để chạy ứng dụng Streamlit trong Colab và hiển thị nó thông qua một URL công khai để tương tác.
Đoạn mã này hoàn chỉnh một cách đáng kinh ngạc. Phần lớn, đó chỉ là việc “sao chép-dán” để có được một phiên bản cơ bản hoạt động (ngoài việc cần khóa API ngrok của mìnhđể có tunnel ổn định, điều này là cũng bình thường). Cấu trúc rất logic và các chức năng cốt lõi đã được vạch ra sẵn. Cấu trúc của câu trả lời này vượt xa sự mong đợi của mình dựa trên những trải nghiệm trước đây. Tuy nhiên tốc độ trả lời thì có lẽ vẫn cần cải thiện thêm (có lẽ nhiều người tham gia test quá?)
Kiểm Tra Thực Tế: Debug và Tinh Chỉnh
Tất nhiên, “gần như hoàn chỉnh” không giống như “hoàn toàn sẵn sàng cho sản phẩm”. Mặc dù ứng dụng ban đầu là chạy được, vẫn cần thêm công đoạn debug và tinh chỉnh. Đây là cũng là lúc nhiều mô hình AI khiến coder phát cáu vì nó cứ nhai đi nhai lại cả block code một cách vô ích, và cũng là lúc kiến thức chuyên môn trở nên quan trọng. Dưới đây là các lĩnh vực chính mà mình đã giải quyết thêm với sự trợ giúp của Gemini:
- Tối ưu hóa OCR Tiếng Việt: Hóa đơn mục tiêu của mình là bằng tiếng Việt.
- Tesseract: cần cài đặt gói ngôn ngữ tiếng Việt (tesseract-ocr-vie) và chỉ định lang=’vie’ trong các lệnh gọi pytesseract.
- PaddleOCR: cần khởi tạo PaddleOCR đặc biệt với mô hình ngôn ngữ tiếng Việt (lang=’vi’). Gemini ban đầu cung cấp cài đặt chung cho tiếng Anh.
- Tinh chỉnh Prompt LLM: Prompt cho API OpenAI cần được tinh chỉnh để nêu rõ văn bản đầu vào là tiếng Việt, hướng dẫn chuyển đổi định dạng ngày (DD/MM/YYYY sang YYYY-MM-DD) và xử lý định dạng tiền tệ/số của Việt Nam (như 50.000 đ). Geminicũng hướng dẫn nó sử dụng các khóa JSON cụ thể.
- Xác thực Credentials: Cell nhập credentials ban đầu hoạt động nhưng không xác thực bất cứ điều gì. Mình đã yêu cầu Gemini cải tiến nó thêm để:
- Kiểm tra xem khóa OpenAI có hợp lệ không bằng một lệnh gọi API nhanh.
- Xác minh sự tồn tại và định dạng của tệp JSON Google Service Account.
- Thử kết nối thực sự đến Google Sheet được chỉ định bằng thông tin đăng nhập trước khi ghi tệp .env. Điều này đã phát hiện sớm một số vấn đề tiềm ẩn.
- Những điểm lưu ý về Google Sheets API: Đây hóa ra lại là phần phức tạp nhất.
- Kích hoạt API: Các thông báo lỗi ban đầu chỉ rõ ràng về việc cần kích hoạt “Google Sheets API” và “Google Drive API” trong dự án Google Cloud, ngay cả khi bạn chỉ nghĩ rằng bạn cần Sheets.
- Phạm vi xác thực (Scopes): Lỗi khó xử lý nhất! Cell xác thực hoạt động vì đã yêu cầu cả phạm vi Sheets và Drive. Tuy nhiên, hàm kết nối của ứng dụng Streamlit ban đầu chỉ yêu cầu phạm vi Sheets. Điều này gây ra lỗi 403 Insufficient Authentication Scopes trong ứng dụng đang chạy, mặc dù API của Google Sheet và Google Drive đã được bật và quá trình xác thực đã thành công. Mình loay hoay mất khoảng tầm 10 phút để debug vấn dề này.
- Những điểm đặc trưng của Streamlit: Mình cũng gặp phải một lỗi phổ biến của Streamlit vì st.set_page_config() khi chạy lại UI lần thứ 2, nhưng sau khi cung cấp mã lệnh thì Gemini cũng giải quyết được

Bài học rút ra và đánh giá Gemini 2.5 Pro
Thử nghiệm này thực sự là một thành công đối với mình, không chỉ trong việc xây dựng ứng dụng mà còn trong việc đánh giá Gemini 2.5 Pro.
- Tốc độ & Cấu trúc: Khả năng tạo ra một bộ khung ứng dụng đa thành phần, có cấu trúc tốt trong một phản hồi duy nhất là một yếu tố tiết kiệm thời gian khổng lồ. Nó xử lý yêu cầu phức tạp một cách đáng nể.
- Tinh chỉnh nhiều lần: Mặc dù không hoàn hảo ngay từ đầu, Gemini rất hữu ích trong giai đoạn gỡ lỗi khi được cung cấp các thông báo lỗi và ngữ cảnh cụ thể.
- Ngữ cảnh rất quan trọng: Mô hình cần ngữ cảnh chính xác, đặc biệt là về các chi tiết ngôn ngữ cụ thể (OCR/prompts tiếng Việt) và chi tiết tương tác API (như vấn đề phạm vi của Google). Nó không phải lúc nào cũng đoán đúng những điều này ban đầu.
- Cải tiến đáng kể: Gemini 2.5 Pro cho cảm giác là một bước nhảy vọt đáng kể so với các phiên bản tiền nhiệm. Khả năng hiểu và tạo ra các đoạn mã phức tạp, liên kết với nhau của nó rất ấn tượng. Đặc biệt, việc debug với Gemini 2.5 Pro cũng tương đối nhanh gọn và đơn giản, đi sâu vào trọng tâm chi tiết của vấn đề

Kết luận
Việc xây dựng webapp OCR hóa đơn này đã chứng minh tiềm năng đáng kinh ngạc của các mô hình như Gemini 2.5 Pro trong việc tạo mẫu và phát triển nhanh chóng. Mặc dù nó không phải là một phát ăn một – việc gỡ lỗi và kiến thức chuyên môn vẫn rất cần thiết – nó đã đẩy nhanh đáng kể quá trình từ một ý tưởng đơn thuần đến một ứng dụng chức năng.
Đoạn mã ban đầu cung cấp một nền tảng vững chắc, tiết kiệm hàng giờ, nếu không muốn nói là hàng ngày, cho việc thiết lập ban đầu và viết mã soạn sẵn. Nếu bạn chưa thử Gemini 2.5 Pro, trải nghiệm này cho thấy nó chắc chắn đáng để khám phá.
P.S
- Toàn bộ prompt của quá trình có thể được xem tại đây, file Google Colab hoàn chỉnh tại đây
- Bản thân bài blog này cũng được viết bởi Gemini 2.5 Pro, nhựng thực ra thì nó cũng hơi củ chuối nên vẫn phải edit lại kha khá 🙂
- Mình có lặp lại quá trình trên với DeepSeek V1 thì kết quả tạm ổn, nhưng vẫn phải debug nhiều hơn để code chạy được