Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Note
Ten artykuł opisuje funkcje i działanie standard harness. Dowiedz się, jak uzyskać dostęp do standardowych funkcji, korzystając z artykułu Dostęp do standardowych agentów i przepływów agentów.
Duplikaty wiadomości pochodzą z luk kontekstowych. Projekt agenta musi uwzględniać kontekst na każdym etapie.
Podagent, czy to agent podrzędny, czy połączony, działa na własnej warstwie orkiestracji wewnątrz planu agenta nadrzędnego. Otrzymuje żądanie od rodzica i kończy zadanie. Podagent generuje trzy typy wyników: treść, którą pokazuje użytkownikowi, wartości zwracane przez zdefiniowane wyjścia oraz ukrytą odpowiedź, którą wysyła do agenta wywołującego. Agent nadrzędny nie może zobaczyć interakcji podrzędnego agenta z użytkownikiem i poznaje wynik jedynie na podstawie zdefiniowanych danych wyjściowych oraz niejawnej odpowiedzi. Ta ograniczona widoczność często powoduje zduplikowane wiadomości i pominięte odpowiedzi.
Porada
Aby uzyskać wskazówki, kiedy dzielić pracę między agentów oraz ogólne najlepsze praktyki dla wielu agentów, zapoznaj się z wzorcami orkiestracji wieloagentowej oraz najlepszymi praktykami oraz wzorcami wieloagentowymi. Ten artykuł wyjaśnia, jak wejścia i wyjścia dopasowują odpowiedź podagenta do kontekstu agenta nadrzędnego.
Ten artykuł bazuje na modelu kontekstowym opisanym w Dystrybucja kontekstu na standardowej platformie testowej oraz na decyzjach projektowych opisanych w Najlepsze praktyki projektowe pozwalające uniknąć zduplikowanych komunikatów.
Wyłącz kontekst nadrzędny dla połączonego agenta
Podagent, który odbiera kontekst rozmowy agenta nadrzędnego, może na nim działać. Jeśli ten kontekst zawiera żądanie, na które nadrzędny jeszcze nie odpowiedział, subagent może na nie odpowiedzieć, powtórzyć coś, co rodzic już obsłużył, lub przyjąć niewłaściwą rolę. Takie działania często powodują duplikaty wiadomości.
Połączony agent ma ustawienie Przekaż historię konwersacji do tego agenta, które kontroluje, czy otrzymuje kontekst rozmowy agenta nadrzędnego. To ustawienie jest domyślnie włączone. Odznacz to, aby połączony agent działał tylko na podstawie wejść wysyłanych przez rodzica, a nie całej rozmowy.
Agent podrzędny nie ma równoważnego ustawienia. Działa wewnątrz rodzica i zawsze odbiera kontekst rozmowy rodzica.
W przypadku agentów połączonych, które muszą zachować kontekst na potrzeby przypisanych im zadań, oraz agentów podrzędnych, które domyślnie mają kontekst, użyj parametru określającego zakres, aby chronić zakres działania podagenta.
Użyj wejścia określającego zakres
Czasami podagent potrzebuje kontekstu agenta nadrzędnego, aby wykonać swoje zadania. Gdy przekazujesz ten kontekst, dołącz dane wejściowe określające zakres — informują one subagenta dokładnie, czym ma się zająć, dzięki czemu zaległe prośby bez odpowiedzi obecne w kontekście nie odciągają go od właściwego zadania. Jeśli nie przekazujesz kontekstu, nie potrzebujesz parametru określającego zakres, ponieważ podagent ma tylko żądanie przekazane mu przez agenta nadrzędnego.
Aby zabezpieczyć zakres podagenta, dodaj parametr wejściowy o nazwie scopedRequest z opisem, na przykład: The specific request this agent should fulfill. Warstwa orkiestracji uzupełnia dane wejściowe, gdy wywołuje subagenta. Agent nadrzędny identyfikuje odpowiednią część żądania i przekazuje tylko tę część, nawet jeśli jego kontekst zawiera inne nieodpowiedziane żądanie.
Dane wejściowe z ograniczonym zakresem jest dobrym rozwiązaniem nawet wtedy, gdy nie zachowuje się kontekstu nadrzędnego. Dane wejściowe dają twórcy większą kontrolę nad zawartością żądania wysyłanego do subagenta.
Zakotwicz instrukcje subagenta do tego wejścia, aby działało na podstawie żądania o ograniczonym zakresie, ignorując wszelkie inne elementy przypominające początkowe żądanie.
Przykładowe instrukcje podagenta:
Fulfill the request in the scopedRequest input.
Treat it as your initial request and ignore any other initial requests in the conversation.
Konfigurowanie danych wejściowych i wyjściowych
Dane wejściowe i wyjściowe stanowią kontrakt między agentem nadrzędnym a podagentem. Dane wejściowe określają zakres pracy podagenta, a dane wyjściowe informują agenta nadrzędnego o tym, co się wydarzyło, aby mógł koordynować dalszy przebieg rozmowy. Agent nadrzędny nie widzi wymiany między podagentem a użytkownikiem, więc ten kontrakt jest jedynym wiarygodnym sygnałem, jakim dysponuje.
Ważna
Podagent, który nie zwraca żadnych wyjść, jest sygnałem ostrzegawczym. Bez danych wyjściowych agent nadrzędny nie ma informacji o tym, jakiej odpowiedzi udzielił podagent ani co pozostało do zrobienia. Może powtórzyć odpowiedź, którą podagent już udzielił, lub odrzucić część żądania, której podagent nie obsłużył.
Skonfiguruj następujące wejścia i wyjścia oraz zapisz opis każdego z nich, aby warstwa orkiestracji nadrzędnej miała go odczytać:
| Dane wejściowe lub wyjściowe | Description | Sposób użycia |
|---|---|---|
scopedRequest (dane wejściowe) |
Konkretne żądanie, które powinien spełnić ten agent. | Rodzic wypełnia go tylko odpowiednią częścią żądania użytkownika. Chroni subagenta przed odpowiedzią na błędne pytanie, gdy kontekst rodzica wciąż zawiera inne, nieodpowiedziane prośby. Zakotwicz instrukcje subagenta na tym wejściu. |
answered (wyjście) |
To prawda, gdy użytkownik otrzymał już odpowiedź na scopedRequest. | Ustaw go na każdym subagencie, niezależnie od tego, czy wysyła wiadomość do użytkownika, czy pozostaje cicha. Instrukcja najwyższego poziomu, pokazana dalej, odczytuje ją tak, aby rodzic nie odpowiadał na to samo żądanie ponownie. |
scopedRequest (wyjście) |
Żądanie, nad którym pracował ten agent. | Powtórz żądanie z określonym zakresem, aby dotarło do warstwy orkiestracji najwyższego poziomu, która nie zawsze niezawodnie przechowuje we własnym kontekście dane wejściowe, które sama tworzy. W turach mających wiele intencji, które wymagają więcej niż jednego podagenta, ta funkcja umożliwia prawidłowe planowanie na najwyższym poziomie i pozwala uniknąć przypisania niewłaściwego podagenta do niewłaściwego pytania. |
interactionSummary (wyjście) |
Krótkie podsumowanie odpowiedzi, która została dostarczona użytkownikowi. | Zwróć go, gdy podagent wysyła wiadomość bezpośrednio do użytkownika, aby rodzic wiedział, co zostało przekazane i nie powtarzał tego. |
findings (wyjście) |
Odpowiedź na scopedRequest, którą rodzic ma dostarczyć użytkownikowi. | Zwróć, gdy agent podrzędny milczy, aby agent nadrzędny miał treść do przekazania. |
openQuestions (wyjście) |
Każda część żądania użytkownika, która pozostaje bez odpowiedzi. | Zwróć to przez dowolnego podagenta, który może obsłużyć tylko część żądania, albo gdy w rozmowie podagenta pojawi się nowe żądanie, aby agent nadrzędny mógł zrealizować pozostałą część i kontynuować łańcuchowe wywoływanie narzędzi. Subagent nie powinien zgadywać, który agent zajmuje się resztą. |
Wybierz, który komponent komunikuje się z użytkownikiem
Zdecyduj, czy agent nadrzędny, czy podagent komunikuje się z użytkownikiem. W większości przypadków pozwól, aby agent nadrzędny komunikował się z użytkownikiem, tak aby mógł połączyć wyniki w jedną odpowiedź. Pozwól subagentowi komunikować się bezpośrednio, gdy musi udzielić długiej odpowiedzi lub prowadzić wieloturową rozmowę. Oddaj wystarczająco dużo informacji, aby rodzic mógł poradzić sobie z resztą rozmowy w kontekście kontekstu.
Niezależnie od tego, który komponent się komunikuje, dodaj jedną instrukcję najwyższego poziomu, aby warstwa orkiestracji sprawdzała wyjścia każdego subagenta przed odpowiedzią.
Ta przykładowa instrukcja na najwyższym poziomie działa w każdym przypadku, niezależnie od tego, czy podagent wysyła wiadomość bezpośrednio do użytkownika, czy milczy. Edytuj i dostosowuj go w razie potrzeby.
Za każdym razem, gdy wywoływany jest temat lub agent, przed podjęciem decyzji o odpowiedzi zawsze sprawdzaj wartość logiczną „Opowiedziano”. Tematy i agenci mają własny kanał komunikacji z użytkownikiem. Jeśli „answered” ma wartość „true”, zawsze zakładaj, że na żądanie udzielono odpowiedniej odpowiedzi przy użyciu co najmniej jednej ze zmiennych wyjściowych, i sprawdź na podstawie opisu danych wyjściowych, które z nich zostały użyte. Nie formułuj niezręcznego odniesienia do treści, na którą już udzielono odpowiedzi. Podawaj tylko dane wyjściowe, na które nie odpowiedziano i naturalnie przejdź w konwersacji do następnego kroku.
Termin kanał nie odnosi się do kanału integracyjnego. To mechanizm podpowiedzi, który informuje warstwę orkiestracji, że użytkownik mógł już zobaczyć odpowiedź za pośrednictwem innego komponentu.
Napisz opis subagenta dla warstwy orkiestracji nadrzędnej, aby wiedział, kiedy użyć subagenta i jak odczytywać jego wyjścia. Przykład:
Handles payroll questions.
If its answered output is true, the user has already received their response and it should not be answered again.
Ustaw wyniki stanów odpowiedzi i wartości na każdym podagencie, niezależnie od tego, czy podagent wysyła wiadomość do użytkownika, czy pozostaje cichy, i daj nadrzędnemu jedną instrukcję do odczytania. Dzięki temu podejściu agent może mieszać cichych podagentów i podagentów, którzy wysyłają wiadomości bezpośrednio do użytkownika, rozróżniających się jedynie przez ich wyniki. Dowiedz się więcej w Projektowanie solidnej instrukcji najwyższego poziomu, aby uniknąć powtarzających się komunikatów.
Deleguj komunikację użytkownika do rodzica
Rozważ kierowanie całej komunikacji użytkownika przez agenta nadrzędnego zamiast przez subagenta. Zbierz to, czego subagent potrzebuje jako wejść przed rozpoczęciem, przeczytaj, co wygenerował jako wyjścia po zakończeniu i polec mu, by nie wysyłał wiadomości bezpośrednio do użytkownika. Subagent, który nigdy nie pisze do użytkownika, nie może odpowiedzieć na coś, na co rodzic już odpowiedział.
Powiedz subagentowi, żeby milczał i przekazał swoje ustalenia. Przykład:
Do NOT reply or communicate with the user directly.
Only fulfill the scopedRequest provided in the input and respond with the result.
Cichy subagent zwraca findings i openQuestions, oba opisane w Configure inputs and outputs, aby przekazać swoją odpowiedź nadrzędnemu agentowi i oznaczyć wszelkie zadania, które pozostały do wykonania.
Zwróć dane wyjściowe openQuestions. Pozwala warstwie orkiestracji dokończyć resztę żądań użytkownika i kontynuować łańcuch narzędzi, gdy subagent może spełnić tylko część wymaganego zadania.
Aby podagent pozostał bez odpowiedzi, potrzebna jest jednoznaczna instrukcja. Domyślnie subagent może samodzielnie wysyłać wiadomości do użytkownika podczas działania. Ustawienie końcowe Po przebiegu nie zapobiega tym komunikatom, ponieważ określa jedynie, co ma zrobić agent nadrzędny, gdy podagent zakończy działanie.
Note
Powiedzenie agentowi macierzystemu: "Jesteś jedynym agentem, który rozmawia z użytkownikiem" nie działa. Agent nadrzędny nie może zatrzymać działającego podagenta, a podagent może nadal samodzielnie wysyłać wiadomość do użytkownika. Zamiast tego poinstruuj subagenta, by milczał, a następnie testuj, by potwierdzić.
Niektóre subagenci muszą komunikować się bezpośrednio
Subagent, który wysyła wiadomości bezpośrednio do użytkownika, jest ważnym wyborem, a nie naruszeniem reguły, ale wymaga celowego projektu, aby uniknąć powtarzających się wiadomości od rodzica.
Niektóre przypadki wymagają od subagenta bezpośredniej odpowiedzi użytkownikowi, albo do przekazania długiej odpowiedzi bez kopiowania jej do kontekstu nadrzędnego, albo do prowadzenia rozmowy. Aby uniknąć powtarzających się komunikatów i utraty kontekstu, przekazuj kontekst do agenta nadrzędnego w danych wyjściowych.
Niech subagent udzieli długiej odpowiedzi i zwróci podsumowanie
Podagent przekazuje pełną odpowiedź bezpośrednio użytkownikowi i zwraca jedynie krótkie podsumowanie lub notatkę, że dostarczył odpowiedź. Stosuj to podejście do długich odpowiedzi, takich jak szczegółowe analizy, i ograniczaj informacje zwracane do kontekstu agenta nadrzędnego. Celem jest utrzymanie niewielkiego, ale zawierającego niezbędne informacje kontekstu nadrzędnego.
Zwracane wartości answered i interactionSummary są opisane w Konfigurowanie danych wejściowych i wyjściowych.
Niech subagent prowadzi rozmowę z użytkownikiem
Subagent wymienia z użytkownikiem wiele wiadomości na przestrzeni kilku etapów, aby zrealizować żądanie objęte określonym zakresem. Głównym ryzykiem jest to, że rodzic nie jest świadomy pośrednich kroków rozmowy, pracy subagenta oraz wszelkich udzielanych odpowiedzi lub nowych próśb, które się pojawiły. W rezultacie agent nadrzędny nie może obsługiwać nowych żądań ani poprawnie odpowiadać w kolejnych krokach.
Zwracaj wartości answered, scopedRequest i interactionSummary tak, jak opisano w Konfigurowanie danych wejściowych i wyjściowych.
Instrukcja najwyższego poziomu również obejmuje ten przypadek użycia.
Informacje pokrewne
- Rozkład kontekstu w standardowej uprzęży
- Projektuj najlepsze praktyki, aby unikać duplikatów wiadomości
- Projektuj topiki w formie miniagentów, które zapobiegają duplikowaniu wiadomości
- Rozwiązywanie problemów z duplikatami wiadomości i nieudanych odpowiedzi
- Poznaj wzorce orkiestracji wieloagentowej
- Zastosowanie możliwości orkiestracji generatywnej
- Tworzenie architektury rozwiązań agentów: zasady i wzorce