Ollama: تمارين المرحلة الأولى الشاملة

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

💡 نصيحة: هذا الدرس العملي مرتبط ارتباطًا وثيقًا بالدروس الخمسة الأولى. نوصي بإكمالها بالترتيب: أتقن التثبيت والإعداد (الدرس 2)، أساسيات سطر الأوامر (الدرس 3)، إدارة النماذج (الدرس 4)، REST API (الدرس 5)، ثم عُد للتمارين الشاملة. لا تتخطَّ — قد تواجه مفاهيم وأوامر غير مألوفة.

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

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


2. قصة حقيقية من مدير تقني لشركة ناشئة

ℹ️ معلومة: هدف النموذج الأولي (PoC - إثبات المفهوم) هو "التحقق من الجدوى" وليس "التنفيذ المثالي". إثبات عمل المسار الأساسي بأسرع سرعة يكسب ثقة الفريق والميزانية اللاحقة. لا تركز على دقة النموذج أو جودة الكود في مرحلة النموذج الأولي.

⚠️ تحذير: عند التحقق الشامل من النموذج الأولي، تأكد من فحص تأثير "البدء البارد" على كمون API — الطلب الأول يحتاج لتحميل النموذج (5-30 ثانية)، والطلبات اللاحقة فقط تعكس كمون الاستنتاج الحقيقي. أرسل طلب تحمية أولًا، ثم ابدأ التوقيت.

(1) المشكلة: النظرية وحدها لا تقنع الفريق

أكملت أليس الدروس الخمسة الأولى، لكن الفريق لا يزال يتشكك في الذكاء الاصطناعي المحلي: "هل يعمل حقًا؟ هل الجودة كافية؟" تحتاج نموذجًا أوليًا شاملًا لإثبات جدوى الذكاء الاصطناعي المحلي قبل أن تحصل على ميزانية لخوادم GPU.

(2) الحل: نموذج أولي شامل في 30 دقيقة

من التثبيت إلى نموذج أولي تفاعلي لخدمة العملاء، أكملت أليس التحقق الكامل للمسار في 30 دقيقة:

BASH
# الخطوة 1: التثبيت
curl -fsSL https://ollama.com/install.sh | sh

# الخطوة 2: سحب النموذج
ollama pull qwen2.5

# الخطوة 3: اختبار API
curl http://localhost:11434/api/chat -d '{
  "model": "qwen2.5",
  "messages": [{"role": "user", "content": "Hello"}],
  "stream": false
}'

3. تمرين 1: سير العمل الشامل من البداية إلى النهاية

ℹ️ ملاحظة: الهدف الأساسي للتحقق الشامل هو "إثبات أن المسار يعمل" — من التثبيت إلى استدعاءات API، كل خطوة تنجح. لا تسعَ لجودة إخراج النموذج في هذه المرحلة؛ هذا للتحسين لاحقًا. ابدأ بأصغر نموذج (3B) للتحقق السريع — هذا أكثر كفاءة بكثير من التصحيح بنموذج كبير.

💡 نصيحة: مفتاح النموذج الأولي الشامل هو "التحقق السريع من الجدوى"، وليس الكمال. استخدم أصغر نموذج (3B) أولًا للتحقق من عمل المسار، ثم انتقل للنموذج المستهدف لاختبار الجودة. هذا أكثر كفاءة بكثير من سحب نموذج كبير منذ البداية.

(1) من الصفر إلى استدعاء API

أكمل الخطوات التالية بالترتيب، مع التحقق من كل خطوة قبل الانتقال:

100%
flowchart LR
    A[Install Ollama] --> B[Verify Service]
    B --> C[Pull Model]
    C --> D[CLI Test]
    D --> E[REST API Test]
    E --> F[Script Integration]
الخطوة الإجراء أمر التحقق
1 تثبيت Ollama ollama --version
2 تأكيد تشغيل الخدمة curl http://localhost:11434/api/tags
3 سحب qwen2.5 ollama pull qwen2.5
4 اختبار تفاعل سطر الأوامر ollama run qwen2.5 "Hello"
5 اختبار REST API استدعاء curl لـ /api/chat
6 اختبار تكامل السكربت استدعاء دفعي عبر سكربت Shell

▶ مثال 1: سكربت التحقق الشامل

BASH
#!/bin/bash
# سكربت التحقق الشامل
set -e

echo "=== Step 1: Verify Installation ==="
ollama --version

echo "=== Step 2: Verify Service ==="
curl -s http://localhost:11434/api/tags | python3 -m json.tool > /dev/null
echo "Service is running."

echo "=== Step 3: Pull Model ==="
ollama pull qwen2.5

echo "=== Step 4: CLI Test ==="
ollama run qwen2.5 "Say hello in one sentence"

echo "=== Step 5: REST API Test ==="
curl -s http://localhost:11434/api/chat -d '{
  "model": "qwen2.5",
  "messages": [{"role": "user", "content": "Hello"}],
  "stream": false
}' | python3 -c "import sys,json; print('API works:', json.load(sys.stdin)['message']['content'][:50])"

echo "=== All Steps Passed ==="

الإخراج:

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

4. تمرين 2: اختبار دفعي لجودة استجابة النماذج

(1) مقارنة إخراج النماذج بأعداد معلمات مختلفة

استخدم نفس مجموعة الأسئلة لاختبار نماذج مختلفة، مع تقييم السرعة والجودة:

بُعد الاختبار نموذج 3B نموذج 8B نموذج التضمين
سرعة الاستجابة سريع (30+ رمز/ثانية) متوسط (15-20 رمز/ثانية) سريع (متجهات فقط)
جودة الصينية مقبول أساسيًا طبيعي وسلس غير قابل للتطبيق
قدرة الاستنتاج مهام بسيطة تعقيد متوسط غير قابل للتطبيق
استهلاك الموارد 4 غيغابايت RAM 8 غيغابايت RAM 300 ميغابايت RAM

▶ مثال 2: مقارنة جودة النماذج الدفعية

BASH
#!/bin/bash
# اختبار دفعي لنماذج مختلفة بنفس الأسئلة

QUESTIONS=(
    "What is the return policy for electronics?"
    "Translate to French: Free shipping on orders over $50"
    "Write a SQL query to find top 10 customers by revenue"
)

MODELS=("llama3.2:3b" "llama3.1:8b" "qwen2.5:7b")

for model in "${MODELS[@]}"; do
    echo "=== Model: $model ==="
    for q in "${QUESTIONS[@]}"; do
        echo "Q: $q"
        start=$(date +%s%N)
        response=$(curl -s http://localhost:11434/api/chat -d "{
            \"model\": \"$model\",
            \"messages\": [{\"role\": \"user\", \"content\": \"$q\"}],
            \"stream\": false,
            \"options\": {\"temperature\": 0.3}
        }" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['message']['content'][:100])")
        end=$(date +%s%N)
        elapsed=$(( (end - start) / 1000000 ))
        echo "A: ${response}..."
        echo "Time: ${elapsed}ms"
        echo ""
    done
done

الإخراج:

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

5. تمرين 3: سكربت روبوت محادثة باستخدام curl

(1) تصميم سكربت محادثة تفاعلي

نفّذ روبوت محادثة بسيط باستخدام سكربت Shell، مع الحفاظ يدويًا على سجل المحادثة:

100%
flowchart TD
    A[Start Session] --> B[Read User Input]
    B --> C{Input == /quit?}
    C -->|Yes| D[Exit]
    C -->|No| E[Append to Messages Array]
    E --> F[Call /api/chat]
    F --> G[Print Response]
    G --> H[Append Response to Messages]
    H --> B

▶ مثال 3: روبوت محادثة تفاعلي

BASH
#!/bin/bash
# روبوت محادثة تفاعلي بسيط باستخدام curl

API="http://localhost:11434/api/chat"
MODEL="qwen2.5"
MESSAGES='[{"role":"system","content":"You are a helpful assistant. Be concise."}]'

echo "ChatBot (type /quit to exit)"
echo "--------------------------------"

while true; do
    read -p "You: " input
    if [ "$input" = "/quit" ]; then
        echo "Goodbye!"
        break
    fi

    # إضافة رسالة المستخدم
    MESSAGES=$(echo "$MESSAGES" | python3 -c "
import sys, json
msgs = json.load(sys.stdin)
msgs.append({'role': 'user', 'content': '$input'})
print(json.dumps(msgs))
")

    # استدعاء API
    response=$(curl -s "$API" -d "{
        \"model\": \"$MODEL\",
        \"messages\": $MESSAGES,
        \"stream\": false,
        \"options\": {\"temperature\": 0.5}
    }")

    # استخراج وطباعة الرد
    content=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin)['message']['content'])")
    echo "Bot: $content"

    # إضافة رد المساعد
    MESSAGES=$(echo "$MESSAGES" | python3 -c "
import sys, json
msgs = json.load(sys.stdin)
msgs.append({'role': 'assistant', 'content': '''$content'''})
print(json.dumps(msgs))
")
    echo ""
done

الإخراج:

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

6. التحقق من جدوى النموذج الأولي المحلي لأليس

(1) أبعاد تقييم النموذج الأولي

البُعد عنصر الفحص المستهدف
الوظائف يمكن الرد بشكل صحيح على الأسئلة الشائعة دقة > 80%
الكمون وقت استجابة أول رمز < 500 مللي ثانية
الإنتاجية الطلبات المعالجة في الدقيقة > 10 طلب/دقيقة
التكلفة استثمار hardware مقابل وفورات السحابة نقطة التعادل خلال 6 أشهر
الخصوصية هل تغادر البيانات المحلي 0 تسريب

▶ مثال 4: سكربت معيار أداء النموذج الأولي

BASH
#!/bin/bash
# معيار أداء سريع للنموذج الأولي للذكاء الاصطناعي المحلي

API="http://localhost:11434/api/chat"
MODEL="qwen2.5"
REQUESTS=10

echo "=== Local AI PoC Benchmark ==="
echo "Model: $MODEL"
echo "Requests: $REQUESTS"
echo ""

total_time=0
total_tokens=0

for i in $(seq 1 $REQUESTS); do
    start=$(date +%s%N)
    response=$(curl -s "$API" -d "{
        \"model\": \"$MODEL\",
        \"messages\": [{\"role\": \"user\", \"content\": \"Explain the return policy briefly\"}],
        \"stream\": false,
        \"options\": {\"temperature\": 0.3}
    }")
    end=$(date +%s%N)

    elapsed_ms=$(( (end - start) / 1000000 ))
    tokens=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin).get('eval_count', 0))")

    total_time=$((total_time + elapsed_ms))
    total_tokens=$((total_tokens + tokens))
    echo "Request $i: ${elapsed_ms}ms, ${tokens} tokens"
done

avg_time=$((total_time / REQUESTS))
avg_tokens=$((total_tokens / REQUESTS))
tput=$((total_tokens * 1000 / total_time))

echo ""
echo "=== Results ==="
echo "Avg latency: ${avg_time}ms"
echo "Avg tokens:  ${avg_tokens}"
echo "Throughput:  ${tput} tokens/s"
echo "Target met:  $([ $avg_time -lt 5000 ] && echo 'YES' || echo 'NO')"

الإخراج:

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

▶ مثال 5: التحقق من قائمة التقييم الذاتي

BASH
#!/bin/bash
# قائمة التقييم الذاتي للمرحلة الأولى

echo "=== Phase 1 Self-Assessment ==="
echo ""

checks=0
total=6

# فحص 1: Ollama مثبت
if command -v ollama &> /dev/null; then
    echo "[PASS] Ollama is installed"
    ((checks++))
else
    echo "[FAIL] Ollama is not installed"
fi

# فحص 2: الخدمة تعمل
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
    echo "[PASS] Ollama service is running"
    ((checks++))
else
    echo "[FAIL] Ollama service is not running"
fi

# فحص 3: نموذج واحد متاح على الأقل
model_count=$(ollama list 2>/dev/null | tail -n +2 | wc -l)
if [ "$model_count" -gt 0 ]; then
    echo "[PASS] $model_count model(s) available"
    ((checks++))
else
    echo "[FAIL] No models pulled"
fi

# فحص 4: تفاعل سطر الأوامر يعمل
if ollama run llama3.2 "test" > /dev/null 2>&1; then
    echo "[PASS] CLI interaction works"
    ((checks++))
else
    echo "[FAIL] CLI interaction failed"
fi

# فحص 5: REST API يستجيب
if curl -s http://localhost:11434/api/generate -d '{"model":"llama3.2","prompt":"hi","stream":false}' > /dev/null 2>&1; then
    echo "[PASS] REST API responds"
    ((checks++))
else
    echo "[FAIL] REST API not responding"
fi

# فحص 6: المتدفقة تعمل
if curl -s http://localhost:11434/api/chat -d '{"model":"llama3.2","messages":[{"role":"user","content":"hi"}]}' | grep -q '"done":true'; then
    echo "[PASS] Streaming API works"
    ((checks++))
else
    echo "[FAIL] Streaming API failed"
fi

echo ""
echo "Score: $checks / $total"
if [ "$checks" -eq "$total" ]; then
    echo "✅ Ready for Phase 2!"
else
    echo "⚠️ Review failed items before proceeding."
fi

الإخراج:

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

7. مثال شامل: سير عمل التحقق الشامل الكامل

BASH
#!/bin/bash
# ============================================
# شامل: سير عمل المرحلة الأولى الشامل
# تثبيت → إعداد → سحب → اختبار → تقرير
# ============================================

set -e
REPORT="phase1_report_$(date +%Y%m%d_%H%M%S).txt"

echo "Phase 1 E2E Workflow" | tee "$REPORT"
echo "====================" | tee -a "$REPORT"
echo "" | tee -a "$REPORT"

# الخطوة 1: التحقق من التثبيت
echo "## Installation" | tee -a "$REPORT"
echo "Ollama: $(ollama --version 2>&1)" | tee -a "$REPORT"
echo "OS: $(uname -s) $(uname -m)" | tee -a "$REPORT"
echo "RAM: $(free -g | awk '/^Mem:/{print $2}')GB" | tee -a "$REPORT"
if command -v nvidia-smi &> /dev/null; then
    echo "GPU: $(nvidia-smi --query-gpu=name --format=csv,noheader)" | tee -a "$REPORT"
else
    echo "GPU: CPU-only mode" | tee -a "$REPORT"
fi
echo "" | tee -a "$REPORT"

# الخطوة 2: سحب حزمة نماذج SupportBot
echo "## Model Stack" | tee -a "$REPORT"
ollama pull qwen2.5 2>&1 | tail -1 | tee -a "$REPORT"
ollama pull llama3.2:3b 2>&1 | tail -1 | tee -a "$REPORT"
ollama pull nomic-embed-text 2>&1 | tail -1 | tee -a "$REPORT"
echo "" | tee -a "$REPORT"

# الخطوة 3: اختبار الجودة بـ 3 أسئلة
echo "## Quality Test" | tee -a "$REPORT"
questions=(
    "What is your return policy?"
    "How do I track my order?"
    "Do you ship internationally?"
)
for q in "${questions[@]}"; do
    echo "Q: $q" | tee -a "$REPORT"
    answer=$(curl -s http://localhost:11434/api/chat -d "{
        \"model\": \"qwen2.5\",
        \"messages\": [{\"role\": \"system\", \"content\": \"You are an e-commerce support agent. Be concise.\"},
                       {\"role\": \"user\", \"content\": \"$q\"}],
        \"stream\": false,
        \"options\": {\"temperature\": 0.3}
    }" | python3 -c "import sys,json; print(json.load(sys.stdin)['message']['content'][:120])")
    echo "A: $answer" | tee -a "$REPORT"
    echo "" | tee -a "$REPORT"
done

# الخطوة 4: معيار الأداء
echo "## Benchmark" | tee -a "$REPORT"
start=$(date +%s%N)
curl -s http://localhost:11434/api/chat -d '{
    "model": "qwen2.5",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": false
}' > /dev/null
end=$(date +%s%N)
latency=$(( (end - start) / 1000000 ))
echo "Single request latency: ${latency}ms" | tee -a "$REPORT"
echo "Target < 5000ms: $([ $latency -lt 5000 ] && echo PASS || echo FAIL)" | tee -a "$REPORT"
echo "" | tee -a "$REPORT"

echo "Report saved: $REPORT"

❓ أسئلة شائعة

س ماذا أفعل إذا فشل السكربت الشامل في خطوة ما؟
ج تحقق من كل خطوة على حدة. أولًا ollama --version، ثم curl localhost:11434/api/tags، تشخيص طبقة بطبقة. 90% من المشاكل سببها الخدمة لم تبدأ أو النموذج لم يُسحب.
س تحميل النموذج بطيء أثناء الاختبار الدفعي، ماذا أفعل؟
ج الطلب الأول يحتاج لتحميل النموذج في الذاكرة (بدء بارد). اضبط OLLAMA_KEEP_ALIVE=30m لإبقاء النموذج في الذاكرة، والطلبات اللاحقة تستجيب في ثوانٍ.
س ماذا لو أصبح سجل محادثات سكربت روبوت المحادثة طويلًا جدًا؟
ج مصفوفة messages المتنامية تستهلك نافذة السياق. نوصي بتنفيذ نافذة منزلقة — الاحتفاظ بآخر 10 أدوار فقط وإهمال الأقدم. أو تلخيص وضغط دوريًا.
س نتائج معيار أداء النموذج الأولي غير متسقة، ماذا أفعل؟
ج الطلب الأول يتضمن وقت تحميل النموذج (تحيز البدء البارد). نوصي بتجاهل أول طلبين ومتوسط الـ 10 التالية. تأكد من عدم وجود حمل آخر أثناء الاختبار.
س ما المعارف المسبقة المطلوبة للمرحلة الثانية؟
ج أساسيات Python (دوال، أصناف، async/await)، خبرة استدعاء HTTP API، مفاهيم Docker الأساسية. الدرس 7 يبدأ بـ Python SDK؛ نوصى بالتعرف على Python مسبقًا.
س كيف أعرف أنني مستعد للمرحلة الثانية؟
ج أكمل قائمة التقييم الذاتي 6/6 عناصر وكن قادرًا على بناء سكربت حوار متعدد الأدوار باستخدام curl بشكل مستقل — عندئذٍ تكون مستعدًا للمرحلة الثانية.

📖 ملخص


📝 تمارين

  1. أساسي (صعوبة ⭐): أكمل كل خطوة من سكربت التحقق الشامل، مع التأكد من نجاح جميع الخطوات، واحفظ لقطات شاشة للنتائج.
  2. متوسط (صعوبة ⭐⭐): شغّل سكربت مقارنة جودة النماذج الدفعية، اختر 3 نماذج مختلفة، سجّل أوقات الاستجابة ودرجات الجودة، واكتب تقرير تحليل موجز.
  3. متقدم (صعوبة ⭐⭐⭐): أكمل تحقق نموذج أولي كامل لشركة SaaS لأليس — اكتب سكربتات معيار، سجّل بيانات الكمون والإنتاجية، احسب مقارنات التكلفة لـ 12 شهرًا، وأصدر مستند تقرير جدوى.
Web-Tutorial.com

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

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

100%