نقاط رئيسية
- تحتاج التشغيلات المحلية إلى ذاكرة وصول عشوائي أو ذاكرة فيديو كافية لملف التكميم بالإضافة إلى التخزين المؤقت للسياق.
- Ollama هو أسرع بداية؛ بينما يمنحك llama.cpp مزيدًا من التحكم في التكميم والعلامات.
- كلاهما يعرض خادمًا بنمط OpenAI، لذا يمكن لنفس كود العميل أن يشير إلى المحلي أو المستضاف.
- تكلفة نقطة النهاية المستضافة هي $0.15 لكل مليون رمز مدخل و$0.50 لكل مليون رمز مخرج، وتستغرق دقائق للإعداد.
قرر أولاً: ما العتاد الذي تملكه؟
الذاكرة تحدد كل شيء. نموذج اللغة هو مجموعة كبيرة جدًا من الأرقام، ويجب أن تجلس المجموعة بأكملها في ذاكرة سريعة أثناء التوليد. يقلل التكميم من حجم هذه الأرقام. يأخذ نموذج مُكمّم بـ 4 بت حوالي نصف بايت لكل معلمة، لذا فإن نموذجًا يحتوي على 8 مليارات معلمة يستهلك حوالي 5 جيجابايت، ونموذج بـ 70 مليار معلمة يستهلك حوالي 40 جيجابايت. تعامل مع هذه الأرقام على أنها تقريبيّة، حيث يعتمد الحجم الدقيق على تنسيق التكميم.
إضافة إلى الأوزان، تحتاج إلى مساحة للتخزين المؤقت للسياق. ينمو هذا التخزين مع طول السياق، لذا فإن تاريخ لعب الأدوار الطويل أو مستند كبير يكلف ذاكرة أكثر من سؤال قصير. خطط لبضع جيجابايت إضافية عند سياقات معتدلة، والمزيد إذا كنت تدفع نحو سياقات طويلة.
- لابتوب بسعة 8 GB وبدون GPU: نماذج صغيرة فقط، وإخراج بطيء.
- ماك بتقنية Apple Silicon بسعة 16 إلى 32 GB: تعمل النماذج متوسطة الحجم جيدًا لأن وحدة المعالجة المركزية ووحدة معالجة الرسومات تشاركان الذاكرة.
- بطاقة رسومات استهلاكية واحدة بسعة ذاكرة 12 إلى 24 جيجابايت: نماذج متوسطة الحجم بسرعة جيدة.
- أي شيء أكبر: بطاقات رسومات متعددة أو خادم مستأجر.
الطريقة 1: Ollama في بضع أوامر
Ollama هو أقصر طريق. يقوم بتنزيل نموذج مُكمَّم، ويشغّل خادمًا في الخلفية ويمنحك واجهة محادثة. ثبّته من الموقع الرسمي لنظام التشغيل الخاص بك، ثم تحقق من وسوم Dolphin التي تسرد مكتبة نماذج Ollama حاليًا، لأن الأسماء والأحجام تتغير بين الإصدارات.
# replace <tag> with a Dolphin tag from the Ollama library
ollama pull <tag>
ollama run <tag>
الأمر الأول يقوم بتنزيل الملف، والذي قد يستغرق وقتًا طويلاً على اتصال بطيء. الأمر الثاني يفتح محادثة تفاعلية في الطرفية. يوفر Ollama أيضًا واجهة برمجة تطبيقات HTTP على جهازك، بما في ذلك مسار على طراز OpenAI تحت /v1، لذا يمكن للبرامج الأخرى استخدامه.
إذا كان التوليد بطيئًا جدًا، فمن المحتمل أن النموذج لم يتسع في ذاكرة الفيديو وأن جزءًا منه يعمل على وحدة المعالجة المركزية. اختر علامة أصغر أو تكميم منخفض البت.
الطريقة 2: llama.cpp للتحكم الأفضل
llama.cpp هو محرك C++ الذي بُنيت عليه العديد من الأدوات الأخرى. تقوم بتنزيل ملف GGUF للنموذج، ثم تشغل خادمه. يستغرق هذا خطوات أكثر من Ollama لكنه يتيح لك تعيين طول السياق، وعدد الطبقات الموضوعة على بطاقة الرسومات، والتكميم الذي تريده.
# after building llama.cpp and downloading a GGUF file
llama-server -m ./model.gguf -c 8192 -ngl 99 --port 8080
يحدد هنا -c طول السياق، ويحدد -ngl عدد الطبقات التي تنتقل إلى وحدة معالجة الرسومات، ويختار --port المنفذ. تحقق من ملف README الخاص بالمشروع للحصول على الخيارات في إصدارك، لأنها تتطور. يستهلك حجم أكبر لـ -c ذاكرة أكبر، لذا قم بزيادته فقط عند الحاجة.
للاستخدام الرسومي، يمكن لواجهات أمامية مثل Open WebUI التحدث مع أي من الخوادم. يوضح ملاحظتنا حول نقاط نهاية Open WebUI API كيفية إضافة نقطة نهاية مخصصة.
استدعاء خادمك المحلي من الكود
يمكن للأدوات التحدث بتنسيق محادثة OpenAI، لذا تكتب العميل مرة واحدة وتغير الهدف بإعدادين. يحتوي هذا النص البرمجي على كلا الهدفين جنبًا إلى جنب. يستخدم المحلي المنفذ الذي يستخدمه Ollama بشكل افتراضي؛ قم بتغييره إذا بدأت llama.cpp على 8080.
from openai import OpenAI
TARGETS = {
"local": {"base_url": "http://localhost:11434/v1", "key": "not-needed", "model": "your-local-tag"},
"hosted": {"base_url": "https://api.dolphinllm.com/v1", "key": "YOUR_KEY", "model": "uncensored"},
}
t = TARGETS["hosted"]
client = OpenAI(base_url=t["base_url"], api_key=t["key"])
resp = client.chat.completions.create(
model=t["model"],
messages=[{"role": "user", "content": "Summarize what a GGUF file is."}],
)
print(resp.choices[0].message.content)
عادةً ما تتجاهل الخوادم المحلية المفتاح، لكن SDK يتطلب سلسلة غير فارغة. اسم النموذج للخادم المحلي هو أي وسم أو لقب قمت بتحميله، بينما معرف النموذج المستضاف هو دائمًا uncensored.
الطريقة 3: تخطي الإعداد واستخدام نقطة نهاية مستضافة
إذا كانت حسابات الأجهزة سيئة، أو أردت نفس السلوك على كل جهاز، فإن نقطة النهاية المستضافة أبسط. توفر هذه الخدمة نموذجًا واحدًا مفتوح الأوزان، وتشغله جهة مستقلة ومضبوطة للإجابة بدون رفض المحتوى للاستخدام القانوني للبالغين. إنها ليست واجهة برمجة التطبيقات الرسمية لأي بائع نماذج، ولا تتيح لك اختيار نماذج أخرى. ما تحصل عليه هو عنوان URL ثابت، ومفتاح API، والفوترة حسب الرمز.
الخطوات قصيرة. سجّل حسابًا باستخدام Google أو عبر البريد الإلكتروني وكلمة المرور، افتح صفحة مفتاح API، واحصل على رصيد تجريبي بقيمة $0.50 بنقرة واحدة. لا يتطلب بطاقة، وهو صالح لمدة 7 أيام، ومحدود لشخص واحد. ثم قم بتشغيل النص البرمجي Python أعلاه مع الهدف المستضاف. إذا كنت تفضل curl:
curl https://api.dolphinllm.com/v1/chat/completions -H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" -d '{"model":"uncensored","messages":[{"role":"user","content":"Hello"}],"stream":false}'
تبلغ نافذة السياق 100,000 رمز (token)، وهو أكثر مما يمكن لمعظم أجهزة اللابتوب الاحتفاظ به في ذاكرة التخزين المؤقت بسهولة. لا تُستخدم الموجّهات (prompts) للتدريب.
التكلفة والجهد مقارنة
الشعور المحلي مجاني، لكنه ليس كذلك. تدفع مقابل العتاد، الكهرباء ووقتك الخاص. التكلفة المستضافة هي المال لكل طلب، لكن الأرقام صغيرة. عند $0.15 لكل مليون رمز إدخال و $0.50 لكل مليون رمز إخراج، فإن دور محادثة مع 3,000 رمز إدخال و 700 رمز إخراج يكلف:
- الإدخال: 3,000 × $0.15 / 1,000,000 = $0.00045
- الإخراج: 700 x $0.50 / 1,000,000 = $0.00035
- المجموع: $0.0008 لكل دور، لذا $0.80 لكل 1,000 دورة
حتى المستخدم الثقيل الذي يرسل 5,000 من هذه الأدوار في شهر سينفق حوالي $4. ستحتاج بطاقة GPU التي تكلف مئات الدولارات إلى سنوات من الاستخدام لتعويض التكلفة على هذا الحجم. تنقلب المقارنة عندما يكون لديك حجم مرتفع مستمر، أو تحتاج إلى ضبط دقيق معين، أو لا يمكنك إرسال البيانات خارج جهازك.
تفاصيل السعر الكاملة، بما في ذلك مكافآت شحن الرصيد بنسبة +5% و +10% و +15%، موجودة في صفحة الأسعار، ويغطي التوثيق الحدود والمعاملات.
قاعدة بسيطة للاختيار
شغل محليًا إذا كنت تريد تجربة العديد من الضبط الدقيق، العمل دون اتصال، أو الاحتفاظ بكل الموجّه (prompt) على قرصك الخاص. استخدم نقطة النهاية المستضافة إذا كنت تبني شيئًا سيستخدمه آخرون، أو كان عتادك متواضعًا، أو تريد نافذة سياق طويلة بـ 100,000 رمز دون إدارة الذاكرة. يقوم العديد من المطورين بكلاهما: نموذج محلي للتجريب الخاص، ونقطة نهاية مستضافة لأي شيء يحتاج إلى البقاء قيد التشغيل. لأن كود العميل هو نفسه، فإن التبديل يكلف سطرًا واحدًا.

