Asosiy qismga o'tish

VLM — Vision Language Model bilan OCR

6-bob 4 kod bloki 671 so'z

Natijalar hali qayta tekshirilmagan

Bu kitobning kodi saytga qo'yishdan oldin qayta ishga tushirilmagan, shuning uchun ayrim natija va raqamlar qo'lda yozilgan bo'lishi mumkin. Kodni o'zingiz ishga tushirib ko'ring — farq topsangiz, Telegramda yozing.

Paradigma o'zgarishi

Shu paytgacha ko'rgan hamma vosita "OCR uchun maxsus qurilgan". VLM (Vision Language Model) esa boshqa yo'l: LLM ning o'ziga ko'z qo'shilgan. Qwen2.5-VL, GPT-4o, Claude, Gemini — rasmni to'g'ridan-to'g'ri "ko'radi" va nima so'rasangiz, shuni qiladi: matnni o'qiydi, jadvalni Markdown qiladi, muhrni tasvirlaydi, kerakli maydonni ajratadi.

RAG qo'llanmasida generation uchun Ollama + Qwen ishlatganmiz. Xuddi shu stack ning vision versiyasi bilan davom etamiz — yangi infratuzilma kerak emas:

matn1 qator
ollama pull qwen2.5vl:7b

Kod: rasmdan matn

Ollama OpenAI-compatible API beradi, shuning uchun kod RAG dagi generation kodiga juda o'xshaydi — faqat message ichida rasm bor:

python25 qator
import base64
from openai import OpenAI

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

with open("scanned_page.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

response = client.chat.completions.create(
    model="qwen2.5vl:7b",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text",
             "text": "Rasmdagi barcha matnni o'qib ber. "
                     "Tuzilishini saqla: sarlavhalar, ro'yxatlar. "
                     "Jadvallarni Markdown formatida qaytar. "
                     "O'zingdan hech narsa qo'shma."},
            {"type": "image_url",
             "image_url": {"url": f"data:image/png;base64,{image_b64}"}},
        ],
    }],
    temperature=0,
)
print(response.choices[0].message.content)

Ikki muhim detal:

  • temperature=0 — OCR ijodkorlik emas. Model eng ishonchli variantni tanlashi kerak.
  • "O'zingdan hech narsa qo'shma" — promptda aniq taqiq. Busiz model "yordam berish" uchun izoh, tarjima, xulosa qo'shishi mumkin.

Prompt — yangi sozlash quroli

Klassik OCR da sozlash = PSM va preprocessing. VLM da sozlash = prompt. Bu juda kuchli:

python11 qator
# Faqat kerakli maydonlarni olish (forma, shartnoma)
prompt = ("Bu shartnoma. Faqat quyidagilarni JSON qilib qaytar: "
          "shartnoma_raqami, sana, tomonlar, summa. "
          "Topilmagan maydon uchun null yoz.")

# Jadvalni toza olish
prompt = "Rasmdagi jadvalni Markdown jadval qilib qaytar. Boshqa hech narsa yozma."

# Muhr va imzoni e'tiborsiz qoldirish
prompt = ("Hujjat matnini o'qi. Muhr, imzo va QR kodlarni "
          "[MUHR], [IMZO], [QR] deb belgila, tasvirlashga urinma.")

Klassik OCR bilan "shartnoma raqamini ajratish" uchun alohida regex/parsing kod yozardingiz. VLM buni o'qish paytidayoq qiladi.

Nega VLM kuchli

  • Layout ni tushunadi — ikki ustunli matnni to'g'ri tartibda o'qiydi, jadvalni Markdown qiladi (RAG chunking uchun ideal!)
  • Qo'lyozma — klassik OCR dan sezilarli yaxshi
  • Past sifatli rasm — kontekstdan foydalanib "taxmin" qiladi: "Toshk_nt sh." → "Toshkent sh."
  • Ko'p til aralash — uzb lotin + kirill + rus bitta sahifada — muammo emas
  • Post-processing kerak emas — natija allaqachon toza

Nega VLM xavfli: Hallucination

Eng muhim farqni yodda tuting:

python6 qator
Klassik OCR xatosi:              VLM xatosi:
"Shartn0ma"                       O'qiy olmagan joyga ISHONCHLI
(ko'rinib turgan xato,            ko'rinadigan matn TO'QIB yozadi:
 topish oson)                     "...summa 12 500 000 so'm..."
                                  (aslida 17 500 000 edi — 
                                   xira raqamni "taxmin" qildi)

Klassik OCR hech qachon to'qimaydi — faqat noto'g'ri o'qiydi, va confidence past bo'ladi. VLM esa til modeli: uning tabiati — "eng ehtimolli davomni" yozish. Xira joyni ko'rganda u eng ehtimolli matnni ishonch bilan yozadi va sizga hech qanday ogohlantirish bermaydi (confidence yo'q!).

Himoya choralari:

  1. temperature=0 — majburiy
  2. Promptda taqiq: "aniq o'qiy olmagan joyni [O'QIB BO'LMADI] deb belgila"
  3. Muhim raqamlar (summa, sana, raqam) uchun: ikki marta o'qitib, natijani solishtirish
  4. Yuridik/moliyaviy hujjatlarda VLM natijasini odam tekshirishi shart

Klassik OCR vs VLM

Tesseract Qwen2.5-VL
Xato turi Belgi xatosi (ko'rinadi) Hallucination (ko'rinmaydi!)
Confidence ✅ so'z darajasida ❌ yo'q
Jadval Buzib o'qiydi ✅ Markdown
Qo'lyozma ❌ ✅
Tezlik ~1 s/sahifa (CPU) ~5-15 s/sahifa (GPU)
Resurs CPU GPU (7B: ~8GB VRAM)
Narx Bepul GPU yoki API narxi
Sozlash PSM, preprocessing Prompt

Xulosa

Tushuncha Asosiy fikr
VLM = LLM + ko'z Bitta model: o'qiydi, tushunadi, formatlaydi
Bizning tanlov Qwen2.5-VL Ollama orqali — mavjud stack, offline, bepul
Prompt = sozlash Jadval, maydon ajratish, muhr — hammasi prompt bilan
Hallucination VLM ning asosiy xavfi: xatosi ko'rinmaydi. temperature=0 + taqiq prompt + odam nazorati
O'rni Qiyin sahifalar: jadval, qo'lyozma, past sifat. Oddiy matnga — isrof

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar