چیتشیت
OCR و درک سند
OCR and Document Understanding
آموزش CTC OCR، انتخاب استک پردازش سند، بازیابی صفحات با بیشینهی شباهت (MaxSim) و تأیید فیلدها در برابر اسپنهای دقیق منبع.
فهرست مطالب
پایپلاین OCR کلاسیک
معماریوظایف در قالب کد
کار و کد| وظیفه | کد |
|---|---|
| تابع زیان (loss) CTC | ctc_loss(log_probs, targets, ...) |
| رمزگشایی حریصانهی CTC | greedy_ctc_decode(log_probs, blank=0) |
| بازشناس خطوط | TinyCRNN(vocab_size=40, hidden=128, feat=32) |
| OCR در محیط عملیاتی | PaddleOCR(lang="en").ocr(image_path) |
| ورودی LayoutLMv3 | layoutlm_input(tokens) |
| اسکیمای JSON مدل Donut | donut_schema("invoice") |
| صفحات برتر (Top-k) با بیشینهی شباهت (MaxSim) | retrieve(query, pages, k=3) |
آموزش CRNN به همراه CTC
کدpython
vocab = ["_"] + list("0123456789abcdefghijklmnopqrstuvwxyz") # نماد blank در شاخص 0
model = TinyCRNN(vocab_size=len(vocab))
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
imgs, targets, target_lens = build_batch(strings, vocab) # ارتفاع 32
log_probs = model(imgs) # (W', N, vocab)
input_lens = torch.full((8,), log_probs.size(0), dtype=torch.long)
loss = F.ctc_loss(log_probs, targets, input_lens, target_lens,
blank=0, reduction="mean", zero_infinity=True)
opt.zero_grad(); loss.backward(); opt.step() # از حدود 3 تا حدود 0.2 در 200 گام
تعامل متأخر بیشینهی شباهت (MaxSim)
کدpython
def maxsim(query_tokens, patches):
s = 0.0
for q in query_tokens: # یک بردار بهازای هر توکن پرامپت
best = max(cosine(q, p) for p in patches) # بهترین پچ صفحه
s += best # مجموع روی توکنهای پرامپت
return s
scored = [(p.doc_id, maxsim(query.tokens, p.patches)) for p in pages]
scored.sort(key=lambda x: -x[1]) # صفحات برتر (top-k)
idx = build_index(prune=True) # با فعال بودن DocPruner، حذف 50٪ پچها
hits = idx.retrieve(q, k=3)
دستورات
دستورها| دستور | کارکرد |
|---|---|
python3 cli.py sample.txt --schema schema.json --output output/review.html | میز بازبینی HTML و گزارش JSON را میسازد |
--proposals <file> | مدلهای OCR خارجی یا کاندیداها را بارگذاری میکند |
--approve <file> | تصمیمات دانلودشده از میز HTML را اعمال میکند |
python3 scripts/project_test.py document-extraction-desk --all --solution --strict | راهحل مرجع را ارزیابی و نمرهدهی میکند |
python main.py | اسکلت نهایی کدنوشتهی MaxSim و DocPruner را اجرا میکند |
npm start | بررسی خودکار نمایشگر را یکبار اجرا کرده و با کد 0 خارج میشود |
npm run serve | سرور HTTP نمایشگر را روی 127.0.0.1 اجرا میکند |
پرسش و پاسخ سند مبتنی بر تصویر (Vision-first)
گامبهگام- بارگذاریرندر هر صفحه PDF به یک PNG با ابعاد 1536x2048. ذخیرهی
{doc_id, page_num, image_path}. - جاسازیاجرای ColQwen2.5-v0.2. دریافت حدود 2048 بردار پچ با بعد 128 بهازای هر صفحه.
- هرسابزار DocPruner نیمی از پچها را که بیشترین سیگنال را دارند نگه میدارد.
- پرامپتجاسازی توکنهای پرامپت. اجرای بیشینهی شباهت (MaxSim). بازگرداندن صفحات برتر (top-k).
- ترکیبارسال پرامپت و تصاویر 5 صفحهی برتر به VLM. ارجاع به (doc_id, page).
- شواهدرسم کادرهای محدودکنندهی ارجاعشده بهصورت لایههای رویی در نمایشگر.
- طرح پشتیبان OCRاجرای Nougat یا dots.ocr روی صفحات پر از فرمول.
- ارزیابیگزارش ViDoRe v3 nDCG@5 و M3DocVQA در مقایسه با رویکرد «ابتدا OCR، سپس متن».
فرمولها و اعداد
مفهومها- ادغام CTC
- انجام merge روی تکرارها، سپس حذف blankها. تبدیل "h h h _ _ e e l l _ l l o _ _" به "hello".
- CER
- فاصلهی لووناشتاین تقسیم بر طول مرجع. مقدار WER همین است اما بر اساس کلمه.
- بیشینهی شباهت (MaxSim)
- $\sum_i \max_j \cos(q_i, p_j)$ روی توکنهای پرامپت $q_i$ و پچهای صفحه $p_j$.
- فضای ذخیرهسازی ColPali
- 50 صفحه ضربدر 729 پچ ضربدر بعد 128 ضربدر 4 بایت = حدود 18 مگابایت خام، حدود 2.3 مگابایت پس از 8x کوانتیزهسازی برداری (PQ).
- فضای ذخیرهسازی Text-RAG
- 50 چانک ضربدر بعد 768 ضربدر 4 بایت = حدود 150 کیلوبایت. مدل ColPali حدود 120 برابر خامتر و پس از PQ حدود 15 برابر بزرگتر است.
- ViDoRe
- مدل ColPali-v1 امتیاز حدود 80٪ برای nDCG@5 میگیرد؛ Text-RAG حدود 50-60٪.
پیشفرضها و محدودیتها
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
CER target | < 2% | روی اسکنهای واضح |
CRNN input height | 32 | شبکه CNN ارتفاع را به 1 کاهش میدهد (pooling). عرض همان زمان است |
Page render | 180 DPI | PyMuPDF در پروژهی پایانی |
DocPruner | 50% | افت دقت کمتر از 0.5٪ |
Schema fields | 1 to 30 | نامهای حروف کوچک، برچسبهای یکتا |
Document size | 100000 | حداکثر کاراکترها |
Candidates | 300 | حداکثر پیشنهادها در هر بازبینی |
انتخاب استک پردازش سند
مفهومها- فاکتورهای چاپی در مقیاس بالا
- ترکیب LayoutLMv3 + قوانین. مقرونبهصرفه.
- فرمهای ترکیبی و دستنویس
- مبتنی بر VLM بومی (PaliGemma 2 یا Qwen2.5-VL).
- مقالههای arXiv
- ابزار Nougat برای ریاضیات، VLM برای شکلها.
- حوزههای تحت نظارت قانونی
- پایپلاین OCR + اعتبارسنج VLM جهت بررسی مضاعف.
- رسیدها با ساختار ثابت
- فاینتیون Donut.
- اسناد متنی خالص
- بازیابی مبتنی بر متن (Text-RAG). سادهتر است و ذخیرهسازی کمتری مصرف میکند.
- PDFهای غنی از تصویر
- ابزار ColPali برای کیفیت، VisRAG برای مقیاسپذیری بالا.
عیبیابی
عیبیابی"Approval belongs to another document version"
- علت
- متن تغییر کرده است،
sourceSha256تطابق ندارد - راهحل
- نسخهی جدید را دوباره بازبینی کنید
"Proposal does not match its exact source span"
- علت
- عبارت نقلشده در
startوendقرار ندارد - راهحل
- آفستهای پیشنهاد را اصلاح کنید
"Use an ISO date: YYYY-MM-DD"
- علت
- متن فیلد تاریخ در فرمت ISO نیست
- راهحل
- متن مبدأ را اصلاح کنید
وضعیت فیلد مبهم است
- علت
- دو نقلقول برای صندلیها وجود دارد
- راهحل
- یک اسپن را با
--approveانتخاب کنید
شکست Donut روی مقاله
- علت
- مدلهای بدون نیاز به OCR ابزارهایی تخصصی هستند
- راهحل
- برای مقالهها از Nougat استفاده کنید
دادههای نمودار در RAG وجود ندارند
- علت
- موتور OCR دادههای نمودار را نادیده میگیرد
- راهحل
- تصاویر صفحات را با ColPali جاسازی کنید
کوتهنوشتها
اصطلاحها- CTC
- ردهبندی زمانی پیوندگرا. آموزش بدون نیاز به برچسبهای گامبهگام زمانی.
- CRNN
- ویژگیهای کانولوشنی + BiLSTM + CTC. خط مبنا سال 2015.
- VLM-OCR
- یک مدل بینایی-زبان که برای OCR آموزش دیده یا پرامپتنویسی شده است.
- DocVQA
- استاندارد VQA اسناد؛ پرارجاعترین معیار.
- ViDoRe
- ارزیابی بازیابی اسناد بصری؛ معیار ارزیابی: nDCG@5.
- PQ
- کوانتیزهسازی حاصلضربی (Product Quantization). کاهش حجم ذخیرهسازی تا حدود 8 برابر.
پرسشها
پرسش و پاسخ- چرا CTC؟
- بدون نیاز به ترازسازی در سطح کاراکتر آموزش میبیند.
- چرا پایپلاینهای OCR هنوز برنده هستند؟
- برای مقیاسهای بسیار بزرگ اسکن، خطاهای قطعی و خروجی قابل بازرسی.
- چرا بیشینهی شباهت (MaxSim) به جای میانگین؟
- هر توکن پرامپت بهترین پچ خود را برمیگزیند؛ پچهای نامرتبط اثر آن را خنثی نمیکنند.
- آیا آفستها صحت مقدار را اثبات میکنند؟
- خیر. آنها فقط منشأ و سندیت را اثبات میکنند؛ یک بازبین انسانی فیلد را تأیید میکند.