দ্রুত উত্তর: ২০২৬ সালে Fill-in-the-Middle (FIM) প্রিফিক্স, সাফিক্স এবং মিডল টোকেন (যেমন <|fim_prefix|>, <|fim_suffix|>, <|fim_middle|>) ব্যবহারের মাধ্যমে IDE-তে রিয়েল-টাইম ঘোস্ট-টেক্সট কোড অটো-কমপ্লিশন নিশ্চিত করে। ১০০ মিলিসেকেন্ডের কম লেটেন্সিতে Qwen 2.5 Coder 1.5B মাত্র ৪২ মিলিসেকেন্ড TTFT এবং ৮৪.৬% সিঙ্গেল-লাইন FIM নির্ভুলতায় শীর্ষে রয়েছে, আর Qwen 2.5 Coder 7B মাল্টি-লাইন সিন্থেসিসে (৭৬.৮%) সেরা।
১. ভূমিকা: ঘোস্ট-টেক্সট AI অটো-কমপ্লিশনের গতি ও নির্ভুলতার চাহিদা
রিয়েল-টাইম ai code completion এবং ai autocomplete প্রয়োগমূলক কৃত্রিম বুদ্ধিমত্তার সবচেয়ে সময়-সংবেদনশীল কাজের একটি। চ্যাট-ভিত্তিক কোডিং এজেন্ট (যেমন Claude Code, Aider বা OpenCode) মাল্টি-ফাইল প্ল্যানিংয়ের জন্য ১.৫ থেকে ৫.০ সেকেন্ড সময় নিতে পারে, কিন্তু এডিটরে প্রদর্শিত ইনলাইন কোড বা "ঘোস্ট টেক্সট" ১০০ মিলিসেকেন্ডের মধ্যে স্ক্রিনে আসা প্রয়োজন, যাতে ডেভেলপারের কাজের স্বাভাবিক গতি ব্যাহত না হয়।
+-----------------------------------------------------------------------------------------------+
| IDE ঘোস্ট-টেক্সট অটো-কমপ্লিশনের লেটেন্সি বাজেট |
+-----------------------------------------------------------------------------------------------+
| কিস্ট্রোক ডিবউন্স : 30ms - 50ms |
| কনটেক্সট অ্যাসেম্বলি : 10ms - 15ms (Tree-sitter AST, প্রিফিক্স ও সাফিক্স উইন্ডোয়িং) |
| নেটওয়ার্ক / IPC : 5ms - 20ms (লোকাল vLLM / llama.cpp বা প্রাইভেট ওয়েবসকেট) |
| প্রথম টোকেনের সময় : 35ms - 55ms (প্রথম অক্ষরের জন্য সাব-১০০ মিলিসেকেন্ড সীমা) |
| টোকেন স্ট্রিমিং : 15ms - 25ms (১২০+ টোকেন/সেকেন্ডে ১৫-৪০ টোকেন লাইন সমাপ্তি) |
+-----------------------------------------------------------------------------------------------+
| মোট বাজেট : 95ms - 145ms (তাত্ক্ষণিক উপলব্ধির মানবিক সংবেদনশীলতা সীমা) |
+-----------------------------------------------------------------------------------------------+
স্বাভাবিক অটোরেগ্রেসিভ ল্যাঙ্গুয়েজ মডেল শুধুমাত্র বাম থেকে ডানে পরবর্তী টোকেন অনুমানে প্রশিক্ষিত হয়:
$$P(W) = \prod_{i=1}^{n} P(w_i \mid w_1, w_2, \dots, w_{i-1})$$
কিন্তু কোড এডিটরে কার্সারের পরে ইতিমধ্যেই ফাংশন বা ব্র্যাকেট উপস্থিত থাকে। মডেল যদি শুধুমাত্র কার্সারের আগের কোড (Prefix) দেখে, তবে সে নিচের কোডের সাথে সাংঘর্ষিক ডুপ্লিকেট ব্র্যাকেট বা ভ্যারিয়েবল তৈরি করে ফেলবে।
এই সমস্যার সমাধান হলো Fill-in-the-Middle (FIM) কোড জেনারেশন—যেখানে মডেলকে Prefix (পূর্ববর্তী কোড) এবং Suffix (পরবর্তী কোড) উভয় দ্বারা শর্তযুক্ত করে মাঝের অংশটি (Middle) তৈরি করানো হয়।
২. FIM আর্কিটেকচার কীভাবে কাজ করে
StarCoder, DeepSeek Coder এবং Qwen 2.5 Coder-এ ব্যবহৃত FIM পদ্ধতি ট্রান্সফরমারের সেলফ-অ্যাটেনশন ম্যাট্রিক্সে কোনো পরিবর্তন না এনেই মডেলকে দ্বিমুখী কনটেক্সট অনুধাবনের ক্ষমতা দেয়।
+-----------------------------------------------------------------------------------------------+
| Fill-in-the-Middle (FIM) রূপান্তর প্রক্রিয়া |
+-----------------------------------------------------------------------------------------------+
| মূল সোর্স কোড ডকুমেন্ট: |
| [ কার্সারের আগের কোড (Prefix) ] [ কার্সারের স্থান (Middle) ] [ কার্সারের পরের কোড (Suffix) ] |
| |
| FIM ফরম্যাট (PSM মোড): |
| <PRE> [ প্রিফিক্স কোড ] <SUF> [ সাফিক্স কোড ] <MID> ===> মডেল অনুমান করবে [ Middle ] |
| |
| FIM ফরম্যাট (SPM মোড): |
| <SUF> [ সাফিক্স কোড ] <PRE> [ প্রিফিক্স কোড ] <MID> ===> মডেল অনুমান করবে [ Middle ] |
+-----------------------------------------------------------------------------------------------+
৩. বিভিন্ন মডেলের FIM স্পেশাল টোকেন ছক (২০২৬)
+-------------------------------------------------------------------------------------------------------------+
| FIM স্পেশাল টোকেন রূপরেখা (২০২৬) |
+--------------------+--------------------------+--------------------------+--------------------------+-------+
| মডেল পরিবার | প্রিফিক্স টোকেন | সাফিক্স টোকেন | মিডল টোকেন | মোড |
+--------------------+--------------------------+--------------------------+--------------------------+-------+
| 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 |
+--------------------+--------------------------+--------------------------+--------------------------+-------+
৪. সাব-১০০ মিলিসেকেন্ড ঘোস্ট-টেক্সট মডেল বেঞ্চমার্ক
+---------------------------------------------------------------------------------------------------------------+
| ১০০ মিলিসেকেন্ডের কম লেটেন্সির মডেল সমূহের ফলাফল |
+-----------------------+--------------------+-------------------+------------------+-------------+-------------+
| মডেল | সিঙ্গেল লাইন 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 |
+-----------------------+--------------------+-------------------+------------------+-------------+-------------+
৫. এডিটর কনটেক্সট উইন্ডোয়িং কৌশল
- অপ্রতিসম উইন্ডো: প্রিফিক্সে ৬০-৭০% (১,৫০০-৩,০০০ টোকেন) এবং সাফিক্সে ৩০-৪০% (৫০০-১,৫০০ টোকেন)।
- অন্যান্য ফাইলের রেফারেন্স: Tree-sitter ব্যবহার করে ওপেন ট্যাব থেকে প্রয়োজনীয় টাইপ ডেফিনিশন ও ইমপোর্ট যুক্ত করা।
৬. পাইথন ও FastAPI-তে FIM সার্ভার বাস্তবায়ন
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)
}
৭. স্টপ সিকোয়েন্স ও কোড ডুপ্লিকেশন প্রতিরোধ
- মডেলের সকল FIM স্পেশাল টোকেন
stopঅ্যারেতে যুক্ত করুন। - এক লাইনের সাজেশনের ক্ষেত্রে দুটি নিউলাইন (
\n\n) পেলেই থামিয়ে দিন। - সাফিক্সে ইতিমধ্যে থাকা ব্র্যাকেট (
}বা)) ডুপ্লিকেট হওয়া ঠেকাতে ওভারল্যাপ ফিল্টার ব্যবহার করুন।
৮. ১০০ জন ডেভেলপারের টিমের খরচ ও TCO
- প্রতিদিন রিকোয়েস্ট: প্রায় ১,২০,০০০ টি (মাসে প্রায় ২৬.৪ লাখ)।
- বাণিজ্যিক Copilot: $১,৯০০/মাস ($১৯/জন)।
- সার্ভারলেস API: প্রায় $১১৫.৪০/মাস।
- ডেডিকেটেড GPU সার্ভার (A10G): $৭৩০/মাস (সম্পূর্ণ ডেটা গোপনীয়তা, <৭০ms লেটেন্সি)।
- লোকাল ল্যাপটপ (Mac M4 / RTX 4090): $০ ক্লাউড খরচ।
৯. উপসংহার ও বাস্তবায়ন সুপারিশ
- ব্যক্তিগত ল্যাপটপের জন্য:
llama.cpp-এর সাথে Qwen 2.5 Coder 1.5B ব্যবহার করুন (৪২ms লেটেন্সি এবং ৩.২GB মেমরি)। - টিম সার্ভারের জন্য: vLLM-এ Qwen 2.5 Coder 7B চালান (মাল্টি-লাইনে ৭৬.৮% নির্ভুলতা)।
- কনটেক্সট সীমিত রাখুন: প্রিফিক্স ২০০০ টোকেনের নিচে সীমাবদ্ধ রাখলে লেটেন্সি ১০০ms-এর কম থাকবে।