SLM w 2026 r.: przegląd modeli małego języka i punktów odniesienia
W 2023 r. „model AI” prawie zawsze oznaczał GPT-4 lub Claude. W 2026 roku krajobraz i radykalnie inny: Phi-4-mini (3,8 miliarda parametrów) przewyższa Mixtral 8x7B (46B) na wzorcach rozumowania matematycznego działa 135 milionów parametrów SmolLM2 Raspberry Pi 4 i Gemma 3n E4B mają LMArena Elo powyżej 1300 — więcej niż wiele Modele 70B sprzed roku. Nadeszła era małych modeli językowych, co ma swoje konsekwencje konkretne dla tych, którzy opracowują aplikacje AI.
Czego się nauczysz
- Mapa głównych SLM w 2026 roku: Phi-4-mini, Gemma 3n, Qwen 3, SmolLM2, DeepSeek
- Jak interpretować benchmarki: MMLU, HumanEval, MATH, GPQA
- Który model wybrać do zadań związanych z kodowaniem, wnioskowaniem, czatem i klasyfikacją
- Sprzęt wymagany do lokalnego wnioskowania z każdym modelem
- Jak uruchomić niestandardowe testy porównawcze w swoim przypadku użycia
Co definiuje „mały” model językowy w 2026 r
Definicja „małego” zmieniała się z biegiem czasu. W 2024 r. „mały” oznaczał poniżej 7B parametry. W 2026 r., gdy modele 1B będą konkurować z modelami 13B sprzed dwóch lat, próg praktyka się zmieniła: uważamy, że SLM to modele o parametrach poniżej 10B, które można uruchomić na sprzęcie konsumenckim bez agresywnej kwantyzacji.
| Model | Parametry | Twórca | Licencja | Pamięć RAM (fp16) |
|---|---|---|---|---|
| SmolLM2 | 135 mln - 1,7 mld | Przytulana twarz | Apache 2.0 | 0,3 - 3,5 GB |
| Phi-4-mini | 3,8B | Microsoftu | MIT | 7,6 GB |
| Gemma 3n E4B | 4B efekt. | ToS Gemmy | 8 GB | |
| Qwen 3 (1,7B) | 1,7B | Alibaba | Apache 2.0 | 3,4 GB |
| Qwen 3 (7B) | 7B | Alibaba | Apache 2.0 | 14 GB |
| DeepSeek-R1 (7B) | 7B destylowany | DeepSeek | MIT | 14 GB |
| Mistral 7B v0.3 | 7B | AI Mistrala | Apache 2.0 | 14 GB |
| Lama 3.2 (3B) | 3B | Połowa | Lamy 3.2 | 6 GB |
Benchmarki: jak je poprawnie interpretować
Punkty odniesienia akademickie są przydatne, ale należy je interpretować ostrożnie. Model, który się wyróżnia na MMLU (wiedza ogólna) może być niewystarczająca do generowania czystego kodu Pythona. Oto główne punkty odniesienia i to, co faktycznie mierzą.
Kluczowe wzorce akademickie
# Confronto benchmark principali (valori approssimativi, Febbraio 2026)
benchmarks = {
"Phi-4-mini (3.8B)": {
"MMLU": 72.8, # Conoscenza generale, 57 soggetti
"HumanEval": 62.3, # Completamento codice Python
"MATH": 70.5, # Ragionamento matematico (AMC/AIME)
"GPQA Diamond": 36.2, # PhD-level science questions
"MT-Bench": 7.8, # Conversazione multi-turno (1-10)
},
"Gemma 3n E4B": {
"MMLU": 74.1,
"HumanEval": 58.7,
"MATH": 65.3,
"GPQA Diamond": 34.8,
"MT-Bench": 8.1,
"LMArena Elo": 1312, # Confronto umano (stile chess ELO)
},
"Qwen 3 7B": {
"MMLU": 78.3,
"HumanEval": 72.1,
"MATH": 78.9,
"GPQA Diamond": 41.2,
"MT-Bench": 8.4,
},
"DeepSeek-R1 7B distilled": {
"MMLU": 75.2,
"HumanEval": 68.4,
"MATH": 82.3, # Eccelle nel ragionamento matematico
"GPQA Diamond": 38.7,
"MT-Bench": 8.0,
},
# Per confronto: modelli piu grandi
"Mixtral 8x7B (46B)": {
"MMLU": 71.4, # Phi-4-mini (3.8B) lo supera!
"HumanEval": 60.1,
"MATH": 66.8,
},
}
# NOTA IMPORTANTE: i benchmark non misurano tutto
# - Hallucination rate (frequenza di invenzioni plausibili)
# - Instruction following su task complessi
# - Context handling su documenti lunghi
# - Velocita di inferenza su hardware specifico
# - Consumo energetico
Jak zbudować punkt odniesienia na podstawie przypadku użycia
from lm_eval.api.model import LM
from lm_eval import evaluator
import json
def benchmark_slm_for_custom_task(
model_name: str,
task_examples: list[dict],
metric_fn: callable
) -> dict:
"""
Benchmark di un SLM su un task personalizzato.
task_examples: lista di {"input": str, "expected": str}
metric_fn: funzione che restituisce float 0-1 (accuracy, F1, etc.)
"""
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto"
)
results = []
total_time = 0
for example in task_examples:
import time
start = time.time()
inputs = tokenizer(example["input"], return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.1, # bassa temperatura per task deterministici
do_sample=False
)
elapsed = time.time() - start
generated = tokenizer.decode(
outputs[0][inputs.input_ids.shape[1]:],
skip_special_tokens=True
)
score = metric_fn(generated, example["expected"])
results.append({
"input": example["input"][:50],
"expected": example["expected"],
"generated": generated,
"score": score,
"latency_ms": elapsed * 1000
})
total_time += elapsed
avg_score = sum(r["score"] for r in results) / len(results)
avg_latency = sum(r["latency_ms"] for r in results) / len(results)
return {
"model": model_name,
"task_score": round(avg_score, 4),
"avg_latency_ms": round(avg_latency, 1),
"total_examples": len(results),
"hardware": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU",
"detail": results
}
# Esempio di uso per classificazione del sentiment in italiano
sentiment_examples = [
{"input": "Classifica il sentiment: 'Il prodotto e eccellente!' -> ", "expected": "positivo"},
{"input": "Classifica il sentiment: 'Esperienza terribile, non lo raccomando' -> ", "expected": "negativo"},
# ... 100 esempi dal proprio dataset reale ...
]
def exact_match(generated: str, expected: str) -> float:
return 1.0 if expected.lower() in generated.lower() else 0.0
# Eseguire il benchmark su piu modelli
for model in ["microsoft/phi-4-mini", "Qwen/Qwen3-7B", "google/gemma-3n-e4b"]:
result = benchmark_slm_for_custom_task(model, sentiment_examples, exact_match)
print(f"{model}: score={result['task_score']}, latency={result['avg_latency_ms']}ms")
Wymagania sprzętowe: Co jest potrzebne do uruchomienia SLM
Jedną z głównych zalet SLM jest to, że działają na sprzęcie konsumenckim. Oto praktyczny przewodnik.
| Sprzęt komputerowy | VRAM/RAM | Kompatybilne modele (fp16) | Tokeny/s (w przybliżeniu) |
|---|---|---|---|
| MacBook M3 Pro (18 GB) | 18 GB zunifikowane | Phi-4-mini, Gemma 3n, Lama 3.2 3B | 25-40 tok/s |
| MacBook M4 Max (48 GB) | Zunifikowane 48 GB | Wszystkie 7B, Lama 3 8B | 60-80 tok/s |
| RTX 4060 (8 GB) | 8 GB pamięci VRAM | Phi-4-mini q4, SmolLM2 1,7B | 35-55 tok/s |
| RTX 4070 (12 GB) | 12 GB pamięci VRAM | Phi-4-mini fp16, Qwen 3 7B q4 | 50-70 tok/s |
| RTX 4090 (24 GB) | 24 GB pamięci VRAM | Wszystkie 7B fp16, Lama 3 8B | 100-130 tok/s |
| Serwer A100 (80 GB) | 80 GB pamięci VRAM | Modele do 40B | 200-400 tok/s |
# Verificare se un modello entra nella VRAM disponibile
def check_model_fits_vram(
model_name: str,
quantization: str = "fp16",
safety_margin: float = 0.85
) -> dict:
"""
Stima il VRAM necessario e verifica la compatibilita.
quantization: 'fp32', 'fp16', 'int8', 'int4' (gguf q4)
"""
import torch
# Stima parametri del modello
param_counts = {
"microsoft/phi-4-mini": 3.8e9,
"google/gemma-3n-E4B": 4.0e9,
"Qwen/Qwen3-7B": 7.6e9,
"deepseek-ai/DeepSeek-R1-Distill-Qwen-7B": 7.6e9,
"meta-llama/Llama-3.2-3B": 3.2e9,
"HuggingFaceTB/SmolLM2-1.7B": 1.7e9,
}
bytes_per_param = {
"fp32": 4, "fp16": 2, "bf16": 2, "int8": 1, "int4": 0.5
}
params = param_counts.get(model_name, 0)
if params == 0:
return {"error": f"Model {model_name} not in database"}
model_vram_gb = (params * bytes_per_param.get(quantization, 2)) / 1e9
overhead_gb = 1.5 # KV cache + activations
total_vram_gb = model_vram_gb + overhead_gb
available_vram = 0
if torch.cuda.is_available():
available_vram = torch.cuda.get_device_properties(0).total_memory / 1e9
elif hasattr(torch.backends, 'mps') and torch.backends.mps.is_available():
# Apple Silicon: usare la memoria di sistema disponibile
import psutil
available_vram = psutil.virtual_memory().available / 1e9 * 0.7
fits = total_vram_gb <= available_vram * safety_margin
return {
"model": model_name,
"quantization": quantization,
"model_vram_gb": round(model_vram_gb, 2),
"total_with_overhead_gb": round(total_vram_gb, 2),
"available_gb": round(available_vram, 2),
"fits": fits,
"recommendation": "OK" if fits else
f"Insufficiente: prova int4 o un modello piu piccolo"
}
# Test
for model in ["microsoft/phi-4-mini", "Qwen/Qwen3-7B"]:
for quant in ["fp16", "int8", "int4"]:
result = check_model_fits_vram(model, quant)
status = "OK" if result["fits"] else "NO"
print(f"[{status}] {model} ({quant}): {result['total_with_overhead_gb']:.1f}GB needed")
Który SLM wybrać dla swojego przypadku użycia
Wybór modelu zależy głównie od zadania. Oto praktyczny przewodnik oparty na benchmarki i testy społecznościowe w 2026 r.
Zalecenia dotyczące przypadków użycia
- Kodowanie (Python, TypeScript, SQL): Qwen 3 7B lub DeepSeek-R1 7B — najlepszy w swojej klasie dla 7B
- Rozumowanie matematyczne/logiczne: Destylowany DeepSeek-R1 7B — ogromna poprawa w stosunku do bazy
- Czat i asystent ogólny: Phi-4-mini lub Gemma 3n — najlepszy stosunek jakości do wielkości
- Prosta klasyfikacja i NLU: SmolLM2 1.7B — już powyżej progu dla wielu zadań
- Urządzenie mobilne na urządzeniu: Gemma 3n E4B (zoptymalizowany dla NPU) lub SmolLM2 135M
- Włoski RAG: Phi-4-mini (wielojęzyczny forte) lub Mistral 7B v0.3
Wnioski
Rok 2026 definitywnie zatwierdził erę modeli małego języka: modele 3-7B z właściwa architektura i odpowiednie dane szkoleniowe pokonują modele 10 razy starsze niż dwa lata temu. Wybór nie polega już na „LLM kontra SLM”, ale „który SLM do jakiego zadania, na jakim sprzęcie”.
Następny artykuł z serii szczegółowo porównuje Phi-4-mini i Gemma 3n: dwie możliwości najciekawsze pod względem wdrażania brzegowego w 2026 r., z równoległymi testami porównawczymi dotyczącymi kodowania, zadania polegające na rozumowaniu i konwersacji w języku włoskim i angielskim.
Seria: Małe modele językowe
- Artykuł 1 (ten): SLM w 2026 r. – przegląd i benchmark
- Artykuł 2: Phi-4-mini vs Gemma 3n – szczegółowe porównanie
- Artykuł 3: Dostrajanie z LoRA i QLoRA
- Artykuł 4: Kwantyzacja dla Edge - GGUF, ONNX, INT4
- Artykuł 5: Ollama – SLM lokalnie w 5 minut







