PDF trong Claude Code: Chuyển đổi, token và bảo toàn cấu trúc
MarkdownMarkItDown, PyMuPDF4LLM, MCP, các tập lệnh chuyển đổi hoàn chỉnh, giới hạn PDF và những trường hợp phân tích hình ảnh quan trọng hơn tiết kiệm token.
Đọc toàn bộ bài viết
Điểm chính
Mỗi trang PDF trong Claude Code tiêu tốn 1,500–3,000 token trước cả câu hỏi đầu tiên — và Anthropic nêu rõ điều này trong tài liệu của họ. Trong phép tính minh họa, báo cáo 15 trang qua 4 chat dùng 135,000 token PDF giá khoảng $0.40, so 18,000 Markdown giá $0.054, giảm khoảng 87%. Giả định 2,250 token PDF hoặc 300 Markdown mỗi trang cùng giá đầu vào; tài liệu thật khác nhau. Hướng dẫn này trình bày ba phương pháp chuyển đổi (MarkItDown, PyMuPDF4LLM và máy chủ MCP) cùng một tập lệnh bash sẵn dùng để xử lý cả thư mục tài liệu.
Hướng dẫn thực tế về cách sử dụng Ailoot có trong tài liệu.
PDF được xử lý thế nào trong Claude và vì sao mỗi trang tốn 1,500–3,000 token?
Điểm chính
Khi bạn tải PDF lên Claude Code, Claude không đọc tệp đó như một tệp văn bản. Trước tiên, mỗi trang được chuyển thành hình ảnh, sau đó văn bản được trích xuất, rồi cả hai lớp — hình ảnh và văn bản — được đưa vào ngữ cảnh cùng lúc. Vì vậy, một trang chiếm 1,500–3,000 token và tài liệu 50 trang có thể tiêu tốn 75,000–150,000 token trước khi bạn đặt câu hỏi đầu tiên.
Tài liệu chính thức của Anthropic mô tả quy trình bằng ba bước đơn giản:
Hệ thống chuyển từng trang tài liệu thành hình ảnh. Văn bản từ mỗi trang được trích xuất và cung cấp cùng với hình ảnh của trang đó. Claude phân tích cả văn bản lẫn hình ảnh để hiểu tài liệu tốt hơn.
Nghe có vẻ hợp lý, nhưng chi phí xử lý tăng tuyến tính theo số trang. Và đây là con số giải thích vì sao giới hạn gói đăng ký của bạn cạn kiệt chỉ vì một tệp PDF:
Mỗi trang thường dùng 1,500–3,000 token tùy theo mật độ nội dung. Vì mỗi trang được chuyển thành hình ảnh nên áp dụng mức chi phí tương tự như đối với hình ảnh thông thường.
Để hình dung con số đó lớn đến đâu, Anthropic đã đo cùng một tệp PDF 3 trang trên Bedrock ở hai chế độ. Ở chế độ văn bản (Converse Document Chat), tệp dùng ~1,000 token. Với phân tích hình ảnh (Claude PDF Chat), tệp dùng ~7,000 token. Việc đưa hình ảnh vào khiến xử lý tốn kém hơn 7 lần.
Ảnh chụp màn hình của trang còn tốn kém hơn. Ảnh chụp màn hình 1000×1000 pixel tốn khoảng 1,300 token.
Cơ chế rất đơn giản: PDF tốn kém vì Claude không tin OCR của chính nó. Claude dùng cả văn bản lẫn hình ảnh để đối chiếu — và bạn phải trả phí cho cả hai lớp cùng lúc. Với tài liệu lớn, bạn có thể làm theo cách khác: lưu tệp dưới dạng Markdown trong thư mục dự án rồi bảo Claude: “đây là tài liệu có chứa thông tin — hãy chia nội dung ra”. Claude sẽ phân phối nội dung vào các tệp riêng và tiếp tục làm việc với phần văn bản đã được sắp xếp, thay vì xử lý mọi thứ cùng lúc.
PDF tiêu tốn bao nhiêu trong một tác vụ thông thường?
Điểm chính
Xét báo cáo công khai 15 trang qua 4 ngữ cảnh: phân tích, trích dẫn, dịch, tóm tắt. Giả định 2,250 token đầu vào/trang PDF, 300/trang Markdown chuyển và cùng giá đầu vào. Tải PDF lại cho 135,000 token khoảng $0.40; Markdown 18,000 giá $0.054. Tiết kiệm khoảng 87% theo giả định đó, không từ đo mọi PDF.
Các con số cụ thể (mô hình Sonnet 4.x, đầu vào có giá $3 cho mỗi triệu token):
| Phương pháp | Token (15 trang, 4 cuộc trò chuyện) | Chi phí |
|---|---|---|
| Tải PDF trực tiếp 4 lần | 15 × 2250 × 4 = 135,000 | ~$0.40 |
| PDF → Markdown + 4 cuộc trò chuyện | 15 × 300 × 4 = 18,000 | ~$0.054 |
| Mức tiết kiệm | −87% | −$0.35 |
Và đó mới chỉ là một chu kỳ gồm 4 yêu cầu. Sau đó, prompt caching sẽ phát huy tác dụng (TTL mặc định 5 phút, tối đa 1 giờ ở cấp mở rộng, giảm đến 90% cho các lần gọi lại trong khoảng thời gian đó) — mức tiết kiệm sẽ nhân lên.
Mỗi lần tải cùng một PDF lên một cuộc trò chuyện mới, Claude lại đọc nó; bộ nhớ đệm không được dùng chung giữa các cuộc trò chuyện.
Nếu chuyển PDF 15 trang một lần sang Markdown rồi dùng .md trong bốn chat mới, ví dụ dùng 15 × 300 × 4 = 18,000 token đầu vào thay 135,000. 300 token mỗi trang chuyển và 2,250 mỗi trang PDF là giả định tính, không hằng số đo cho mọi PDF. Đếm tài liệu thật và kiểm chất lượng chuyển trước ước tính.
Phép tính này càng có ý nghĩa hơn khi dùng gói Claude Pro. Chỉ một báo cáo 100 trang cũng có thể tiêu hết giới hạn 5 giờ. Sau khi chuyển sang Markdown, hơn 10 tài liệu như vậy vẫn nằm trong cùng hạn mức.
Giới hạn API của Anthropic đối với PDF trong năm 2026 là gì?
Điểm chính
Anthropic đặt giới hạn nghiêm ngặt: tối đa 32 MB cho mỗi yêu cầu (bao gồm toàn bộ nội dung, không chỉ riêng PDF) và tối đa 600 trang cho mỗi yêu cầu. Nhưng giới hạn thấp hơn đối với các mô hình Sonnet 4.x và Opus 4.x hiện tại có ngữ cảnh 200K: 100 trang. Có thể gửi PDF theo ba cách: qua URL, ở dạng Base64 hoặc qua Files API để dùng lại bằng file_id. Với tài liệu dài, người ta dùng Files API kết hợp chia tài liệu thành nhiều phần.
Tài liệu của Anthropic liệt kê các giới hạn ở đầu trang (cập nhật đến ngày 31 tháng 5 năm 2026):
| Yêu cầu | Giới hạn |
|---|---|
| Kích thước yêu cầu tối đa | 32 MB (tùy nền tảng) |
| Số trang tối đa mỗi yêu cầu | 600 (100 với các mô hình có ngữ cảnh 200K token) |
| Định dạng | PDF tiêu chuẩn, không có mật khẩu hoặc mã hóa |
Cả hai giới hạn đều áp dụng cho toàn bộ phần thân yêu cầu, bao gồm cả nội dung đi kèm PDF. Với PDF lớn, hãy dùng Files API và tham chiếu tệp bằng `file_id` để giữ phần thân yêu cầu ở kích thước nhỏ.
Claude.ai (ứng dụng web dành cho người dùng) có giới hạn khác: tối đa 500 MB mỗi tệp và tối đa 20 tệp trong một cuộc trò chuyện. Tuy nhiên, phân tích hình ảnh chỉ hoạt động với PDF tối đa 100 trang — vượt quá giới hạn này Claude chỉ thấy văn bản, không có biểu đồ hay sơ đồ.
Có ba cách gửi PDF qua API:
- Qua URL -
"source": {"type": "url", "url": "..."}- đơn giản nhất khi tài liệu đang có trên mạng. - Ở dạng Base64 -
"source": {"type": "base64", "media_type": "application/pdf", "data": "..."}- dành cho tệp cục bộ. - Qua Files API -
"source": {"type": "file", "file_id": "file_abc123"}- dành cho yêu cầu lặp lại; cần tiêu đề betaanthropic-beta: files-api-2025-04-14.
Files API là cách chính để tiết kiệm khi làm việc với cùng một PDF qua nhiều cuộc trò chuyện. Tải tệp lên một lần, nhận file_id, rồi dùng ID đó cho mọi tương tác. Với cache_control: ephemeral, các lần gọi lại có chi phí bằng 10% giá thông thường.
Anthropic cũng đưa ra lời khuyên chính thức về cách giảm mức sử dụng:
PDF dày đặc nội dung (có nhiều chữ nhỏ, bảng phức tạp hoặc nhiều đồ họa) có thể lấp đầy cửa sổ ngữ cảnh trước khi chạm giới hạn số trang. Hãy thử chia tài liệu thành các phần; với tệp lớn, giảm độ phân giải của hình ảnh nhúng trước khi tải lên.
Phương pháp 1: Thiết lập MarkItDown trong 5 phút như thế nào?
Điểm chính
MarkItDown là tiện ích Python của nhóm Microsoft AutoGen, giúp chuyển PDF, DOCX, PPTX, XLSX, HTML, âm thanh, hình ảnh và thậm chí video YouTube thành Markdown sạch. Dự án có 134 nghìn sao trên GitHub, dùng giấy phép MIT và cài đặt bằng một lệnh: pip install 'markitdown[all]'. Cách dùng cũng đơn giản không kém: markitdown document.pdf > document.md. Đây là công cụ đa năng nhất để chuyển đổi tệp trước khi dùng Claude Code.
MarkItDown là dự án chính thức của Microsoft do nhóm AutoGen duy trì. Trên GitHub, dự án có 134 nghìn sao và 9.2 nghìn fork (tính đến cuối tháng 5 năm 2026). Mục đích của dự án được nêu trực tiếp trong README:
Tiện ích Python gọn nhẹ để chuyển đổi tệp sang Markdown, dùng với LLM và các quy trình phân tích văn bản.
Các định dạng được hỗ trợ:
- Tài liệu: PDF, DOCX, PPTX, XLSX
- Web: HTML, JSON, XML, CSV
- Phương tiện: âm thanh có bản chép lời, hình ảnh có EXIF và OCR, video YouTube (qua phụ đề)
- Tệp lưu trữ: ZIP, EPub
- Khác: mọi tệp đính kèm trong tệp Outlook MSG
Cài đặt
Yêu cầu: Python 3.10+ (thường đã có trên macOS; trên Windows cần cài riêng).
pip install 'markitdown[all]'
Nếu không cần mọi định dạng, bạn có thể chỉ cài những định dạng được chọn:
pip install 'markitdown[pdf, docx, pptx]'
Chuyển đổi một tệp
Trường hợp đơn giản nhất:
markitdown document.pdf > document.md
Sau đó, document.md sẽ xuất hiện trong thư mục hiện tại. Đưa tệp vào Claude Code bằng @document.md hoặc đặt ngay cạnh dự án.
Python API
Nếu muốn tích hợp vào tập lệnh của bạn:
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("research-paper.pdf")
print(result.text_content)
# Có thể lưu ngay:
with open("research-paper.md", "w") as f:
f.write(result.text_content)
MarkItDown KHÔNG thể làm gì
- OCR cho PDF scan - không trả về nội dung. Tệp scan cần PyMuPDF4LLM hoặc Docling.
- Bố cục phức tạp có nhiều cột - thứ tự đọc có thể bị xáo trộn.
- URL nhúng trong PDF - không được giữ lại.
Với PDF đơn giản (báo cáo, bài viết, tài liệu hướng dẫn), MarkItDown là lựa chọn tốt nhất: một công cụ đa năng, cài đặt trong một phút và không cần kiến thức Python. Hiệu quả trên tài liệu có chữ Cyrillic và bản scan được thể hiện trong số liệu ở phân tích về cách chuyển PDF thành văn bản cho AI.
Phương pháp 2: PyMuPDF4LLM có gì và khi nào tốt hơn?
Điểm chính
PyMuPDF4LLM là dự án của Artifex Software, dựa trên engine MuPDF C gốc. Đây là trình chuyển đổi PDF nhanh nhất (không cần GPU); smart OCR chỉ áp dụng cho những vùng không đọc được và giảm thời gian xử lý 50%. Đây là công cụ phổ biến duy nhất giữ lại URL và hình ảnh nhúng trong PDF. Nhược điểm là giấy phép kép AGPL v3 / Artifex thương mại: với dự án SaaS, AGPL có nghĩa là bạn phải công bố mã nguồn của mình.
MarkItDown cung cấp nhiều định dạng; PyMuPDF4LLM xử lý PDF chuyên sâu.
Phần mở rộng PyMuPDF gọn nhẹ, chuyển PDF thành dữ liệu có cấu trúc, rõ ràng với thiết lập tối thiểu.
Phiên bản tính đến ngày 31 tháng 5 năm 2026 là 1.27.2.3 (phát hành ngày 24 tháng 4 năm 2026).
Những gì được cung cấp
- Trang nhiều cột với thứ tự đọc chính xác
- Chuyển bảng thành Markdown theo kiểu GitHub
- Tự động loại bỏ đầu trang và chân trang
- Trích xuất hình ảnh với liên kết tương đối tới một thư mục riêng
- Smart OCR: chỉ áp dụng cho vùng không đọc được, tiết kiệm ~50% thời gian xử lý
- Engine C gốc, không cần GPU
Cài đặt
pip install pymupdf4llm
Cách dùng
import pymupdf4llm
# Cách dùng cơ bản - chuyển thẳng sang Markdown:
md_text = pymupdf4llm.to_markdown("document.pdf")
# Lưu lại:
with open("document.md", "w") as f:
f.write(md_text)
Trong một dòng như đã hứa:
python3 -c "import pymupdf4llm; \
open('document.md','w').write(pymupdf4llm.to_markdown('document.pdf'))"
Khi nào nên chọn PyMuPDF4LLM thay cho MarkItDown
- Khi PDF có nhiều liên kết bạn cần giữ lại (MarkItDown làm mất chúng).
- Khi tài liệu là bản scan và bạn cần OCR.
- Khi cần xử lý nhanh hàng nghìn tệp cục bộ — engine C gốc nhanh hơn các wrapper Python.
- Khi cần hình ảnh từ PDF trong một thư mục riêng để xử lý tiếp.
Chi tiết giấy phép (quan trọng với doanh nghiệp)
PyMuPDF4LLM có giấy phép kép: AGPL v3 HOẶC Artifex thương mại.
AGPL có nghĩa là: nếu dùng thư viện trong SaaS công khai, bạn phải phát hành toàn bộ mã nguồn dịch vụ theo cùng giấy phép AGPL. Với mục đích nội bộ (tập lệnh chạy trên máy tính xách tay của bạn), không có hạn chế.
Để phát triển thương mại mà không công khai mã nguồn, hãy mua giấy phép của Artifex (artifex.com). Giá không được công bố; hãy yêu cầu bộ phận bán hàng báo giá.
Nếu đang xây dựng sản phẩm cho khách hàng, hãy kiểm tra giấy phép ngay từ đầu. MarkItDown (MIT) và Docling (MIT) an toàn hơn cho SaaS.
Phương pháp 3: Kết nối máy chủ MarkItDown MCP với Claude Code như thế nào?
Điểm chính
Máy chủ MarkItDown MCP là chính MarkItDown được bọc trong giao thức MCP, để Claude Code có thể chuyển PDF ngay khi cần mà không tải tệp gốc vào ngữ cảnh. Kết nối bằng một lệnh duy nhất qua uv, với phiên bản được ghim: markitdown-mcp@0.0.1a7. Công cụ Claude nhận được là convert_to_markdown(uri). Chi phí khi không hoạt động là ~110 token cho phần mô tả skill và bằng không khi không cần dùng.
MarkItDown ở chế độ CLI có nghĩa là “tôi tự chuyển đổi tệp trước”; máy chủ MCP có nghĩa là “Claude Code tự quyết định khi nào cần chuyển đổi”.
Cài đặt
Bạn cần trình quản lý gói uv. Không cần cài máy chủ riêng; uv sẽ tải máy chủ về trong lần chạy đầu tiên.
Cấu hình trong Claude Code
Một lệnh kết nối máy chủ với mọi dự án của bạn, đồng thời ghim phiên bản:
claude mcp add --scope user --env 'ORT_DISABLE_TELEMETRY=1' --env 'UV_PYTHON=3.12' --transport stdio markitdown -- uvx markitdown-mcp@0.0.1a7
claude mcp list
Mục markitdown sẽ hiển thị “Connected.” Lần đầu khởi chạy, uv tải khoảng 70 gói và mất tối đa một phút; sau đó máy chủ khởi động trong một hoặc hai giây.
Đây là lý do lệnh cần hai biến. ORT_DISABLE_TELEMETRY=1 tắt dữ liệu thống kê mà engine onnxruntime bên trong máy chủ mặc định gửi tới Microsoft trên Mac và Linux. UV_PYTHON=3.12 chạy máy chủ bằng Python 3.12, phiên bản có sẵn các gói dựng sẵn cho Windows, Linux và Mac dùng Apple Silicon. Trên Mac Intel và macOS 13 trở xuống, máy chủ không cài được dưới Python 3.14. Có lưu ý đối với Intel và 3.12: uv sẽ dựng thư viện cryptography từ mã nguồn vì không có gói Intel dựng sẵn kể từ tháng 6 năm 2026. Quá trình cài đặt sẽ lâu hơn và có thể thất bại. Nếu bạn chưa có Python 3.12, uv sẽ tải phiên bản này về.
Máy chủ chạy trực tiếp trên máy tính của bạn và có thể mở bất kỳ tệp nào bạn có quyền truy cập. Nếu Claude Code đang mở, hãy khởi động lại; markitdown sẽ xuất hiện trong danh sách máy chủ MCP.
Cách sử dụng
Trong Claude Code, chỉ cần nói:
Chuyển /Users/your-user/Documents/report.pdf sang Markdown và phân tích các ý chính.
Claude tự gọi convert_to_markdown(uri), nhận Markdown và làm việc với nội dung đó — PDF hoàn toàn không được tải vào ngữ cảnh.
URI được hỗ trợ
file://- tệp cục bộhttp://,https://- tài liệu trực tuyếndata:- dữ liệu nội tuyến (Base64)
Bảo mật
Trích từ README chính thức:
Máy chủ không hỗ trợ xác thực và chạy với quyền của người dùng đã khởi chạy máy chủ.
Theo mặc định, máy chủ chỉ bind với localhost. Nếu chạy qua HTTP/SSE (tùy chọn --http --host 127.0.0.1 --port 3001), đừng mở cổng ra bên ngoài nếu không có reverse proxy được xác thực.
Nên chọn phương pháp nào cho công việc của bạn?
Điểm chính
MarkItDown là công cụ đa năng nếu bạn làm việc với nhiều định dạng (PDF + DOCX + PPTX + YouTube) và cần một lệnh CLI nhanh. PyMuPDF4LLM là chuyên gia PDF: nhanh hơn, có OCR và giữ lại liên kết, nhưng AGPL là cái bẫy với SaaS. Docling dành cho môi trường production và xử lý bảng cùng công thức tốt nhất. Marker phù hợp với bài báo khoa học có công thức. Máy chủ MCP dành cho trường hợp bạn không muốn nghĩ về việc chuyển đổi và muốn Claude Code tự quyết định.
Bảng so sánh mở rộng:
| Công cụ | Sao trên GitHub | Phù hợp nhất với | Tốc độ | Giấy phép |
|---|---|---|---|---|
| MarkItDown (Microsoft) | 134k | PDF + DOCX + PPTX + YouTube + âm thanh | Trung bình | MIT |
| PyMuPDF4LLM (Artifex) | - | PDF gốc, OCR, URL nhúng | Nhanh nhất (không GPU) | AGPL v3 / thương mại |
| Docling (IBM Research) | 60.7k | RAG production, bảng, công thức | Trung bình | MIT |
| Marker (datalab.to) | 35.6k | PDF khoa học, arXiv, công thức | Cao (có GPU) | GPL-3.0 + Open Rail-M |
| MinerU | - | Tài liệu CJK (Trung/Nhật) | Cao | Apache-2.0 |
Marker đưa ra những con số chính xác ấn tượng trong các bài kiểm tra chuẩn:
0.18 giây mỗi trang trên GPU H100 (122 trang mỗi giây). Độ chính xác 95.67% so với Llamaparse (84.24%) và Mathpix (86.43%). Với bài báo khoa học, độ chính xác là 96.67%.
Nhưng Marker cần GPU để đạt tốc độ tốt và đi kèm các mô hình học máy. Với hầu hết tác vụ (PDF văn bản thông thường), PyMuPDF4LLM hoặc MarkItDown sẽ xử lý được trong vài giây mà không cần GPU.
Quy tắc chọn đơn giản
- Một hoặc hai PDF, cần xử lý nhanh - MarkItDown CLI.
- Hàng chục PDF, cần tự động hóa - máy chủ MarkItDown MCP hoặc PyMuPDF4LLM trong tập lệnh.
- PDF có liên kết và hình ảnh, cần giữ nguyên cấu trúc - PyMuPDF4LLM.
- RAG production cho doanh nghiệp, cần bảng ổn định - Docling.
- Bài báo khoa học có công thức - Marker.
- Không muốn bận tâm, để Claude chuyển đổi - máy chủ MarkItDown MCP.
Viết tập lệnh sẵn dùng để tự động chuyển đổi một thư mục tài liệu như thế nào?
Điểm chính
Cách làm thuận tiện nhất là dùng tập lệnh bash duyệt qua thư mục dự án, chuyển tất cả tệp PDF, DOCX và PPTX sang Markdown rồi đặt chúng trong thư mục con _md/. Chỉ cần thiết lập một lần, mọi thư mục tài liệu mới sẽ trở nên “đọc được với Claude” chỉ trong một lượt. Sau đó đưa _md/ vào Claude Code bằng @_md/ và làm việc với phần văn bản đã được nén gọn.
Ví dụ thực tế: giả sử bạn có 40 báo cáo PDF và PPTX từ khách hàng trong một thư mục — sao kê môi giới, hợp đồng, bản trình bày. Tải cả thư mục trực tiếp lên Claude sẽ vô ích: cửa sổ ngữ cảnh sẽ đầy thông tin trước khi nhận được câu trả lời đầu tiên. Chạy tập lệnh dưới đây một lượt trên toàn bộ thư mục, rồi tiếp tục làm việc với các tệp .md nhẹ thay vì PDF cồng kềnh.
Lưu tập lệnh này thành scripts/docs-to-md.sh trong thư mục gốc của dự án:
#!/bin/bash
# docs-to-md.sh - chuyển đổi mọi tài liệu trong thư mục sang Markdown bằng MarkItDown
# Cách dùng: bash docs-to-md.sh ./documents
set -e
INPUT_DIR="${1:-./documents}"
OUTPUT_DIR="${INPUT_DIR}/_md"
mkdir -p "$OUTPUT_DIR"
echo "Scanning $INPUT_DIR..."
for file in "$INPUT_DIR"/*.{pdf,docx,pptx,xlsx}; do
[ -f "$file" ] || continue
basename=$(basename "$file")
name="${basename%.*}"
output="$OUTPUT_DIR/${name}.md"
if [ -f "$output" ] && [ "$output" -nt "$file" ]; then
echo "Skipping $basename (already converted)"
continue
fi
echo "Converting $basename..."
markitdown "$file" > "$output"
done
echo "Done. Results are in $OUTPUT_DIR"
Cho tập lệnh quyền thực thi:
chmod +x scripts/docs-to-md.sh
Chạy tập lệnh:
bash scripts/docs-to-md.sh ./reports
Sau khi chạy xong, ./reports/_md/ sẽ chứa các phiên bản .md của mọi tài liệu. Đưa chúng vào Claude Code bằng @reports/_md/ và làm việc với văn bản đã nén gọn thay vì PDF.
Tập lệnh tự động bỏ qua những tệp đã được chuyển đổi (nếu tệp .md mới hơn tệp nguồn) — chạy lại rất ít tốn kém và không phải tính toán lại mọi thứ.
Chuyển đổi tăng dần và idempotency
Nếu muốn tập lệnh phát hiện các PDF đã thay đổi (được lưu lại dưới cùng tên), hãy thêm bước kiểm tra content hash:
hash=$(shasum -a 256 "$file" | cut -d' ' -f1)
hash_file="$OUTPUT_DIR/.${name}.sha256"
if [ -f "$hash_file" ] && [ "$(cat "$hash_file")" = "$hash" ]; then
echo "Skipping $basename (hash matches)"
continue
fi
markitdown "$file" > "$output"
echo "$hash" > "$hash_file"
Phiên bản này chỉ chuyển đổi lại tệp khi nội dung của tệp đã thay đổi.
Khi nào dùng PDF trong Claude vẫn tốt hơn Markdown?
Điểm chính
Chuyển đổi sang Markdown làm mất ba thứ: yếu tố hình ảnh (sơ đồ, biểu đồ, bản vẽ), các bảng phức tạp có ô gộp và chú thích, và toàn bộ định dạng của tài liệu với tư cách một hiện vật (ví dụ, hợp đồng cần trích dẫn theo trang). Nếu các yếu tố này quan trọng với tác vụ, hãy giữ PDF, bật phân tích hình ảnh và chấp nhận rõ ràng chi phí xử lý hình ảnh.
Có ba trường hợp chuyển đổi sang Markdown không đáp ứng được:
1. Phân tích hình ảnh của sơ đồ và biểu đồ
Nếu Claude cần “đọc” biểu đồ — đường giá, sơ đồ quy trình hoặc sơ đồ kiến trúc — thông tin đó không có trong Markdown. Markdown chỉ giữ chú thích hình; bản thân hình ảnh sẽ bị mất.
Giải pháp: tải PDF lên và bật rõ chế độ hình ảnh. Trên Claude API, cờ này hoạt động tự động; trên AWS Bedrock, bạn cần cờ citations.
Claude phân tích cả văn bản lẫn hình ảnh để hiểu tài liệu tốt hơn.
2. Bảng phức tạp có ô gộp
Bảng Markdown là dạng phẳng. Nếu PDF có bảng chứa ô gộp, tiêu đề nhiều cấp hoặc bảng con lồng nhau, trình chuyển đổi sẽ làm phẳng bảng hoặc làm mất các mối liên hệ.
Giải pháp: dùng PDF trực tiếp, dùng Docling (công cụ xử lý bảng phức tạp tốt nhất) hoặc tự định dạng lại sau khi chuyển đổi.
3. Tài liệu cần trích dẫn theo trang
Với văn bản pháp lý, hợp đồng và biên bản, việc có thể trích dẫn “trang 7, đoạn 3” rất quan trọng. Số trang bị mất trong Markdown.
Giải pháp: PDF + Files API + prompt caching. Tải tệp lên một lần, sau đó tham chiếu bằng file_id; Claude sẽ thấy số trang và có thể trích dẫn trang cụ thể.
Tài liệu ngắn
Nếu PDF ngắn hơn 2 trang và bạn chỉ dùng một lần, chuyển đổi không đáng công. 5,000 token cho PDF so với 800 token cho Markdown không tiết kiệm đủ để biện minh cho việc cài MarkItDown.
Điểm hòa vốn là khoảng 5+ trang hoặc dùng cùng tài liệu 2+ lần. Ít hơn mức đó thì tải PDF trực tiếp; nhiều hơn thì chuyển đổi.
5 lỗi phổ biến nhất khi dùng PDF trong Claude là gì?
Điểm chính
Những vấn đề chính: tải cùng một PDF lên lại trong các cuộc trò chuyện khác nhau thay vì chỉ chuyển đổi một lần, không dùng prompt caching cho yêu cầu lặp lại, dùng ảnh chụp màn hình thay vì văn bản, không OCR PDF scan và bỏ qua giới hạn 100 trang của mô hình có ngữ cảnh 200K. Mỗi lỗi đều lãng phí hàng chục nghìn token mà chẳng có lý do chính đáng.
1. Mỗi lần lại tải cùng một PDF lên cuộc trò chuyện mới
Claude Pro giới hạn số tin nhắn trong 5 giờ — một báo cáo 50 trang có thể dùng hết giới hạn trước khi bạn đặt câu hỏi thứ hai.
Có một nguyên tắc đơn giản: một tác vụ — một cuộc trò chuyện. Khi AI bắt đầu tiêu tốn lượng token vô lý, điều đó có nghĩa là bạn đang nhồi nhét mọi thứ vào một cuộc trò chuyện và liên tục đưa PDF vào lại. Hãy dành mỗi cửa sổ cho một tác vụ nhỏ. Chuyển tài liệu sang Markdown một lần, sau đó thêm tệp .md vào mỗi cửa sổ mới cùng với dự án. Vòng tròn cửa sổ ngữ cảnh sẽ không chuyển sang màu vàng.
Giải pháp: chuyển tài liệu sang Markdown một lần hoặc dùng Files API với file_id và prompt caching.
2. Dùng ảnh chụp màn hình thay vì văn bản
Ví dụ điển hình: ai đó muốn cho Claude xem một đoạn mã hoặc bảng, chụp toàn bộ màn hình 1920×1080 rồi thắc mắc vì sao giới hạn cạn sau 5 yêu cầu.
Ảnh chụp màn hình 1000×1000 pixel tốn ~1,300 token. Cùng văn bản đó nếu tự sao chép chỉ tốn 50–100 token. Chênh lệch từ 13 đến 26 lần.
Giải pháp: cắt ảnh thật gọn (chỉ lấy phần quan trọng), hoặc tốt hơn nữa, sao chép trực tiếp văn bản.
3. PDF scan không có OCR
MarkItDown không thể OCR. Nếu chuyển đổi bản scan, kết quả sẽ là tệp .md trống (hoặc 3 dòng nhiễu).
Giải pháp: với bản scan, dùng PyMuPDF4LLM (có smart OCR tích hợp) hoặc Docling.
4. Bỏ qua giới hạn 100 trang
Tài liệu của Anthropic nêu giới hạn 600 trang cho mỗi yêu cầu — nhưng trên thực tế, giới hạn với các mô hình có ngữ cảnh 200K (Sonnet 4.x, Opus 4.x) là 100 trang. Giới hạn 600 trang dành cho mô hình cũ hơn hoặc các gói đặc biệt.
Nếu tải báo cáo 150 trang lên Sonnet 4.6, bạn sẽ nhận lỗi hoặc, tệ hơn, Claude chỉ xử lý 100 trang đầu rồi hành xử như thể đã đọc toàn bộ tài liệu.
Giải pháp: chia PDF dài thành nhiều phần trước khi tải lên. Hoặc chuyển sang Markdown — không có giới hạn trang, chỉ có giới hạn token.
5. Không dùng prompt caching cho yêu cầu lặp lại
Nếu làm việc với cùng một tài liệu qua API, hãy đặt tài liệu trong cache_control: ephemeral. Các lần gọi lại trong vòng 5 phút chỉ tốn 10% giá ban đầu. Yêu cầu đầu tiên tốn nhiều hơn; các yêu cầu còn lại được giảm 90%.
Giải pháp: bật prompt caching theo mặc định cho mọi nội dung bạn tải lên nhiều hơn một lần.
Tiếp theo: context engineering
Điểm chính
Chuyển PDF sang Markdown là một kỹ thuật context engineering, một năng lực mới để làm việc với AI. Prompt là câu hỏi. Context là mọi thứ Claude thấy trước và xung quanh câu hỏi: system prompt, CLAUDE.md, tệp, máy chủ MCP và lịch sử phiên làm việc. Context càng sạch, câu trả lời càng chính xác và chi phí càng thấp. Đọc bài phân tích đầy đủ trong hướng dẫn “Context Engineering in 2026”.
PDF-to-Markdown là một cách tiết kiệm token. Tự nó không giúp câu trả lời của Claude chính xác hơn. Độ chính xác đến từ context engineering — lĩnh vực nghiên cứu những gì bạn đưa vào ngữ cảnh của mô hình trước khi đặt câu hỏi.
Nếu CLAUDE.md của bạn có 800 dòng, dự án có 10 máy chủ MCP không cần thiết và bạn đưa vào một PDF 100 trang, chuyển đổi Markdown sẽ ngăn được một chỗ thất thoát, nhưng ba chỗ còn lại vẫn còn đó. Đó là lý do các hướng dẫn này đề cập đến:
- Token được dùng vào đâu trong Claude Code - 9 kiểu thất thoát ngữ cảnh, không chỉ riêng PDF.
- Context Engineering in 2026 - quản lý ngữ cảnh một cách có hệ thống.
- Plan Mode trong Claude Code - chế độ lập kế hoạch trước khi Claude bắt đầu viết mã.
Nguồn
Tiếp tục khám phá Ailoot tại ailoot.ai.
Xem thêm chi tiết
Câu hỏi thường gặp
Ví dụ 15 trang qua bốn chat dùng bao nhiêu token Markdown?
Theo giả định 300 token mỗi trang chuyển đổi, tổng là 15 × 300 × 4 = 18,000 token đầu vào. Đây là ước tính minh họa; hãy đếm token bản chuyển của chính tệp bạn.
Chuyển thành văn bản có đủ cho mọi PDF không?
Không. So Markdown đã chuyển với PDF, nhất là bảng, thứ tự trang và nội dung phụ thuộc ảnh. Chỉ so token sau khi xác nhận thông tin cần cho việc còn nguyên.