Ollama: النماذج متعددة الوسائط

النماذج متعددة الوسائط تمنح الذكاء الاصطناعي عيونًا — يرى صورة، يصفها بكلمات، كل شيء بنظرة واحدة.

💡 نصيحة: النماذج متعددة الوسائط (مثل llava وminicpm-v) أكبر بـ 2-3 أضعاف من النماذج النصية فقط، ومعالجة الصور تتطلب حسابات مشفّر رؤية إضافية، لذا يُوصى بشدة بتسريع GPU. في بيئات CPU فقط، قد تكون سرعة استنتاج النماذج متعددة الوسائط بطيئة جدًا لدرجة غير عملية (1-3 رموز/ثانية). GPU بـ 8 غيغابايت+ VRAM هو الحد الأدنى لتشغيل النماذج متعددة الوسائط بسلاسة.

📋 المتطلبات المسبقة: يجب أن تتقن ما يلي أولًا

1. ماذا ستتعلم


2. قصة حقيقية من مؤسس SaaS

ℹ️ معلومة: حاليًا، النماذج متعددة الوسائط التي يدعمها Ollama هي أساسًا سلسلة LLaVA (llava، llava-llama3، minicpm-v، إلخ). قدرة الفهم البصري لا تضاهي GPT-4V، لكنها عملية بما يكفي لسيناريوهات تحليل لقطات شاشة الواجهة ومساعدة OCR ووصف المنتجات.

💡 نصيحة: للنماذج متعددة الوسائط، نوصي باستخدام llava:13b بدلاً من llava:7b — إصدار 13B محسّن بشكل ملحوظ في الفهم البصري، خاصةً في السيناريوهات التي تتطلب وصف التفاصيل (مثلاً، مواقع عناصر الواجهة، بيانات المخططات). 7B مناسب للتصنيف البسيط؛ 13B مناسب للوصف والتحليل.

(1) المشكلة: لقطات شاشة تعليقات المستخدمين كثيرة جدًا للمراجعة

فريق التجارة الإلكترونية GlobalShop لأليس يستقبل أكثر من 50 تعليق مستخدم يوميًا، كل منها مع لقطة شاشة للواجهة. التحليل اليدوي للقطات الشاشة وكتابة تقارير التعليقات يستغرق وقتًا طويلًا. تريد أليس أتمتة هذه العملية.

(2) الحل: نموذج الرؤية يحلل لقطات الشاشة تلقائيًا

باستخدام نموذج LLaVA لتحليل لقطات شاشة الواجهة تلقائيًا وإنشاء تقارير تعليقات منظمة:

BASH
ollama run llava "What UI issues do you see in this image?" /path/to/screenshot.png

3. بنية النماذج متعددة الوسائط

⚠️ تحذير: النماذج متعددة الوسائط (مثل llava) أكبر بـ 2-3 أضعاف من النماذج النصية فقط ومعالجة الصور تستهلك VRAM أكثر. GPU بـ 8 غيغابايت VRAM قد يعالج فقط صورًا منخفضة الدقة؛ الصور عالية الدقة قد تسبب OOM (نفاد الذاكرة). اختبر بصور صغيرة أولًا.

(1) مبادئ نموذج الرؤية-اللغة (VLM)

100%
flowchart TD
    A[Image Input] --> B[Vision Encoder<br/>CLIP/ViT]
    B --> C[Image Embeddings]
    D[Text Input] --> E[Text Tokenizer]
    E --> F[Text Embeddings]
    C --> G[Projection Layer]
    F --> G
    G --> H[Language Model<br/>LLaMA/Mistral]
    H --> I[Text Output]
المكوّن الوظيفة مثال النموذج
مشفّر الرؤية استخراج سمات الصورة CLIP ViT-L/14
طبقة الإسقاط محاذاة فضاءات الرؤية واللغة محول MLP
نموذج اللغة توليد وصف نصي LLaMA 2 / Mistral

(2) مقارنة النماذج متعددة الوسائط المتاحة

النموذج المعلمات الحجم نقاط القوة أنواع الصور
llava 7B 4.7 غيغابايت وصف صور عام صور/لقطات شاشة/مستندات
llava-llama3 8B 5.5 غيغابايت استنتاج أقوى + رؤية فهم مشاهد معقدة
llava:13b 13B 7.4 غيغابايت دقة أعلى التعرف على التفاصيل
minicpm-v 8B 5.2 غيغابايت OCR + الصينية مستندات/جداول
bakllava 7B 4.7 غيغابايت خفيف وسريع صور بسيطة

▶ مثال 1: سحب وتشغيل LLaVA

BASH
# سحب النموذج متعدد الوسائط
ollama pull llava

# وصف صورة أساسي (سطر الأوامر بمسار ملف)
ollama run llava "Describe this image in detail" /path/to/photo.jpg

# بدون صورة: وضع نصي فقط
ollama run llava "What is machine learning?"

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

4. طرق إدخال الصور عبر سطر الأوامر

(1) طريقتا إدخال الصور

⚠️ ملاحظة: تُقلّص الصور تلقائيًا إلى أقصى دقة يدعمها النموذج (عادةً 336×336 أو 448×448 بكسل) قبل إدخالها. تفاصيل الصور عالية الدقة جدًا قد تُفقد في هذه العملية. إذا كنت بحاجة للنموذج للتعرف على نصوص صغيرة أو تفاصيل في صورة، قصّ الصورة إلى المنطقة الرئيسية أولًا بدلاً من إرسال الصورة عالية الدقة بالكامل.

الطريقة الصيغة حالة الاستخدام
مسار الملف ollama run llava "prompt" /path/to/image.jpg صور محلية، الأبسط
تفاعلي استخدام أمر .image في المحادثة إدخال صور ديناميكي

(2) صيغ الصور المدعومة

الصيغة الامتداد الحجم الأقصى ملاحظات
JPEG .jpg/.jpeg ضمن الحدود الأفضل للصور الفوتوغرافية
PNG .png ضمن الحدود لقطات شاشة/محتوى نصي
WebP .webp ضمن الحدود صور الويب
GIF .gif الإطار الأول فقط بدون دعم الحركة
⚠️ ملاحظة: تُقلّص الصور إلى الدقة التي يدعمها النموذج (عادةً 336×336 أو 448×448 بكسل). تفاصيل الصور عالية الدقة جدًا قد تُفقد.

▶ مثال 2: تفاعل متعدد الوسائط عبر سطر الأوامر

BASH
# بدء جلسة تفاعلية مع صورة
ollama run llava

>>> .image /path/to/product-photo.jpg
>>> What product is shown and what are its key features?

# Output: The image shows a pair of premium wireless headphones...
# Key features include:
# 1. Over-ear design with memory foam cushions
# 2. Active noise cancellation
# 3. USB-C charging port visible on the left ear cup

>>> .image /path/to/chart.png
>>> Summarize the data trends shown in this chart

# Output: The chart displays quarterly revenue from 2023-2024...

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

5. استدعاءات متعددة الوسائط عبر REST API

(1) صيغة طلب API

كلتا نقطتي /api/chat و/api/generate تدعمان حقل images، مع تمرير صور مشفّرة Base64:

الحقل النوع الوصف
images list[string] قائمة صور مشفّرة Base64
كل صورة string بدون بادئة data:image/...

▶ مثال 3: استدعاء صورة Base64 عبر REST API

BASH
# تحويل صورة إلى Base64 واستدعاء API
IMAGE_BASE64=$(base64 -w 0 /path/to/photo.jpg)

curl http://localhost:11434/api/chat -d "{
  \"model\": \"llava\",
  \"messages\": [{
    \"role\": \"user\",
    \"content\": \"Describe this image\",
    \"images\": [\"$IMAGE_BASE64\"]
  }],
  \"stream\": false
}"

الإخراج:

TEXT
{"status":"ok","data":{}}

▶ مثال 4: استدعاء متعدد الوسائط عبر Python SDK

PYTHON
import ollama
import base64
from pathlib import Path

def analyze_image(image_path: str, prompt: str, model: str = "llava") -> str:
    """Analyze an image using a multimodal model."""
    # Read and encode image
    image_data = base64.b64encode(
        Path(image_path).read_bytes()
    ).decode("utf-8")

    response = ollama.chat(
        model=model,
        messages=[{
            "role": "user",
            "content": prompt,
            "images": [image_data]
        }],
        stream=False
    )
    return response["message"]["content"]

# الاستخدام
result = analyze_image(
    "/path/to/screenshot.png",
    "List all UI issues you can identify in this screenshot"
)
print(result)

الإخراج:

TEXT
# Function defined successfully

6. سيناريوهات عملية

(1) مقارنة السيناريوهات

السيناريو الإدخال النموذج الموصى به مثال الموجه
وصف المنتج صورة منتج llava "Describe this product for an e-commerce listing"
تحليل الأخطاء لقطة شاشة واجهة llava-llama3 "What UI bugs are visible in this screenshot?"
مساعدة OCR مسح مستند minicpm-v "Extract all text from this document image"
تفسير المخططات مخطط بيانات llava "Summarize the trends in this data chart"
مراجعة أمنية صورة محتوى llava "Does this image contain any unsafe content?"

▶ مثال 5: تحليل لقطات شاشة الواجهة لأليس

PYTHON
import ollama
import base64
from pathlib import Path
import json

def analyze_ui_screenshot(image_path: str) -> dict:
    """Analyze a UI screenshot and return structured feedback."""
    image_data = base64.b64encode(
        Path(image_path).read_bytes()
    ).decode("utf-8")

    system_prompt = """You are a UI/UX expert reviewing application screenshots.
Analyze the screenshot and provide feedback in this JSON format:
{
  "issues": [{"type": "layout|color|text|accessibility", "description": "...", "severity": "high|medium|low"}],
  "summary": "Brief overall assessment"
}"""

    response = ollama.chat(
        model="llava-llama3",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": "Review this UI screenshot for issues",
             "images": [image_data]}
        ],
        stream=False,
        format="json",
        options={"temperature": 0.3}
    )

    try:
        return json.loads(response["message"]["content"])
    except json.JSONDecodeError:
        return {"raw": response["message"]["content"]}

# الاستخدام
feedback = analyze_ui_screenshot("/path/to/app-screenshot.png")
print(json.dumps(feedback, indent=2))

الإخراج:

TEXT
# Function defined successfully

7. مثال شامل: نظام مساعد خدمة عملاء متعدد الوسائط

PYTHON
# ============================================
# شامل: خدمة عملاء متعددة الوسائط
# تحليل صور + محادثة نصية للتجارة الإلكترونية
# ============================================

import ollama
import base64
from pathlib import Path
from dataclasses import dataclass
from typing import Optional

@dataclass
class MultimodalSupport:
    chat_model: str = "qwen2.5"
    vision_model: str = "llava"
    temperature: float = 0.3

    def handle_product_query(
        self, image_path: str, question: str
    ) -> str:
        """Answer product questions using image + text."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        response = ollama.chat(
            model=self.vision_model,
            messages=[{
                "role": "user",
                "content": f"Answer this question about the product shown: {question}",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": self.temperature}
        )
        return response["message"]["content"]

    def handle_damage_report(
        self, image_path: str, order_id: str
    ) -> str:
        """Process a damage report with photo evidence."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        # الخطوة 1: تحليل الضرر من الصورة
        damage_desc = ollama.chat(
            model=self.vision_model,
            messages=[{
                "role": "user",
                "content": "Describe the damage visible in this product photo. Be specific about the type and severity.",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": 0.2}
        )["message"]["content"]

        # الخطوة 2: توليد رد باستخدام نموذج المحادثة
        response = ollama.chat(
            model=self.chat_model,
            messages=[
                {"role": "system", "content": "You are an e-commerce customer service agent handling damage reports."},
                {"role": "user", "content": f"Order {order_id} has damage: {damage_desc}. Generate a polite response acknowledging the damage and explaining the refund/replacement process."}
            ],
            stream=False,
            options={"temperature": self.temperature}
        )
        return response["message"]["content"]

    def extract_text_from_image(
        self, image_path: str
    ) -> str:
        """OCR-like text extraction from document images."""
        image_data = base64.b64encode(
            Path(image_path).read_bytes()
        ).decode("utf-8")

        response = ollama.chat(
            model="minicpm-v",
            messages=[{
                "role": "user",
                "content": "Extract all visible text from this image. Preserve the original layout and formatting.",
                "images": [image_data]
            }],
            stream=False,
            options={"temperature": 0.1}
        )
        return response["message"]["content"]

# الاستخدام
if __name__ == "__main__":
    service = MultimodalSupport()

    print("=== Damage Report ===")
    # print(service.handle_damage_report("damaged_item.jpg", "#12345"))

    print("=== Product Query ===")
    # print(service.handle_product_query("headphones.jpg", "Does this have noise cancellation?"))

    print("=== OCR Extraction ===")
    # print(service.extract_text_from_image("receipt.png"))

❓ أسئلة شائعة

س هل يمكن استخدام النماذج متعددة الوسائط والنصية بالتبادل؟
ج لا. النماذج متعددة الوسائط تعالج صور + نص؛ النماذج النصية تعالج نصًا فقط. النماذج متعددة الوسائط يمكنها التعامل مع إدخال نصي بدون صور، لكن النماذج النصية لا يمكنها معالجة الصور.
س هل تؤثر دقة الصورة على سرعة الاستنتاج؟
ج نعم. الصور بدقة أعلى تُشفّر رموز أكثر، مما يزيد وقت الاستنتاج. يُقلّص Ollama تلقائيًا إلى أقصى دقة يدعمها النموذج — بدون حاجة لتعديل يدوي.
س هل يمكن طرح أسئلة متعددة على صورة واحدة؟
ج نعم. اذكر أسئلة متعددة في الموجه وسيجيب النموذج عليها واحدة واحدة. لكن نوصى بالتركيز على 1-2 سؤال لكل استدعاء للحصول على استجابات أدق.
س ما مدى جودة قدرة llava على الصينية؟
ج llava موجّه أساسًا للإنجليزية. لوصف الصور بالصينية، نوصي بـ minicpm-v أو qwen2.5-vl (إذا كان متاحًا). استخدام موجهات صينية ينتج استجابات صينية.
س هل يمكن معالجة الفيديو؟
ج حاليًا Ollama متعدد الوسائط يدعم الصور الثابتة فقط. الفيديو يتطلب استخراج إطارات رئيسية كصور أولًا، ثم التحليل إطارًا بإطار. GIF يعالج الإطار الأول فقط.
س صور Base64 المشفّرة كبيرة جدًا، ماذا أفعل؟
ج اضغط الصور إلى دقة معقولة أولًا (مثلاً، ضمن 1024 بكسل). جودة JPEG عند 80 عادةً كافية. تجنب إرسال أصول بحجم 10 ميغابايت+.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): اسحب نموذج llava، استخدم سطر الأوامر لتحليل صورة منتج ووصف ميزاتها.
  2. متوسط (صعوبة ⭐⭐): استخدم Python SDK لتنفيذ حوار متعدد الأدوار مع صورة + نص — حلل محتوى الصورة أولًا، ثم اطرح أسئلة متابعة بناءً على التحليل.
  3. متقدم (صعوبة ⭐⭐⭐): ابنِ أداة مراجعة آلية للقطات شاشة الواجهة لأليس: أدخل لقطة شاشة، أخرج تقرير أخطاء JSON منظم (نوع، وصف، شدة)، وصنّف وأرشف تلقائيًا.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%