Migliori pratiche di progettazione per evitare 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.

Nel cablaggio standard, diversi componenti possono gestire la richiesta di un utente e ognuno agisce dal proprio punto di vista. Un argomento può mostrare un messaggio o una Scheda Adattiva, uno strumento può restituire dati, e un figlio o un agente connesso può rispondere dal proprio contesto. Il livello di orchestrazione prosegue il piano da un contesto che potrebbe non corrispondere alla risposta ricevuta dall'utente. Quando questi punti di vista si allontanano, l'utente potrebbe vedere un messaggio ripetuto o una risposta mancata. I produttori incontrano questo comportamento più spesso con modelli più recenti rispetto a quelli più vecchi.

Capisci perché si verificano i duplicati prima di progettare una soluzione. Scopri di più sulla distribuzione del contesto nell'imbracatura standard.

Note

Messaggi ripetuti e duplicati sono solitamente problemi di progettazione legati alla gestione del contesto, non bug. Si verificano quando l'utente vede una risposta, ma la componente che prosegue il piano contiene informazioni diverse su ciò che è già stato risposto.

Per comprendere questi casi d'uso, consideriamo due superfici separatamente: l'output visibile dall'utente (ciò che l'utente vede in chat) e il contesto attivo (le informazioni che un componente ha a disposizione quando decide cosa fare dopo). I creatori non vedono direttamente il contesto attivo. Pertanto, è importante comprendere la prospettiva di ogni componente e utilizzare input e output per mantenere tali prospettive allineate.

Per debug di un sintomo in un agente attivo, inizia con Risoluzione di problemi di messaggi duplicati e risposte mancate , poi torna a questo articolo per indicazioni sulla riprogettazione.

Progettare tenendo conto del contesto

Se una richiesta viene gestita con un singolo passaggio seguito da un Fine di tutti gli argomenti, la gestione del contesto non entra in gioco. Ma quando una richiesta deve concatenare più componenti, o quando l'utente effettua più di una richiesta nella stessa sessione, la gestione del contesto è importante. La maggior parte dei casi d'uso reali attraversa diversi componenti per sessione, quindi progetta di conseguenza.

  • Un componente, poi chiudi tutti gli argomenti. Un singolo argomento, strumento, child agent o connected agent gestisce la richiesta e la sessione termina. Se quel componente scrive la risposta completa e segnala tale completamento, il layer di orchestrazione non ha motivo di generare un'altra risposta.
  • Diverse componenti della sessione. Una sessione può eseguire diversi componenti prima di fornire all'utente una risposta completa. Una sessione può anche coprire più richieste. Un componente può rispondere a una parte della richiesta mentre un altro deve rispondere al resto. Ogni componente che funziona deve riportare cosa ha fatto. Altrimenti, un componente successivo potrebbe agire in base a un contesto che sembra privo di risposta e rispondere nuovamente.
Dove il contesto conta Example Design sonoro
Nessun contesto usato Un argomento mostra la risposta completa in un messaggio o in una Scheda Adattiva. Il nodo Elimina tutti gli argomenti impedisce al livello di orchestrazione di rispondere nuovamente.
Il livello di orchestrazione utilizza il contesto Un argomento mostra una tabella per la parte A, poi il livello di orchestrazione risponde alla parte B usando conoscenze o un altro agente. Ogni componente riporta la risposta e restituisce i valori necessari nei passaggi successivi, così il livello di orchestrazione non risponde due volte.
Il componente utilizza il contesto Un tema risponde all'utente sulla parte A, poi un altro agente gestisce la parte B. Se l'agente riceve un contesto padre in cui sembra che la parte A non abbia ancora ricevuto risposta, risponde di nuovo alla parte A. Escludere, ove possibile, il contesto padre dall'agente connesso e i componenti restituiscono output che confermano a cosa è già stata data risposta e cosa resta da rispondere.

Progettare componenti per riferire quanto accaduto

Un componente invia un messaggio ripetuto o messaggi duplicati quando il livello di orchestrazione non riesce a rilevare il lavoro completato da un componente precedente. Usa sempre lo stesso approccio di progettazione per evitare messaggi duplicati: istrui ogni componente a riportare le proprie azioni al livello di orchestrazione. Per ogni parte della richiesta, assegna esattamente un componente per scrivere la risposta ricevuta dall'utente. Ogni altro componente svolge il proprio lavoro e restituisce il contesto senza scrivere all'utente.

Utilizzare queste pratiche insieme come un unico approccio progettuale:

  1. Restituisce risultati che registrano quanto accaduto. I soli output sono di solito sufficienti per i modelli più vecchi.
  2. Aggiungi un'istruzione all'argomento o alla descrizione del sottoagente che definisca cosa significa una run di successo. Questo approccio rende il design robusto.
  3. Aggiungi un'istruzione di primo livello così il livello di orchestrazione controlla quegli output prima di rispondere. I modelli più recenti traggono maggior beneficio da questo approccio.

Solo i componenti che supportano output personalizzati possono restituire output e includere istruzioni di descrizione. Per i componenti che non supportano output personalizzati, si evitano i messaggi duplicati limitando il contesto ricevuto e aggiungendo un'istruzione di livello superiore.

Componente Riferimenti con Correzione
Argomento answered (Vero/Falso), choiceReceived (Vero/Falso) e un valore visualizzato o un output di riepilogo (Testo) Restituisci gli output e aggiungi un'istruzione alla descrizione dell'argomento. Progettare gli argomenti come mini-agenti che evitano messaggi duplicati fornisce esempi di descrizioni degli argomenti.
Sottoagente (figlio o agente collegato) answered (Vero/Falso), interactionSummary (Testo), openQuestions (Testo) Restituisci gli output, aggiungi un input di ambito e aggiungi un'istruzione alla descrizione del sottoagente. I sottoagenti di progettazione che evitano messaggi duplicati forniscono esempi di descrizioni dei sottoagenti.
Conoscenza (un richiamo alla conoscenza) Non posso personalizzare il contesto, potrei ripetere una risposta. Mantieni un contesto pulito e di alto livello e influenza le richieste inviate.
Nodo delle risposte generative Non si può personalizzare il contesto, potrebbe ripetere una risposta, la risposta potrebbe essere ripetuta più tardi. Mantieni un contesto di primo livello pulito, modifica la richiesta scritta nell’input del nodo e fai in modo che il topic host restituisca l’output o un output nello stato di risposta.

Progetta un'istruzione di alto livello robusta per evitare messaggi ripetuti

I risultati mantengono aggiornato il livello di orchestrazione. Aggiungi un'istruzione di alto livello che dica ai modelli più recenti di controllare gli output prima di rispondere.

La seguente istruzione di alto livello dell'agente è un esempio progettato per funzionare tra diversi casi d'uso, indipendentemente dal fatto che un componente comunichi direttamente con l'utente o meno. Modifica e personalizza secondo necessità.

Ogni volta che viene richiamato un topic o un agente, controlla sempre l'output booleano 'answered' prima di decidere come 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 fare un commento goffo sul contenuto a cui è già stata data risposta. 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 come Teams o un sito web. È un dispositivo di prompting che comunica al livello di orchestrazione che l'utente potrebbe aver già visto la risposta o fatto una selezione tramite un altro componente, come un argomento, una scheda o un sottoagente. Questa formulazione spinge efficacemente il modello a controllare la propria risposta prima di rispondere.

Gestire gli argomenti

Un argomento spesso comunica direttamente con l'utente mostrando un messaggio, ponendo una domanda o presentando una Carta Adattiva. Il contesto di orchestrazione riceve il testo dell'argomento come testo semplice, ma non registra se l'utente lo ha visto. Il contesto inoltre non riceve azioni o selezioni di Adaptive Card. Se l'argomento risponde all'utente ma non segnala quell'azione al livello di orchestrazione, il livello di orchestrazione considera la richiesta come non risolta e risponde di nuovo.

Progetta un argomento come un mini-agente. Restituisci un output in stato risposto così che il livello di orchestrazione sappia che la richiesta è stata gestita, e restituisci qualsiasi valore visualizzato dall'argomento o la selezione raccolta che richieda un passaggio successivo. Gli output rendono disponibili al resto del piano le azioni e i risultati. Aggiungi un'istruzione alla descrizione dell'argomento che definisca cosa significa una run di successo.

Scopri di più sugli argomenti di Design come mini-agenti che evitano messaggi duplicati.

Gestire i child e gli agenti connessi

Progetta agenti figli e connessi come progetti qualsiasi altro componente. Il loro scambio con l'utente è invisibile al genitore, che apprende cosa è successo solo tramite output, e solo dopo che l'agente ha terminato.

Anche gli agenti secondari e gli agenti connessi potrebbero ricevere richieste rimaste precedentemente senza risposta e che restano nel contesto dell'agente principale.

Per ogni agente, definiscine il compito tramite un input, specifica se risponde all'utente o rimane silenzioso e restituisci output che informino l'agente padre su ciò che è accaduto.

Scopri di più su Sottoagenti di Progettazione che evitano messaggi duplicati.

Gestione della conoscenza

La conoscenza è un concetto di alto livello a cui l'agente fa affidamento. Riceve una richiesta basata sul design dell'agente e riceve il contesto dell'agente. La maggior parte dei problemi di messaggi ripetuti si verifica quando il contesto dell'agente manca di informazioni provenienti da altri componenti. Progettare conoscenze per influenzare il modo in cui l'agente formula la richiesta. Assicurati che gli altri componenti usino correttamente le loro uscite.

Gestire i nodi delle risposte generative

Un nodo di risposta generativa vive all'interno di un argomento e risponde dalla conoscenza. Riceve il contesto padre più tutto ciò che gli viene passato in input, quindi si comporta come una conoscenza di primo livello e integra la propria risposta con il contesto corrente. Può scrivere la risposta direttamente nel pannello di chat o memorizzarla in una variabile di argomento, ma non può restituire nulla al contesto di livello superiore da solo. Come in qualsiasi contenuto argomentale, la risposta rimane nell'argomento a meno che l'argomento non restituisca un risultato.

Un nodo di risposte generative non necessita di una gestione speciale oltre alla regola che si applica a ogni argomento: passare il risultato come output di argomento. Se il nodo risponde all'utente nell'argomento, aggiungi un'uscita a stato risposto e un'uscita a valore visualizzato. Questi output danno al livello di orchestrazione un registro che la richiesta è stata risposta e impediscono a un passaggio successivo di rispondere nuovamente alla richiesta.

Assicurati che descrizioni e istruzioni corrispondano al punto di vista

Descrizioni e istruzioni fanno anch'esse parte del contratto contestuale.

Questa istruzione rimanda all'argomento:

When the user asks about their account balance, call the Account balance topic.

Questa istruzione instrada e assegna la proprietà delle risposte al livello di orchestrazione:

When the user asks about their account balance, call the Account balance topic and give the balance.

Se l'argomento mostra già l'equilibrio, la seconda istruzione crea un secondo percorso di risposta. Se l'argomento non ritorna balanceValue, il livello di orchestrazione potrebbe richiamare l'argomento o rispondere che non ne conosce il valore.

Usa descrizioni e istruzioni che corrispondano al punto di vista:

  • Una descrizione dell'argomento aiuta il livello di orchestrazione a decidere quando e come utilizzare l'argomento. Segue anche le istruzioni su cosa fare o cosa produrre dopo.
  • Una descrizione di agente connesso deriva dal punto di vista del genitore.
  • Un'istruzione a agente connesso viene letta dal punto di vista dell'agente connesso.
  • Una descrizione dell'output di un topic o di un connected-agent indica al livello di orchestrazione come interpretare il valore restituito.

Per un argomento che fornisce una risposta all'utente e imposta answered=true, descrivi sia quando indirizzare all'argomento sia cosa significhi un'esecuzione riuscita:

This topic handles account balance requests.
If its answered output is true, the user has already received their response and it should not be answered again.

Per un argomento che genera solo risultati, descrivi sia quando indirizzare verso l'argomento sia come rispondere:

This topic handles account balance requests and responds with the balance value in italics.

Ripristina il contesto nelle lunghe conversazioni

Un valore che un componente aveva può uscire dal contesto attivo in due modi. In una lunga sessione, un valore che era disponibile qualche turno fa potrebbe non essere più nel contesto attivo. Oppure un componente ottiene un risultato completo, usa la parte rilevante per produrre una risposta e restituisce solo quella risposta, così che il resto del risultato non raggiunga mai il livello di orchestrazione. In ogni caso, l'agente potrebbe recuperare di nuovo i dati o chiedere all'utente informazioni già possedute, cosa che l'utente percepisce come una risposta mancata. Il livello di orchestrazione si comporta come se non avesse mai ricevuto il valore.

Progetta tenendo conto di questo scenario recuperando e salvando le informazioni di contesto importanti e rendendole nuovamente disponibili quando necessario:

  • Restituisci un risultato completo, non solo la parte utilizzata per rispondere. Un risultato recuperato spesso ha più di un campo, molte righe e testo lungo. Restituisci tutti i dati di cui un turno successivo potrebbe aver bisogno in output, in modo che il livello di orchestrazione li abbia senza doverli recuperare di nuovo.

  • Salva e fornisci valori tra un turno e l'altro. Nei punti appropriati, prima o dopo una chiamata a uno strumento, indirizza a un argomento che possa memorizzare o fornire il valore tramite i relativi input e output e una variabile globale, così che il piano non debba recuperare il valore né richiederlo di nuovo.

Tip

Il comportamento agentico senza soluzione di continuità si basa su un design dell'agente che tiene conto del contesto in ogni fase e da ogni punto di vista.