Introduzione

  • Il limite degli agenti AI non dipende solo dalla dimensione del modello, ma anche dall’abilità nella “gestione del contesto”. È come configurare la memoria per una CPU, determinando la profondità e l’efficienza del pensiero dell’agente.
  • La finestra di contesto non è un bidone della spazzatura: il sovraccarico di informazioni può “contaminare”, disturbare e confondere il giudizio dell’AI. La precisione è molto più importante della quantità.
  • Gli esperti usano le quattro tecniche di “Scrittura, Filtraggio, Compressione e Isolamento” per gestire il contesto dell’AI, massimizzando l’uso della “memoria” limitata per ottenere una riduzione dei costi e un aumento dell’efficienza.
  • La competizione futura sarà una competizione di efficienza dei sistemi. Isolare i compiti usando un’architettura multi-agente, permettendo a ciascun agente di dare il massimo nella propria piccola finestra, è la chiave per costruire sistemi complessi di compiti.

Riepilogo Chiave

Gli agenti (Agent) svolgono i loro compiti grazie al contesto (Context). L’ingegneria del contesto è l’arte e la scienza di iniettare informazioni appropriate nella finestra di contesto dell’agente in ogni fase del suo compito. In questo articolo, sintetizzeremo le strategie di ingegneria del contesto adottate dagli attuali agenti di punta in alcune categorie generali.

Ingegneria del Contesto

Ingegneria del Contesto

Come ha detto Andrej Karpathy, i modelli linguistici di grandi dimensioni (LLM) sono come un “nuovo sistema operativo”. LLM è la CPU, mentre la sua “finestra di contesto” funge da RAM, rappresentando la memoria di lavoro del modello. Proprio come la capacità della RAM è limitata, la finestra di contesto di un LLM affronta anche delle limitazioni di capacità quando si tratta di gestire fonti diverse di contesto. Uno dei compiti principali di un sistema operativo è gestire come utilizzare efficacemente la RAM della CPU, e “l’ingegneria del contesto” svolge un ruolo simile. Karpathy riassume benissimo questo concetto:

L’ingegneria del contesto è “…un’arte e scienza sofisticata per riempire con precisione la finestra di contesto per il passo successivo (di calcolo).”

Ingegneria del Contesto

Quando costruiamo applicazioni LLM, quali tipi di contesto dobbiamo gestire? Il concetto complessivo di ingegneria del contesto include i seguenti diversi tipi di contesto:

  • Istruzioni (Instructions) – frasi di invito, memoria, esempi con pochi campioni, descrizioni degli strumenti, ecc.
  • Conoscenza (Knowledge) – fatti, memoria, ecc.
  • Strumenti (Tools) – informazioni di feedback sulle chiamate di strumenti.

Ingegneria del Contesto per Agenti

Quest’anno, con il miglioramento delle capacità di ragionamento e di chiamata di strumenti degli LLM, l’interesse per gli agenti è cresciuto notevolmente. Gli agenti eseguono compiti alternando chiamate a LLM e strumenti, mostrano particolari abilità nel gestire compiti complessi a lungo termine.

Ingegneria del Contesto per Agenti

Tuttavia, i compiti a lungo termine e il feedback accumulato dalle chiamate agli strumenti significano che gli agenti tendono a consumare un gran numero di token. Questo può dar luogo a vari problemi: superare i limiti di capacità della finestra di contesto, aumentando i costi e i ritardi, e persino riducendo le prestazioni degli agenti. Drew Breunig ha chiaramente evidenziato che un contesto eccessivamente lungo può portare a problemi di prestazione in vari modi:

  • Contaminazione del Contesto (Context Poisoning): quando informazioni errate (hallucination) entrano nel contesto.
  • Distrazione del Contesto (Context Distraction): quando troppi elementi di contesto sommersano la conoscenza originale addestrata nel modello.
  • Confusione del Contesto (Context Confusion): quando informazioni di contesto irrilevanti influenzano le risposte del modello.
  • Conflitto del Contesto (Context Clash): quando le diverse parti del contesto si contraddicono.

Considerando questi problemi, la Cognition AI sottolinea l’importanza dell’ingegneria del contesto:

“L’ingegneria del contesto”… è, di fatto, il compito principale per gli ingegneri che costruiscono agenti AI.

Anche la Anthropic ha affermato chiaramente:

Gli agenti spesso hanno bisogno di condurre centinaia di turni di dialogo, il che richiede l’adozione di strategie di gestione del contesto prudenti.

Come stanno affrontando l’attuale sfida gli sviluppatori? Ho riassunto i metodi esistenti in quattro categorie: **Scrittura (Write), Filtraggio (Select), Compressione (Compress) e Isolamento (Isolate)**—e fornirò esempi per ciascuna.

Tipo di Memoria

Scrivere il Contesto (Write Context)

Scrivere il contesto significa conservare informazioni al di fuori della finestra di contesto per l’uso durante l’esecuzione di un compito da parte dell’agente.

Area di Scratch (Scratchpads)

Quando gli esseri umani risolvono problemi, prendono appunti e ricordano alcune cose da usare in compiti futuri. Anche gli agenti stanno acquisendo gradualmente queste capacità! Prendere appunti in un’“area di scratch” è un modo per persistente informazioni durante un compito effettuato da un agente. L’idea principale è di conservare informazioni al di fuori della finestra di contesto, ma accessibili all’agente in qualsiasi momento. Il sistema di ricerca multi-agente di Anthropic offre un chiaro esempio:

Il “capo ricercatore” inizia a riflettere su metodi per risolvere un problema e salva il piano nella “memoria” per permanere il contesto, poiché una volta superati i 200.000 token, il contesto potrebbe essere troncato e la conservazione del piano è cruciale.

Esistono vari modi per implementare un’area di scratch. Può essere una semplice chiamata di strumento, come scrivere un file; oppure un campo nello stato di runtime, che rimane invariato per l’intero periodo della sessione. Indipendentemente dal metodo, l’area di scratch consente all’agente di memorizzare informazioni utili per completare meglio il compito.

Memoria (Memories)

L’area di scratch aiuta l’agente a risolvere compiti all’interno di una singola sessione, ma a volte l’agente deve ricordare informazioni attraverso più sessioni. Il modello Reflexion ha introdotto l’idea di riflessione dopo ogni azione dell’agente e il riutilizzo di queste memorie generate autonomamente. Il modello Generative Agents consiglie di sintetizzare periodicamente memorie da un insieme di feedback del passato agente.

Questi concetti sono stati applicati in prodotti popolari come ChatGPT, Cursor e Windsurf. Tutti hanno meccanismi per generare automaticamente memorie a lungo termine basate su interazioni tra l’utente e l’agente.

Memorie

Filtrare il Contesto (Select Context)

Filtrare il contesto significa portare le informazioni necessarie nella finestra di contesto per aiutare l’agente nell’esecuzione del compito.

Area di Scratch (Scratchpad)

Il meccanismo di filtraggio del contesto dall’area di scratch dipende da come è stato implementato. Se è uno strumento, l’agente può leggerlo semplicemente attraverso una chiamata a uno strumento. Se è parte dello stato di runtime dell’agente, gli sviluppatori possono selettivamente esporre alcune parti dello stato all’agente in ogni fase. Questo fornisce un controllo fine su come fornire contesto dall’area di scratch all’LLM nei turni successivi.

Memoria (Memories)

Se l’agente è in grado di memorizzare, ha anche la necessità di selezionare memorie pertinenti al compito attuale. Questo è molto utile per diversi motivi: l’agente può scegliere esempi con pochi campioni (memoria contestuale) per apprendere schemi comportamentali attesi; può scegliere istruzioni (memoria programmatica) per guidare il proprio comportamento; oppure può selezionare fatti (memoria semantica) fornisce un contesto rilevante per il compito.

Memory Type

Una grande sfida è garantire che le memorie filtrate siano pertinenti. Alcuni agenti popolari utilizzano solo una piccola parte di file fissi che vengono sempre caricati nel contesto. Ad esempio, molti agenti di codice utilizzano file per salvare istruzioni (memoria programmatica) o, in alcuni casi, salvare esempi (memoria contestuale). Claude Code utilizza CLAUDE.md, mentre Cursor e Windsurf utilizzano file di regole.

Tuttavia, se un agente conserva un gran numero di fatti o relazioni (ad esempio di tipo “memoria semantica”), il filtraggio diventa più complesso. ChatGPT è un buon esempio, poiché memorizza e filtra da una vasta gamma di memorie esclusive per l’utente.

L’uso di embeddings vettoriali e/o graph di conoscenza è una tecnica comune di indicizzazione della memoria per assistere il filtraggio. Tuttavia, il filtraggio della memoria rimane pieno di sfide. Alla AI Engineer World Expo, Simon Willison ha condiviso un esempio in cui il filtraggio della memoria ha sbagliato: ChatGPT ha recuperato la sua posizione dalla memoria e l’ha inavvertitamente iniettata nell’immagine richiesta. Questo recupero di memoria inaspettato o indesiderato può far sentire ad alcuni utenti che la finestra di contesto “non gli appartiene più”!

Strumenti (Tools)

Gli agenti devono utilizzare strumenti, ma se gli strumenti forniti sono troppi, possono essere sopraffatti. Questo è spesso causato da descrizioni di strumenti che possono sovrapporsi, portando il modello a confondersi nella scelta dello strumento da utilizzare. Un metodo è applicare RAG (Retrieve-Augmented Generation) alle descrizioni degli strumenti, per recuperare gli strumenti più rilevanti per il compito in base alla similarità semantica. Alcuni articoli recenti dimostrano che questo approccio può triplicare la precisione nella scelta degli strumenti.

Conoscenza (Knowledge)

Il Retrieve-Augmented Generation (RAG) è di per sé un ampio argomento ed è una delle principali sfide dell’ingegneria del contesto. Gli agenti di codice sono uno dei migliori esempi dell’applicazione di RAG su larga scala. Varun di Windsurf ha riassunto bene alcune di queste sfide:

Indicizzare il codice ≠ Recuperare il contesto… ciò che stiamo facendo è analizzare il codice tramite AST (Abstract Syntax Tree) e suddividerlo lungo confini semanticamente significativi… Ma con la crescita delle dimensioni del codice, la ricerca tramite embeddings vettoriali come metodo di recupero diventa inaffidabile… dobbiamo fare affidamento su una combinazione di diverse tecniche, come grep/ricerca di file, recupero basato su graph di conoscenza e… un passaggio di riordino in cui il contesto viene ordinato per rilevanza.

Comprimere il Contesto (Compress Context)

Comprimere il contesto significa mantenere solo i token necessari all’esecuzione del compito.

Sintesi del Contesto (Context Summarization)

Le interazioni degli agenti possono coprire centinaia di turni e utilizzare strumenti che consumano un gran numero di token. La sintesi è un metodo comune per affrontare queste sfide. Se hai mai usato Claude Code, avrai visto la sua applicazione pratica. Quando l’utilizzo della finestra di contesto supera il 95%, Claude Code esegue la “compressione automatica”, sintetizzando l’intera traiettoria di interazione tra utente e agente. Questa sintesi della traiettoria dell’agente può comportare diverse strategie, come la sintesi ricorsiva o la sintesi a livelli.

Sintesi del Contesto

Integrare passaggi di sintesi nel design di un agente è anche molto utile. Ad esempio, può essere utile per elaborare dopo determinate chiamate di strumenti (specialmente strumenti come quelli di ricerca che consumano molti token). Inoltre, la Cognition ha menzionato la sintesi ai confini della transizione tra agenti, per ridurre il consumo di token durante il processo di trasmissione delle conoscenze. Se è necessario catturare eventi o decisioni specifiche, la sintesi può presentare delle sfide. Per questo motivo, la Cognition utilizza un modello fine-tuned, evidenziando l’importante lavoro necessario in questa fase.

Potatura del Contesto (Context Trimming)

La sintesi utilizza tipicamente LLM per estrarre i frammenti di contesto più rilevanti, mentre la potatura si assomiglia più a un filtro o, come ha detto Drew Breunig, a una “potatura” del contesto. Questo può comportare regole euristiche codificate, come rimuovere messaggi più vecchi dalla lista di messaggi. Drew ha anche menzionato Provence, un potatore di contesto addestrato per compiti di domande e risposte.

Isolare il Contesto (Isolating Context)

Isolare il contesto significa suddividerlo per aiutare l’agente a svolgere il compito.

Multi-agente (Multi-agent)

Uno dei modi più popolari per isolare il contesto è disperderlo tra più sub-agenti. Una delle motivazioni per la libreria Swarm di OpenAI è la “separazione dei punti di attenzione”, cioè un team di agenti posterà per gestire i sub-compiti. Ogni agente ha un proprio set di strumenti, istruzioni e finestra di contesto indipendente.

Multi-agente

Il sistema di ricerca multi-agente di Anthropic offre una forte prova di ciò: più agenti con contesti indipendenti tendono a superare le prestazioni di un singolo agente, in gran parte perché la finestra di contesto di ogni sub-agente può concentrarsi su un sub-compito più ristretto. Come dichiarato nel loro blog:

I sub-agenti operano in parallelo con le proprie finestre di contesto, esplorando diversi aspetti del problema.

Naturalmente, anche i multi-agenti affrontano sfide, inclusi i consumi di token (ad esempio, Anthropic riporta un uso di token 15 volte superiore rispetto alla chat), richiedendo una progettazione attenta dei suggerimenti per pianificare il lavoro dei sub-agenti e gestire il coordinamento tra di essi.

Isolamento del Contesto tramite Ambienti (Context Isolation with Environments)

Il progetto Deep Research di HuggingFace mostra un altro esempio interessante di isolamento del contesto. La maggior parte degli agenti utilizza chiamate API per strumenti, le quali restituiscono oggetti JSON (parametri degli strumenti), quindi vengono trasmesse a strumenti (come un’API di ricerca) per ottenere feedback (come i risultati di ricerca). HuggingFace utilizza un CodeAgent, che genera direttamente il codice contenente la chiamata di strumento desiderata. Questi codici vengono poi eseguiti in un ambiente sandbox. Solo il contesto specifico restituito dalla chiamata agli strumenti (come i valori di ritorno) viene restituito all’LLM.

Isolamento del Contesto tramite Ambienti

Questo consente la separazione del contesto dall’LLM nell’ambiente. Hugging Face sottolinea che questo è un ottimo modo per isolare oggetti che consumano molti token:

Gli Agent Code possono gestire meglio lo stato… Hai bisogno di memorizzare immagini/audio/altro per uso futuro? Nessun problema, assegnalo semplicemente come variabile e puoi usarlo più tardi.

Stato (State)

Vale la pena notare che l’oggetto di stato runtime dell’agente è anche un buon modo per isolare il contesto. Questo può funzionare in modo simile a un sandbox. L’oggetto di stato può essere progettato secondo uno schema (Schema, come il modello Pydantic) che include campi che possono essere scritti nel contesto. Un campo nello schema (come messages) può essere esposto all’LLM in ogni interazione dell’agente, ma lo schema può isolare le informazioni in altri campi per un utilizzo più selettivo.

Conclusione

I modelli di ingegneria del contesto per gli agenti AI continuano ad evolversi, ma possiamo riassumere i metodi comuni in quattro categorie: Scrittura, Filtraggio, Compressione e Isolamento:

  • • Scrivere il contesto significa conservare informazioni al di fuori della finestra di contesto per l’uso dell’agente nell’esecuzione del compito.
  • • Filtrare il contesto significa portare le informazioni necessarie nella finestra di contesto per aiutare l’agente nell’esecuzione del compito.
  • • Comprimere il contesto significa mantenere solo i token necessari per eseguire il compito.
  • • Isolare il contesto significa suddividere il contesto per aiutare l’agente nell’esecuzione del compito.

Comprendere e applicare questi modelli è il lavoro chiave per costruire agenti efficienti oggi.