Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Samenwerking tussen agenten verkennen in
Belangrijk
Deze functie bevindt zich in de experimentele fase. Functies in deze fase zijn in ontwikkeling en kunnen worden gewijzigd voordat u naar de preview- of releasekandidaatfase gaat.
Gedetailleerde API-documentatie met betrekking tot deze discussie is beschikbaar op:
Functie is momenteel niet beschikbaar in Java.
Wat is AgentChat
?
AgentChat
biedt een framework dat interactie tussen meerdere agents mogelijk maakt, zelfs als ze van verschillende typen zijn. Hierdoor kunnen een ChatCompletionAgent
en een OpenAIAssistantAgent
samenwerken binnen hetzelfde gesprek.
AgentChat
definieert ook toegangspunten voor het initiëren van samenwerking tussen agents, hetzij via meerdere antwoorden of één agentantwoord.
Als abstracte klasse kunnen van AgentChat
subklassen worden gemaakt om aangepaste scenario's te ondersteunen.
Een dergelijke subklasse, AgentGroupChat
, biedt een concrete implementatie van AgentChat
, met behulp van een strategiegebaseerde benadering om gespreksdynamiek te beheren.
Een AgentGroupChat
aanmaken
Als u een AgentGroupChat
wilt maken, kunt u de deelnemende agenten opgeven of een lege chat maken en vervolgens agenten als deelnemers toevoegen. Het configureren van de chatinstellingen en strategieën wordt ook uitgevoerd tijdens AgentGroupChat
initialisatie. Deze instellingen bepalen hoe de gespreksdynamiek in de groep werkt.
Opmerking: de standaard Chat-Settings resulteren in een gesprek dat is beperkt tot één antwoord. Zie
AgentChat
Gedrag voor meer informatie over het configureren van chatinstellingen.
Een AgentGroupChat
creëren met een Agent
:
// Define agents
ChatCompletionAgent agent1 = ...;
OpenAIAssistantAgent agent2 = ...;
// Create chat with participating agents.
AgentGroupChat chat = new(agent1, agent2);
# Define agents
agent1 = ChatCompletionAgent(...)
agent2 = OpenAIAssistantAgent(...)
# Create chat with participating agents
chat = AgentGroupChat(agents=[agent1, agent2])
Functie is momenteel niet beschikbaar in Java.
Een Agent
toevoegen aan een AgentGroupChat
:
// Define agents
ChatCompletionAgent agent1 = ...;
OpenAIAssistantAgent agent2 = ...;
// Create an empty chat.
AgentGroupChat chat = new();
// Add agents to an existing chat.
chat.AddAgent(agent1);
chat.AddAgent(agent2);
# Define agents
agent1 = ChatCompletionAgent(...)
agent2 = OpenAIAssistantAgent(...)
# Create an empty chat
chat = AgentGroupChat()
# Add agents to an existing chat
chat.add_agent(agent=agent1)
chat.add_agent(agent=agent2)
Functie is momenteel niet beschikbaar in Java.
AgentGroupChat
gebruiken
AgentChat
ondersteunt twee bewerkingsmodi: Single-Turn
en Multi-Turn
. In single-turn
wordt een specifieke agent aangewezen om een antwoord te geven. In multi-turn
reageren alle agents in het gesprek om beurten totdat aan een beëindigingscriterium wordt voldaan. In beide modi kunnen agents samenwerken door op elkaar te reageren om een gedefinieerd doel te bereiken.
Het geven van invoer
Het toevoegen van een invoerbericht aan een AgentChat
volgt hetzelfde patroon als een ChatHistory
-object.
AgentGroupChat chat = new();
chat.AddChatMessage(new ChatMessageContent(AuthorRole.User, "<message content>"));
chat = AgentGroupChat()
await chat.add_chat_message(message="<message content>")
Functie is momenteel niet beschikbaar in Java.
Eenmalige oproep van agent
In een aanroep met meerdere beurten moet het systeem beslissen welke agent vervolgens reageert en wanneer het gesprek moet worden beëindigd. Een aanroep van één beurt retourneert daarentegen gewoon een reactie van de opgegeven agent, zodat de beller de deelname van de agent rechtstreeks kan beheren.
Nadat de agent deelneemt aan een AgentChat
via een enkelvoudige aanroep, wordt deze toegevoegd aan de verzameling agenten die in aanmerking komen voor aanroepen met meerdere beurten.
// Define an agent
ChatCompletionAgent agent = ...;
// Create an empty chat.
AgentGroupChat chat = new();
// Invoke an agent for its response
ChatMessageContent[] messages = await chat.InvokeAsync(agent).ToArrayAsync();
# Define an agent
agent = ChatCompletionAgent(...)
# Create an empty chat
chat = AgentGroupChat()
# Invoke an agent for its response(s)
async for message in chat.invoke(agent)
# process message response(s)
Functie is momenteel niet beschikbaar in Java.
Meertraps aanroep van agent
Hoewel samenwerking tussen agents vereist dat een systeem aanwezig is dat niet alleen bepaalt welke agent moet reageren tijdens elke beurt, maar ook beoordeelt wanneer het gesprek het beoogde doel heeft bereikt, blijft het initiëren van samenwerking met meerdere paden eenvoudig.
Antwoorden van de agent worden asynchroon geretourneerd wanneer ze worden gegenereerd, zodat het gesprek in real-time kan verlopen.
Opmerking: In de volgende secties worden agentselectie en chatbeëindiging uitgebreid ingegaan op de uitvoeringsinstellingen. De standaarduitvoeringsinstellingen maken gebruik van sequentiële of round robin-selectie en beperkt de deelname van agents aan één beurt.
API voor .NET-uitvoeringsinstellingen: AgentGroupChatSettings
// Define agents
ChatCompletionAgent agent1 = ...;
OpenAIAssistantAgent agent2 = ...;
// Create chat with participating agents.
AgentGroupChat chat =
new(agent1, agent2)
{
// Override default execution settings
ExecutionSettings =
{
TerminationStrategy = { MaximumIterations = 10 }
}
};
// Invoke agents
await foreach (ChatMessageContent response in chat.InvokeAsync())
{
// Process agent response(s)...
}
# Define agents
agent1 = ChatCompletionAgent(...)
agent2 = OpenAIAssistantAgent(...)
# Create chat with participating agents
chat = AgentGroupChat(
agents=[agent1, agent2],
termination_strategy=DefaultTerminationStrategy(maximum_iterations=10),
)
async for response in chat.invoke():
# process agent response(s)
Functie is momenteel niet beschikbaar in Java.
Chatgeschiedenis openen
De AgentChat
gespreksgeschiedenis is altijd toegankelijk, ook al worden berichten bezorgd via het aanroeppatroon. Dit zorgt ervoor dat eerdere uitwisselingen tijdens het gesprek beschikbaar blijven.
Opmerking: Het meest recente bericht wordt eerst opgegeven (aflopende volgorde: nieuwste naar oudste).
// Define and use a chat
AgentGroupChat chat = ...;
// Access history for a previously utilized AgentGroupChat
ChatMessageContent[] history = await chat.GetChatMessagesAsync().ToArrayAsync();
# Define a group chat
chat = AgentGroupChat(...)
# Access history for a previously utilized AgentGroupChat
history = await chat.get_chat_messages()
Functie is momenteel niet beschikbaar in Java.
Omdat verschillende agenttypen of configuraties hun eigen versie van de gespreksgeschiedenis kunnen onderhouden, is de specifieke agentgeschiedenis ook beschikbaar door een agent op te geven. (Bijvoorbeeld: OpenAIAssistant
versus ChatCompletionAgent
.)
// Agents to participate in chat
ChatCompletionAgent agent1 = ...;
OpenAIAssistantAgent agent2 = ...;
// Define a group chat
AgentGroupChat chat = ...;
// Access history for a previously utilized AgentGroupChat
ChatMessageContent[] history1 = await chat.GetChatMessagesAsync(agent1).ToArrayAsync();
ChatMessageContent[] history2 = await chat.GetChatMessagesAsync(agent2).ToArrayAsync();
# Agents to participate in a chat
agent1 = ChatCompletionAgent(...)
agent2 = OpenAIAssistantAgent(...)
# Define a group chat
chat = AgentGroupChat(...)
# Access history for a previously utilized AgentGroupChat
history1 = await chat.get_chat_messages(agent=agent1)
history2 = await chat.get_chat_messages(agent=agent2)
Functie is momenteel niet beschikbaar in Java.
AgentGroupChat
gedrag definiëren
Samenwerking tussen agents voor het oplossen van complexe taken is een kernagentisch patroon. Als u dit patroon effectief wilt gebruiken, moet een systeem aanwezig zijn dat niet alleen bepaalt welke agent moet reageren tijdens elke beurt, maar ook beoordeelt wanneer het gesprek het beoogde doel heeft bereikt. Hiervoor moet agentselectie worden beheerd en duidelijke criteria worden vastgesteld voor gespreksafbreking, waardoor naadloze samenwerking tussen agents tot een oplossing wordt gewaarborgd. Beide aspecten worden beheerd door de eigenschap Execution Settings.
In de volgende secties, Agentselectie en Chatbeëindiging, worden deze overwegingen uitgebreid besproken.
Agentselectie
Bij oproepen met meerdere beurten wordt de selectie van agenten geleid door een selectie-strategie. Deze strategie wordt gedefinieerd door een basisklasse die kan worden uitgebreid om aangepast gedrag te implementeren dat is afgestemd op specifieke behoeften. Voor het gemak zijn er ook twee vooraf gedefinieerde concrete selectiestrategieën beschikbaar, die kant-en-klare benaderingen bieden voor het afhandelen van agentselectie tijdens gesprekken.
Indien bekend, kan een initiële agent worden opgegeven om steeds als eerste aan de beurt te zijn. Een geschiedenisbeperking kan ook worden gebruikt om het tokengebruik te beperken bij gebruik van een strategie die gebaseerd is op een KernelFunction
.
API voor .NET-selectiestrategie:
// Define the agent names for use in the function template
const string WriterName = "Writer";
const string ReviewerName = "Reviewer";
// Initialize a Kernel with a chat-completion service
Kernel kernel = ...;
// Create the agents
ChatCompletionAgent writerAgent =
new()
{
Name = WriterName,
Instructions = "<writer instructions>",
Kernel = kernel
};
ChatCompletionAgent reviewerAgent =
new()
{
Name = ReviewerName,
Instructions = "<reviewer instructions>",
Kernel = kernel
};
// Define a kernel function for the selection strategy
KernelFunction selectionFunction =
AgentGroupChat.CreatePromptFunctionForStrategy(
$$$"""
Determine which participant takes the next turn in a conversation based on the the most recent participant.
State only the name of the participant to take the next turn.
No participant should take more than one turn in a row.
Choose only from these participants:
- {{{ReviewerName}}}
- {{{WriterName}}}
Always follow these rules when selecting the next participant:
- After {{{WriterName}}}, it is {{{ReviewerName}}}'s turn.
- After {{{ReviewerName}}}, it is {{{WriterName}}}'s turn.
History:
{{$history}}
""",
safeParameterNames: "history");
// Define the selection strategy
KernelFunctionSelectionStrategy selectionStrategy =
new(selectionFunction, kernel)
{
// Always start with the writer agent.
InitialAgent = writerAgent,
// Parse the function response.
ResultParser = (result) => result.GetValue<string>() ?? WriterName,
// The prompt variable name for the history argument.
HistoryVariableName = "history",
// Save tokens by not including the entire history in the prompt
HistoryReducer = new ChatHistoryTruncationReducer(3),
};
// Create a chat using the defined selection strategy.
AgentGroupChat chat =
new(writerAgent, reviewerAgent)
{
ExecutionSettings = new() { SelectionStrategy = selectionStrategy }
};
Api voor Python-selectiestrategie:
REVIEWER_NAME = "Reviewer"
WRITER_NAME = "Writer"
agent_reviewer = ChatCompletionAgent(
kernel=kernel,
name=REVIEWER_NAME,
instructions="<instructions>",
)
agent_writer = ChatCompletionAgent(
kernel=kernel,
name=WRITER_NAME,
instructions="<instructions>",
)
selection_function = KernelFunctionFromPrompt(
function_name="selection",
prompt=f"""
Determine which participant takes the next turn in a conversation based on the the most recent participant.
State only the name of the participant to take the next turn.
No participant should take more than one turn in a row.
Choose only from these participants:
- {REVIEWER_NAME}
- {WRITER_NAME}
Always follow these rules when selecting the next participant:
- After user input, it is {WRITER_NAME}'s turn.
- After {WRITER_NAME} replies, it is {REVIEWER_NAME}'s turn.
- After {REVIEWER_NAME} provides feedback, it is {WRITER_NAME}'s turn.
History:
{{{{$history}}}}
""",
)
chat = AgentGroupChat(
agents=[agent_writer, agent_reviewer],
selection_strategy=KernelFunctionSelectionStrategy(
function=selection_function,
kernel=_create_kernel_with_chat_completion("selection"),
result_parser=lambda result: str(result.value[0]) if result.value is not None else COPYWRITER_NAME,
agent_variable_name="agents",
history_variable_name="history",
),
)
Functie is momenteel niet beschikbaar in Java.
Chatbeëindiging
Bij aanroepen met meerdere beurten bepaalt de beëindigingsstrategie wanneer de laatste beurt plaatsvindt. Deze strategie zorgt ervoor dat het gesprek eindigt op het juiste punt.
Deze strategie wordt gedefinieerd door een basisklasse die kan worden uitgebreid om aangepast gedrag te implementeren dat is afgestemd op specifieke behoeften. Voor het gemak zijn er ook verschillende vooraf gedefinieerde concrete selectiestrategieën beschikbaar, die kant-en-klare benaderingen bieden voor het definiëren van beëindigingscriteria voor een AgentChat
gesprek.
API voor .NET-beëindigingsstrategie:
TerminationStrategy
RegexTerminationStrategy
KernelFunctionSelectionStrategy
KernelFunctionTerminationStrategy
AggregatorTerminationStrategy
// Initialize a Kernel with a chat-completion service
Kernel kernel = ...;
// Create the agents
ChatCompletionAgent writerAgent =
new()
{
Name = "Writer",
Instructions = "<writer instructions>",
Kernel = kernel
};
ChatCompletionAgent reviewerAgent =
new()
{
Name = "Reviewer",
Instructions = "<reviewer instructions>",
Kernel = kernel
};
// Define a kernel function for the selection strategy
KernelFunction terminationFunction =
AgentGroupChat.CreatePromptFunctionForStrategy(
$$$"""
Determine if the reviewer has approved. If so, respond with a single word: yes
History:
{{$history}}
""",
safeParameterNames: "history");
// Define the termination strategy
KernelFunctionTerminationStrategy terminationStrategy =
new(terminationFunction, kernel)
{
// Only the reviewer may give approval.
Agents = [reviewerAgent],
// Parse the function response.
ResultParser = (result) =>
result.GetValue<string>()?.Contains("yes", StringComparison.OrdinalIgnoreCase) ?? false,
// The prompt variable name for the history argument.
HistoryVariableName = "history",
// Save tokens by not including the entire history in the prompt
HistoryReducer = new ChatHistoryTruncationReducer(1),
// Limit total number of turns no matter what
MaximumIterations = 10,
};
// Create a chat using the defined termination strategy.
AgentGroupChat chat =
new(writerAgent, reviewerAgent)
{
ExecutionSettings = new() { TerminationStrategy = terminationStrategy }
};
Api voor python-beëindigingsstrategie:
REVIEWER_NAME = "Reviewer"
WRITER_NAME = "Writer"
agent_reviewer = ChatCompletionAgent(
kernel=kernel,
name=REVIEWER_NAME,
instructions="<instructions>",
)
agent_writer = ChatCompletionAgent(
kernel=kernel,
name=WRITER_NAME,
instructions="<instructions>",
)
termination_function = KernelFunctionFromPrompt(
function_name="termination",
prompt="""
Determine if the copy has been approved. If so, respond with a single word: yes
History:
{{$history}}
""",
)
chat = AgentGroupChat(
agents=[agent_writer, agent_reviewer],
termination_strategy=KernelFunctionTerminationStrategy(
agents=[agent_reviewer],
function=termination_function,
kernel=_create_kernel_with_chat_completion("termination"),
result_parser=lambda result: str(result.value[0]).lower() == "yes",
history_variable_name="history",
maximum_iterations=10,
),
)
Functie is momenteel niet beschikbaar in Java.
Voltooiingsstatus van chat opnieuw instellen
Ongeacht of AgentGroupChat
wordt aangeroepen met behulp van de enkelvoudige of meervoudige benadering, wordt de status van AgentGroupChat
bijgewerkt om aan te geven dat deze is voltooid zodra aan de beëindigingscriteria is voldaan. Dit zorgt ervoor dat het systeem herkent wanneer een gesprek volledig is afgesloten. Als u een AgentGroupChat
-exemplaar wilt blijven gebruiken nadat deze de voltooide status heeft bereikt, moet deze status opnieuw worden ingesteld om verdere interacties mogelijk te maken. Zonder het opnieuw instellen zijn extra interacties of agentreacties niet mogelijk.
In het geval van een aanroep met meerdere beurten die de maximale draailimiet bereikt, stopt het systeem de aanroep van de agent, maar markeert het exemplaar niet als voltooid. Dit maakt het mogelijk om het gesprek uit te breiden zonder de voltooiingsstatus opnieuw in te stellen.
// Define an use chat
AgentGroupChat chat = ...;
// Evaluate if completion is met and reset.
if (chat.IsComplete)
{
// Opt to take action on the chat result...
// Reset completion state to continue use
chat.IsComplete = false;
}
# Define a group chat
chat = AgentGroupChat()
# Evaluate if completion is met and reset
if chat.is_complete:
# Reset completion state to continue use
chat.is_complete = False
Functie is momenteel niet beschikbaar in Java.
Volledige gesprekstoestand wissen
Wanneer u klaar bent met het gebruik van een AgentChat
waarbij een OpenAIAssistant
heeft deelgenomen, kan het nodig zijn om de externe thread te verwijderen die aan de assistent is gekoppeld.
AgentChat
ondersteunt het opnieuw instellen of wissen van de volledige gespreksstatus, waaronder het verwijderen van een externe threaddefinitie. Dit zorgt ervoor dat er geen resterende gespreksgegevens aan de assistent blijven gekoppeld zodra de chat is afgesloten.
Bij een volledige reset worden de agents die zich bij de AgentChat
hebben aangesloten niet verwijderd en blijft de AgentChat
in een toestand waarin het opnieuw kan worden gebruikt. Hierdoor kunnen interacties met dezelfde agents worden voortgezet zonder dat ze opnieuw hoeven te worden geïnitialiseerd, waardoor toekomstige gesprekken efficiënter worden.
// Define an use chat
AgentGroupChat chat = ...;
// Clear the all conversation state
await chat.ResetAsync();
# Define a group chat
chat = AgentGroupChat()
# Clear the conversation state
await chat.reset()
Functie is momenteel niet beschikbaar in Java.
Handleiding
Zie voor een end-to-end-voorbeeld voor het gebruik van AgentGroupChat
voor Agent
samenwerking: