
Trứng 25 năm
25 Years of Eggs
Bài viết này chia sẻ hành trình 14 ngày sử dụng các AI coding agents để trích xuất dữ liệu chi tiêu cho trứng từ hóa đơn kéo dài 25 năm. Một trong những thử thách lớn nhất là việc xử lý OCR (Optical Character Recognition) trên những hóa đơn chất lượng thấp, đa dạng về định dạng và dễ bị mờ nhòe – những yếu tố mà các phương pháp computer vision và OCR truyền thống đã bó tay. Giải pháp đột phá ở đây là tận dụng các model AI tiên tiến: Meta's SAM3 cho image segmentation, giúp tách biệt các vùng quan trọng trên ảnh hóa đơn. Đồng thời, các LLMs (Large Language Models) được sử dụng để xử lý "ngầm" các vấn đề về orientation (hướng chữ) và extraction (trích xuất văn bản), thay thế cho Tesseract. Nhóm đã chuyển sang sử dụng PaddleOCR-VL với một kỹ thuật slicing (cắt ảnh) mới lạ để đạt được độ chính xác cao hơn. Đây là một ví dụ thực tế cho thấy các AI models hiện tại, đặc biệt là các mô hình vision-language, có khả năng giải quyết các bài toán trích xuất dữ liệu phức tạp mà trước đây gần như bất khả thi. Thú vị hơn, các công cụ và giải pháp ta đang sử dụng trong quá trình phát triển lại chính là chìa khóa để mở ra những hướng đi mới, giúp vượt qua các giới hạn kỹ thuật.
Mọi người đều cần một sở thích bổ ích. Tôi đã quét tất cả các biên lai của mình từ năm 2001. Tôi không bao giờ gõ vào một giá duy nhất - chỉ giữ lại những hình ảnh. Tôi hình dung một ngày nào đó công nghệ sẽ...

Xuất bản: Ngày 23 tháng 2 năm 2026
Mọi người đều cần một sở thích bổ ích. Tôi đã quét tất cả các biên lai của mình từ năm 2001. Tôi không bao giờ gõ vào một giá duy nhất - chỉ giữ lại những hình ảnh. Tôi hình dung một ngày nào đó công nghệ để đọc chúng sẽ bắt kịp, và dữ liệu sẽ rất thú vị.
Năm nay tôi đã thử nghiệm nó. Hai tác nhân mã hóa AI, 11.345 biên lai. Tôi bắt đầu với trứng. Nếu bạn có thể theo dõi một mục trong 25 năm in nhiệt bị cắt xén, lỗi OCR và lỗi chính tả của thư mục, bạn có thể theo dõi mọi thứ.
14 ngày. 1,6 tỷ token. 589 biên lai trứng được tìm thấy. Dưới đây là những gì dữ liệu cho biết.
Dưới đây là những gì tôi đã nhập vào Ngày 1:
Ok vì vậy hãy lập kế hoạch dự án. Trong ~/Records/ chúng tôi có rất nhiều biên lai. Nhiều tệp là pdf/image/v.v. Tôi muốn xem qua và trích xuất nội dung thực tế của biên lai để tìm xem chúng ta chi bao nhiêu cho trứng. Biên lai nổi tiếng là khủng khiếp đối với OCR, vì vậy chúng tôi có thể cần phải làm điều gì đó nâng cao hơn.
Codex đã khám phá hệ thống tệp của tôi, tìm thấy hai cơ sở dữ liệu SQLite hiện có mà tôi đã quên, phát hiện ra 11.345 biên lai trên các tệp PDF, email và hình ảnh và quay lại với một kế hoạch dự án. Tôi nói “vui lòng viết thư này cho plan.md.” Nó đã làm. Chúng tôi đã xây dựng trong vòng một giờ.
Toàn bộ quá trình mất 14 ngày. Có lẽ 15 giờ của tôi thực sự ở bàn phím - những tiếng nổ ngắn của hướng dẫn cách nhau bởi những đoạn dài của các tác nhân vừa chạy. Codex đã thực hiện 15 phiên tương tác. Claude đã xử lý 10.
Sắc thái của màu trắng
Các biên lai cũ nhất là các bản quét phẳng - nhiều biên lai trên mỗi trang, định hướng ngẫu nhiên, giấy trắng trên giường quét trắng. Codex và tôi đã thử bảy cách tiếp cận CV cổ điển để tìm ranh giới biên nhận. Phát hiện biên. Ngưỡng thích ứng. Phân tích đường viền. Hoạt động hình thái. Phân đoạn đầu nguồn. Kết hợp mẫu. Một sự phân hủy dựa trên lưới mà tôi gọi là "một vấn đề HackerRank cổ điển".
Không ai trong số họ làm việc. Vấn đề cốt lõi: biên lai có màu trắng và giường máy quét cũng vậy. Tôi bắt đầu gọi nó là vấn đề "sắc thái của màu trắng". Nỗ lực thông minh nhất được lấy cảm hứng từ việc loại bỏ khách du lịch khỏi các bức ảnh mang tính bước ngoặt - xếp chồng tất cả các bản quét, tính điểm ảnh trung bình ở mỗi vị trí, trừ để lộ các cạnh. Tôi nghĩ rằng một cái sẽ hoạt động. F1 tốt nhất: 0,302.
Chúng tôi cũng đã ném macOS Vision OCR vào nó (thông qua tập lệnh Swift Codex viết nhanh), Tesseract, một số công cụ khác. Tôi bắt đầu nghĩ rằng việc quét phẳng có thể chỉ là một mất mát. Sau đó tôi đã thử SAM3 của Meta.

Một cuộc gọi API với text="nhận". 0.92-0.98 tự tin trên mọi ranh giới. Bốn giây cho mỗi lần quét. 1.873 biên lai từ 760 trang đa biên lai. Bảy lần tiếp cận trong giờ; SAM3 trong một buổi chiều.
Chờ đã - Bạn đã biết câu trả lời
Biên lai hạ cánh ở các góc ngẫu nhiên và OCR cần chúng thẳng đứng. Chúng tôi đã thử phát hiện định hướng của Tesseract, macOS Vision OCR, Moondream 2 và 3 - mỗi cái tốt hơn cái trước nhưng không đủ tin cậy. Sau đó, tôi nhận ra rằng mỗi khi tôi dán một biên lai vào cuộc trò chuyện Claude của chúng tôi để gỡ lỗi một cái gì đó, nó đã đọc văn bản một cách hoàn hảo. Xoay chiều, nhạt nhòa, không thành vấn đề.
Tại sao tôi xây dựng một đường ống quay khi công cụ tôi đang nói chuyện đã giải quyết vấn đề này? Vì vậy, chúng tôi đã gửi tất cả 11.345 biên lai thông qua Sonnet và Codex. Đôi khi câu trả lời là nhìn chằm chằm vào mặt bạn.
Thay thế Tesseract qua đêm
Nửa chừng dự án, Tesseract là mắt xích yếu. Nó đọc “SỮA YẾN MẠCH” là “OATH ILK”. Nó giảm số thập phân - $ 4,37 trở thành $ 437. Trên các bản in nhiệt cũ, nó không tạo ra gì cả. Codex đã mở 20 trong số những cái tồi tệ nhất bằng tay và thấy rằng một số thậm chí không phải là biên lai. Một bức ảnh gia đình. Một tấm bưu thiếp. Một tấm thiệp chúc mừng. Tất cả được nộp theo “Biên lai”.
Tôi đã tìm thấy PaddleOCR-VL - một mô hình ngôn ngữ hình ảnh tham số 0,9B chạy cục bộ trên Apple Silicon. Kiểm tra đầu tiên trên bảng sao kê ngân hàng mẫu: văn bản rõ ràng, chính xác trong 2,1 giây. Tesseract nhanh hơn nhưng ồn ào hơn đáng kể. Thử nghiệm thứ hai trên một hóa đơn Fred Meyer cao: thảm họa. Mô hình bước vào một vòng lặp lặp đi lặp lại, ảo giác “CHO ĐẾN YGRT” vô tận.
Việc sửa chữa hóa ra rất đơn giản - chia các biên lai cao thành các lát. Cắt động dựa trên tỷ lệ khung hình: num_slices = max(2, round(aspect_ratio / 1.5)). Năm mảnh song song chạy qua đêm. GPU được chốt ở mức 100% trong 10,8 giờ. Vào buổi sáng: 11.345 hóa đơn OCRđã được nhận thành công. Văn bản sạch hơn cho mọi biên lai trong kho lưu trữ.
PaddleOCR-VL không phải là sự thay thế Codex - nó không thể thực hiện trích xuất có cấu trúc hoặc làm theo hướng dẫn. Đó là một khối Ma phương tốt hơn. The real pipeline: receipt image → PaddleOCR-VL (local, clean text) → Codex/Claude (structured extraction).
Mười hai đến ba giờ
Sau khi biên lai được phân đoạn, định hướng và OCR, họ cần chiết xuất có cấu trúc - tìm các mặt hàng trứng, kéo giá và số lượng.
Nó bắt đầu với regex. Các người mẫu đều thích regex. Đối sánh từ khóa cho "trứng", các mẫu tiền cho giá cả. Heuristics tìm thấy trứng trong 25/25 mẫu dương tính với 0 mẫu dương tính giả. Không tệ. Nhưng trên toàn bộ văn bản, các âm bản giả chất đống - Fred Meyer viết tắt các mã như STO LRG BRUNN, Whole Foods bị cắt ngắn thành EDGS, OCR đã cắt nhỏ “TRỨNG” thành LG EGO 12 CT. Không có regex nào bắt được những thứ này.
Vì vậy, tôi đã nói với Codex “chúng tôi có mã thông báo không giới hạn, hãy sử dụng tất cả chúng” và chúng tôi đã xoay vòng để gửi mọi biên lai thông qua Codex để trích xuất có cấu trúc. Từ một câu đó, Codex đã trở lại với kiến trúc công nhân song song - sharding, quản lý sức khỏe, điểm kiểm tra, thử lại logic. Toàn bộ điều này. Khi tôi hết token trên Codex vào giữa kỳ, nó sẽ tự động chuyển sang Claude và tiếp tục hoạt động. Tôi không yêu cầu nó làm điều đó. Tôi không biết điều đó đã xảy ra cho đến khi tôi đọc nhật ký.
Nhưng các cuộc chạy vẫn tiếp tục đổ vỡ. Các công việc CLI dài đã chết khi hết thời gian chờ. Kịch bản đã đưa ra kết quả cuối cùng, vì vậy những ca tử vong sớm đã mất tất cả. Tôi đã xem nó xảy ra ba lần. Trong lần thử thứ tư, tôi đã nói "Tôi dự kiến chúng tôi sẽ bắt đầu một quy trình mới cho mỗi lô." Đó là cách khắc phục - một quy trình mới cho mỗi lô, giới hạn cuộc gọi cứng, thoát hoàn toàn, tiếp tục từ bộ nhớ cache. Codex đã vá nó, ra mắt nó trong một phiên tmux và ETA giảm từ 12 giờ xuống còn 3. Không phải là một sửa chữa khó khăn. Chỉ là những điều bạn biết sau khi bạn đã chứng kiến đủ công việc qua đêm chết vào lúc 3 giờ sáng.
11.345 biên lai đã được xử lý. Điều đáng lẽ phải mất cả đêm đã hoàn thành trước khi tôi đi ngủ.
Bộ phân loại đã đánh bại sự thật nền tảng của chính nó
Đầu tiên tôi cần sự thật cơ bản. Tôi yêu cầu Claude xây dựng cho tôi một công cụ ghi nhãn - đầu tiên là bàn phím, hình ảnh biên lai ở bên trái, dữ liệu phân loại ở bên phải, các phím mũi tên để điều hướng, nhấn phím đơn để phán quyết. Nó xây dựng toàn bộ ứng dụng Flask trong 22 phút. Tôi ngồi xuống và dán nhãn 375 biên lai.
Regex tìm thấy 650 biên lai đề cập đến "trứng". So với 375 nhãn đó: thu hồi 88%. Các thiếu sót đã kể câu chuyện - mã viết tắt, OCR cắt xén, mô tả ngắn gọn. Không có tìm kiếm từ khóa nào bắt được STO LRG BRUNN.
Cách khắc phục: sử dụng các trường hợp cạnh được dán nhãn bằng tay đó làm ví dụ vài lần trong bộ phân loại LLM. Hai mươi ví dụ về "trứng" trông như thế nào trên một bản in nhiệt bị cắt xén từ năm 2003. Batch 10 biên lai cho mỗi cuộc gọi. Tám công nhân song song. Hai giờ. 11.345 biên lai được phân loại.
Độ chính xác cuối cùng: 99%+. Mỗi "bỏ lỡ" được cho là của LLM hóa ra là một nhãn sai trong sự thật cơ bản. Một hóa đơn cửa hàng xe đạp mà heuristic cũ đã được gắn cờ. Quét chỉ bằng mã vạch. Mì trứng. Bộ phân loại chính xác hơn nhãn của tôi.
Sau đó, thêm QA. Một công cụ thứ hai để nhãn cầu 497 hình ảnh yếu: Không gian cho không có trứng, X cho có trứng. Một phần ba để nhập dữ liệu trên 95 biên lai với các trường bị thiếu - tối ưu hóa numpad, tự động nâng cao. Tổng cộng bốn công cụ, mỗi công cụ được xây dựng trong vài phút, mỗi công cụ tôi nghiền bằng tay.
Chất lượng
Vậy dữ liệu tốt như thế nào? Tôi lấy 372 mẫu ngẫu nhiên và kiểm tra chúng bằng tay. Ban đầu: chính xác 96%. Các lỗi chủ yếu là bị cắt xén OCR trên các bản quét cũ. Một là ảo giác - dữ liệu trứng do đường ống tạo ra cho một hóa đơn không chứa trứng nào cả.
Dữ liệu trong thế giới thực rất lộn xộn:
- Lỗi chính tả trong thư mục biên lai kéo dài nhiều năm: “Reciepts” (2016-2017) và “Recipts”
- Biên lai được quét ngược - Claude đã giải mã ký tự OCR được nhân đôi theo ký tự
- Biên lai email âm thầm ưu tiên
văn bản/đơn giảnhơnvăn bản/html, bỏ các mục hàng định giá chỉ tồn tại trong phần HTML
Đây là những gì làm cho chất lượng tốt: mỗi khi tôi bắt được một cái gì đó, tôi có thể chỉ cho các đại lý những gì cần tìm và họ sẽ sửa chữa nó ở khắp mọi nơi. Tôi bắt gặp một địa chỉ cửa hàng ẩn trong tiếng ồn OCR: "915 Ny 45th St" là 915 NW 45th St, Seattle. Tôi đã cho họ thấy mô hình, họ đã chạy một thẻ phục hồi trên 40 biên lai vị trí bị mất - tất cả 40 đã được giải quyết.
Bằng những con số
| Thời gian đồng hồ treo tường | |||
| 14 ngày (8-22/2/2026) | |||
| Thời gian thực hành | 15 giờ | ||
| Mã thông báo đã tiêu thụ | 1,6 tỷ | ||
| Chi phí token ước tính | $ 1,591 | ||
| Biên lai trứng đã xác nhận | 589 | ||
| Tổng chi tiêu trứng đã thu được | $ 1.972 | ||
| Tổng số trứng | 8.604 |
Codex và Claude rất xuất sắc trong việc xây dựng các công cụ và trích xuất dữ liệu có cấu trúc, nhưng họ không thể phân đoạn hình ảnh hoặc thay thế công cụ OCR. Câu trả lời đúng là một loạt các mô hình chuyên biệt - SAM3 cho phân đoạn, PaddleOCR cho văn bản, Codex và Claude cho mọi thứ khác. Tôi mong đợi điều này, nhưng nó đáng để thử con đường đơn giản trước.
Đây là những ngày của phép lạ và kỳ diệu. Tôi không thể chờ đợi để xem những quả trứng 30 năm trông như thế nào.
Tác giả: avyfain