Stel richtlijnen op om dubbele berichten te voorkomen

Note

Dit artikel beschrijft de kenmerken en het gedrag van het standaardharnas. Lees hoe je toegang krijgt tot standaardfuncties in Standaardagenten en agentstromen openen.

In het standaardharnas kunnen verschillende componenten het verzoek van een gebruiker afhandelen, en elk handelt vanuit zijn eigen perspectief. Een topic kan een bericht of een Adaptive Card tonen, een tool kan data teruggeven, en een kind of verbonden agent kan vanuit zijn eigen context reageren. De orkestratielaag zet het plan voort vanuit een context die mogelijk niet overeenkomt met de reactie die de gebruiker ontvangt. Wanneer die gezichtspunten uit elkaar groeien, kan de gebruiker een herhaald bericht of een gemiste antwoord zien. Makers komen dit gedrag vaker tegen bij nieuwere modellen dan bij oudere.

Begrijp waarom duplicaten voorkomen voordat je een oplossing ontwerpt. Lees meer over contextverdeling in het standaardharnas (harness).

Note

Herhaalde berichten en dubbele berichten zijn meestal ontwerpproblemen die te maken hebben met het beheren van context, niet bugs. Ze ontstaan wanneer de gebruiker een antwoord ziet, maar het onderdeel dat het plan voortzet heeft andere informatie over wat al beantwoord is.

Om deze gebruikssituaties te begrijpen, kun je twee oppervlakken apart bekijken: de door de gebruiker zichtbare output (wat de gebruiker in de chat ziet) en de actieve context (de informatie die een component beschikbaar heeft wanneer hij beslist wat hij daarna doet). Makers zien de actieve context niet direct. Daarom is het belangrijk om het perspectief van elk onderdeel te begrijpen en input en output te gebruiken om die perspectieven op één lijn te houden.

Om een symptoom in een live agent te debuggen, begin je met Troubleshoot dubbele berichten en gemiste antwoorden en ga daarna terug naar dit artikel voor advies over het herontwerp.

Ontwerp met context in gedachten

Als een verzoek wordt afgehandeld door één stap gevolgd door een 'Einde alle onderwerpen', komt contextbeheer niet van toepassing. Maar wanneer een verzoek meerdere componenten moet aaneenschakelen, of wanneer de gebruiker meer dan één verzoek in dezelfde sessie doet, is contextbeheer van belang. De meeste praktijkvoorbeelden doorlopen meerdere componenten per sessie, dus ontwerp dienovereenkomstig.

  • Eén component, vervolgens alle onderwerpen beëindigen. Een enkel onderwerp, tool, kindagent of verbonden agent behandelt het verzoek en de sessie eindigt. Als die component het volledige antwoord schrijft en die voltooiing rapporteert, heeft de orkestratielaag geen reden om een nieuw antwoord te schrijven.
  • Verschillende onderdelen in de sessie. Een sessie kan meerdere componenten uitvoeren voordat de gebruiker een volledig antwoord krijgt. Een sessie kan ook meerdere verzoeken omvatten. Een component kan een deel van het verzoek beantwoorden, terwijl een ander de rest moet beantwoorden. Elk onderdeel dat wel werkt, moet rapporteren wat het heeft gedaan. Anders kan een later onderdeel ingrijpen op context die onbeantwoord lijkt en opnieuw reageren.
Waar context ertoe doet Example Geluidsontwerp
Geen context gebruikt Een onderwerp toont het volledige antwoord in een bericht of Adaptieve Kaart. De End all topics-node voorkomt dat de orkestratielaag opnieuw antwoordt.
De orkestratielaag gebruikt context Een onderwerp toont een tabel voor deel A, waarna de orkestratielaag deel B beantwoordt door kennis of een andere agent te gebruiken. Elke component rapporteert wat het beantwoordde en geeft eventuele waarden terug die latere stappen nodig hebben, zodat de orkestratielaag niet twee keer antwoordt.
Component maakt gebruik van context Een onderwerp beantwoordt deel A aan de gebruiker, waarna een andere agent deel B behandelt. Als de agent oudercontext ontvangt waarbij A onbeantwoord lijkt, antwoordt hij opnieuw A. Sluit de parent context op de connected agent waar mogelijk uit, en componenten geven outputs terug die bevestigen wat er is beantwoord en wat er overblijft.

Ontwerp componenten om te rapporteren wat er is gebeurd

Een component stuurt een herhaald bericht of dubbele berichten wanneer de orkestratielaag het werk dat een eerdere component heeft voltooid niet kan detecteren. Gebruik elke keer dezelfde ontwerpaanpak om dubbele berichten te voorkomen—geef elke component opdracht zijn acties te rapporteren aan de orkestratielaag. Voor elk deel van het verzoek wijs je precies één component toe om het antwoord te schrijven dat de gebruiker ontvangt. Elke andere component doet zijn werk en geeft context terug zonder aan de gebruiker te schrijven.

Gebruik deze praktijken samen als één ontwerpaanpak:

  1. Uitvoer retourneren waarin wordt vastgelegd wat er is gebeurd. Alleen de output is meestal voldoende voor oudere modellen.
  2. Voeg een instructie toe aan de topic- of subagentbeschrijving die definieert wat een succesvolle run betekent. Deze aanpak maakt het ontwerp robuust.
  3. Voeg een top-level instructie toe zodat de orkestratielaag die outputs controleert voordat hij antwoordt. Nieuwere modellen profiteren het meest van deze aanpak.

Alleen componenten die aangepaste uitvoer ondersteunen, kunnen uitvoer retourneren en beschrijvingsinstructies bevatten. Voor componenten die geen aangepaste uitvoer ondersteunen, voorkom dubbele berichten door de context die ze ontvangen te beperken en door een top-level instructie toe te voegen.

Onderdeel Rapporteert terug met Corrigeren
Onderwerp answered (Waar/Onwaar), choiceReceived (Waar/Onwaar), en een weergegeven waarde of samenvatting (Tekst) Geef de output terug en voeg een instructie toe aan de onderwerpbeschrijving. Onderwerpen ontwerpen als mini-agenten die dubbele berichten vermijden bevat voorbeeldbeschrijvingen van onderwerpen.
Subagent (onderliggende of verbonden agent) answered (Waar/Onwaar), interactionSummary (Tekst), openQuestions (Tekst) Geef de uitvoer terug, voeg een scoping-invoer toe en voeg een instructie toe aan de subagentbeschrijving. Design subagents die dubbele berichten vermijden, geeft voorbeeldbeschrijvingen van subagenten.
Kennis (een oproep tot kennis) Ik kan de context niet aanpassen, ik kan een antwoord herhalen. Houd een schone context op het hoogste niveau en beïnvloed de verzoeken die worden verzonden.
Generatieve antwoordknoop Je kunt de context niet aanpassen, kan een antwoord herhalen, het antwoord kan later herhaald worden. Houd een schone context op het hoogste niveau, beïnvloed het verzoek dat naar de invoer van het knooppunt wordt geschreven en laat het hosttopic de uitvoer of een uitvoer met de status 'beantwoord' retourneren.

Ontwerp een robuuste topniveau-instructie om herhaalde berichten te voorkomen

Outputs houden de orkestratielaag op de hoogte. Voeg een instructie op het hoogste niveau toe die nieuwere modellen opdraagt de uitvoer te controleren voordat ze antwoorden.

De volgende top-level agentinstructie is een voorbeeld dat ontworpen is om over use cases heen te werken, ongeacht of een component direct met de gebruiker communiceert of niet. Bewerk en pas het aan indien nodig.

Wanneer een onderwerp of agent wordt genoemd, zoek dan altijd naar de 'beantwoorde' booleaanse output voordat je beslist wat je wilt antwoorden. Topics en agents hebben hun eigen communicatiekanaal met de gebruiker. Als 'beantwoord' waar is, ga er dan altijd van uit dat het verzoek correct is beantwoord met ten minste één van de uitvoervariabelen, en controleer welke op basis van de uitvoerbeschrijving. Laat een ongemakkelijke bevestiging van de beantwoorde inhoud achterwege. Geef alleen de onbeantwoorde uitkomsten en zet het gesprek natuurlijk voort met de volgende stap.

De term kanaal verwijst niet naar een integratiekanaal zoals Teams of een website. Het is een prompting-apparaat dat de orkestratielaag laat weten dat de gebruiker het antwoord mogelijk al heeft gezien of een selectie heeft gemaakt via een ander component, zoals een onderwerp, kaart of subagent. Deze formulering zorgt er het meest voor dat het model zijn antwoord controleert voordat het antwoordt.

Onderwerpen behandelen

Een onderwerp communiceert vaak direct met de gebruiker door een bericht te tonen, een vraag te stellen of een Adaptieve Kaart te presenteren. De orkestratiecontext ontvangt de tekst van het onderwerp als platte tekst, maar registreert niet of de gebruiker het heeft gezien. De context ontvangt ook geen acties of selecties van de Adaptieve Kaart. Als het onderwerp de gebruiker beantwoordt maar die actie niet rapporteert aan de orkestratielaag, behandelt de orkestratielaag het verzoek als onopgelost en beantwoordt het opnieuw.

Ontwerp een onderwerp als mini-agent. Geef een antwoordtoestand-uitvoer terug zodat de orkestratielaag weet dat het verzoek is afgehandeld, en geef elke waarde terug die het onderwerp toont of welke selectie het heeft verzameld en die een latere stap nodig heeft. De output maakt de acties en resultaten beschikbaar voor de rest van het plan. Voeg een instructie toe aan de onderwerpbeschrijving die definieert wat een succesvolle run betekent.

Lees meer in Onderwerpen ontwerpen als mini-agenten die dubbele meldingen voorkomen.

Behandel kind- en verbonden agenten

Ontwerp kind- en verbonden agenten zoals je andere componenten ontwerpt. Hun heen-en-weer met de gebruiker is onzichtbaar voor de ouder, die alleen via outputs ontdekt wat er is gebeurd, en pas nadat de agent klaar is.

Kind- en verbonden agenten kunnen ook eerder onbeantwoorde verzoeken ontvangen die in de context van de ouderagent blijven staan.

Voor elke agent bepaal je zijn taak met een input, geef aan of deze reageert op de gebruiker of zwijgt, en geef je outputs terug die de ouderagent vertellen wat er is gebeurd.

Lees meer in Design subagents die dubbele berichten vermijden.

Kennis beheren

Kennis is een topniveau construct waarop de agent zich beroept. Het ontvangt een verzoek gebaseerd op het ontwerp van de agent, en ontvangt de context van de agent. De meeste herhaalde berichtproblemen ontstaan wanneer de context van de agent geen informatie van andere componenten bevat. Ontwerp kennis om te beïnvloeden hoe de agent het verzoek formuleert. Zorg dat andere componenten hun output correct gebruiken.

Verwerk knooppunten voor generatieve antwoorden

Een generatieve antwoordknoop leeft binnen een onderwerp en antwoordt vanuit kennis. Het ontvangt de oudercontext plus alles wat in zijn invoer wordt doorgegeven, dus het gedraagt zich als topniveau kennis en vult zijn antwoord uit vanuit de huidige context. Het kan zijn antwoord direct naar het chatpaneel schrijven of opslaan in een topicvariabele, maar het kan niets teruggeven naar de top-level context zelf. Zoals bij elke onderwerpinhoud blijft het antwoord in het onderwerp, tenzij het onderwerp een output teruggeeft.

Een generatieve antwoordknoop heeft geen speciale behandeling nodig behalve de regel die voor elk onderwerp geldt: geef het resultaat door als een onderwerpoutput. Als de node de gebruiker binnen het onderwerp antwoord geeft, voeg dan een uitvoer voor de beantwoord-status en een uitvoer voor de weergegeven waarde toe. Deze uitvoer geeft de orkestratielaag een vastlegging dat het verzoek is beantwoord en voorkomt dat een volgende stap het verzoek opnieuw beantwoordt.

Zorg ervoor dat beschrijvingen en instructies overeenkomen met het perspectief

Beschrijvingen en instructies maken ook deel uit van het contextcontract.

Deze instructie leidt naar het onderwerp:

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

Deze instructie routeert en wijst het eigendom van het antwoord toe aan de orkestratielaag:

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

Als het onderwerp al de balans laat zien, creëert de tweede instructie een tweede antwoordpad. Als het onderwerp niet terugkeert balanceValue, kan de orkestratielaag het onderwerp opnieuw aanroepen of antwoorden dat het de waarde niet kent.

Gebruik beschrijvingen en instructies die passen bij het perspectief:

  • Een onderwerpbeschrijving helpt de orkestratielaag te beslissen wanneer en hoe het onderwerp wordt gebruikt. Het volgt ook instructies over wat je daarna moet doen of uitvoeren.
  • Een beschrijving van een verbonden agent komt vanuit het perspectief van de ouder.
  • Een verbonden-agent instructie wordt gelezen vanuit het perspectief van de verbonden agent.
  • Een onderwerp- of connected-agent outputbeschrijving vertelt de orkestratielaag hoe de geretourneerde waarde moet worden geïnterpreteerd.

Voor een onderwerp dat een antwoord aan de gebruiker toont en sets answered=true, beschrijf zowel wanneer je naar het onderwerp moet routeren als wat een succesvolle run betekent:

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.

Voor een onderwerp dat alleen outputs schrijft, beschrijf zowel wanneer je naar het onderwerp moet routeren als hoe je moet antwoorden:

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

Herstel de context in lange gesprekken

Een waarde die een component had, kan de actieve context op twee manieren verlaten. In een lange sessie is een waarde die een paar beurten geleden beschikbaar was, misschien niet langer actief in de context. Of een component haalt een compleet resultaat op, gebruikt het relevante deel om een antwoord te produceren, en geeft alleen dat antwoord terug zodat de rest van het resultaat nooit de orkestratielaag bereikt. Hoe dan ook, de agent kan de data opnieuw ophalen of de gebruiker om informatie vragen die hij al heeft, wat de gebruiker als een gemiste antwoord ervaart. De orkestratielaag gedraagt zich alsof deze de waarde nooit heeft ontvangen.

Houd bij het ontwerp rekening met dit scenario door belangrijke context op te halen en op te slaan, en deze indien nodig weer beschikbaar te maken:

  • Geef een volledig resultaat terug, niet alleen het deel dat is gebruikt om te antwoorden. Een opgehaald resultaat heeft vaak meer dan één veld, veel rijen en lange tekst. Geef alle gegevens die een latere stap mogelijk als output nodig heeft terug, zodat de orkestratielaag daarover beschikt zonder deze opnieuw op te halen.

  • Sla waarden op en gebruik ze tussen interacties. Leid op de juiste momenten, vóór of na een toolaanroep, naar een topic dat de waarde via de invoer en uitvoer en een globale variabele kan opslaan of aanleveren, zodat het plan de waarde niet opnieuw opvraagt of er opnieuw om vraagt.

Tip

Naadloos agentisch gedrag is gebaseerd op een agentontwerp dat rekening houdt met context bij elke stap en vanuit elk perspectief.