LFM3 di Liquid AI: i nuovi modelli 2B per testo, visione, audio e omni
Un modello da 1,7B che batte Qwen3.5-9B sugli agenti, e tre fratelli per immagini, video e voce.

Liquid AI ha rilasciato LFM3, la nuova generazione dei suoi Liquid Foundation Models. Quattro modelli da circa 2 miliardi di parametri condividono lo stesso backbone e coprono testo, visione, audio e omni: LFM3-1.7B, LFM3-VL-2B, LFM3-Audio-2B e LFM3-Omni-2B. Sono open-weight, pensati per girare on-device e supportati da llama.cpp fin dal lancio.
In questa guida vediamo cosa fa ciascun modello, quali risultati dichiara Liquid AI e come si posiziona rispetto a modelli fino a 15 volte più grandi, come Qwen3.5-27B e Qwen3-Omni-30B-A3B. Per ogni modello trovi anche un caso d'uso concreto, con i comandi per eseguirlo in locale con llama.cpp e i GGUF Q8_0.
- Modelli presentati in questa guida
- 4
- Parametri per modello
- 1,7 - 2,2 B
- Contesto del modello testuale
- 256K token
- Peso del GGUF Q8_0
- 1,85 GB
In questa guida
La famiglia LFM3 in sintesi
Liquid AI ha annunciato LFM3 il 27 ottobre 2026. Tutti i modelli derivano da LFM3-1.7B-Base, con un pre-training su 22 trilioni di token. Ogni variante aggiunge un encoder (vision, audio o entrambi) e un post-training dedicato. La release include anche due decision model, d1-2B e d1-Omni-2B, che trattiamo in un articolo dedicato.
| Modello | Parametri | Input | Output | Contesto | GGUF Q8_0 |
|---|---|---|---|---|---|
| LFM3-1.7B | 1,73 B | Testo | Testo, tool call | 256K | 1,85 GB |
| LFM3-VL-2B | 1,92 B | Testo, immagini, video | Testo, tool call | 128K | 1,85 GB + mmproj 0,20 GB |
| LFM3-Audio-2B | 2 B | Testo, audio 16 kHz | Testo, voce 24 kHz, tool call | 32K | 1,85 GB + mmproj 0,34 GB |
| LFM3-Omni-2B | 2,17 B | Testo, immagini, video con audio, audio | Testo, voce 24 kHz, tool call | 32K | 1,85 GB + mmproj 0,54 GB |
L'architettura tri-ibrida di LFM3
LFM2 combinava short convolution e attention. LFM3 aggiunge un terzo operatore, la sliding-window attention (SWA), per mantenere veloce l'inferenza anche con contesti lunghi. Liquid AI ha definito il layout con una architecture search "hardware-in-the-loop" su 14 combinazioni di dispositivi e backend, dai telefoni Samsung Galaxy S26 Ultra e OnePlus 15 al Raspberry Pi 5, fino a GPU e NPU Qualcomm Hexagon.
I 24 layer di LFM3-1.7B sono così distribuiti:
- 13 gated short convolution, con kernel size 7 (era 3 in LFM2);
- 5 layer di sliding-window attention con una finestra di 256 token;
- 6 layer di global attention con grouped-query attention (GQA).
Head-wise gated attention
Un gate sigmoid scala l'output di ogni head, che può "spegnersi" quando non ha nulla da aggiungere. Questo riduce gli activation outlier che peggiorano la quantizzazione.
Partial RoPE
Nei layer di global attention RoPE viene applicato solo a metà di ogni head. L'altra metà confronta i token in base al contenuto, indipendentemente dalla distanza.
Sandwich norm
Ogni blocco normalizza sia l'input sia l'output, così le attivazioni restano su scale stabili durante il training.
Il vantaggio si vede soprattutto con contesti lunghi. Secondo Liquid AI, a parità di parametri LFM3-1.7B è veloce quanto LFM2-1.2B sui prompt brevi e circa il 25% più veloce con 8K token di contesto. Con un contesto pieno da 128K token la KV cache occupa 1,6 GB, contro 4,3 GB di Qwen3.5-4B e 5,6 GB di MiniCPM5-2B.
Come è stato addestrato LFM3-1.7B
Pre-training (22T token). Circa 15T di dati web e sintetici, poi 3T di codice, matematica e scienza a 4K di contesto. Gli ultimi 3,5T sono un mid-training su dati selezionati, con più agentic trace e tool call, che estende il contesto prima a 128K e poi a 256K.
Post-training in quattro fasi.
- SFT su 1,75T token di chat, reasoning, tool calling e agentic trace.
- Mixed RL su molti domini insieme, con una length penalty che mantiene le risposte concise.
- Multi-domain on-policy distillation (MOPD): sei teacher specializzati (codice, matematica, tool use, long context, task agentici e workflow aziendali) vengono distillati in un unico modello.
- Agentic RL su task reali eseguiti dentro harness come Hermes Agent, Pi e OpenClaw.
Preparare llama.cpp per LFM3 in Q8_0
Il supporto a tutta la famiglia LFM3 è arrivato in llama.cpp v0.8.0 (build nightly b11960). Questa release aggiunge anche l'endpoint WebSocket /v1/realtime per le conversazioni vocali e l'endpoint POST /tts per la sintesi vocale. Le versioni precedenti non riconoscono l'architettura LFM3.
1. Installa llama.cpp
1. Installa llama.cpp
Lo script ufficiale installa il comando unificato llama, con i sottocomandi llama serve (server OpenAI-compatible con web UI) e llama cli:
curl -LsSf https://llama.app/install.sh | sh
llama version
In alternativa puoi scaricare i binari dalle release su GitHub. I tool classici (llama-server, llama-cli, llama-tts) accettano gli stessi flag.
2. Scegli la quantizzazione Q8_0
2. Scegli la quantizzazione Q8_0
Con -hf llama.cpp scarica il modello da Hugging Face. Il suffisso :Q8_0 seleziona il file a 8 bit; senza suffisso llama.cpp sceglie Q4_K_M. Per i modelli multimodali scarica in automatico anche il multimodal projector (mmproj), il file che contiene gli encoder vision e audio.
llama cli -hf LiquidAI/LFM3-1.7B-GGUF:Q8_0
3. Imposta sempre la porta
3. Imposta sempre la porta
In llama.cpp v0.8.0 il server ascolta di default su 127.0.0.1:9931. Tutti gli esempi di questa guida usano --port 8080, come le model card di Liquid AI, quindi l'API OpenAI-compatible risponde su http://localhost:8080/v1.
Perché Q8_0
Q8_0 usa circa 8,5 bit per peso. La perdita di qualità rispetto a BF16 è in genere trascurabile, e il file resta piccolo: 1,85 GB contro 3,47 GB in BF16. È un buon punto di partenza quando vuoi valutare il modello senza introdurre errori di quantizzazione.
Quando scendere a 4 bit
Su telefoni o dispositivi con poca memoria valuta LFM3-1.7B-QAD-Q4_0.gguf (1,05 GB), un checkpoint addestrato con Quantization-Aware Distillation per recuperare l'accuratezza persa in Q4_0. Tutte le velocità dichiarate da Liquid AI sono misurate in Q4_0: in Q8_0 aspettati un decode più lento.
LFM3-1.7B: il modello testuale per agenti locali
LFM3-1.7B è un modello text-only da 1,73 miliardi di parametri, con 256K token di contesto e 16 lingue supportate, italiano incluso. Il post-training è orientato ad agenti locali, tool calling, structured output e fine-tuning su domini specifici. Il reasoning è attivo di default. Supporta anche i deferred tools: le definizioni dei tool restano fuori dal prompt finché un tool di ricerca non le recupera (tool search).
Liquid AI non lo consiglia per agentic coding o reasoning complesso in più passaggi. Per i task che richiedono molta conoscenza suggerisce di affiancargli retrieval o ricerca web.
Benchmark ufficiali di LFM3-1.7B
La tabella riporta una selezione dei 29 benchmark pubblicati nella model card. Tutti i modelli sono stati valutati da Liquid AI con vLLM in BF16.
| Benchmark | LFM3-1.7B | LFM2.5-2.6B | MiniCPM5-2B | Gemma 4 E4B | Qwen3.5-4B | Qwen3.5-9B |
|---|---|---|---|---|---|---|
| LiveClaw (agenti) | 45,60 | 14,70 | 30,37 | 20,36 | 19,94 | 35,77 |
| WebArena-Verified | 38,42 | 3,02 | 9,11 | 17,06 | 21,92 | 28,94 |
| AutomationBench | 41,29 | 0,94 | 4,71 | 1,92 | 8,67 | 15,10 |
| BFCL V4 (tool use) | 71,39 | 55,89 | 62,65 | 48,25 | 55,12 | 62,83 |
| MCP-Atlas | 32,57 | 16,45 | 26,38 | 6,19 | 41,37 | 42,67 |
| SWE-bench Verified (OpenCode) | 43,40 | 18,00 | 34,80 | 0,50 | 41,20 | 51,20 |
| LiveCodeBench v6 | 73,46 | 60,57 | 70,52 | 71,00 | 61,99 | 69,86 |
| IFBench | 73,03 | 60,48 | 62,08 | 44,56 | 38,16 | 48,84 |
| GPQA Diamond | 63,37 | 57,78 | 65,15 | 57,88 | 75,76 | 80,40 |
| RULER 128K | 65,56 | 1,15 | 37,96 | 18,82 | 84,63 | 87,11 |
| Media dei 29 benchmark | 49,37 | 31,55 | 39,19 | 31,74 | 39,27 | 47,24 |
In sintesi: LFM3-1.7B è il migliore su automazione, web browsing e instruction following, e batte Qwen3.5-9B su WebArena-Verified e AutomationBench. Perde invece su conoscenza (GPQA Diamond), agentic coding (SWE-bench) e long context (RULER 128K), dove il numero di parametri conta di più.
LFM3-1.7B contro Qwen3.5-27B, un modello 16 volte più grande
I benchmark ufficiali si fermano a Qwen3.5-9B. Per un confronto con un modello di un ordine di grandezza più grande abbiamo scelto Qwen3.5-27B, un modello dense da 27 miliardi di parametri (circa 15,6 volte LFM3-1.7B). I suoi punteggi sono quelli dichiarati dal team Qwen nella model card, ottenuti con harness e impostazioni diversi da quelli di Liquid AI.
| Benchmark | LFM3-1.7B | Qwen3.5-9B | Qwen3.5-27B | Note |
|---|---|---|---|---|
| IFEval | 96,66 | 92,08 | 95,0 | LFM3 in testa |
| IFBench | 73,03 | 48,84 | 76,5 | Divario di 3,5 punti |
| BFCL V4 | 71,39 | 62,83 | 68,5 | LFM3 in testa |
| LiveCodeBench v6 | 73,46 | 69,86 | 80,7 | |
| AA-LCR (contesto lungo) | 52,83 | 62,00 | 66,1 | |
| GPQA Diamond | 63,37 | 80,40 | 85,5 | Conoscenza: vince la scala |
| Humanity's Last Exam, senza tool | 7,17 | 16,41 | 24,3 | Qwen: HLE con CoT |
| Humanity's Last Exam, con tool | 13,90 | 17,50 | 48,5 | Harness di ricerca diversi |
| SWE-bench Verified | 43,40 | 51,20 | 72,4 | LFM3: OpenCode. Qwen: harness proprio |
Su tool calling e instruction following LFM3-1.7B regge il confronto anche con un modello 16 volte più grande: su BFCL V4 e IFEval supera i punteggi dichiarati per Qwen3.5-27B. Su conoscenza, agentic coding e ricerca con tool il distacco resta ampio, tra 20 e 35 punti. È il profilo che ci si aspetta da un modello pensato per eseguire azioni dentro un harness, non per ricordare fatti.
Velocità on-device di LFM3-1.7B
- LFM3-1.7B237
- MiniCPM5-2B106
- Qwen3.5-4B100
- Gemma 4 E4B87
- Qwen3.5-9B71
Scale starts at zero.
| Dispositivo | Prefill (token/s) | Decode (token/s) | Memoria (GB) |
|---|---|---|---|
| AMD Ryzen AI Max+ 395 (Vulkan) | 3.771 | 129,6 | 2,75 |
| Apple M5 Max (Metal) | 8.028 | 237,1 | 2,25 |
| iPhone 17 Pro (A19 Pro) | 1.061 | 43,6 | 1,90 |
Secondo Liquid AI, su tutti e tre i dispositivi LFM3-1.7B è il modello più veloce del confronto e quello che usa meno memoria. In decode è da 1,8 a 2,8 volte più veloce del secondo classificato. Su una GPU NVIDIA B300 con SGLang in BF16 arriva a 3,6 miliardi di token al giorno con 1.024 richieste in parallelo.
Caso d'uso: smistare i ticket di assistenza con il tool calling
Scenario: un help desk riceve email in italiano e vuole classificarle e aprire un ticket senza mandare i dati a un servizio cloud. LFM3-1.7B gira su un server interno o sul laptop dell'operatore e restituisce una tool call alla funzione crea_ticket.
1. Avvia il server in Q8_0
1. Avvia il server in Q8_0
Usa i sampling parameter consigliati per chat, tool use e agenti:
llama serve -hf LiquidAI/LFM3-1.7B-GGUF:Q8_0 \
--temp 0.1 --top-k 50 --repeat-penalty 1.1 \
-c 32768 --port 8080
-c 32768 limita il contesto a 32K token per tenere bassa la memoria della KV cache. Il modello arriva fino a 256K.
2. Definisci il tool e invia l'email
2. Definisci il tool e invia l'email
Il server espone un'API OpenAI-compatible e converte le tool call del modello nel campo tool_calls:
import json
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="none")
tools = [{
"type": "function",
"function": {
"name": "crea_ticket",
"description": "Apre un ticket nel sistema di assistenza.",
"parameters": {
"type": "object",
"properties": {
"categoria": {"type": "string", "enum": ["fatturazione", "tecnico", "commerciale"]},
"priorita": {"type": "string", "enum": ["bassa", "media", "alta"]},
"riassunto": {"type": "string", "description": "Una frase in italiano."},
},
"required": ["categoria", "priorita", "riassunto"],
},
},
}]
email = (
"Buongiorno, da stamattina il gestionale rifiuta il login "
"e abbiamo 20 ordini fermi. Potete intervenire subito?"
)
response = client.chat.completions.create(
model="lfm3-1.7b",
messages=[
{"role": "system", "content": "Classifica le email dei clienti e apri un ticket con lo strumento disponibile."},
{"role": "user", "content": email},
],
tools=tools,
)
message = response.choices[0].message
for call in message.tool_calls or []:
print(call.function.name, json.loads(call.function.arguments))
if not message.tool_calls:
print("Nessuna tool call:", message.content)
3. Esegui la funzione e restituisci il risultato
3. Esegui la funzione e restituisci il risultato
L'applicazione esegue crea_ticket, aggiunge alla conversazione il messaggio dell'assistente con le tool_calls e un messaggio tool con il risultato, poi richiama il modello per la risposta finale. Valida sempre gli argomenti prima di eseguire azioni reali.
Per adattare il modello a categorie e formati interni, Liquid AI fornisce notebook di fine-tuning con TRL: SFT per estrarre JSON da documenti, DPO per rispondere solo in base ai documenti recuperati e GRPO per scegliere il tool giusto in un'app con 108 tool.
LFM3-VL-2B: visione, video e grounding on-device
LFM3-VL-2B unisce il language model LFM3 (1,73B) a un nuovo vision encoder proprietario da 164M parametri e a un projector da 25M, per un totale di 1,92 miliardi. L'encoder combina 8 layer di convoluzione 2D e 6 layer di bidirectional attention. Secondo Liquid AI richiede 3 volte meno compute dell'encoder SigLIP2 usato nei precedenti modelli LFM-VL.
Le novità principali rispetto a LFM2.5-VL:
- Input video, campionato a 2 fps fino a 768 frame. È il primo modello vision di Liquid AI che accetta video.
- Reasoning step-by-step prima della risposta, utile per grafici, matematica e problemi in più passaggi.
- Spatial ed embodied reasoning: localizza gli oggetti e ne descrive le posizioni relative, una buona base per applicazioni di robotica.
Il modello è pensato per leggere documenti, grafici e schermate di app, localizzare oggetti e rispondere a domande su video. Non è consigliato per coding, conversazioni multi-turn o reasoning complesso.
Benchmark ufficiali di LFM3-VL-2B
| Categoria | LFM3-VL-2B | LFM3-VL-2B senza thinking | Qwen3.5-2B | Qwen3.5-4B | Gemma 4 12B | GPT-5.6 Luna | Gemini 3.5 Flash Lite |
|---|---|---|---|---|---|---|---|
| Generale | 66,0 | 56,4 | 64,0 | 73,0 | 74,0 | 72,2 | 74,1 |
| Percezione | 75,6 | 68,9 | 71,2 | 77,1 | 73,5 | 71,0 | 73,0 |
| Documenti, OCR e grafici | 83,9 | 71,6 | 79,1 | 84,3 | 85,7 | 84,4 | 82,3 |
| Matematica e logica | 68,8 | 41,0 | 61,0 | 78,4 | 79,3 | 77,3 | 66,7 |
| Visual grounding | 77,3 | 72,6 | 61,2 | 67,0 | 74,1 | 72,7 | 63,5 |
| Embodied reasoning | 64,4 | 57,9 | 51,2 | 63,2 | 59,1 | 61,5 | 50,3 |
| GUI understanding | 83,1 | 81,5 | 67,2 | 81,1 | 76,1 | 82,5 | 71,0 |
| Video | 61,2 | 54,0 | 57,0 | 67,5 | 58,9 | 72,8 | 70,0 |
| Multilingue | 84,4 | 76,2 | 78,6 | 83,9 | 86,1 | 82,1 | 85,8 |
| Agentic | 42,5 | 32,9 | 15,2 | 31,3 | 43,6 | 56,1 | 62,4 |
| Media su 62 benchmark | 71,4 | 62,1 | 64,0 | 73,4 | 71,7 | 73,4 | 70,0 |
In media LFM3-VL-2B supera di 7,4 punti Qwen3.5-2B, il concorrente più vicino per dimensioni, e pareggia Gemma 4 12B (71,4 contro 71,7), un modello oltre 6 volte più grande. È il migliore della tabella in visual grounding, embodied reasoning e GUI understanding.
Ci sono però due dettagli che l'annuncio non mette in evidenza. Il primo: nella stessa model card Qwen3.5-4B, circa due volte più grande, ha una media di 73,4, due punti sopra LFM3-VL-2B. Il secondo: il reasoning conta molto. Senza thinking la media scende a 62,1 e la categoria matematica perde quasi 28 punti.
LFM3-VL-2B contro Qwen3.5-27B
Il confronto ufficiale arriva fino a Gemma 4 12B. Aggiungiamo Qwen3.5-27B, nativamente multimodale e con circa 14 volte i parametri di LFM3-VL-2B. I suoi valori sono quelli dichiarati da Qwen: varianti dei benchmark e prompt possono essere diversi.
| Benchmark | LFM3-VL-2B | Gemma 4 12B | Qwen3.5-27B |
|---|---|---|---|
| MMMU (val) | 55,7 | 76,7 | 82,3 |
| MathVista (mini) | 84,2 | 80,4 | 87,8 |
| MATH-Vision | 51,6 | 73,8 | 86,0 |
| MMStar | 74,4 | 77,7 | 81,0 |
| RealWorldQA | 79,3 | 76,9 | 83,7 |
| HallusionBench | 65,6 | 68,9 | 70,0 |
| CharXiv (reasoning) | 70,2 | 77,1 | 79,5 |
| RefCOCO (media) | 90,5 | 82,2 | 90,9 |
| EmbSpatial-Bench | 82,9 | 80,2 | 84,5 |
| ScreenSpot-Pro | 55,5 | 25,2 | 70,3 |
| V* (senza code interpreter) | 86,4 | 69,6 | 89,0 |
| Video-MME (senza sottotitoli) | 62,8 | 62,1 | 82,8 |
| MLVU | 71,3 | 53,9 | 85,9 |
| LVBench | 41,2 | 36,5 | 73,6 |
Su percezione e grounding il distacco è minimo: su RefCOCO, EmbSpatial, MathVista e V* LFM3-VL-2B resta entro 4 punti dal modello da 27B. Il divario cresce invece sui task che richiedono conoscenza e reasoning complesso (MMMU, MATH-Vision) e soprattutto sui video lunghi: 32 punti su LVBench e 20 su Video-MME.
Caso d'uso: scontrini in JSON e ispezioni video
Scenario: un'app per le note spese legge le foto degli scontrini, mentre una squadra di manutenzione fa analizzare i difetti ripresi con il telefono. Tutto resta sul dispositivo.
Scontrino in JSON
Scontrino in JSON
Avvia il server con i sampling parameter della model card. --no-reasoning-preserve evita di conservare nella history il reasoning dei turni precedenti:
llama serve -hf LiquidAI/LFM3-VL-2B-GGUF:Q8_0 \
--temp 0.1 --top-p 1.0 --top-k 50 --min-p 0.0 --repeat-penalty 1.1 \
--no-reasoning-preserve --port 8080
Invia l'immagine come data URI in base64 e chiedi un JSON. Il server separa il reasoning dalla risposta, quindi message.content contiene solo l'output finale:
import base64
import json
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="none")
with open("scontrino.jpg", "rb") as f:
image_b64 = base64.b64encode(f.read()).decode()
prompt = (
"Estrai dallo scontrino un oggetto JSON con le chiavi "
"esercente, data (AAAA-MM-GG), totale (numero) e righe "
"(lista di oggetti con descrizione e importo). "
"Rispondi solo con il JSON."
)
response = client.chat.completions.create(
model="lfm3-vl-2b",
messages=[{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{image_b64}"}},
{"type": "text", "text": prompt},
],
}],
temperature=0.1,
)
text = response.choices[0].message.content.strip()
text = text.removeprefix("```json").removesuffix("```").strip()
receipt = json.loads(text)
print(receipt["totale"], len(receipt["righe"]))
Controlla sempre i campi estratti, per esempio verificando che la somma delle righe corrisponda al totale. Per formati ricorrenti Liquid AI offre un notebook SFT pensato proprio per estrarre JSON dalle foto degli scontrini.
Ispezione da video
Ispezione da video
Con llama cli -st (single turn) poni una sola domanda su un video e il programma termina dopo la risposta. Serve ffmpeg nel PATH:
llama cli -st -hf LiquidAI/LFM3-VL-2B-GGUF:Q8_0 \
--temp 0.1 --top-p 1.0 --top-k 50 --min-p 0.0 --repeat-penalty 1.1 \
--video sopralluogo.mp4 \
-p "Elenca i difetti visibili sulla facciata, nell'ordine in cui compaiono, e indica quale sembra più urgente."
In llama.cpp questo modello campiona sempre a 2 fps, da 4 a 768 frame, e --video-fps viene ignorato. Oltre i 6 minuti e mezzo circa scatta il limite dei 768 frame. Ogni frame occupa token di contesto, quindi con clip brevi e mirate ottieni risultati più affidabili.
mmproj Q8_0 esplicito
mmproj Q8_0 esplicito
Per scegliere tu quale projector caricare, scarica i file e passali a mano:
hf download LiquidAI/LFM3-VL-2B-GGUF \
LFM3-VL-2B-Q8_0.gguf mmproj-LFM3-VL-2B-Q8_0.gguf --local-dir models
llama serve -m models/LFM3-VL-2B-Q8_0.gguf \
--mmproj models/mmproj-LFM3-VL-2B-Q8_0.gguf \
--temp 0.1 --top-p 1.0 --top-k 50 --min-p 0.0 --repeat-penalty 1.1 \
--no-reasoning-preserve --port 8080
Il projector Q8_0 pesa 0,20 GB, quello F16 0,38 GB.
LFM3-Omni-2B: vede, ascolta e risponde a voce
LFM3-Omni-2B è il primo modello omni di Liquid AI: un unico modello end-to-end da 2,17 miliardi di parametri che capisce testo, immagini, video e audio e risponde in testo, voce a 24 kHz o entrambi. Secondo Liquid AI prende il posto di quattro componenti separati: ASR, vision-language model, LLM e TTS.
La caratteristica più interessante è che vede e ascolta nello stesso momento. Con un video riceve frame e traccia audio in modo interleaved, quindi può rispondere a domande che richiedono entrambi. Per la voce supporta 19 lingue e varianti regionali, italiano incluso. È un modello non-reasoning, con 32K token di contesto.
Benchmark di LFM3-Omni-2B
| Benchmark | LFM3-Omni-2B | Qwen2.5-Omni-3B | Qwen2.5-Omni-7B | Gemma 4 E4B | Phi-4 multimodal |
|---|---|---|---|---|---|
| Parametri totali | 2,2 B | 6 B | 10,7 B | 8 B | 5,6 B |
| Daily-Omni (video + audio) | 70,09 | 58,81 | 61,32 | 54,14 | 48,87 |
| WorldSense (video + audio) | 47,10 | 44,99 | 45,37 | 43,51 | 42,37 |
| AV-SpeakerBench | 46,79 | 40,44 | 43,24 | 36,36 | 37,95 |
| OmniBench (immagine + audio) | 46,32 | 47,11 | 49,65 | 20,67 | 38,97 |
| RealWorldQA (domanda a voce) | 64,68 | 61,05 | 69,93 | 49,02 | 64,31 |
| EmbSpatial (domanda a voce) | 67,59 | 53,40 | 59,51 | 54,01 | 42,60 |
| VoiceBench | 64,73 | 66,37 | n.d. | 72,90 | 64,97 |
| ASR inglese, WER (più basso è meglio) | 6,36 | 6,30 | n.d. | 7,82 | 5,14 |
Sui task video con audio LFM3-Omni-2B supera tutti i modelli del confronto, compreso Qwen2.5-Omni-7B, che ha circa 5 volte i parametri. Su Daily-Omni il margine è di quasi 9 punti. Con domande a voce sulle immagini è vicino, e a volte superiore, a modelli molto più grandi. Nella voice chat pura (VoiceBench) resta invece sotto Gemma 4 E4B e Qwen2.5-Omni-3B.
LFM3-Omni-2B contro Qwen3-Omni-30B-A3B
Per un confronto con un modello circa 14 volte più grande abbiamo scelto Qwen3-Omni-30B-A3B, un MoE da 30 miliardi di parametri totali e 3 miliardi attivi per token. I suoi punteggi sono dichiarati da Qwen. Come sanity check: su WorldSense Qwen riporta 45,4 per Qwen2.5-Omni-7B, e Liquid AI misura 45,37 per lo stesso modello.
| Benchmark | LFM3-Omni-2B | Qwen3-Omni-30B-A3B | Note |
|---|---|---|---|
| WorldSense | 47,10 | 54,0 | Variante Instruct |
| Daily-Omni | 70,09 | 75,8 | Solo la variante Thinking è dichiarata |
| MMStar | 55,67 | 68,5 | Input testuale, variante Instruct |
| MMMU (val) | 42,44 | 69,1 | Variante Instruct |
| VoiceBench | 64,73 | 85,5 | Media sugli stessi 9 subset |
Sui video con audio il distacco è contenuto: 7 punti su WorldSense e meno di 6 su Daily-Omni, contro un modello Thinking da 30B. Cresce molto invece su conoscenza visiva (MMMU) e voice chat (VoiceBench). Poi c'è il costo: Qwen indica per Qwen3-Omni-30B-A3B-Instruct almeno 78,85 GB di memoria GPU in BF16 per un video di 15 secondi, mentre i file Q8_0 di LFM3-Omni-2B, modello e mmproj, pesano in tutto circa 2,4 GB.
Caso d'uso: un assistente vocale che vede
Scenario: un tecnico inquadra un quadro elettrico e chiede a voce cosa indica una spia, oppure carica un breve video con audio per capire quale componente fa rumore. Avvia il server con --reasoning off, perché il modello non è addestrato per il reasoning, e usa greedy decoding (--temp 0) per l'output testuale:
llama serve -hf LiquidAI/LFM3-Omni-2B-GGUF:Q8_0 --reasoning off --temp 0 --port 8080
Domanda vocale su una foto
Domanda vocale su una foto
Invia nello stesso messaggio l'immagine e la registrazione della domanda. I system prompt in inglese sono quelli indicati nella model card, mentre la domanda può essere in italiano:
import base64
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="none")
def b64(path):
with open(path, "rb") as f:
return base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="lfm3-omni-2b",
messages=[
{
"role": "system",
"content": "Answer questions about the provided image. "
"Base every answer only on what can be seen. Respond with text.",
},
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64('quadro.jpg')}"}},
{"type": "input_audio", "input_audio": {"data": b64("domanda.wav"), "format": "wav"}},
],
},
],
temperature=0,
)
print(response.choices[0].message.content)
llama.cpp riconosce il formato audio dal contenuto del file (wav, mp3, flac).
Video con traccia audio
Video con traccia audio
Con il system prompt della model card il modello vede i frame e ascolta l'audio del video. Serve ffmpeg nel PATH:
llama cli -st -hf LiquidAI/LFM3-Omni-2B-GGUF:Q8_0 \
--video motore.mp4 \
-sys "Answer questions about the video using what you see and hear." \
-p "Da quale parte del motore sembra provenire il rumore metallico?" --temp 0
In llama.cpp il video viene campionato a 2 fps, da 4 a 384 frame. La traccia audio invece viene sempre elaborata per intero.
Voice chat in tempo reale
Voice chat in tempo reale
Lo stesso server espone il WebSocket /v1/realtime, compatibile con la Realtime API di OpenAI. L'audio viene elaborato mentre arriva, quindi la risposta parte subito dopo l'ultimo chunk. Il repository di llama.cpp include un client di esempio:
git clone --depth 1 --branch v0.8.0 https://github.com/ggml-org/llama.cpp
pip install "openai[realtime]" numpy
python llama.cpp/examples/realtime_client.py \
--url http://127.0.0.1:8080/v1 \
--output-modalities text,audio --out risposta.wav domanda.wav
Il client legge file wav PCM16 e salva la risposta vocale in risposta.wav. Con --output-modalities text,audio usa il system prompt della model card per ottenere testo e voce interleaved.
LFM3-Audio-2B: voce, trascrizione e comandi vocali
LFM3-Audio-2B è il modello audio completo della famiglia: riceve testo o audio e risponde con testo, voce o entrambi. Combina il backbone LFM3 con un causal audio encoder e il nuovo audio tokenizer LiquidCodec, entrambi sviluppati da Liquid AI:
- Voice chat con risposte in streaming; quando la risposta è solo testo, il modello può usare il reasoning.
- ASR, TTS e traduzione in 18 lingue, italiano incluso, più la trascrizione live in inglese.
- Audio understanding: domande su parlato, suoni ed eventi presenti in una registrazione.
- Tool calling da comandi vocali, per controllare app e dispositivi.
L'encoder causale elabora l'audio del microfono mentre l'utente parla, e Liquid AI dichiara un time to first token fino a 50 ms. LiquidCodec rappresenta 80 ms di voce con 12 token e genera l'audio circa 87 volte più veloce del real time su un singolo thread CPU di un Apple M4 Max.
Benchmark di LFM3-Audio-2B
| Benchmark | LFM3-Audio-2B | LFM2.5-Audio-1.5B | Gemma 4 E4B (8B) | Qwen2.5-Omni-3B (6B) | Voxtral Mini 3B (5B) | Kimi-Audio-7B (10B) |
|---|---|---|---|---|---|---|
| ASR inglese, WER (più basso è meglio) | 6,23 | 6,13 | 7,82 | 6,30 | 5,51 | 5,3 |
| ASR multilingue, WER/CER (più basso è meglio) | 6,03 | n.d. | 6,54 | 7,41 | 7,76 | n.d. |
| TTS inglese, UTMOSv2 (1-5) | 3,83 | 3,22 | n.d. | 3,42 | n.d. | n.d. |
| VoiceBench | 73,13 | 55,17 | 72,90 | 66,37 | 65,78 | 76,9 |
| Tool calling (eval interna) | 58,50 | n.d. | 72,40 | 44,30 | 44,50 | 50,6 |
| Audio understanding (MMAR) | 50,60 | 25,85 | 49,10 | 54,41 | 50,10 | 53,3 |
LFM3-Audio-2B è il migliore della tabella nell'ASR multilingue (media su 9 lingue di FLEURS, italiano incluso) e nella qualità del TTS in inglese. Rispetto a LFM2.5-Audio raddoppia il punteggio MMAR e guadagna 18 punti su VoiceBench. Non vince ovunque: Gemma 4 E4B fa meglio nel tool calling da voce e Kimi-Audio-7B su VoiceBench e ASR inglese. I valori di Kimi-Audio-7B provengono dalle tabelle del blog, con una cifra decimale.
Caso d'uso: verbali di riunione e comandi vocali offline
Scenario: un piccolo studio vuole trascrivere le riunioni in italiano, generare avvisi vocali e controllare la sala riunioni con la voce, senza mandare l'audio a servizi esterni.
Trascrizione in italiano
Trascrizione in italiano
Converti la registrazione in wav mono a 16 kHz, il sample rate dell'encoder. Per sicurezza dividila in segmenti brevi, perché il contesto del modello è di 32K token:
ffmpeg -i riunione.m4a -ac 1 -ar 16000 -c:a pcm_s16le riunione.wav
ffmpeg -i riunione.wav -f segment -segment_time 120 -c copy parte_%03d.wav
Trascrivi ogni segmento con il system prompt della model card:
for f in parte_*.wav; do
llama cli -st -hf LiquidAI/LFM3-Audio-2B-GGUF:Q8_0 \
--audio "$f" -sys "Perform ASR in Italian." -p "<__media__>" --temp 0 \
>> verbale.txt
done
-st esegue un solo turno e poi chiude il programma, così il ciclo passa al file successivo. <__media__> indica dove inserire l'audio nel prompt. Con Perform ASR. il modello riconosce da solo la lingua.
Text-to-speech
Text-to-speech
Avvia il server. L'endpoint POST /tts restituisce un file wav e accetta lingua e voce (female o male):
llama serve -hf LiquidAI/LFM3-Audio-2B-GGUF:Q8_0 --port 8080
curl -X POST http://127.0.0.1:8080/tts \
-H "Content-Type: application/json" \
-d '{"input": "La riunione delle 15 è spostata in sala due.", "lang": "it", "voice": "female"}' \
-o avviso.wav
I sampling parameter audio della model card sono già salvati nel GGUF. Il modello non supporta il voice cloning.
Comandi vocali con tool
Comandi vocali con tool
Con il server avviato, il client realtime di llama.cpp mette a disposizione un tool di esempio, set_volume. Il modello trasforma il comando vocale in una tool call, il client la esegue e restituisce il risultato al modello:
python llama.cpp/examples/realtime_client.py \
--url http://127.0.0.1:8080/v1 --tools comando.wav
In un'applicazione reale sostituisci il tool di esempio con le tue funzioni, per esempio luci, proiettore o calendario. Il system prompt consigliato è Respond with function calls, and interleaved text and audio. seguito dall'elenco dei tool.
Come leggere i confronti tra benchmark
I confronti con Qwen3.5-27B e Qwen3-Omni-30B-A3B mettono insieme numeri prodotti da laboratori diversi, con harness, prompt e versioni dei benchmark diverse. Per capire quanto possono divergere, abbiamo confrontato i valori che Liquid AI misura per Qwen3.5-9B con quelli che Qwen dichiara per lo stesso modello.
| Benchmark | Misura Liquid AI | Dichiarato da Qwen | Differenza |
|---|---|---|---|
| GPQA Diamond | 80,40 | 81,7 | -1,3 |
| IFEval | 92,08 | 91,5 | +0,6 |
| AA-LCR | 62,00 | 63,0 | -1,0 |
| BFCL V4 | 62,83 | 66,1 | -3,3 |
| LiveCodeBench v6 | 69,86 | 65,6 | +4,3 |
| IFBench | 48,84 | 64,5 | -15,7 |
Licenza e limiti di LFM3
LFM Open License v1.0
I pesi sono open e scaricabili. L'uso commerciale è consentito alle organizzazioni con un fatturato annuo inferiore a 10 milioni di dollari. Oltre questa soglia la licenza non copre l'uso commerciale, quindi serve un accordo separato con Liquid AI. Le organizzazioni non profit qualificate sono esenti per usi non commerciali e di ricerca.
Limiti dichiarati
I modelli testo e audio non sono consigliati per agentic coding e reasoning complesso. Il modello vision non è consigliato per coding e conversazioni multi-turn. Sulla conoscenza fattuale i modelli da 2B restano lontani da quelli più grandi: affiancali a retrieval o ricerca web.
Domande frequenti su LFM3
Quale modello LFM3 devo scegliere?
Per agenti, tool calling ed estrazione di dati da testo usa LFM3-1.7B. Per documenti, screenshot, foto e video usa LFM3-VL-2B. Per ASR, TTS e assistenti vocali usa LFM3-Audio-2B. Scegli LFM3-Omni-2B quando lo stesso assistente deve vedere e ascoltare insieme, per esempio domande a voce su un'immagine o video con audio.
Quanta memoria serve per eseguire LFM3 in Q8_0?
Il file Q8_0 pesa 1,85 GB per tutti e quattro i modelli; VL, Audio e Omni aggiungono un projector da 0,20 a 0,54 GB. A questi valori va sommata la KV cache, che cresce con il contesto. Secondo una nostra stima, con contesti brevi 4 GB di memoria libera sono un punto di partenza ragionevole. Per il modello testuale Liquid AI indica una KV cache di 1,6 GB a 128K token.
LFM3 funziona in italiano?
Sì. L'italiano è tra le 16 lingue testuali di LFM3-1.7B, LFM3-VL-2B e LFM3-Omni-2B, ed è supportato anche per la voce da LFM3-Audio-2B e LFM3-Omni-2B, per ASR, TTS e traduzione. La trascrizione live è disponibile solo in inglese.
Quale versione di llama.cpp supporta LFM3?
Serve llama.cpp v0.8.0, cioè la build b11960, o una versione successiva. Il supporto include testo, immagini, video, input audio, TTS e voice chat realtime con tool call. In alternativa puoi usare Ollama su macOS (dalla versione 0.40.12), LM Studio o l'app Llama.
LFM3 è migliore di Qwen3.5?
Dipende dal compito. Nei benchmark di Liquid AI LFM3-1.7B supera Qwen3.5-9B su agenti web, automazione e instruction following, mentre perde su conoscenza, agentic coding e long context. LFM3-VL-2B supera Qwen3.5-2B ma resta sotto Qwen3.5-4B nella media dei benchmark vision. Il vantaggio più netto di LFM3 è l'efficienza: è più veloce e usa meno memoria a parità di qualità.
Posso fare fine-tuning dei modelli LFM3?
Sì, è uno degli obiettivi dichiarati della famiglia. Liquid AI pubblica notebook per SFT, DPO, GRPO e continued pre-training con TRL per il modello testuale, e notebook con Transformers per VL, Audio e Omni. Il fine-tuning di ogni modello è possibile su una singola GPU.
Fonti
Dati aggiornati al 29 ottobre 2026. I benchmark di LFM3 sono quelli pubblicati da Liquid AI e non li abbiamo verificati in modo indipendente. I punteggi di Qwen3.5-27B, Qwen3.5-9B e Qwen3-Omni-30B-A3B sono quelli dichiarati da Qwen. Le medie senza AA-Omniscience, i rapporti tra parametri e le differenze tra punteggi sono calcoli nostri. I comandi seguono la documentazione ufficiale di llama.cpp v0.8.0 e delle model card, mentre i casi d'uso sono esempi illustrativi.
References
- Liquid AI: Introducing LFM3, Every Modality for Specialized Intelligence (27 ottobre 2026)
- Hugging Face: model card LiquidAI/LFM3-1.7B
- Hugging Face: model card LiquidAI/LFM3-VL-2B
- Hugging Face: model card LiquidAI/LFM3-Omni-2B
- Hugging Face: model card LiquidAI/LFM3-Audio-2B
- Hugging Face: LiquidAI/LFM3-1.7B-GGUF
- Hugging Face: LiquidAI/LFM3-VL-2B-GGUF
- Hugging Face: LiquidAI/LFM3-Omni-2B-GGUF
- Hugging Face: LiquidAI/LFM3-Audio-2B-GGUF
- GitHub: llama.cpp release v0.8.0
- GitHub: README del server llama.cpp (v0.8.0)
- GitHub: README di llama.cpp TTS (v0.8.0)
- GitHub: llama.cpp examples/realtime_client.py (v0.8.0)
- Hugging Face: model card Qwen/Qwen3.5-27B
- Hugging Face: model card Qwen/Qwen3.5-9B
- Hugging Face: model card Qwen/Qwen3-Omni-30B-A3B-Instruct
- Hugging Face: LFM Open License v1.0