Sottoagenti di progettazione che evitano messaggi duplicati

Note

Questo articolo descrive le caratteristiche e il comportamento dell'imbracatura standard. Impara come accedere alle funzionalità standard negli agenti standard Access e nei flussi degli agenti.

I messaggi duplicati provengono da lacune contestuali. Il design dell'agente deve tenere conto del contesto in ogni fase.

Un sottoagente, sia un agente figlio che un agente connesso, funziona su un proprio livello di orchestrazione all'interno del piano di un agente genitore. Riceve una richiesta dal genitore e completa il compito. Il sottoagente produce tre tipi di output: contenuto che mostra all'utente, valori che restituisce tramite output definiti e una risposta implicita che invia all'agente chiamante. Il genitore non può vedere lo scambio del sottoagente con l'utente e apprende il risultato solo attraverso gli output definiti e la risposta implicita. Questa visibilità limitata causa spesso messaggi duplicati e risposte mancate.

Tip

Per sapere quando suddividere il lavoro fra più agenti e quali sono le best practice generali per l’uso di più agenti, consulta Pattern di orchestrazione multi-agente e best practice e Pattern multi-agente. Questo articolo spiega come input e output allineino la risposta di un sottoagente al contesto dell'agente genitore.

Questo articolo si basa sul modello di contesto descritto in Distribuzione del contesto nell'harness standard e sulle decisioni di progettazione illustrate in Procedure consigliate di progettazione per evitare messaggi duplicati.

Disattiva il contesto genitore per un agente connesso

Un sottoagente che riceve il contesto della conversazione del genitore può agire in base ad esso. Se quel contesto contiene una richiesta a cui il genitore non ha ancora risposto, il sottoagente potrebbe rispondere, ripetere qualcosa già gestito dal genitore o assumere il ruolo sbagliato. Queste azioni causano spesso messaggi duplicati.

Un agente connesso ha un'impostazione, Passa la cronologia delle conversazioni a questo agente, che controlla se riceve il contesto della conversazione del genitore. Questa opzione è attivata per impostazione predefinita. Deselezionalo in modo che l'agente connesso operi solo sugli input inviati dal padre, e non sull'intera conversazione.

Schermata dell'opzione 'Passa la cronologia delle conversazioni a questo agente' attivata, con l'indicazione che, se deselezionata, impedisce la condivisione della cronologia tra agenti.

Un agente bambino non ha un'impostazione equivalente. Va all'interno del genitore e riceve sempre il contesto della conversazione del genitore.

Per gli agenti collegati che devono mantenere il contesto relativo al lavoro assegnato e per gli agenti figli che dispongono del contesto per impostazione predefinita, utilizza un input di definizione dell'ambito per proteggere l'ambito del sottoagente.

Usa un input di ambito

A volte un sottoagente ha bisogno del contesto dell'agente genitore per completare i suoi compiti. Quando passi quel contesto, includi un input di delimitazione: indica al sottoagente esattamente su cosa lavorare, così che le richieste ancora in sospeso e senza risposta nel contesto non lo distraggano dal compito. Se non passi il contesto, non hai bisogno di un input per definire l'ambito, perché il subagente dispone solo della richiesta che l'agente padre gli ha inoltrato.

Per proteggere l'ambito del sottoagente, si aggiunge un input con un nome scopedRequest con una descrizione come: The specific request this agent should fulfill. Il livello di orchestrazione popola l'input quando chiama il subagente. L'agente genitore identifica la parte rilevante della richiesta e passa solo quella parte, anche se il suo contesto contiene un'altra richiesta senza risposta.

Un input di scoping è un design robusto anche quando non si mantiene il contesto genitore. L'input dà al creatore maggiore controllo sul contenuto della richiesta inviata al sottoagente.

Ancora le istruzioni del sottoagente a quell'input, in modo che operi sulla base della richiesta circoscritta e ignori qualsiasi altra cosa che sembri una richiesta iniziale.

Istruzioni per sottoagenti di esempio:

Fulfill the request in the scopedRequest input. 
Treat it as your initial request and ignore any other initial requests in the conversation.

Configurare gli input e gli output

Input e output sono il contratto tra il genitore e il sottoagente. L'input determina su cosa lavora il sottoagente, e gli output dicono al genitore cosa è successo così da poter orchestrare il resto della conversazione. Il genitore non può vedere lo scambio del sottoagente con l'utente, quindi questo contratto è l'unico segnale affidabile che ha.

Importante

Un sottoagente che non restituisce output è un campanello d'allarme. Senza output, il genitore non ha traccia di ciò che il sottoagente ha risposto o di ciò che rimane. Può ripetere una risposta già data dal sottoagente, oppure eliminare la parte della richiesta che il sottoagente non ha gestito.

Configura i seguenti input e output, e scrivi la descrizione di ciascuno affinché il livello di orchestrazione superiore possa leggerla:

Input o output Description Come usare
scopedRequest (input) La richiesta specifica che questo agente dovrebbe soddisfare. Il padre lo riempie solo con la parte rilevante della richiesta dell'utente. Protegge il sottoagente dal rispondere alla domanda sbagliata quando il contesto del genitore contiene ancora altre richieste senza risposta. Collega le istruzioni del subagente a questo input.
answered (output) Vero quando l'utente ha già ricevuto una risposta alla scopedRequest. Impostalo su ogni sottoagente, sia che scriva all'utente sia che rimanga silenzioso. L'istruzione di primo livello, mostrata subito dopo, la legge in modo che il genitore non risponda di nuovo alla stessa richiesta.
scopedRequest (output) La richiesta su cui questo agente ha lavorato. Ripeti la richiesta con ambito definito in modo che raggiunga il livello superiore di orchestrazione, che non conserva in modo affidabile nel proprio contesto gli input che crea. Nei turni multi-intento che richiedono più di un sottoagente, questa capacità permette al livello superiore di pianificare correttamente ed evitare di indirizzare il sottoagente sbagliato alla domanda sbagliata.
interactionSummary (output) Un breve riassunto della risposta fornita all'utente. Restituiscila quando il subagente invia un messaggio diretto all'utente, così il genitore sa cosa è stato comunicato e non lo ripete.
findings (output) La risposta alla ScopedRequest, che il genitore deve consegnare all'utente. Restituisci quando il sottoagente rimane in silenzio, così il genitore ha il contenuto da consegnare.
openQuestions (uscita) Qualsiasi parte della richiesta dell'utente rimane senza risposta. Restituiscilo da parte di qualsiasi subagente che possa soddisfare solo una parte della richiesta, oppure in cui emerga una nuova richiesta nella conversazione del subagente, in modo che l'agente padre possa completare il resto e continuare la concatenazione degli strumenti. Il sottoagente non dovrebbe indovinare quale agente gestisce il resto.

Scegli quale componente comunica con l'utente

Decidi se l'agente genitore o il sottoagente comunica con l'utente. Nella maggior parte dei casi, lascia che l'agente genitore comunichi con l'utente così da poter combinare i risultati in un'unica risposta. Lascia che il sottoagente comunichi direttamente quando deve fornire una risposta lunga o avere una conversazione su più turni. Restituisci abbastanza informazioni perché il genitore possa gestire il resto della conversazione con il contesto.

Qualunque componente comunichi, aggiungi un'istruzione di livello superiore così che il livello di orchestrazione controlli gli output di ogni sottoagente prima di rispondere.

Questa istruzione di primo livello funziona in ogni caso, sia che un sottoagente scriva direttamente all'utente sia che rimanga silenzioso. Modifica e personalizza secondo necessità.

Ogni volta che viene invocato un topic o un agente, cerca sempre l'output booleano 'answered' prima di decidere cosa rispondere. Gli argomenti e gli agenti hanno un proprio canale di comunicazione con l'utente. Se 'answered' è vero, si assume sempre che la richiesta sia stata risposta correttamente usando almeno una delle variabili di output e verifica quali basandosi sulla descrizione di output. Non dare un riconoscimento imbarazzante del contenuto a cui è stato risposto. Fornisci solo le uscite non risposte e continua la conversazione in modo naturale con il passo successivo.

Il termine canale non si riferisce a un canale di integrazione. È un dispositivo di prompting che comunica al livello di orchestrazione che l'utente potrebbe aver già visto la risposta tramite un altro componente.

Scrivi la descrizione del sottoagente per il livello di orchestrazione genitore, così sa quando usare il sottoagente e come leggere i suoi output. Per esempio:

Handles payroll questions. 
If its answered output is true, the user has already received their response and it should not be answered again.

Imposta gli output di stato risposto e valore su ogni sottoagente, sia che il sottoagente invii un messaggio all'utente sia che rimanga silenzioso, e dai al genitore un'istruzione per leggerli. Con questo approccio, un agente può combinare sottoagenti silenziosi e sottoagenti che inviano messaggi diretti all'utente, distinguendosi solo per i loro output. Scopri di più in Progettare un'istruzione di alto livello robusta per evitare messaggi ripetuti.

Delegare la comunicazione con l'utente al genitore

Considera di instradare tutta la comunicazione con l'utente attraverso l'agente genitore invece che tramite un subagente. Raccogli ciò di cui il sottoagente ha bisogno come input prima di iniziare, leggi ciò che ha prodotto come output dopo la fine e istruisci a non scrivere direttamente all'utente. Un subagent che non scrive mai all'utente non può rispondere a qualcosa che il genitore ha già risposto.

Dì al sottoagente di restare in silenzio e di restituire i suoi risultati. Per esempio:

Do NOT reply or communicate with the user directly. 
Only fulfill the scopedRequest provided in the input and respond with the result.

Un sottoagente silenzioso restituisce findings e openQuestions, entrambi descritti in Configure inputs and outputs, per assegnare la sua risposta al genitore e segnalare qualsiasi lavoro residuo.

Restituisci un openQuestions output. Permette al livello di orchestrazione di completare il resto della richiesta dell'utente e di continuare il collegamento degli strumenti quando un sottoagente può soddisfare solo parte di quanto richiesto.

Mantenere il sottoagente silenzioso richiede un'istruzione esplicita. Di default, un subagente può inviare un messaggio all'utente autonomamente mentre è in esecuzione. L'impostazione Dopo aver eseguito il completamento non impedisce questi messaggi perché dice al genitore cosa fare quando il sottoagente termina.

Note

Dire all'agente padre: "Sei l'unico agente che parla con l'utente" non funziona. L'agente genitore non può fermare un subagente in esecuzione, e il subagente può comunque inviare messaggi all'utente da solo. Invece, istrui il sottoagente a rimanere in silenzio e poi prova per confermare.

Alcuni sottoagenti devono comunicare direttamente

Un sottoagente che invia messaggi direttamente all'utente è una scelta valida, non una violazione di una regola, ma richiede una progettazione deliberata per evitare messaggi ripetuti dal genitore.

Alcuni casi d'uso richiedono che il subagente risponda direttamente all'utente, sia per fornire una risposta lunga senza copiarla nel contesto genitore, sia per tenere una conversazione. Per evitare messaggi ripetuti e contesto perso, si passa il contesto al genitore negli output.

Fai in modo che il sottoagente dia una risposta lunga e restituisci un riassunto

Il sottoagente fornisce la sua risposta completa direttamente all'utente e restituisce solo un breve riassunto o una nota che indica di aver fornito la risposta. Usa questo approccio per risposte lunghe, come analisi dettagliate, e limita le informazioni restituite al contesto del genitore. L'obiettivo è mantenere il contesto dei genitori piccolo ma informato.

Return answered e interactionSummary, entrambi descritti in Configura ingressi e uscite.

Fai in modo che il sottoagente mantenga una conversazione con l'utente

Il sottoagente scambia più messaggi con l'utente in diversi passaggi per completare la richiesta con ambito definito. Il rischio principale è che il genitore non sia a conoscenza dei passaggi intermedi della conversazione, del lavoro del sottoagente e di eventuali risposte fornite, o di eventuali nuove richieste emerse. Di conseguenza, il genitore non può agire su nuove richieste né rispondere correttamente nei passaggi successivi.

Restituire answered, scopedRequest, e interactionSummary, come descritto in Configurare ingressi e uscite.

Anche l'istruzione di livello superiore copre questo caso d'uso.