Knowledge Bases

خط لوله‌های OCR مقاوم برای سیستم‌های RAG

سیستم‌های تولید تقویت‌شده با بازیابی (RAG) به اندازه لایه جذب داده‌هایشان خوب هستند. هنگام کار با اسناد اسکن‌شده، استخراج متن خام از طریق شناسایی نوری کاراکتر (OCR) اغلب نویز قابل توجه، خطاهای قالب‌بندی و تکه‌تکه شدن ساختاری ایجاد می‌کند. برای توسعه‌دهندگان متوسط تا پیشرفته، ساخت خط لوله‌ای که استخراج متن با وفاداری بالا را تضمین کند، برای حفظ دقت بازیابی و تولید پاسخ‌های منسجم از مدل‌های زبان بزرگ (LLM) حیاتی است.

چالش ورودی‌های ناقص

اسناد اسکن‌شده به ندرت متن تمیز و آماده دیجیتال ارائه می‌دهند. مشکلات رایج شامل صفحات کج، کنتراست پایین، طرح‌بندی‌های پیچیده، زبان‌های مخلوط و حتی حاشیه‌نویسی‌های دست‌نویس است. موتورهای استاندارد OCR ممکن است در این ابهامات دچار مشکل شوند که منجر به سناریوهای «ورودی زباله، خروجی زباله» می‌شود، جایی که LLM زمینه‌ای تکه‌تکه یا بی‌معنی دریافت می‌کند. برای کاهش این مشکل، باید یک خط لوله پیش‌پردازش چندمرحله‌ای پیاده‌سازی کنیم که فراتر از تبدیل ساده تصویر به متن باشد.

پیش‌پردازش و حذف نویز

قبل از اجرای OCR، تصاویر باید نرمال‌سازی شوند تا تشخیص ویژگی‌ها بهبود یابد. این کار شامل تبدیل به مقیاس خاکستری، آستانه‌گذاری برای حذف نویز پس‌زمینه و صاف‌سازی (Deskewing) برای اصلاح خطاهای چرخشی است. با استفاده از کتابخانه‌هایی مانند OpenCV، می‌توانیم این مراحل را خودکار کنیم تا مطمئن شویم موتور OCR ورودی تمیزی دریافت می‌کند.

import cv2
import numpy as np

def preprocess_image(image_path):
    # Load image
    img = cv2.imread(image_path)
    
    # Convert to grayscale
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # Apply adaptive thresholding to handle uneven lighting
    thresh = cv2.adaptiveThreshold(
        gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
        cv2.THRESH_BINARY, 11, 2
    )
    
    # Remove noise using morphological operations
    kernel = np.ones((2,2), np.uint8)
    cleaned = cv2.dilate(thresh, kernel, iterations=2)
    cleaned = cv2.erode(cleaned, kernel, iterations=1)
    
    return cleaned

مدیریت دست‌نویس و متن چندزبانه

بسیاری از اسناد سازمانی حاوی یادداشت‌ها یا امضاهای دست‌نویس مخلوط با متن چاپی هستند. مدل‌های سنتی OCR که اغلب عمدتاً بر روی فونت‌های چاپی آموزش دیده‌اند، با دست‌نویس مشکل دارند. در این موارد، استفاده از مدل‌های ترکیبی که تشخیص متن چاپی را با مدل‌های تخصصی دست‌نویس ترکیب می‌کنند، یا باریک‌سازی (Fine-tune) مدل‌های متن‌باز مانند Tesseract یا PaddleOCR روی مجموعه‌داده‌های خاص حوزه را در نظر بگیرید.

برای اسناد چندزبانه، شناسایی زبان حیاتی است. می‌توانید زبان اصلی را با استفاده از کتابخانه‌هایی مانند langdetect تشخیص دهید و پیکربندی زبان موتور OCR را متناسب با آن تغییر دهید. این کار نگاشت کاراکتر دقیق را برای_scripts_ غیرلاتین، مانند CJK (چینی، ژاپنی، کره‌ای) یا کاراکترهای سیریلیک که اغلب توسط پیکربندی‌های پیش‌فرض به اشتباه تفسیر می‌شوند، تضمین می‌کند.

پیش‌پردازش پس از OCR و اعتبارسنجی

پردازش پس از OCR شامل تمیز کردن خروجی متن خام است. این کار شامل حذف کاراکترهای خاصی است که احتمالاً نشان‌دهنده نویز به جای محتوا هستند، اصلاح اشتباهات رایج OCR (مثلاً جایگزینی 'O' با '0' بر اساس زمینه) و ساختاردهی مجدد متن به تکه‌های منطقی برای جاسازی (Embedding) است. عبارات منظم (Regular Expressions) می‌توانند در اینجا بسیار قدرتمند باشند:

import re

def clean_text(raw_text):
    # Remove extra whitespace
    cleaned = re.sub(r'\s+', ' ', raw_text)
    # Remove non-alphanumeric characters except punctuation
    cleaned = re.sub(r'[^\w\s.,!?;:\-()]', '', cleaned)
    return cleaned.strip()

نتیجه‌گیری

ساخت خطوط لوله OCR مقاوم برای RAG تنها اجرای یک ابزار نیست؛ بلکه نیازمند رویکردی جامع شامل پیش‌پردازش تصویر، انتخاب هوشمندانه مدل و پیش‌پردازش دقیق پس از آن است. با رفع سیستماتیک مشکلات نویز، دست‌نویس و تنوع زبان، توسعه‌دهندگان می‌توانند قابلیت اطمینان و کارایی برنامه‌های هوش مصنوعی مبتنی بر سند خود را به طور قابل توجهی افزایش دهند.

Share: