Code AI

دليل إكمال الأكواد بتقنية Fill-in-the-Middle (FIM): البنية المعمارية والاختبارات

الإجابة السريعة: في عام 2026، تتيح تقنية Fill-in-the-Middle (FIM) إكمال الأكواد البرمجية في بيئات التطوير (IDE) في الوقت الفعلي عبر تنسيق المطالبات باستخدام رموز البادئة واللاحقة والوسط (مثل <|fim_prefix|> و<|fim_suffix|> و<|fim_middle|>). في معالجة الاستدلال في أقل من 100 مللي ثانية، يتصدر Qwen 2.5 Coder 1.5B دقة السطر الواحد (84.6%) مع زمن استجابة 42 مللي ثانية، بينما يهيمن Qwen 2.5 Coder 7B على ملء الكتل البرمجية المتعددة الأسطر (76.8%).


1. المقدمة: متطلبات السرعة والدقة في الإكمال التلقائي الفوري (Ghost Text)

يعد ai code completion (إكمال الأكواد البرمجية بالذكاء الاصطناعي) وai autocomplete الفوري من أكثر أعباء العمل حساسية لزمن الاستجابة في الذكاء الاصطناعي التطبيقي. بينما يمكن للوكلاء البرمجيين القائمين على الدردشة (مثل Claude Code وAider وOpenCode) استغراق من 1.5 إلى 5.0 ثوانٍ للتفكير والتخطيط، فإن الاقتراحات المضمنة داخل المحرر البرمجي ("النص الشبحي" أو Ghost Text) يجب أن تظهر في أقل من 100 مللي ثانية لتجنب تشتيت تركيز المطور.

+-----------------------------------------------------------------------------------------------+
|                       ميزانية زمن الاستجابة للإكمال التلقائي في محرر الأكواد                  |
+-----------------------------------------------------------------------------------------------+
| تأخير الضغطات (Debounce)  : 30ms - 50ms                                                       |
| تجميع سياق الكود         : 10ms - 15ms  (تحليل Tree-sitter وتقليص البادئة واللاحقة)           |
| النقل الشبكي / IPC       : 5ms  - 20ms  (خادم vLLM محلي أو WebSocket آمن)                     |
| زمن الرمز الأول (TTFT)   : 35ms - 55ms  (الحد الأقصى لظهور أول حرف مقترح)                     |
| بث تدفق الرموز           : 15ms - 25ms  (15-40 رمزاً بسرعة تتجاوز 120 رمز/ثانية)              |
+-----------------------------------------------------------------------------------------------+
| الميزانية الكلية         : 95ms - 145ms (عتبة الإدراك البشري للإكمال اللحظي الفوري)           |
+-----------------------------------------------------------------------------------------------+

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

وهنا تبرز أهمية تقنية Fill-in-the-Middle (FIM): وهي آلية تجعل النموذج يسترشد بكل من Prefix (الكود قبل المؤشر) وSuffix (الكود بعد المؤشر) لتوليد الكود الأوسط الناقص بدقة متناهية (Middle).


2. بنية FIM وكيفية عملها

تم تطوير FIM نظرياً بواسطة باحثي OpenAI وتم تطبيقها بنجاح في StarCoder وDeepSeek Coder وQwen 2.5 Coder. تعمل هذه التقنية على تزويد النماذج بقدرة فهم ثنائية الاتجاه دون تعديل مصفوفات الانتباه الذاتي في نموذج المحول (Transformer).

+-----------------------------------------------------------------------------------------------+
|                               تحويل Fill-in-the-Middle (FIM)                                  |
+-----------------------------------------------------------------------------------------------+
| وثيقة الكود المصدرية الأصلية:                                                                |
| [ الكود قبل المؤشر (Prefix) ]   [ موضع المؤشر (Middle) ]   [ الكود بعد المؤشر (Suffix) ]      |
|                                                                                               |
| نمط PSM (Prefix-Suffix-Middle):                                                               |
| <PRE> [ رموز البادئة ] <SUF> [ رموز اللاحقة ] <MID> ===> النموذج يتوقع [ رموز الوسط ]         |
|                                                                                               |
| نمط SPM (Suffix-Prefix-Middle):                                                               |
| <SUF> [ رموز اللاحقة ] <PRE> [ رموز البادئة ] <MID> ===> النموذج يتوقع [ رموز الوسط ]         |
+-----------------------------------------------------------------------------------------------+

3. جدول الرموز الخاصة بتقنية FIM لكل نموذج (2026)

+-------------------------------------------------------------------------------------------------------------+
|                                    جدول الرموز الخاصة لتقنية FIM (عام 2026)                                 |
+--------------------+--------------------------+--------------------------+--------------------------+-------+
| عائلة النموذج      | رمز البادئة (Prefix)     | رمز اللاحقة (Suffix)     | رمز الوسط (Middle)       | النمط |
+--------------------+--------------------------+--------------------------+--------------------------+-------+
| Qwen 2.5 Coder     | <|fim_prefix|>           | <|fim_suffix|>           | <|fim_middle|>           | PSM   |
| DeepSeek Coder V1/2| <|fim begin|>          | <|fim hole|>           | <|fim end|>            | SPM   |
| StarCoder / SC2    | <fim_prefix>             | <fim_suffix>             | <fim_middle>             | PSM   |
| Mistral Codestral  | [PREFIX]                 | [SUFFIX]                 | [MIDDLE]                 | PSM   |
| CodeLlama          | <PRE>                    | <SUF>                    | <MID>                    | PSM   |
+--------------------+--------------------------+--------------------------+--------------------------+-------+

4. اختبارات الأداء: النماذج الأسرع من 100 مللي ثانية

+---------------------------------------------------------------------------------------------------------------+
|                               مقارنة أداء نماذج الإكمال التلقائي فائقة السرعة                                 |
+-----------------------+--------------------+-------------------+------------------+-------------+-------------+
| النموذج               | دقة السطر الواحد   | دقة الكتل المتعددة| زمن أول رمز      | سرعة التوليد| استهلاك     |
|                       | FIM (Pass@1)       | الأسطر (Pass@1)   | (TTFT p50)       | (رمز/ثانية) | VRAM (FP16) |
+-----------------------+--------------------+-------------------+------------------+-------------+-------------+
| Qwen 2.5 Coder 1.5B   | 84.6%              | 64.2%             | 42 ms            | 188 tok/s   | 3.2 GB      |
| Qwen 2.5 Coder 7B     | 89.2%              | 76.8%             | 84 ms            | 112 tok/s   | 15.2 GB     |
| DeepSeek Coder 1.3B   | 78.4%              | 56.1%             | 39 ms            | 196 tok/s   | 2.8 GB      |
| StarCoder2 3B         | 81.1%              | 60.5%             | 58 ms            | 144 tok/s   | 6.4 GB      |
+-----------------------+--------------------+-------------------+------------------+-------------+-------------+

5. هندسة الإضافات داخل بيئات التطوير: إدارة نافذة السياق

  • نافذة غير متماثلة: تخصيص 60-70% للبادئة (1,500-3,000 رمز) و30-40% لللاحقة (500-1,500 رمز).
  • حقن الرموز عبر الملفات: استخراج تعريفات الأنواع من الملفات المجاورة المفتوحة عبر Tree-sitter (300 رمز تقريباً).

6. كود خادم FIM باستخدام Python وFastAPI

import os, time
from typing import Optional, List
from fastapi import FastAPI
from pydantic import BaseModel
import httpx

app = FastAPI(title="FIM Engine")
BACKEND_URL = os.getenv("INFERENCE_BACKEND_URL", "http://127.0.0.1:8000/v1/completions")
MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-Coder-1.5B")

class FIMRequest(BaseModel):
    prefix: str
    suffix: str
    max_tokens: int = 48
    temperature: float = 0.1

@app.post("/v1/autocomplete")
async def autocomplete(req: FIMRequest):
    t0 = time.perf_counter()
    prompt = f"<|fim_prefix|>{req.prefix}<|fim_suffix|>{req.suffix}<|fim_middle|>"
    stops = ["<|fim_prefix|>", "<|fim_suffix|>", "<|fim_middle|>", "<|endoftext|>", "\n\n"]
    
    payload = {
        "model": MODEL_NAME, "prompt": prompt, "max_tokens": req.max_tokens,
        "temperature": req.temperature, "stop": stops, "stream": False
    }
    async with httpx.AsyncClient(timeout=1.5) as client:
        resp = await client.post(BACKEND_URL, json=payload)
        data = resp.json()
    return {
        "completion": data["choices"][0]["text"],
        "latency_ms": round((time.perf_counter() - t0) * 1000, 2)
    }

7. رموز التوقف ومنع تكرار الأكواد

  1. تضمين كافة رموز FIM الخاصة في قائمة التوقف (stop).
  2. إيقاف التوليد عند وجود سطرين فارغين (\n\n) في اقتراحات السطر الواحد.
  3. تطبيق فلتر لحذف الأقواس المكررة مثل } أو ) إذا كانت موجودة في اللاحقة بالفعل.

8. دراسة التكاليف (TCO) لفريق من 100 مطور

  • 100 مطور: حوالي 120,000 طلب يومياً (2.64 مليون طلب شهرياً).
  • اشتراك Copilot التجاري: 1,900 دولار شهرياً (19 دولار للمستخدم).
  • واجهات Serverless API: نحو 115.40 دولار شهرياً.
  • خادم سحابي مخصص (A10G): 730 دولار شهرياً (خصوصية تامة وسرعة استجابة أقل من 70 مللي ثانية).
  • تشغيل محلي على أجهزة المطورين (Mac M4 / RTX 4090): صفر دولار تكلفة سحابية.

9. التوصيات النهائية

  1. للأجهزة الفردية: تشغيل Qwen 2.5 Coder 1.5B عبر llama.cpp (سرعة استجابة 42 مللي ثانية واستهلاك 3.2 جيجابايت فقط من الذاكرة).
  2. للخوادم المشتركة: تشغيل Qwen 2.5 Coder 7B عبر vLLM (دقة 76.8% في ملء الكتل المعقدة).
  3. تحديد نافذة السياق بدقة: عدم تجاوز 2,000 رمز للبادئة و800 رمز لللاحقة لضمان بقاء زمن الاستجابة دون 100 مللي ثانية.
→ كل المقالات
0 / 4