الوحدة 8 — التشغيل المحلّي دون اتّصال
الفكرة العمليّة لهذه الدورة كلّها: نموذج يعمل على جهاز الموظّف بلا خادوم مركزيّ ولا سحابة. الوحدة السابقة أعطتنا نموذجًا مضبوطًا؛ هنا نضعه في الاستخدام اليوميّ.
Ollama: الخيار الأسرع للانطلاق
Ollama تطبيق يغلّف llama.cpp خلف واجهة سطر أوامر بسيطة وواجهة برمجيّة محلّيّة على منفذ 11434. مصمَّم لجعل تشغيل نموذج محلّي بسيطًا كتشغيل قاعدة بيانات محلّيّة.
التثبيت على أنظمة التشغيل الثلاثة:
- macOS/Linux:
curl -fsSL https://ollama.com/install.sh | sh - Windows: تنزيل الحزمة من
ollama.com/downloadوتشغيلها
بعد التثبيت، تحميل نموذج وتشغيله في أمر واحد:
ollama pull qwen2.5:3b
ollama run qwen2.5:3b "صنّف هذه البطاقة: طلبي لم يصل بعد أسبوعين"
Ollama يخزّن النموذج في مجلّد النظام (نحو 1,8 غيغا لنموذج 3 مليارات مكمَّم على Q4)، ويشغّل خدمة في الخلفيّة تُصغي إلى الطلبات.
استيراد نموذج مخصَّص إلى Ollama
النموذج المضبوط الذي أخرجناه في الوحدة السابقة بصيغة GGUF يُستورَد بملفّ تعريف يُسمّى Modelfile:
FROM /chemin/vers/qwen2.5-3b-tickets-Q4_K_M.gguf
TEMPLATE """<|im_start|>system
أنت مساعد لتصنيف بطاقات دعم العملاء بالعربيّة الفصحى.
<|im_end|>
<|im_start|>user
{{ .Prompt }}
<|im_end|>
<|im_start|>assistant
"""
PARAMETER temperature 0.3
PARAMETER num_ctx 2048
ثمّ تسجيل النموذج المخصّص:
ollama create tickets-assistant -f Modelfile
ollama run tickets-assistant "بطاقة الاختبار..."
هذا النموذج المخصّص متاح الآن كأيّ نموذج آ خر عبر واجهة Ollama.
متطلّبات الذاكرة
قاعدة تقريبيّة موثوقة لتقدير حجم الذاكرة اللازمة:
- نموذج بـ مليار مُعامِل على تكميم Q4 يشغل نحو غيغابايت
- نموذج بـ مليار مُعامِل على تكميم Q8 يشغل نحو غيغابايت
- أضِف 500 ميغا إلى 1 غيغا لسياق العمل (KV cache)
مثال: Qwen 2.5-3B على Q4 = 1,8 غيغا + 0,5 غيغا سياق = 2,3 غيغابايت ذاكرة عاملة. جهاز بذاكرة 8 غيغا كافٍ بلا مشاكل، حتّى مع تشغيل نظام التشغيل وتطبيقات المكتب.
نموذج 7 مليارات على Q4 يتطلّب 4,5 غيغا، ما يزال ممكنًا على جهاز 8 غيغا لكن مع ضغط. الأمثل: جهاز 16 غيغا.
استخدام Ollama عبر HTTP
Ollama يعرض واجهة HTTP محلّ يّة تتوافق مع طرف OpenAI (تقريبًا). هذا يعني أنّ أيّ تطبيق يستخدم SDK الخاصّ بـOpenAI يمكن توجيهه إلى Ollama بتغيير عنوان الخادوم:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
response = client.chat.completions.create(
model="tickets-assistant",
messages=[
{"role": "system", "content": "أنت مساعد تصنيف بطاقات."},
{"role": "user", "content": "لم أستلم طلبي رقم 45123..."}
]
)