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

نقاط رئيسية
- قيّم نموذج البرمجة على مهامك الخاصة: إصدار بايثون، المكتبات، حجم المستودع وكيفية تعامله مع الاختبارات.
- تحدد ذاكرة وحدة معالجة الرسومات الحد الأقصى للنماذج المحلية. بدقة 4-bit، تحتاج الأوزان إلى نصف بايت تقريباً لكل معلمة، بالإضافة إلى مساحة للسياق.
- هذا الموقع واجهة برمجة API مستضافة، وليس بيئة تشغيل محلية. لديه نافذة سياق بحجم 100,000 رمز وتكلفته $0.15 و$0.50 لكل مليون رمز.
- مجموعة اختبارات صغيرة ومفتاح تجربة سيخبرك بالمزيد من أي لوحة متصدرين.
ابدأ بقيودك، وليس باسم النموذج
السؤال أفضل نموذج ذكاء اصطناعي محلي لبرمجة Python ليس له إجابة ثابتة، لأن النماذج تتغير بسرعة، وجهازك هو الحد الفعلي. قبل مقارنة الأسماء، دوّن أربعة أشياء:
- ذاكرة وحدة معالجة الرسومات. هذا يحدد أحجام النماذج التي يمكنك تشغيلها أصلاً.
- احتياجات نافذة السياق. تعديل دالة واحدة يختلف عن التفكير في حزمة برمجية كاملة.
- قواعد الخصوصية. بعض الأكواد لا يمكن أن تخرج من جهازك، وهو سبب مشروع للبقاء محلياً.
- تسامح الرفض. أدوات الأمان، وأدوات كشط الويب (scrapers)، والهندسة العكسية، وأدوات الفحص العشوائي يمكن أن تحفز الرفض في النماذج ذات التصفية الكثيفة.
إذا كان التشغيل الكامل دون اتصال بشبكة شرطاً صارماً، فأنت بحاجة إلى نموذج تشغله بنفسك. إذا لم يكن كذلك، فإن واجهة برمجة التطبيقات المستضافة تزيل مسألة العتاد. ينتمي هذا الموقع إلى المجموعة الثانية: إنه واجهة برمجة تطبيقات مستضافة ومتوافقة مع OpenAI، وليس بيئة تشغيل محلية، ومن الجدير اختبارها بجانب إعدادك المحلي.
كمية ذاكرة وحدة معالجة الرسومات التي تحتاجها
قاعدة تقريبية للأوزان: عدد المعاملات مضروباً في عدد البايتات لكل معامل. عند الدقة 16-bit، تكون 2 بايت لكل معامل؛ عند 8-bit، بايت واحد؛ عند 4-bit، حوالي 0.5 بايت.
| حجم النموذج | 16-bit | 8-bit | 4-bit |
|---|---|---|---|
| 7B | 14 GB | 7 GB | 3.5 GB |
| 14B | 28 GB | 14 GB | 7 GB |
| 32B | 64 GB | 32 GB | 16 GB |
هذه الأرقام تمثل الأوزان فقط. تحتاج أيضاً إلى ذاكرة للتخزين المؤقت للسياق، والتي تتزايد مع طول الموجّه، ولبيئة التشغيل نفسها. اترك هامشاً من عدة غيغابايت، وأكثر إذا كنت تخطط للصق ملفات كبيرة. يقلل التكميم الأثقل من الذاكرة المطلوبة لكنه قد يكلفك بعض الدقة، وهو أمر مهم في البرمجة حيث يمكن أن يؤدي حرف خاطئ واحد إلى تعطيل البرنامج.
كيفية مقارنة نماذج البرمجة بعدالة
تقيس لوحات المتصدرين العامة مهام الآخرين. طريقة أفضل تستغرق ساعةً واحدةً وتستخدم شيفرتك الخاصة.
- اجمع 15 إلى 20 مهمة حقيقية: خطأ مع اختبار فاشل، دالة يجب كتابتها بناءً على تعليق التوثيق، إعادة هيكلة، طلب لإضافة تلميحات الأنواع.
- شغّل كل نموذج بنفس الموجّه، ونفس درجة الحرارة (0.2 بداية معقولة للكود)، ونفس البذرة حيثما كان ذلك مدعوماً.
- قيّم النتيجة بتشغيل الاختبارات، لا بقراءة الإجابة. هل استوردت وحدات حقيقية؟ هل نجحت؟
- سجّل حالات الرفض بشكل منفصل. نموذج أفضل بنسبة 5% في البرمجة لكنه يرفض مهمة ماسح المنافذ لديك يكون أسوأ بالنسبة لك.
- سجّل الوقت لكل مهمة والتكلفة لكل مهمة بالنسبة للنماذج المستضافة.
احتفظ بإطار العمل في ملف لتتمكن من إعادة تشغيله عند ظهور نموذج جديد. إعادة الاستخدام هذه أكثر قيمةً من أي نتيجة فردية.
اختبار خيار مستضاف على نفس المهام
نظراً لأن واجهة برمجة التطبيقات متوافقة مع OpenAI، يحتاج إطار العمل الخاص بك فقط إلى تغيير في عنوان URL الأساسي. يطلب هذا النص البرمجي دالةً، ويستخرج كتلة Python الأولى ويشغلها مقابل اختبار. معرف النموذج هو uncensored.
import re
import subprocess
import tempfile
from openai import OpenAI
client = OpenAI(base_url="https://api.uncensoredlocalllm.com/v1", api_key="YOUR_API_KEY")
TASK = "Write a Python function parse_size(text) that converts '10KB' or '2 MB' to bytes."
TEST = "assert parse_size('10KB') == 10240\nassert parse_size('2 MB') == 2 * 1024 * 1024\nprint('ok')"
r = client.chat.completions.create(
model="uncensored",
temperature=0.2,
seed=7,
messages=[
{"role": "system", "content": "You write correct Python 3. Reply with one fenced code block and no commentary."},
{"role": "user", "content": TASK},
],
)
text = r.choices[0].message.content
m = re.search(r"```(?:python)?\n(.*?)```", text, re.S)
code = m.group(1) if m else text
with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as f:
f.write(code + "\n" + TEST)
out = subprocess.run(["python3", f.name], capture_output=True, text=True, timeout=20)
print(out.stdout.strip() or out.stderr.strip())
شغّل قائمة المهام نفسها ضد النموذج المحلي وقارن معدلات النجاح. ينفّذ الكود المخرجات المولّدة، لذا استخدم مجلداً مؤقتاً أو حاويةً لأي شيء يتجاوز الأمثلة البسيطة.
أين يساعد النموذج المستضاف مطور Python
نقطة النهاية المستضافة ليست أفضل في كل الحالات، لكن بعض المهام تناسبها جيداً:
- سياق كبير. نافذة السياق تتسع لـ 100,000 رمز، تشمل الموجّه والإكمال. يتسع ذلك لوحدة برمجية كبيرة، واختباراتها، وتتبع المكدس في طلب واحد.
- استدعاء الدوال. يمكنك تعريف أدوات مثل
run_testsأوread_fileوالسماح للنموذج باستدعائها في حلقة، مع إرسال النتائج كرسائلrole: "tool". - وضع JSON. مع
response_format: {"type":"json_object"}يمكنك الحصول على مراجعة شيفرة منظمة، مثل قائمة بالمشكلات مع أرقام الأسطر. - رفض أقل في أعمال الأمان. النموذج مضبوط للإجابة دون رفض للمحتوى للاستخدام القانوني للبالغين، والذي يشمل اختبار أمان الأنظمة التي تمتلكها أو لديك صلاحية اختبارها.
المفاضلة واضحة: يغادر الكود جهازك، وتحتاج إلى اتصال بالشبكة. لا تُستخدم الموجّهات في التدريب، ولكن إذا كانت سياستك تمنع إرسال الكود إلى أي طرف ثالث، فاستخدم النموذج محلياً.
السماح للنموذج بتشغيل اختباراتك باستخدام استدعاء الدوال
يحوّل استدعاء الدوال الإجابة الأحادية إلى حلقة: النموذج يطلب تشغيل الاختبارات، يرى الفشل ويصحح الكود. عرّف أداة واحدة وتعامل مع الاستدعاء بنفسك.
import json
import subprocess
from openai import OpenAI
client = OpenAI(base_url="https://api.uncensoredlocalllm.com/v1", api_key="YOUR_API_KEY")
tools = [{
"type": "function",
"function": {
"name": "run_tests",
"description": "Run pytest in the project and return the output",
"parameters": {"type": "object", "properties": {}, "required": []},
},
}]
messages = [
{"role": "system", "content": "You fix Python bugs. Call run_tests to check your work."},
{"role": "user", "content": "The tests in this project fail. Run them and tell me the first error."},
]
for _ in range(5):
r = client.chat.completions.create(model="uncensored", messages=messages, tools=tools, temperature=0.2)
msg = r.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for call in msg.tool_calls:
out = subprocess.run(["pytest", "-x", "-q"], capture_output=True, text=True)
messages.append({"role": "tool", "tool_call_id": call.id, "content": (out.stdout + out.stderr)[-4000:]})
الحلقة محدودة بخمس جولات حتى لا يستمر النموذج المربك في التشغيل إلى الأبد. اجعل مخرجات الأداة قصيرة، لأن كل ما تعيده يُحسب كمدخل في الجولة التالية. اقتطعه إلى آخر 4,000 حرف لتجعل كل خطوة رخيصة.
تكلفة العمل البرمجي
موجّهات البرمجة كثيفة المدخلات: تلصق الكود وتحصل على إجابة أقصر. احسب طلب إعادة هيكلة يحتوي على 6,000 رمز إدخال و1,500 رمز إخراج بسعر $0.15 و$0.50 لكل مليون:
- الإدخال: 6,000 / 1,000,000 × $0.15 = $0.0009
- الإخراج: 1,500 / 1,000,000 × $0.50 = $0.00075
- المجموع: $0.00165 لكل طلب
تتكلف ألف طلب من هذا النوع $1.65. رصيد التجربة بقيمة $0.50 يغطي حوالي 303 منها، وهو كافٍ لتشغيل معيار أداء من 20 مهمة عدة مرات. قد يكون جهاز GPU المحلي أرخص لكل طلب عند الأحجام الكبيرة، لكنه يتطلب تكلفة أولية ولا ينخفض إلى الصفر عندما لا تستخدمه. تحتوي صفحة الأسعار على الجدول الكامل.
إعدادات عملية لتوليد الكود
- درجة الحرارة من 0.1 إلى 0.3. تقلل القيم المنخفضة من اختلاق واجهات API وتغيرات الأسلوب العشوائية.
- ثبّت البذرة عند مقارنة الموجّهات، حتى تأتي الفروقات من الموجّه وليس من أخذ العينات.
- اذكر إصدار Python والمكتبات في رسالة النظام: "Python 3.11، المكتبة القياسية فقط" يزيل الكثير من التخمين.
- اطلب كتابة الاختبارات مع الكود. غالباً ما يكتشف النموذج أخطاء off-by-one الخاصة به عند تشغيل الاختبارات التي يكتبها بنفسه.
- أرسل تتبع الخطأ الفاشل، وليس وصفاً له.
للتجربة، احصل على رصيد التجربة من صفحة مفتاح API، ثم اتبع دليل البدء السريع. للاستخدام على غرار الدردشة، انظر دليل دردشة LLM بدون رقابة. الخدمة مخصصة للاستخدام القانوني للبالغين، ولا تولّد محتوى جنسي يتضمن القاصرين.
أخطاء شائعة مع نماذج البرمجة
- استيرادات وأسماء دوال مخترعة. شغّل الكود. يمكن للنموذج وصف طريقة مكتبة غير موجودة، لذا فإن الاختبار هو الحكم الوحيد.
- تركيب قديم. إذا كنت بحاجة إلى ميزات حديثة مثل المطابقة الهيكلية للنمط، فاذكر إصدار Python في الموجّه.
- سياق كبير جداً. لا يعني نافذة السياق الأكبر أنك يجب أن تلصق كل شيء. أرسل الملفات المهمة، بالإضافة إلى الخطأ.
- الثقة في كود الأمان المُولّد. راجع يدوياً أي شيء يتعامل مع المصادقة أو التشفير أو تحليل المدخلات.
- تشغيل المخرجات بشكل أعمى. يمكن للكود المُولّد حذف الملفات أو إجراء مكالمات شبكية. استخدم بيئة معزولة.
المزيد من الأدلة
أسئلة وأجوبة
أي LLM محلي هو الأفضل لكود Python؟
يعتمد ذلك على ذاكرة GPU والمهام الخاصة بك، لذا اختبر نموذجين أو ثلاثة بحجم يناسب عتادك على كودك الخاص وقيّمها عن طريق تشغيل الاختبارات. لوحات المتصدرين هي نقطة بداية فقط.
هل هذا الموقع يعمل بنموذج لغوي كبير محليًا؟
لا. إنه واجهة برمجة تطبيقات (API) مستضافة ومتوافقة مع OpenAI، ومعرف النموذج هو uncensored. يناسبك إذا كنت تستطيع إرسال التعليمات البرمجية إلى خدمة عن بُعد.
كم حجم ذاكرة وحدة معالجة الرسومات (GPU) الذي أحتاجه لنموذج بحجم 14B؟
حوالي 28 جيجابايت بدقة 16-bit، و14 جيجابايت بدقة 8-bit، و7 جيجابايت بدقة 4-bit للأوزان فقط، بالإضافة إلى مساحة إضافية للذاكرة المؤقتة للسياق.
هل يمكنني استخدامه من خلال أدوات Python الحالية؟
نعم. تعمل أي مكتبة SDK أو عميل OpenAI بمجرد ضبط عنوان URL الأساسي على https://api.uncensoredlocalllm.com/v1 واستخدام مفتاحك.
كيف يمكنني تجربته مجاناً؟
احصل على رصيد التجربة بقيمة $0.50 في صفحة مفتاح API بعد التسجيل. ساري المفعول لمدة 7 أيام، ولا يتطلب بيانات الدفع ومحدود لشخص واحد فقط.
uncensoredlocalllm.com
مفتاحك على بُعد استمارة واحدة
أنشئ حساباً، وانسخ المفتاح، ثم غيّر عنوان URL الأساسي. هذه هي الإعدادات الكاملة.