← Indice documentazione Microprogettazione › fast-path introvertivo

Metnos

fast-path introvertivo — come l'assistente impara a rispondere subito
Microprogettazione

Pubblico: chi vuole capire perché Metnos a volte risponde in mezzo secondo
e a volte ci mette dieci.
Lettura: 10 minuti.

Indice

  1. L'idea in due righe
  2. Perché serve un fast-path
  3. I due livelli
  4. L0 — cache auto-prodotta (fastpath.py)
  5. L1 — autopath promossi da feedback (autopath.py)
  6. Invecchiamento, morte e eredità
  7. L'estrattore di argomenti
  8. Configurazione
  9. Promozione a executor sintetico

1. L'idea in due righe

Quando una richiesta arriva a Metnos, prima di scomodare il pianificatore LLM si cerca di riconoscerla. Se l'abbiamo già vista e abbiamo già deciso bene come rispondere, la rieseguiamo così com'è e torniamo all'utente in mezzo secondo invece che in dieci. Niente modelli linguistici nel percorso critico, solo memoria.

richiesta query utente L0 fastpath hash + cosine L1 autopath feedback ✓ cluster motore Engine v2
Figura 1 — I livelli di memoizzazione prima del motore: L0 fastpath (hash + cosine), L1 autopath (feedback utente); se nessuno scatta, la richiesta passa al motore (Engine v2).

2. Perché serve un fast-path

Il pianificatore di Metnos è un Qwen 3.6 35B-A3B locale: pensa bene ma ci mette circa dodici secondi a decidere il primo passo di un turno. Per molte richieste questa attesa è spropositata. «Che ora è» non ha bisogno di un LLM: ha bisogno di get_now. Anche «scaricami questa pagina e descrivila in due righe» non ha bisogno del pianificatore se è una richiesta che facciamo spesso e di cui sappiamo già la sequenza: get_urls e poi describe_entries.

Da qui la domanda: come riconosciamo che una richiesta è già nota? E come ci accorgiamo che quasi nota è abbastanza? La risposta è il fast-path introvertivo, organizzato in due livelli — ciascuno coglie un grado diverso di certezza, e tutti convergono allo stesso esito: l'assistente esegue la sequenza giusta senza pensarci due volte.

3. I due livelli

LivelloCosa riconosceComeCosto per ogni hit
L0Una richiesta già risolta con successo, identica o semanticamente molto vicinaHash esatto (0a) + cosine BGE-M3 (0b)< 5 ms (hash) / < 150 ms (cosine)
L1Un intent appartenente a un cluster confermato dall'utente tramite feedback positivoIntent hash + cluster_id lookup~30 ms

Il flusso è rigorosamente sequenziale: prima si tenta L0, se non matcha si tenta L1. Se entrambi mancano, si arriva al pianificatore LLM (Engine v2) come sempre.

Nota. Il pianificatore non sparisce: il fast-path è un percorso aggiuntivo, non sostitutivo. Quando la richiesta è nuova, ambigua, o sotto la soglia di una qualunque delle ricerche, il pianificatore prende le redini come se il fast-path non ci fosse.

4. L0 — cache auto-prodotta (fastpath.py)

Il primo livello vive in runtime/engine/fastpath.py e gestisce un database SQLite (fastpaths.sqlite) di piani già eseguiti. Le entry si producono in automatico: ogni volta che un turno si completa con successo (piano pieno dal motore, hit L1, o promozione da cosine 0b), Metnos registra la query canonica, il suo hash, l'embedding BGE-M3, il piano completo (framework) e l'intent (verbo + oggetto). Non serve nessuna approvazione: le catene sono fatte di executor già vagliati e testati.

Due sotto-livelli di match

La ricerca avviene in due fasi:

Auto-produzione e auto-guarigione. Se un fastpath viene eliminato (per invecchiamento, morte, o feedback negativo dell'utente), si ricrea da solo alla prossima ripetizione riuscita. Questa proprietà rende la potatura a basso costo: i default possono essere aggressivi senza rischio di perdite permanenti.

Valvole di sicurezza

5. L1 — autopath promossi da feedback (autopath.py)

Il secondo livello vive in runtime/engine/autopath.py e opera su una logica diversa: non ripete la stessa query, ma generalizza a un cluster di intent confermato dal feedback positivo dell'utente.

Quando l'utente dà un feedback «✓», Metnos registra il framework del turno, il suo hash e il cluster semantico (intent hash + cluster ID). Dopo un numero minimo di conferme (configurabile, default 1) sullo stesso framework hash e cluster, il piano diventa una autopath riusabile: la prossima volta che arriva un intent nello stesso cluster, il piano viene rieseguito senza passare dal pianificatore.

Anti-autopath e champion/challenger

Confine L0 vs L1. L0 è la ripetizione della stessa query (ammette piani query-specific, via hash esatto). L1 è la generalizzazione a un cluster/intent col consenso esplicito dell'utente. Il fast-path L0 vince sempre (primo in cascata): anche se L1 ha un autopath per quell'intent, un fastpath esatto salta l'intera catena.

6. Invecchiamento, morte e eredità

I fastpath L0 invecchiano e muoiono in modo deterministico, senza alcun intervento LLM. Il job notturno task_state_reaper applica tre regole di invecchiamento e quattro condizioni di morte.

Invecchiamento (aging)

RegolaCriterioDefaultEnv
Mai riusatoCreato da oltre N giorni ma mai servito una seconda volta14 giorniMETNOS_FASTPATH_GRACE_DAYS
StantioUltimo uso oltre N giorni fa30 giorniMETNOS_FASTPATH_STALE_DAYS
Cap LRUTotale entry superiore al tetto; le meno recenti vengono potate500METNOS_FASTPATH_MAX

Morte (solo con catalogo completo)

CodiceCausaEredità
C1Un tool nel piano non esiste più nel catalogo (ritirato, rinominato, archiviato). Il replay fallirebbe.No
C2 provenienzaIl fastpath è stato promosso a executor sintetico (vedi §9) e quell'executor è ora nel catalogo.
C2 nomeEsiste un executor con nome {verbo}_{oggetto} corrispondente all'intent, ma nessun tool del piano appartiene a quella famiglia. Il fastpath oscurerebbe l'executor.
C2 prefilterPer i piani multi-step: il prefilter di routing deterministico sulla query canonica indica che un singolo executor copre l'intent (anche con nome diverso).

Eredità dei punti

Quando un fastpath muore per superamento (C2), i suoi conteggi d'uso (n_uses) vengono trasferiti all'executor erede tramite il sistema di aging degli executor. La domanda accumulata non va persa.

Economia dell'auto-produzione. Un fastpath potato per errore si ricrea da solo alla prossima ripetizione riuscita. La potatura costa zero e i default possono essere aggressivi.

7. L'estrattore di argomenti

Riconoscere la richiesta è metà del lavoro. L'altra metà è ricostruire i valori concreti degli argomenti: quali path, quali URL, quale data, quale soglia. Metnos ha un estrattore deterministico (args_extractor.py) che lavora a regole:

8. Configurazione

I parametri del fast-path sono controllati da variabili d'ambiente METNOS_*. Un file TOML (~/.config/metnos/runtime.toml) stabilisce valori persistenti; il default codificato nel modulo è l'ultima rete di sicurezza.

Layer 0 (fastpath)

VariabileDefaultSignificato
METNOS_FASTPATH_STALE_DAYS30Giorni calendario dopo cui una entry non usata viene potata
METNOS_FASTPATH_GRACE_DAYS14Giorni di grazia per entry mai riusate
METNOS_FASTPATH_MAX500Tetto massimo righe (LRU)

Layer 1 (autopath)

VariabileDefaultSignificato
METNOS_AUTOPATH_MIN_OBS1Osservazioni positive minime per promuovere un autopath
METNOS_AUTOPATH_TTL_ANTI2592000 (30 gg)Durata di un'anti-autopath in secondi
METNOS_AUTOPATH_TTL_REPEAT3600 (1 h)Finestra soft per feedback ripetuti

Promozione a executor

VariabileDefaultSignificato
METNOS_FP_PROMOTE_MIN_CLUSTER3Fastpath distinti minimo nel cluster
METNOS_FP_PROMOTE_MIN_USES15Uso cumulato minimo
METNOS_FP_PROMOTE_MIN_AGE_DAYS30Età minima del cluster
METNOS_FP_PROMOTE_MAX_PER_NIGHT3Massimo emissioni nuove per notte
METNOS_FASTPATH_AUTOPROMOTEoffAbilita auto-promozione Tier 2 (senza approvazione)

9. Promozione a executor sintetico

Quando un gruppo di fastpath L0 ricorrenti condivide la stessa struttura di piano (framework hash) e lo stesso intent, un job notturno (task_fastpath_promotion) li valuta come candidati per diventare un executor sintetico completo. La promozione è cluster-based, mai per singola istanza: servono almeno 3 fastpath distinti, 15 utilizzi cumulati e 30 giorni di età. Solo i pattern multi-step vengono promossi: quelli a step singolo hanno già il loro executor, e il valore del fastpath lì è saltare l'LLM, non il piano.

Due tier di promozione

Provenienza

Ogni candidato emesso registra gli ID e gli hash canonici dei fastpath d'origine in una tabella promotions. Quando l'executor entra nel catalogo, la morte C2 per provenienza è esatta: il legame fra il fastpath originale e il suo erede è registrato, non inferito dal nome.

© 2026 Roberto Brunialti · documentazione Metnos