تميمة NordBastion الدب القطبي جالسًا على مقعد حجري منحوت داخل قبو نوردي مظلم وعلى حجره حاسوب محمول، وشبكة عصبية سيانية متوهجة مختومة داخل وعاء زجاجي سداسي فوق رف الخوادم بجانبه، وسيل قصير من الرموز السيانية يتدفق من الوعاء نزولاً إلى شاشته خلف باب رونيّ مغلق
دليل تطبيقي · وكلاء الذكاء الاصطناعي·17 دقيقة قراءة · 30 دقيقة تطبيق عملي

استضافة LLM ذاتيًا على VPS.
بلا GPU. بلا مفتاح API. ولا طلب واحد يغادر الخادم.

ست خطوات نحو نموذج لغوي يجيب على عتادك الخاص — الحساب الذي يتنبأ بعدد الرموز في الثانية قبل أن تشتري الخادم، والنموذج الذي يلائم 4 أو 8 أو 16 أو 32 GB، والمصادقة التي لا يوفرها Ollama، وقائمة صادقة بالمهام التي لا تلائمه. مُختبر على Debian 12.

الخطوات الست
  1. 01

    الحجم

    النطاق الترددي، لا الأنوية

  2. 02

    تثبيت

    Ollama

  3. 03

    القياس

    رموزك في الثانية

  4. 04

    الحماية

    TLS + رمز

  5. 05

    اتصل

    base URL واحد

  6. 06

    قيّده

    السياق، RAM، القرص

قبل أن تبدأ · الحساب

قسمة واحدة تخبرك بما يستطيعه الخادم. قم بها قبل أن تشتري الخادم.

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

هذه الحقيقة الواحدة تحسم مسألة الأداء بأكملها. سرعة التوليد لا يحددها عدد الأنوية التي تستأجرها؛ بل يحددها مدى سرعة بث الجهاز للنموذج من RAM. وهذا يمنحك سقفًا يمكنك حسابه بسرعة قبل أن تنفق أي شيء:

tokens per second  ≈  memory bandwidth (GB/s)  ÷  model size (GB)

نموذج 8B مكمّم يشغل نحو 5 GB. على خادم افتراضي يمكنك فيه واقعيًا بث ما يقارب 20 GB/s، يكون السقف نحو أربعة رموز في الثانية، والرقم الذي ستلاحظه فعليًا قد يكون نصف ذلك إلى ثلثيه. أي نحو ثلاث كلمات في الثانية تقريبًا. اقرأ هذا كحقيقة عن طبيعة العمل لا كخيبة أمل: إنه بطيء لنافذة محادثة، وكافٍ تمامًا لمهمة تصنّف مستندًا وتُعيد سطر JSON واحدًا.

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

القراءة سريعة، والكتابة بطيئة. هناك مرحلتان في كل طلب ولا تتصرفان بالمثل إطلاقًا. معالجة الطلب — أو ما يُعرف بـ prefill — عملية مصفوفات مقيّدة بالحوسبة على كامل المُدخل دفعة واحدة، وتعمل أسرع من التوليد بمرات عديدة. أما إنتاج الإجابة فهو الجزء المقيّد بالذاكرة الموصوف أعلاه، رمزًا واحدًا في كل مرة. لذا فإن تسليم النموذج مستندًا من ألفي كلمة وطلب ثلاث جمل كإجابة عبء عمل مريح، بينما طلب مقال من ألفي كلمة ليس كذلك. صمّم طلباتك حول عدم التناظر هذا، وسيبدو خادم CPU أفضل بكثير مما يوحي به معدل الرموز لديه.

الفئة الذاكرة أكبر نموذج مريح مرتبة الحجم الغرض منه
Sentinel · $3.904 GB3B عند Q4 (~2 GB)جملة في الثانيةالتصنيف، الوسم، التوجيه، التضمينات
Garrison · $7.908 GB8B عند Q4 (~5 GB)بضع كلمات في الثانيةالافتراضي. الملخصات، استخراج JSON، إجابات RAG
Ravelin · $16.9016 GB14B عند Q4 (~9 GB)نحو نصف ما سبقالاستدلال الأصعب، السياق الطويل، خطوط المعالجة الدفعية
Bulwark · $32.9032 GB32B عند Q4 (~20 GB)أقل من كلمة في الثانيةالجودة قبل السرعة. عمل غير متزامن فقط
Citadel · $62.9064 GB70B عند Q4 (~40 GB)دقائق لكل إجابةيتّسع. لكنه غير تفاعلي. مهام ليلية

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

قبل أن تبدأ · الملاءمة

ما يلائم CPU فعلاً. وما لا يلائمه، بصراحة تامة.

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

يتّسع براحة. أي شيء يكون فيه المخرج قصيرًا وتكمن قيمته في الحكم لا في النثر. تصنيف رسالة ضمن واحدة من فئات قليلة. تحديد ما إذا كانت تذكرة دعم عاجلة. استخراج خمسة حقول من فاتورة على شكل JSON. تلخيص محادثة في ثلاث جمل. وسم مستند. إعادة صياغة وصف منتج. ترجمة نص قصير. كشف ما إذا كان سجلان يصفان الشخص نفسه. حجب الأسماء من فقرة قبل أن تذهب إلى أي مكان آخر. كل واحدة من هذه المهام تستهلك مُدخلاً طويلاً وتنتج مخرجًا قصيرًا، وهذا بالضبط عدم التناظر الذي يتعامل معه CPU جيدًا.

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

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

إن كان عبء عملك يقع في تلك المجموعة الأخيرة، فالإجابة السليمة ليست شراء خادم CPU أكبر — بل نهج هجين. أبقِ نموذجًا محليًا لمعظم الطلبات، ووجّه القلة التي تحتاج استدلالاً طليعيًا إلى API مستضافة، وهذا بالضبط الشكل الذي يصفه دليل تشغيل وكيل ذكاء اصطناعي على مدار الساعة لجانب بيئة التشغيل. ذلك الدليل ترك النموذج نفسه خارج نطاقه عمدًا. وهذا الدليل هو النصف الناقص.

الخطوة 01 · الحجم

اشترِ من أجل النموذج، لا من أجل الأنوية. واترك هامشًا إضافيًا.

اعمل بالاتجاه المعاكس بدءًا من المهمة. حدّد ما يجب أن يفعله النموذج، واختر أصغر حجم يؤدي ذلك، وابحث عمّا يشغله ذلك الحجم عند Q4_K_M، ثم أضف الأعباء الإضافية:

RAM needed  =  model file  +  KV cache  +  ~2 GB for the system

  3B  Q4_K_M  ≈  2.0 GB        KV cache at 8k context   ≈  0.5–1 GB
  8B  Q4_K_M  ≈  4.9 GB        KV cache at 32k context  ≈  2–4 GB
 14B  Q4_K_M  ≈  9.0 GB
 32B  Q4_K_M  ≈ 20.0 GB
 70B  Q4_K_M  ≈ 40.0 GB

ذاكرة التخزين المؤقت (KV) هي العبء الذي ينساه الناس. كل رمز موجود بالفعل في المحادثة يُحفظ في الذاكرة كي لا يعيد النموذج حسابه، وهذا المخزن ينمو مع السياق الذي تسمح به. مضاعفة السياق تضاعفه تقريبًا. نموذج يتّسع مع سياق 4k قد لا يتّسع عند 32k، وسيفشل في الطلب العاشر لا الأول، مما يجعله يبدو لغزًا بدل أن يكون خطأ حسابيًا بسيطًا.

لا يوجد تدهور تدريجي هنا. عندما يتجاوز المجموع RAM، لا تتباطأ النواة بلطف: بل تبدأ بترحيل أوزان النموذج من وإلى القرص، مع كل رمز واحد. توليد يستغرق أربع ثوانٍ يتحول إلى أربع دقائق، ويتسلق متوسط الحِمل إلى العشرات، وكل شيء آخر على الخادم — قاعدة البيانات، وخادم الويب، وجلسة SSH لديك — يعاني معه.

في لوحة التحكم: اطلب ← VPS ← الفئة التي أشار إليها الحساب، بصورة Debian 12. لا يُطلب بريد إلكتروني لفتح الحساب، ولا وثيقة هوية في أي مرحلة، وتُسوّى الفاتورة بـ Monero أو Bitcoin أو Lightning أو أي من الأصول المدعومة الأخرى — وهذا يهم هنا أكثر مما يهم على خادم ويب عادي، للأسباب التي يشرحها الدليل الأساسي حول استضافة VPS مجهولة، ويطبّقها فصل الخصوصية أدناه على الطلبات تحديدًا.

الخطوة 02 · التثبيت

أمر واحد، خدمة واحدة. مرتبطة بـ loopback، وتُترك هناك.

صلّب الجهاز أولاً — SSH بمفاتيح فقط، وجدار حماية لا يسمح بأي شيء لم تطلبه، وتحديثات أمنية تلقائية. تستغرق قائمة الساعة الأولى نحو ساعة، وهذا خادم سيحتفظ عمّا قريب بكل سؤال تطرحه عليه.

بعدها ثبّت المشغّل. Ollama هو llama.cpp مع سجل نماذج وREST API ووحدة systemd ملفوفة حوله، ويقوم مثبّت من سطر واحد بإعداد الثلاثة جميعًا:

apt update && apt install -y curl
curl -fsSL https://ollama.com/install.sh | sh

systemctl status ollama --no-pager
ss -ltnp | grep 11434
# → 127.0.0.1:11434 — loopback only. Leave it that way.

هذا السطر الأخير هو الذي يستحق قراءته مرتين. الخدمة تستمع افتراضيًا على واجهة loopback، وهذا صحيح تمامًا، والخطأ الأكثر شيوعًا في العشر دقائق التالية هو ضبط OLLAMA_HOST على 0.0.0.0 لأن جهة على جهاز آخر لم تستطع الوصول إليها. الخطوة 04 هي الطريقة الصحيحة للوصول إليها؛ ولا توجد نسخة من هذا السيناريو يواجه فيها المنفذ 11434 الإنترنت مباشرة.

إعدادان يستحقان الضبط الآن بدل اكتشافهما لاحقًا. تُخزَّن النماذج افتراضيًا تحت /usr/share/ollama وهي كبيرة الحجم، فوجّه ذلك إلى حيث توجد مساحة. والإعداد الافتراضي يُبقي النموذج مقيمًا في RAM لخمس دقائق بعد آخر طلب، وهذا كرم زائد على خادم يقوم أيضًا بأعمال أخرى:

systemctl edit ollama
[Service]
Environment="OLLAMA_MODELS=/var/lib/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
systemctl daemon-reload && systemctl restart ollama

الطلبات المتوازية والنماذج المتعددة المحمّلة تضاعف استهلاك الذاكرة كلاهما، وعلى جهاز مُقاس ليحمل نموذجًا واحدًا بالضبط لا يوجد جيجابايت إضافي لنسخة ثانية. تسلسل قائمة الانتظار ليس قيدًا على هذا العتاد؛ بل هو الإعداد الوحيد الذي لا ينهار.

الخطوة 03 · القياس

احصل على رقمك الخاص. لا شأن لاختبار أي شخص آخر بجهازك أنت.

اسحب نموذجًا. أي نموذج تعليمات حالي من فئة 8B يفي بالغرض لقياس أول — فهي متقاربة الحجم بما يكفي كي يخبرك التوقيت عن العتاد لا عن النموذج:

ollama pull llama3.1:8b        # ~4.9 GB at Q4_K_M
ollama list
ollama ps                      # nothing resident yet

الآن شغّل توليدًا واحدًا مع تفعيل قياس التوقيت. الرقم المهم هو معدل التوليد — عدد الرموز المُنتَجة في الثانية، بعد قراءة الطلب:

ollama run llama3.1:8b --verbose "Reply with exactly one sentence about the Baltic Sea."
total duration:        14.2s
load duration:          3.1s
prompt eval count:        24 token(s)
prompt eval rate:      92.11 tokens/s      ← reading: fast
eval count:               38 token(s)
eval rate:              3.42 tokens/s      ← writing: the real ceiling

سطران، عالمان مختلفان. القراءة سارت بمعدل تسعين رمزًا في الثانية تقريبًا؛ والكتابة بثلاثة ونصف. هذه النسبة هي عدم التناظر الذي جاء في فصل الحساب، مقاسًا هذه المرة على عتادك أنت، وهو أكثر حقيقة مفيدة ستجمعها اليوم. وهو يقول: أعطِ هذا الخادم مُدخلات طويلة واطلب مخرجات قصيرة.

القياس نفسه عبر API، وهو ما تريده فعلاً إن كنت تنوي برمجة المقارنة بين حجمين أو ثلاثة أحجام من النماذج:

apt install -y jq

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "List three Nordic capitals.",
  "stream": false
}' | jq '{
  tokens: .eval_count,
  seconds: (.eval_duration / 1000000000),
  rate: (.eval_count / (.eval_duration / 1000000000))
}'

قِس الحجم الأصغر والحجم الأكبر، ثم توقف. اسحب نموذج 3B ونموذج 14B، شغّل الطلب نفسه على كل منهما، ودوّن المعدلات الثلاثة. أنت الآن تعرف بالضبط تكلفة هذه المقايضة على هذا الجهاز — عادة شيء قريب من مضاعفة في كل اتجاه — ويمكنك الاختيار حسب المهمة لا حسب الرأي. ثم احذف النماذج التي لن تحتفظ بها، لأن كلاً منها يشغل عدة جيجابايتات.

تحفّظ واحد عند أول تشغيل لأي نموذج: مدة التحميل في ذلك المخرج هي الوقت المستغرق في قراءة الأوزان من القرص إلى RAM. لا تُدفع هذه التكلفة إلا عندما لا يكون النموذج مقيمًا في الذاكرة أصلاً، وهذا ما يتحكم به OLLAMA_KEEP_ALIVE. لا تُدرجها عند مقارنة المعدلات، ولا داعي للقلق منها — فهي ثوانٍ معدودة على NVMe، وتحدث مرة واحدة فقط.

الخطوة 04 · الحماية

Ollama لا يملك أي مصادقة. لا شيء. ليست مصادقة ضعيفة — بل لا شيء إطلاقًا.

هذا هو جزء الدليل الذي يمنع حدوث أمر سيئ، لذا يُقال دون مواربة: API الخاصة بـ Ollama لا تملك كلمة مرور، ولا رمزًا، ولا نظام مستخدمين، ولا نظام صلاحيات. أي جهة قادرة على فتح اتصال TCP بالمنفذ 11434 يمكنها توليد نص على CPU الخاص بك، وسرد النماذج التي سحبتها، وسحب نماذج جديدة، وحذف التي تستخدمها. لا يوجد إعداد لتفعيله، لأنه لا توجد آلية لتفعيلها أصلاً.

المنفذ 11434 يُفحص باستمرار، لسبب واضح: مشغّل نماذج مفتوح هو موارد حوسبة مجانية مملوكة لشخص آخر. العرَض ليس تنبيهًا. بل جهاز يبدو بطيئًا لأسبوعين، ورسم بياني لنطاق ترددي لا يطابق أي شيء فعلته. أبقِ الخدمة على loopback، وضع أمامها ما يسأل عن هوية المتصل.

إن لم تكن أي جهة خارج هذا الجهاز بحاجة إلى النموذج، توقف هنا — لقد انتهيت فعلاً. loopback مع جدار حماية إجابة كاملة، وأي وكيل أو منظومة أتمتة أو تطبيق ويب يعمل على نفس VPS يصل إلى النموذج عبر 127.0.0.1 دون أي مما يلي. تابع فقط إن كان هناك ما على جهاز آخر يحتاج إلى استدعائه.

الوكيل، والرمز. ولّد رمزًا عشوائيًا طويلاً، ووجّه سجل A نحو الخادم، ودع Caddy يتولى الشهادة والباب معًا:

openssl rand -hex 32      # → the bearer token, store it in a password manager
apt install -y caddy

/etc/caddy/Caddyfile

llm.example.com {
    @unauthorised not header Authorization "Bearer PASTE_THE_HEX_TOKEN_HERE"
    respond @unauthorised "unauthorised" 401

    reverse_proxy 127.0.0.1:11434 {
        # Generation is slow by nature — do not let the proxy give up first.
        transport http {
            read_timeout 10m
        }
    }
}
systemctl reload caddy
ufw allow 80,443/tcp
ufw status                # 11434 must appear nowhere

هناك أناقة صغيرة في اختيار رمز حامل (bearer token) بدل المصادقة الأساسية. Ollama يعرض API متوافقة مع OpenAI، وكل عميل OpenAI يرسل مفتاحه في تلك الترويسة بالضبط، وبذا يصبح الرمز الذي ولّدته للتو مفتاح API الذي تعرف تطبيقاتك بالفعل كيفية حمله. لا شيء يحتاج ترويسة مخصصة، وتدوير الوصول سطر واحد في الـ Caddyfile ومتغير بيئة واحد لدى المستدعي.

تحقق من ذلك من جهاز غير الخادم نفسه. يجب أن يُرفض الاستدعاء الأول وأن يجيب الثاني:

curl -s -o /dev/null -w '%{http_code}\n' https://llm.example.com/api/tags
# → 401

curl -s https://llm.example.com/api/tags -H "Authorization: Bearer THE_TOKEN" | jq '.models[].name'
# → the list of models you pulled

إن كان النموذج سيُستدعى من قِبل وكلاء بدلاً منك أنت، فإن مسألة التعريض تستحق معالجة أوفى في دليل استضافة خادم MCP عن بُعد — المنطق نفسه حول TLS والرموز وما يجب أن يكون قابلاً للوصول ومن أين، مطبّقًا على خدمة تُسلّم أدوات لا رموزًا نصية.

الخطوة 05 · الاتصال

base URL واحد، وكل شيء يتحدث لغته بالفعل. أنت فقط تغيّر سلسلة نصية.

يوفّر Ollama واجهة متوافقة مع OpenAI عند /v1 إلى جانب واجهته الخاصة. وهذه هي قصة التكامل بأكملها: أي شيء بُني من أجل OpenAI — الحزم الرسمية SDK، وأغلفة الأطر، وعُقد الأتمتة — يعمل بمجرد تغيير base URL والمفتاح، ولا شيء آخر يتغير.

curl -s https://llm.example.com/v1/chat/completions \
  -H "Authorization: Bearer THE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1:8b",
    "messages": [{"role":"user","content":"Reply with the word OK."}]
  }' | jq -r '.choices[0].message.content'

من Python، السطران الوحيدان المختلفان عن إعداد مستضاف هما السطران في الأعلى:

from openai import OpenAI

client = OpenAI(
    base_url="https://llm.example.com/v1",
    api_key="THE_TOKEN",
)

r = client.chat.completions.create(
    model="llama3.1:8b",
    messages=[{"role": "user", "content": "Classify: 'the invoice is overdue'"}],
)
print(r.choices[0].message.content)

اطلب JSON، واحصل على JSON. الميزة الأكثر فائدة للأتمتة هي المخرجات المقيدة. يستطيع Ollama إجبار الإجابة على أن تكون JSON صالحًا بدل الأمل في أن يتصرف النموذج بشكل جيد، وهذا يحوّل نموذجًا صغيرًا من راوٍ غير موثوق إلى محلّل يُعتمد عليه — وهو الفرق بين سير عمل يعمل بلا إشراف وآخر ينكسر كل أربعين عنصرًا:

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "Extract the total and the currency: Invoice 4021, 1 249,90 EUR due 30 days.",
  "format": "json",
  "stream": false
}' | jq -r .response
# → {"total": 1249.90, "currency": "EUR"}

في منظومة الأتمتة ينطبق الأمر نفسه: يوفّر n8n عقدة Ollama مخصصة، وعقدته الخاصة بـ OpenAI تقبل base URL مخصصًا، بحيث ينتقل سير عمل قائم إلى الاستدلال المحلي بتعديل بيانات اعتماد واحدة. يغطي دليل استضافة n8n ذاتيًا محرك الأتمتة نفسه؛ شغّل الاثنين على خادمين منفصلين إن أمكن، لأن محركًا يستهلك 700 MB وهو خامل ونموذجًا يريد خمسة جيجابايتات جيران غير سعيدين على جهاز بثمانية جيجابايتات.

ونقطة نهاية التضمينات، وهي حيث يثبت هذا الخادم جدواه. نماذج التضمين أصغر من نماذج التوليد بمرتبتين من حيث الحجم، وتنفّذ تمريرة واحدة لكل مقطع دون أي شيء تولّده، لذا يتعامل معها CPU بمعدل يكاد يكون فوريًا:

ollama pull nomic-embed-text      # ~275 MB

curl -s http://127.0.0.1:11434/api/embed -d '{
  "model": "nomic-embed-text",
  "input": ["the first chunk of a document", "the second chunk"]
}' | jq '.embeddings | length'
الخطوة 06 · قيّده

مشغّل نماذج بلا قيود سيستهلك كل ما تملكه. ضع له حدودًا.

قيّد السياق. طول السياق هو المقياس الرئيسي لاستهلاك الذاكرة، والقيمة الافتراضية أكرم مما يحتاجه خادم صغير. اضبطه عالميًا على ما يحتاجه فعلاً أطول طلب واقعي لديك — معظم أعمال التصنيف والاستخراج مريحة ضمن أربعة آلاف رمز — وارفعه لكل طلب في الحالات النادرة التي تحتاج أكثر من ذلك:

Environment="OLLAMA_CONTEXT_LENGTH=4096"
curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "llama3.1:8b",
  "prompt": "…a long document…",
  "options": { "num_ctx": 16384 },
  "stream": false
}'

قرّر إلى متى يبقى النموذج في الذاكرة. النموذج المقيم في الذاكرة فوري الاستدعاء لكنه يحتجز عدة جيجابايتات رهينة. على جهاز مخصص للاستدلال، أبقِه محمّلاً إلى الأبد؛ وعلى جهاز مشترك، دعه يتلاشى بعد فترة. هذه القيمة تُضبط أيضًا لكل طلب، بحيث يمكن لدفعة ليلية تثبيت النموذج طوال تشغيلها ثم تحريره في النهاية:

OLLAMA_KEEP_ALIVE=-1     # resident until the service restarts
OLLAMA_KEEP_ALIVE=30m    # a sensible default on a shared box
OLLAMA_KEEP_ALIVE=0      # unload immediately after each request

ollama ps                # what is resident right now, and how much it holds

سلسِل قائمة الانتظار. طلبان متزامنان على نموذج واحد لا يسيران بضعف السرعة؛ بل يتنافسان على مسار الذاكرة المشبع نفسه ويصبح كل منهما أبطأ، وإن قرر Ollama تحميل نسخة ثانية لخدمتهما نفد RAM من الخادم. على هذه الفئة من العتاد، طلب واحد في كل مرة مع قائمة انتظار أمامه هو الإعداد الأسرع والآمن الوحيد في آن واحد — ولهذا ثُبّت OLLAMA_NUM_PARALLEL وOLLAMA_MAX_LOADED_MODELS على واحد في الخطوة 02 سابقًا.

راقب القرص. مقارنة أربعة نماذج تترك أربعة نماذج خلفها، وبخمسة جيجابايتات لكل منها فإن القرص يمتلئ بصمت دون أن يشتكي شيء. اجعل التنظيف جزءًا من عملية المقارنة نفسها لا مهمة لاحقة:

ollama list
du -sh /var/lib/ollama/models
ollama rm mistral:7b qwen2.5:14b

أخيرًا، انسخ احتياطيًا ما لا يمكن إعادة إنتاجه. أوزان النموذج ليست منها — فسحب واحد يُعيدها. ما يستحق مستودعًا هو الإعداد، وملف Caddyfile، والرمز، والطلبات التي هذّبتها على مدى ثلاثة أسابيع، وإن بنيت واحدًا، الفهرس المتجهي وراء استرجاعك. يغطي دليل النسخ الاحتياطي المشفر الجوانب التقنية؛ وقائمة ما يجب تضمينه لهذا الخادم قصيرة وتستحق أن تُكتب.

الجزء الجيد · الاسترجاع

حيث يفوز CPU بالحجة. التضمينات ليست بطيئة.

كل ما سبق كان عن التوليد، وهو الجزء الذي يؤديه CPU ببطء. الاسترجاع هو النصف الآخر لمعظم الأنظمة المفيدة، وهو يقلب الصورة تمامًا — ولهذا يمكن لأرخص فئة في هذه الصفحة أن تقدّم قيمة حقيقية حتى لو لم تولّد رمزًا واحدًا عليها.

نموذج التضمين يحوّل مقطعًا من النص إلى متجه. يُقاس بمئات الميغابايتات لا بالجيجابايتات، وينفّذ تمريرة أمامية واحدة فقط لكل مقطع، فلا توجد حلقة رمزًا-برمز تتقيد بالنطاق الترددي للذاكرة. على نفس الخادم الذي يكتب فيه نموذج 8B ثلاث كلمات في الثانية، يعالج نموذج التضمين مكتبة مستندات كاملة بمعدل يشبه نسخ الملفات.

شكل الأمر. قسّم مستنداتك إلى مقاطع من بضع مئات من الكلمات. ولّد تضمينًا لكل مقطع مرة واحدة واحفظ المتجه. عند طرح السؤال، ولّد تضمينًا للسؤال، واعثر على أقرب المقاطع إليه، وسلّمها إلى النموذج مع السؤال. التخزين لا يحتاج إلى شيء غريب: قاعدة بيانات SQLite بامتداد متجهي كافية لعشرات الآلاف من المقاطع على VPS واحد، وPostgreSQL مع pgvector يغطيك جيدًا بعد ذلك. قاعدة بيانات متجهية مخصصة أمر جيد أن تطمح إليه لاحقًا، لكنها تبعية غير ضرورية في اليوم الأول.

لماذا يهم هذا أكثر من السرعة. انظر إلى ما يلمسه كل نصف. خطوة التوليد ترى سؤالاً واحدًا وبضع فقرات. أما خطوة التضمين فترى <em>كل مستند تملكه</em> — الأرشيف بأكمله، كل عقد، كل ملاحظة، كل رسالة، تمر عبر النموذج مقطعًا مقطعًا. إن عملت هذه الخطوة على نقطة نهاية مستضافة، فإن مجموعة مستنداتك بأكملها نُقلت إلى طرف ثالث لفهرستها. وإن عملت على جهازك الخاص، فلم يتحرك أي شيء منها.

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

جاران على هذا الموقع يجسّدان هذا النمط. SearXNG المستضاف ذاتيًا يمنح طبقة الاسترجاع واجهة أمامية خاصة للويب المفتوح بدل مجموعة مستندات؛ ومخزن مستندات مستضاف ذاتيًا يمنحها مجموعة المستندات. كلاهما، إضافة إلى النموذج، يتّسعان على فئات تكلف شهريًا أقل من مقعد واحد مستضاف سحابيًا.

الطبقة الواقعة تحت النموذج

الطلبات هي الجزء الحساس. ليست الإجابات — بل الأسئلة.

يفكر الناس في خصوصية النموذج وكأن الخطر يكمن في المخرج. لكنه ليس كذلك. المخرج نص عام؛ حصل ألف شخص آخر على ما يشبهه. العنصر الكاشف هو المُدخل — وسنة كاملة من المُدخلات صورة شبه كاملة لمؤسسة بأكملها.

فكّر فيما يحتويه سجل الطلبات فعليًا. العقد الذي لصقته لتلخيصه. بريد العميل الذي طلبت تصنيفه، وفيه بيانات العميل. الرسالة الطبية، والراتب، وخطاب الاستقالة الذي كنت تصيغه، والشيفرة المأخوذة من مستودع غير عام. ثم البيانات الوصفية المحيطة بكل ذلك: أي أسئلة، بأي ترتيب، في أي ساعة، من أي عنوان، وعبر كم شهرًا. لا أحد يوقّع مستندًا يقول «هذه استراتيجيتنا» — لكن تسلسل الأسئلة هو ذلك المستند بعينه، مُجمّعًا بصدق، منك، طلبًا واحدًا في كل مرة.

الطبقة الأولى — ما تحتفظ به نقطة النهاية. مزوّدو الخدمة الجادّون ينشرون سياسات جادة، والجيدون منهم لا يدرّبون فعلاً على حركة API التجارية. لكن هذا ليس نفس وعد عدم الاحتفاظ بها. تُخزَّن الطلبات عادة لفترة معينة لمراقبة إساءة الاستخدام، ويمكن للموظفين الوصول إليها ضمن شروط محددة، ويمكن تقديمها بموجب إجراء قانوني — وهذه بالضبط الطريقة الصحيحة لتشغيل منصة كبيرة، والمكان الخاطئ تمامًا لنص لن ترسله بالبريد الإلكتروني لغريب. النموذج على جهازك الخاص لا يملك سجلاً كهذا ما لم تكتبه أنت.

الطبقة الثانية — الهوية التي يُربط بها السجل. الاحتفاظ بالبيانات وحده نصف التعريض فقط. النصف الآخر هو المفتاح الذي يُربط به: حساب، اسم شركة، عنوان فوترة، بطاقة. هذا الربط هو ما يحوّل «شخص ما سأل عن الاستحواذ على منافس» إلى «هذه الشركة سألت، في ذلك الثلاثاء». حذف النموذج من المعادلة يزيل الاحتفاظ بالبيانات؛ وحذف الهوية من الجهاز يزيل الربط. VPS يُفتح بلا بريد إلكتروني وبلا وثيقة هوية، ضمن ولاية قضائية نوردية، ومسوّى بـ Monero، هو النصف الثاني من الخطوة نفسها.

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

لا شيء من هذا يجعل النموذج المحلي ضمانة خصوصية بحد ذاته. بل يجعله المعمارية الوحيدة التي تكون فيها الضمانة بيدك أنت لتمنحها: النص يبقى على عتاد تستأجره، تحت ولاية قضائية اخترتها، خلف رمز أصدرته أنت، ولا يخضع لأي جهة أخرى.

ملاحظات ميدانية · ست فخاخ

ست طرق تخيّب بها هذه التجربة أمل الناس. خمس منها يمكن تفاديها.

الفخ 01 · الذاكرة

الخادم تجمّد بدل أن يتباطأ

النموذج مع ذاكرة السياق المؤقتة تجاوز RAM، وبدأت النواة بترحيل الأوزان مع كل رمز. اتّسع في الذاكرة أو انزل حجمًا — لا إعداد وسطًا هنا.

الفخ 02 · التعريض

شخص آخر كان يستخدم CPU الخاص بك

تم ضبط OLLAMA_HOST على 0.0.0.0 لتشغيل عميل ما. الـ API لا تملك أي مصادقة على الإطلاق، والمنفذ 11434 يُفحص. loopback مع وكيل يتحقق من رمز.

الفخ 03 · التوقع

إنه يعمل، ويكتب كجهاز فاكس

اختير نموذج 32B لمساعد تفاعلي. طابِق الحجم مع طبيعة التفاعل: التفاعل يريد نموذجًا صغيرًا، والجودة تريد عملاً غير متزامن.

الفخ 04 · السياق

الطلب الأول كان جيدًا، والعاشر زحف

المحادثة المتنامية تُنمّي ذاكرة التخزين المؤقت، ويُعاد قراءة السجل بأكمله في كل جولة. قيّد السياق، وابدأ محادثة جديدة بدل الإضافة إليها إلى ما لا نهاية.

الفخ 05 · الإقامة في الذاكرة

خمسة جيجابايتات اختفت ولا شيء يعمل

النموذج يبقى مقيمًا في الذاكرة بعد آخر استدعاء بحكم التصميم. اضبط OLLAMA_KEEP_ALIVE بما يناسب الخادم، واقرأ ollama ps قبل أن تلوم أي شيء آخر.

الفخ 06 · القرص

القرص امتلأ بنماذج قارنتها مرة واحدة فقط

أربعة نماذج مرشحة بخمسة جيجابايتات لكل منها، لم يُحذف أي منها. اجعل ollama rm جزءًا من عملية المقارنة، وتفقّد مجلد النماذج عند إطلاق تنبيهات القرص.

الأسئلة الشائعة · النماذج المحلية

أسئلة، أجوبة.

عشرة أسئلة تحدد ما إذا كان نموذج يعمل على CPU فقط هو الأداة المناسبة للمهمة التي تفكر فيها.

هل يمكن فعلاً تشغيل LLM بدون GPU؟

نعم، مع تحفّظ واحد صادق حول السرعة. النموذج المكمّم يعمل جيدًا تمامًا على وحدات CPU العادية للخوادم — الأوزان تجلس في RAM، والحساب في متناول اليد تمامًا، ولا شيء في العملية يحتاج بطاقة رسومات. ما تشتريه GPU هو النطاق الترددي للذاكرة، والنطاق الترددي هو ما يحدد سرعة التوليد. لذا سيجيب خادم يعمل بـ CPU فقط، بشكل صحيح وكامل، بمعدل يتراوح بين بضع كلمات وبضع عشرات من الكلمات في الثانية حسب النموذج. هذا بطيء لنافذة محادثة وجيد تمامًا للعمل الذي يؤتمته معظم الناس فعليًا: تصنيف رسالة، واستخراج JSON منظّم من مستند، وتلخيص صفحة، وتوليد تضمين لنص من أجل البحث، وإعادة صياغة فقرة. السؤال ليس أبدًا «هل يستطيع» — بل «بأي معدل، وهل يهم هذا المعدل لهذه المهمة».

كم رمزًا في الثانية يجب أن أتوقع؟

قم بالحساب بدل الوثوق بأي اختبار مرجعي، بما في ذلك اختبارنا نحن. النموذج الكثيف يقرأ كل وزن من أوزانه من الذاكرة لإنتاج رمز واحد، لذا فإن السقف هو تقريبًا النطاق الترددي للذاكرة مقسومًا على حجم النموذج. نموذج 3B مكمّم إلى نحو 2 GB، على جهاز بنطاق ترددي فعلي 20 GB/s، له سقف قريب من 10 رموز في الثانية؛ ونموذج 7B بحجم 4.4 GB قريب من 4.5؛ ونموذج 32B بحجم 20 GB أقل من 1. الأرقام الفعلية تقع دون السقف — قل إنها 50 إلى 70 بالمئة — وتتفاوت بحسب الخادم والجيران وعدد الخيوط. أما معالجة الطلب فمسألة مختلفة تمامًا: فهي مقيّدة بالحوسبة، وتعمل بسرعة أكبر بمرات عديدة، ولهذا فإن تلخيص مستند طويل مريح بينما محادثة نموذج كبير ليست كذلك.

أي نموذج أبدأ به مع 8 GB من الذاكرة؟

نموذج تعليمات من فئة 8B بصيغة Q4_K_M، يشغل نحو 4.5 إلى 5 GB ويترك مجالاً لنظام التشغيل ولذاكرة السياق المؤقتة. هذا الحجم هو النقطة المثلى حاليًا: كافٍ لاتباع التعليمات بموثوقية، وإنتاج JSON صالح عند الطلب، والتلخيص والتصنيف وإعادة الصياغة؛ وصغير بما يكفي ليبقى سريع الاستجابة. أقل منه، نموذج 3B مفيد فعلاً للتصنيف والوسم والتوجيه وأسرع بمقدار الضعف تقريبًا. أعلى منه، نموذج 14B أفضل ملحوظًا في الاستدلال متعدد الخطوات وبنصف السرعة تقريبًا، وهي مقايضة عادلة للعمل الدفعي وسيئة لأي شيء تفاعلي. ابدأ بـ 8B، قِس، ثم تحرّك في الاتجاه الذي يشير إليه القياس.

كم من RAM يحتاج النموذج فعليًا؟

حجم الملف المكمّم، زائدًا ذاكرة السياق المؤقتة، زائدًا مساحة للنظام — والمجموع يجب أن يتّسع، لأن نمط الفشل هنا ليس البطء بل الانهيار. عندما لا يتّسع النموذج، تبدأ النواة بمبادلة أوزان النموذج مع القرص، ويتحول توليد يفترض أن يستغرق أربع ثوانٍ إلى أربع دقائق بينما يتسلق متوسط الحِمل إلى العشرات. كقاعدة عملية عند Q4_K_M: نموذج 3B نحو 2 GB، و8B نحو 5 GB، و14B نحو 9 GB، و32B نحو 20 GB، و70B نحو 40 GB. أضف جيجابايتين لـ Debian وخدماته، ومن واحد إلى أربعة أخرى لذاكرة التخزين المؤقت (KV) بحسب طول السياق الذي تسمح به. ثم اشترِ الفئة الأعلى من الإجابة، لا الفئة التي تطابقها تمامًا.

Ollama أم llama.cpp؟

Ollama هو llama.cpp فعليًا، مع سجل نماذج وREST API وخدمة systemd ملفوفة حوله. استخدم Ollama ما لم يكن لديك سبب محدد لعدم ذلك: أمر تثبيت واحد، وollama pull بدل البحث عن ملفات GGUF، ونقطة نهاية متوافقة مع OpenAI، وإعدادات افتراضية معقولة لعدد الخيوط والذاكرة. الجأ إلى llama.cpp مباشرة عندما تريد خيارًا لا يوفره Ollama، أو عندما تريد تثبيت إصدار محدد بدقة لضمان قابلية إعادة الإنتاج، أو عندما تشغّل نموذجًا واحدًا بإعداد واحد إلى الأبد وتفضّل عدم وجود خدمة خلفية تدير أي شيء. كلاهما يشغّل الأوزان نفسها بالسرعة نفسها؛ والفرق كله في الجوانب التشغيلية.

هل النموذج المستضاف ذاتيًا جيد بقدر النماذج الكبيرة المستضافة سحابيًا؟

لا، والتظاهر بعكس ذلك يهدر عصرك. النموذج الطليعي خلف API أكبر من أي شيء يتّسع على جهاز افتراضي، وسيكون أفضل في الاستدلال الصعب والسياق الطويل والشيفرة. ما ينافس فيه النموذج المحلي الصغير فعلاً هو الوسط الهائل من العمل الحقيقي: تحديد أي فئة من ست ينتمي إليها بريد إلكتروني، واستخراج خمسة حقول من فاتورة، وتلخيص محادثة دعم، وإعادة صياغة وصف، ووسم مستند، والحكم على ما إذا كان سجلان يصفان الشخص نفسه. في هذه الفئة من المهام تكون الفجوة بين 8B ونموذج طليعي صغيرة، بينما فرق التكلفة كامل وفرق الخصوصية مطلق. الموقف المُجدي ليس «استبدل API» بل «توقف عن إرسال التسعين بالمئة التي لم تكن بحاجة إلى المغادرة أصلاً».

هل يملك Ollama نظام مصادقة؟

لا — لا شيء على الإطلاق، وهذه أهم حقيقة تشغيلية في هذا الدليل. لا توجد كلمة مرور، ولا رمز، ولا نظام مستخدمين. أي جهة قادرة على فتح اتصال TCP بالمنفذ 11434 يمكنها توليد نص، وسرد نماذجك، وسحب نماذج جديدة، وحذف الموجودة. هذا المنفذ يُفحص بانتظام، والنسخ غير المحمية تُكتشف ويستخدمها غرباء كموارد حوسبة مجانية، وهو ما يظهر أولاً كمتوسط حِمل غامض ثم لاحقًا كفاتورة نطاق ترددي. أبقِ Ollama مرتبطًا بـ 127.0.0.1، وضع وكيلاً عكسيًا أمامه، وأنهِ TLS هناك، واطلب رمز حامل أو شهادة عميل عند الوكيل. إن لم تكن أي جهة خارج الجهاز بحاجة إلى النموذج، فلا تعرّضه على الإطلاق.

هل يمكن لـ n8n أو بيئة تشغيل وكلائي استخدام نموذج محلي؟

نعم، وعادة لا يتطلب سوى حقل واحد. يوفّر Ollama واجهة API متوافقة مع OpenAI عند /v1، لذا أي عميل يتيح لك ضبط base URL — حزم OpenAI SDK، وLangChain، وعقدة n8n لـ OpenAI، ومعظم أطر الوكلاء — سيتحدث معه بالإشارة إلى https://your-host/v1 وإرسال أي سلسلة نصية غير فارغة كمفتاح. كما يوفّر n8n عقدة Ollama مخصصة. النمط الذي ينجح عمليًا هو نمط هجين: وجّه الطلبات الكثيرة والروتينية إلى النموذج المحلي، واحتفظ بالـ API المستضافة للقلة من الخطوات التي تحتاج فعلاً استدلالاً طليعيًا، مع بديل احتياطي إن رفض النموذج المحلي إنتاج JSON صالح.

هل تستحق التضمينات على CPU العناء؟

إنها الأفضل قيمةً مقابل الثمن في هذه الصفحة بأكملها. نماذج التضمين صغيرة جدًا — عشرات إلى مئات الميغابايتات لا جيجابايتات — وتنفّذ تمريرة أمامية واحدة لكل مقطع دون توليد رمزًا-برمز، لذا يلتهمها CPU بسرور. هذا يعني أن نصف الاسترجاع بأكمله من نظام RAG — فهرسة مستنداتك، وتوليد تضمين للاستعلام، وإيجاد أقرب المقاطع — يعمل بارتياح على أرخص فئة، وهو أيضًا النصف الذي يلامس كل مستند تملكه. حتى لو قررت أن تبقى خطوة التوليد على API مستضافة، فإن نقل خطوة التضمين إلى جهازك الخاص يبقي مجموعة مستنداتك بعيدة عن جهاز غيرك.

لماذا أستضيف النموذج ذاتيًا أصلاً إذا كانت API أسرع وأرخص؟

ثلاثة أسباب، بترتيب تصاعدي بحسب أهميتها. للتكلفة شكل: الـ API أرخص إلى أن تتوقف عن ذلك، وسير عمل يصنّف خمسين ألف رسالة شهريًا له فاتورة تنمو بينما VPS بسعر $7.90 لا تنمو. التوفر: لا حد لمعدل الطلبات، ولا إيقاف لنموذج بنيت حوله عملك، ولا انقطاع على صفحة حالة تابعة لغيرك. أما السبب الحاسم — طلباتك هي أكثر نص كاشف تنتجه. ليست الإجابات، بل الأسئلة. ما سألته، وعمّن، وفي أي يوم، وبأي ترتيب. نقطة نهاية مستضافة ترى كل ذلك، مربوطًا بهوية فوترة. أما نموذج يعمل على جهاز استأجرته بلا وثيقة هوية، ضمن ولاية قضائية نوردية، مدفوع بـ Monero، فيرى النص نفسه ولا يبلّغ به أحدًا.

احصل على الخادم

VPS نوردي لنموذج لا يجيب إلا لك وحدك. بدون KYC، مدفوع بالعملات المشفرة.

Garrison (4 vCPU، 8 GB، 240 GB NVMe، $7.90/mo) يشغّل نموذج 8B مع مساحة لذاكرة السياق المؤقتة والنظام — الفئة التي يجب أن يبدأ بها معظم الناس. Ravelin يضاعف الذاكرة من أجل 14B والسياقات الطويلة. بلا بريد إلكتروني عند التسجيل، وبلا وثيقة هوية، وبلا فاتورة لكل رمز.

آخر مراجعة · 2026-08-24 · المصادر · توثيق Ollama ومرجع API الخاص به، وتوثيق llama.cpp، وتوثيق الوكيل العكسي Caddy، وبطاقات النماذج المنشورة للإصدارات المكممة المُشار إليها · الدورية · سنوياً