هذا المقال يتطلب مستوى: متوسط — مفترض إنك تعرف Python أساسي وتعاملت قبل كده مع REST API، حتى لو ما لمستش Claude API قبل كده.
لو شركتك بتستلم 200 فاتورة شهريًا في PDF أو صور JPG، وفي محاسب بيقعد ساعتين كل أسبوع يدخّل الأرقام يدويًا في Excel، الشغل ده ينخلص في 4 ثواني بـ 28 سطر Python. الحل مش OCR — الحل Vision API في Claude، اللي بيستقبل الصورة مباشرة ويرجّع JSON متكامل من غير ما تركّب tesseract ولا تشتري Google Vision OCR.
ليه Vision API بيكسر OCR التقليدي في استخراج البيانات
المشكلة باختصار
OCR التقليدي بيرجّع نص خام مرتّب سطر سطر. لكن النص الخام لوحده مش مفيد — أنت محتاج جدول منظم: التاريخ، رقم الفاتورة، المبلغ الإجمالي، الضريبة، البنود. عشان توصل من النص الخام للجدول لازم regex مخصصة لكل template، ولما الـ vendor يغيّر شكل الفاتورة الـ regex بتاعك بيقع. Vision API بيتجاوز الخطوة دي بالكامل: بياخد الصورة كصورة + الـ prompt كنص، ويرجّعلك البنية اللي طلبتها مباشرة.
مثال للمبتدئ: الفرق بين OCR وVision
تخيّل صديقك جابلك صورة فاتورة مطعم وسألك "كم دفعت ضريبة؟". لو شغّلت OCR، الـ tool هيقرألك كل النصوص بالترتيب: "بيتزا 50، كوكاكولا 20، خصم 5، ضريبة 14، الإجمالي 79". أنت لازم تقرأ بنفسك وتلاقي الكلمة "ضريبة" وتطلع الرقم اللي جنبها.
الـ Vision API بيشوف الصورة كلها مرة واحدة. بيفهم إن "ضريبة" كلمة مفتاحية، يلاقي الرقم اللي ملاصقها بصريًا، ويرجّعلك مباشرة {"tax": 14}. الفرق إنه بيشوف الصورة، مش بس بيقرا حروف.
التعريف العلمي بدقة
Vision في Claude مبني على Multimodal Transformer. الموديل بيقسّم الصورة لـ patches صغيرة (14×14 بكسل لكل patch)، وبيحوّل كل patch لـ embedding vector في نفس الـ embedding space اللي بيشتغل فيه النص. النتيجة: في الـ attention layer، الموديل بيقدر يربط الكلمة "tax" في الـ prompt بالـ patch اللي فيه الرقم 14 على الفاتورة، تمامًا زي ما بيربط كلمتين متجاورتين في النص.
الموديلات اللي تدعم Vision حاليًا (إبريل 2026): claude-opus-4-7، claude-sonnet-4-6، claude-haiku-4-5. الحد الأقصى للصورة 5MB، والأبعاد المثالية بين 768×768 و 1568×1568 بكسل.
كود تنفيذي شغّال
السكربت ده بياخد ملف صورة ويرجّع JSON منظّم. شغّال فعليًا على Anthropic SDK Python 0.40+:
import anthropic
import base64
import json
client = anthropic.Anthropic()
def extract_invoice(image_path: str) -> dict:
with open(image_path, "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
},
{
"type": "text",
"text": (
"استخرج من الفاتورة الحقول دي: "
"invoice_number, date (ISO 8601), total, tax, currency, "
"items[] فيها name و quantity و unit_price. "
"ارجع JSON فقط بدون شرح."
)
}
]
}]
)
return json.loads(response.content[0].text)
result = extract_invoice("invoice.jpg")
print(json.dumps(result, ensure_ascii=False, indent=2))