Il rapido avanzamento dell'intelligenza artificiale ha portato a una ridefinizione di concetti chiave, e tra questi, l'ingegneria dei prompt sta vivendo una trasformazione significativa, venendo ora rimarcata come ingegneria del contesto. Nonostante alcuni dei più eminenti ricercatori nel campo dell'AI avessero predetto la sua obsolescenza solo pochi anni fa, questa conclusione si è dimostrata radicalmente errata. Al contrario, l'ingegneria dei prompt, o ingegneria del contesto, è oggi più cruciale che mai, tanto da meritare una nuova etichetta che ne esprime più compiutamente la profondità.
Il "Divine Translation Bureau" di 36Kr, un team di traduzione specializzato in tecnologia, business, ambiente di lavoro e stili di vita, introduce con questo articolo le nuove tecnologie, le prospettive e le tendenze emergenti a livello internazionale. L'ingegneria del contesto, sebbene possa sembrare l'ennesima parola d'ordine di tendenza, descrive il processo essenziale di adattamento delle istruzioni e del contesto di fondo associato per consentire ai modelli linguistici di grandi dimensioni (LLM) di eseguire compiti specifici. Questo articolo, che è una traduzione, illustra attraverso un caso pratico con un agente n8n come l'output strutturato, l'iniezione dinamica del tempo e l'ottimizzazione della cache RAG siano diventate le tre azioni fondamentali per aumentare l'efficienza degli LLM.
Cos'è l'ingegneria del contesto?
Il concetto di ingegneria del contesto è già oggetto di ampie discussioni tra figure di spicco come Ankur Goyal, Walden Yan, Tobi Lutke e Andrej Karpathy. Personalmente, il termine "ingegneria del contesto" è preferibile in quanto copre in modo più completo il cuore dell'ingegneria dei prompt e i compiti ad essa correlati. La professionalità dell'ingegneria dei prompt è stata spesso messa in discussione, poiché molti la confondevano con i cosiddetti "prompt ciechi" (ad esempio, brevi descrizioni di compiti inserite in un modello di grandi dimensioni come ChatGPT).
Un prompt cieco è semplicemente una domanda posta al sistema. L'ingegneria dei prompt, al contrario, richiede un'attenta progettazione del contesto e della struttura del prompt stesso; forse avrebbe dovuto essere chiamata ingegneria del contesto fin dall'inizio. L'ingegneria del contesto è un passo ancora più avanzato: richiede la progettazione di un'architettura contestuale completa, che spesso implica la raccolta, il potenziamento e l'ottimizzazione delle conoscenze del sistema attraverso metodi rigorosi, e non può essere raggiunta con un semplice prompt.
Dal punto di vista di uno sviluppatore, l'ingegneria del contesto è un processo iterativo di ottimizzazione delle istruzioni e del contesto per guidare l'LLM verso il raggiungimento dell'obiettivo desiderato. Questo include la creazione di una procedura di valutazione per misurare l'efficacia della strategia. Data la rapida evoluzione nel campo dell'AI, è opportuno ampliare la definizione di ingegneria del contesto: è il processo di progettazione e ottimizzazione delle istruzioni e del contesto associato per LLM e modelli AI avanzati, al fine di consentire loro di eseguire compiti in modo efficiente. Questa definizione non include solo gli LLM basati su testo, ma anche le ottimizzazioni del contesto sempre più diffuse per i modelli multimodali.
L'ingegneria del contesto comprende l'ingegneria dei prompt e i seguenti processi correlati, tutti volti a ottimizzare le informazioni che vengono inserite nella finestra di contesto dell'LLM, il che implica anche la necessità di filtrare le informazioni rumorose – un'arte che richiede una misurazione sistematica delle prestazioni dell'LLM:
- Progettazione e gestione delle catene di prompt (se applicabile)
- Debug delle istruzioni/prompt di sistema
- Gestione degli elementi dinamici del prompt (ad esempio, input dell'utente, data e ora, ecc.)
- Ricerca e preparazione di conoscenze rilevanti (ovvero RAG - Retrieval Augmented Generation)
- Potenziamento delle query
- Definizione e descrizione degli strumenti (nello scenario di un sistema di agenti)
- Preparazione e ottimizzazione delle dimostrazioni few-shot
- Input e output strutturati (ad esempio, delimitatori/formato JSON)
- Memoria a breve termine (gestione dello stato/contesto storico) e memoria a lungo termine (recupero di conoscenze rilevanti da un database vettoriale)
- E altre tecniche per ottimizzare i prompt di sistema per gli LLM.
In sintesi, l'obiettivo dell'ingegneria del contesto è ottimizzare le informazioni che vengono fornite all'LLM. Questo include anche l'eliminazione delle informazioni superflue o rumorose, un'operazione che di per sé è un'arte e richiede una misurazione sistematica delle prestazioni dell'LLM.
Applicazione pratica dell'ingegneria del contesto
Mentre tutti parlano di ingegneria del contesto, esamineremo ora un esempio pratico della sua implementazione nella creazione di un agente AI. Consideriamo come l'ingegneria del contesto sia stata applicata di recente per una mia applicazione multi-agente per ricerche approfondite. Questo flusso di lavoro dell'agente è stato sviluppato con n8n (sebbene la scelta dello strumento sia irrilevante ai fini concettuali).
All'interno di questo flusso di lavoro, l'"agente di pianificazione della ricerca" è responsabile della generazione di un piano di ricerca basato sulla query dell'utente. Ecco il prompt di sistema scritto per questo sotto-agente:
Lei è un pianificatore di ricerca professionale. Il suo compito è suddividere query di ricerca complesse (racchiuse tra <user_query></user_query>) in sotto-compiti di ricerca concreti, dove ogni sotto-compito si concentra su diversi aspetti o tipi di fonti.
Data e ora attuali: {{ $now.toISO() }}
Ogni sotto-compito deve includere quanto segue:
1. ID univoco della stringa per il sotto-compito (es. 'subtask_1', 'news_update')
2. Istruzione di ricerca concreta che si concentra su un aspetto della query principale
3. Tipo di fonte di ricerca (Web/Notizie/Accademia/Biblioteca Specializzata)
4. Periodo di tempo (Oggi/Ultima Settimana/Recente/Ultimo Anno/Indipendente dal Tempo)
5. Ambito di applicazione (Tecnologia/Scienza/Salute ecc.)
6. Priorità (1 più alta - 5 più bassa)
Ad eccezione di time_period e domain_focus, che possono essere opzionali, tutti gli altri campi (id/query/source_type/time_period/domain_focus/priority) sono obbligatori.
Creare 2 sotto-compiti che coprano insieme l'argomento in modo completo e si concentrino su diverse dimensioni informative o fonti.
Dopo aver ottenuto le informazioni del sotto-compito, è necessario aggiungere due campi: start_date e end_date. Si prega di derivare l'intervallo di date basandosi sulla data attuale e sul time_period selezionato. Un esempio del formato è il seguente:
"start_date": "2024-06-03T06:00:00.000Z",
"end_date": "2024-06-11T05:59:59.999Z",
Nell'elaborazione di questo prompt, molti aspetti devono essere attentamente considerati. Quale contesto specifico dobbiamo fornire affinché l'agente di pianificazione possa eseguire il compito in modo efficiente? Come si può notare, questo non richiede solo la progettazione di un semplice prompt o di un'istruzione, ma anche uno spirito sperimentale e la fornitura del contesto chiave al modello per ottimizzare l'esecuzione del compito. Analizziamo ora i componenti chiave di un'efficace ingegneria del contesto, come esemplificati in questo prompt.
Istruzioni
Le istruzioni sono le direttive operative di livello superiore per il sistema. Nel nostro esempio, l'istruzione chiave è: "Lei è un pianificatore di ricerca professionale. Il suo compito è suddividere query di ricerca complesse (racchiuse tra <user_query></user_query>) in sotto-compiti di ricerca concreti, dove ogni sotto-compito si concentra su diversi aspetti o tipi di fonti."
Molti principianti, e persino sviluppatori AI esperti, potrebbero fermarsi a questo punto. Tuttavia, leggendo il prompt completo, si comprende quanto contesto aggiuntivo sia necessario affinché il sistema funzioni come previsto. Questo è il cuore dell'ingegneria del contesto: il sistema deve comprendere chiaramente l'ambiente del problema e i requisiti specifici. La definizione del ruolo ("pianificatore di ricerca professionale") è cruciale per indirizzare il comportamento dell'LLM, fornendogli una persona con cui operare e aspettative chiare sui tipi di output da produrre.
Input dell'utente
L'input dell'utente è l'elemento dinamico fondamentale che guida l'esecuzione del compito da parte dell'LLM. Nel nostro esempio, le query di ricerca complesse sono racchiuse tra <user_query></user_query>. Questo meccanismo di delimitazione è essenziale per separare chiaramente l'input dell'utente dalle istruzioni di sistema fisse, riducendo l'ambiguità e garantendo che l'LLM interpreti correttamente quale parte del prompt sia la query principale da elaborare. La gestione di tali elementi dinamici è una parte integrante dell'ingegneria del contesto, poiché consente al sistema di adattarsi a richieste diverse senza dover modificare il prompt di sistema sottostante.
Output strutturato
Il prompt specifica in dettaglio la struttura desiderata per l'output di ogni sotto-compito, includendo campi come ID univoco, istruzione di ricerca concreta, tipo di fonte, periodo di tempo, ambito di applicazione e priorità. L'imposizione di un output strutturato, ad esempio in formato JSON o con delimitatori specifici, è fondamentale per l'interoperabilità e l'elaborazione a valle. Nel caso specifico, l'LLM è istruito a creare 2 sotto-compiti e ad aggiungere campi specifici per le date, garantendo che l'output sia immediatamente utilizzabile da altri agenti o sistemi nel flusso di lavoro, senza necessità di ulteriore parsing o interpretazione. Questo riduce significativamente gli errori e aumenta l'affidabilità del sistema complessivo.
Iniezione dinamica del tempo
Un aspetto innovativo di questo prompt è l'iniezione dinamica del tempo tramite {{ $now.toISO() }}. Questo non solo fornisce all'LLM l'ora e la data attuali in un formato standardizzato, ma richiede anche che il modello derivi attivamente start_date e end_date basandosi sul time_period selezionato e sulla data attuale. Questa capacità di adattare il contesto temporale in modo dinamico è cruciale per le query sensibili al tempo, come la ricerca di "notizie recenti" o "eventi dell'ultima settimana", garantendo che la ricerca sia sempre aggiornata e pertinente. La specificazione del formato di data e ora desiderato assicura coerenza e facilità di elaborazione.
Ottimizzazione della cache RAG
Sebbene il prompt non mostri direttamente l'interazione con un sistema RAG per il recupero delle informazioni, esso getta le basi per l'ottimizzazione del RAG. I campi tipo di fonte di ricerca (Web/Notizie/Accademia/Biblioteca Specializzata) e periodo di tempo (Oggi/Ultima Settimana/Recente/Ultimo Anno/Indipendente dal Tempo) all'interno di ogni sotto-compito sono esempi lampanti di come l'output dell'agente di pianificazione possa informare e guidare un sistema RAG. Un sistema RAG può utilizzare queste informazioni per interrogare database specifici o intervalli temporali definiti, riducendo la quantità di dati da ricercare e recuperare e migliorando la pertinenza dei risultati. L'ottimizzazione della cache RAG, menzionata come una delle tre misure principali, implica la gestione intelligente dei dati recuperati per evitare duplicazioni e migliorare la velocità di accesso a informazioni frequentemente richieste.
L'ingegneria del contesto va ben oltre la semplice formulazione di una domanda. È un approccio olistico e iterativo che richiede una comprensione approfondita del funzionamento degli LLM, la capacità di strutturare le informazioni in ingresso e in uscita, e la volontà di sperimentare e affinare costantemente i prompt per ottenere le prestazioni desiderate. L'esempio dell'agente n8n dimostra chiaramente come, attraverso la cura delle istruzioni, la gestione degli input dinamici, la specificazione di output strutturati e la predisposizione per sistemi di recupero avanzati come RAG, sia possibile massimizzare l'efficienza e l'efficacia dei modelli AI nei compiti più complessi.