PDF thích ứng: Khi con người và máy tính nhìn thấy những nội dung khác nhau
Bài viết giới thiệu một kỹ thuật tạo ra "PDF thông minh" giúp con người thấy bố cục trực quan, trong khi các công cụ AI và máy móc trích xuất được cấu trúc Markdown sạch sẽ. Phương pháp này tận dụng một thuộc tính ít được biết đến trong đặc tả PDF để cải thiện độ chính xác khi xử lý tài liệu bằng LLM mà không làm thay đổi diện mạo gốc.

PDF là một định dạng trực quan. Về bản chất, nó lưu trữ các hướng dẫn về vị trí vẽ các ký tự (glyph) lên một trang. Mặc dù đặc tả kỹ thuật của PDF có hỗ trợ "Tagged PDF" — một cây cấu trúc đánh dấu các tiêu đề, đoạn văn và danh sách — nhưng hầu hết các tệp PDF mà chúng ta gặp trong thực tế đều không được gắn thẻ này. Các công cụ phổ biến như LaTeX, tính năng "Print-to-PDF" của Chrome hay hầu hết các công cụ xuất bản khác thường không tạo ra các thẻ này. Do đó, những gì chúng ta nhận được thực chất chỉ là các tọa độ và kích thước phông chữ. Các công cụ trích xuất văn bản sẽ đọc các lệnh vẽ từ trái sang phải, từ trên xuống dưới và hy vọng kết quả ra được như ý muốn.
Vấn đề khi AI đọc PDF
Điều này không quá quan trọng khi con người là độc giả duy nhất. Nhưng hiện nay, hầu hết các PDF đều được đưa vào các Mô hình Ngôn ngữ Lớn (LLM). Chúng ta tải chúng lên ChatGPT, yêu cầu Claude tóm tắt, hoặc đưa qua các bộ phân tích cú pháp. Mọi công cụ này đều phải đối mặt với một vấn đề chung: tái tạo cấu trúc từ một định dạng vốn dĩ không chứa cấu trúc đó.
Một LLM khi nhìn thấy dòng chữ "Project Alpha\nLed a team of 5 engineers\nto deliver the..." sẽ phải đoán xem tiêu đề kết thúc ở đâu và câu văn tiếp tục từ đâu. Đôi khi nó đoán đúng, nhưng thường là sai.
Tôi muốn tạo ra một tệp PDF mà con người nhìn thấy tài liệu được định dạng hoàn chỉnh, nhưng máy móc lại trích xuất được Markdown sạch sẽ. Cùng một tệp, không cần phần mở rộng mới, chỉ đơn giản là một file .pdf.
Cách thức hoạt động
Có một thuộc tính trong đặc tả PDF (từ phiên bản PDF 1.4 năm 2001) cho phép bạn định nghĩa văn bản thay thế cho nội dung được đánh dấu. Các trình hiển thị (renderers) sẽ bỏ qua thuộc tính này và vẽ bất cứ thứ gì mà luồng nội dung yêu cầu. Tuy nhiên, các công cụ trích xuất văn bản hỗ trợ thuộc tính này sẽ trả về văn bản thay thế thay vì văn bản trực quan.
Trong quá trình kiểm tra của tôi, cả PyMuPDF và Poppler đều công nhận thuộc tính này. Mức độ hỗ trợ có thể khác nhau tùy theo công cụ và phiên bản, nhưng các trình trích xuất mã nguồn mở chính đều xử lý tốt nó.
Thuộc tính này ban đầu được thiết kế cho các chữ ghép (ligatures) và các ký tự không ánh xạ tự nhiên sang Unicode. Ví dụ, một glyph trực quan "fi" nên được trích xuất thành hai ký tự "f" và "i". Nó chưa bao giờ được áp dụng cho các khối dữ liệu lớn hơn.
Chúng tôi áp dụng nó ở cấp độ tài liệu. Chúng tôi gắn văn bản thay thế vào luồng nội dung thông qua các chuỗi nội dung được đánh dấu, để các công cụ trích xuất hỗ trợ thuộc tính này trả về cấu trúc Markdown thay vì văn bản trực quan thô. Tệp PDF hiển thị giống hệt nhau, nhưng tạo ra hai kết quả đầu ra hoàn toàn khác nhau tùy thuộc vào ai đang đọc nó.
So sánh thực tế
Dưới đây là những gì PyMuPDF trích xuất từ cùng một PDF có diện mạo trực quan giống hệt nhau:
PDF thông thường:
Quarterly Infrastructure Report Overview Cloud migration completed ahead of sch edule. Three critical services were moved to the new cluster. Key Metrics Uptime: 99.97% ...
PDF thông minh:
Quarterly Infrastructure Report
Overview
Cloud migration completed ahead of schedule. Three critical services were moved to the new cluster.
Key Metrics
| Metric | Value | ...
Cả hai tệp trông giống hệt nhau trên Preview, Adobe hay bất kỳ trình xem PDF nào. Nhưng quá trình trích xuất từ PDF thông thường không có phân cấp, dòng văn bị ngắt giữa chừng, các gạch đầu dòng không phân biệt được với đoạn văn, và bảng bị làm phẳng thành các dòng văn. Ngược lại, trích xuất từ PDF thông minh có tiêu đề (#), bảng Markdown, gạch đầu dòng (-) và các câu văn không bị ngắt giữa từ. LLM không cần phải đoán rằng "Key Metrics" là một tiêu đề mục hay rằng ba dòng đó là một danh sách. Mọi thứ đã được xác định rõ ràng.
Đánh giá hiệu năng
Tôi đã chuyển đổi một số PDF thành PDF thông minh bằng công cụ của mình, sau đó trích xuất văn bản từ cả hai phiên bản bằng PyMuPDF và pdf2go. Số lượng token (đơn vị đo lường văn bản của AI) qua tiktoken cho thấy sự khác biệt không đáng kể.
Lợi thế không nằm ở việc giảm số lượng token, mà là cùng một lượng token đó giờ đây mang theo cấu trúc. "## Overview" và "Overview" tốn cùng số token, nhưng cái đầu tiên báo cho máy biết nó đang nhìn thấy cái gì. Mật độ thông tin trên mỗi token tăng lên mà không làm tăng số lượng token.
Chi phí dung lượng tăng chỉ ở mức một chữ số phần trăm đối với hầu hết các tệp. Một số tệp sách giáo khoa thậm chí còn nhỏ nhẹ hơn do quá trình lưu của PyMuPDF loại bỏ các đối tượng PDF không sử dụng.
Khi tải các PDF thông minh lên ChatGPT và Claude, yêu cầu chúng sao chép văn bản thô mà chúng nhìn thấy, cả hai đều trả về Markdown với các ký tự định dạng như #, ##, -. Mặc dù LLM có khả năng suy luận cấu trúc và các công cụ như Docling cũng có thể tạo Markdown từ PDF thường thông qua phân tích bố cục, nhưng kết quả khớp chính xác với lớp dữ liệu nhúng mà chúng tôi tạo ra.
Tài liệu thích ứng
Kết quả bạn nhận được là một tài liệu thích ứng với người đọc. Con người mở nó và thấy PDF được định dạng như thường lệ: phông chữ, bố cục, khoảng cách, mọi thứ đều bình thường. Máy móc đọc nó và nhận được Markdown sạch sẽ với các tiêu đề, danh sách và cấu trúc. Một tệp, không cần các phiên bản riêng biệt, không cần bước chuyển đổi. Nó chỉ hoạt động tùy thuộc vào ai đang nhìn.
Bạn không cần quản lý hay duy trì hai bản sao. Bản thân tài liệu quyết định nội dung cần trình bày dựa trên cách nó đang được tiêu thụ. Tôi đang tích cực khám phá thêm về ý tưởng này và hướng tới việc phát triển một tiện ích mở rộng cho Google Docs để quy trình này trở nên thuận tiện hơn.
Bài viết liên quan

Phần mềm
Bưu điện Anh chọn Accenture và OneView Commerce thay thế hệ thống Horizon gây tranh cãi
21 tháng 5, 2026

Phần mềm
Linear Cosine Palettes: Tạo bảng màu cho nghệ thuật thuật toán với hàm Cosine
05 tháng 6, 2026
Phần mềm
Vivado 2026.1: AMD loại bỏ hỗ trợ Linux trên bản miễn phí gây tranh cãi
24 tháng 5, 2026
