Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A csoportos csevegés vezénylés több ügynök közötti együttműködésen alapuló beszélgetést modellez, amelyet egy olyan vezénylő koordinál, amely meghatározza a beszélő kiválasztását és a beszélgetés folyamatát. Ez a minta iteratív finomítást, együttműködési problémamegoldást vagy többszempontú elemzést igénylő forgatókönyvekhez ideális.
Belsőleg a csoportos csevegés orchestráció csillagtopológiában szervezi egybe az ügynököket, középen egy orchestrátorral. A vezénylő különböző stratégiákat implementálhat a következő ügynök kiválasztásához, például körkörös kiválasztást, prompt-alapú kiválasztást vagy egyéni logikát, amely a beszélgetési környezeten alapul, így rugalmas és hatékony minta a többügynökös együttműködéshez.
Különbségek a csoportos csevegés és az egyéb minták között
A csoportos csevegés irányítása eltérő jellemzőkkel rendelkezik más többügynöki mintáktól.
- Központosított koordináció: Ellentétben az átadási mintákkal, ahol az ügynökök közvetlenül átadják az irányítást, a csoportos csevegés egy koordinátorral határozza meg, ki beszél legközelebb
- Iteratív pontosítás: Az ügynökök több fordulóban áttekinthetik és felhasználhatják egymás válaszait
- Rugalmas hangszóró kiválasztása: A vezénylő különböző stratégiákat (ciklikus időszeletelés, parancssori, egyéni logika) használhat a hangszórók kiválasztásához
- Megosztott környezet: Minden ügynök a teljes beszélgetési előzményt látja, ami lehetővé teszi az együttműködésen alapuló finomítást
Tudnivalók
- Speciális ügynökök létrehozása csoportos együttműködéshez
- Beszélőválasztási stratégiák konfigurálása
- Munkafolyamatok létrehozása iteratív ügynök finomítással
- Beszélgetési folyamat testreszabása egyéni vezénylőkkel
Az Azure OpenAI-ügyfél beállítása
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;
using Microsoft.Agents.AI;
// Set up the Azure OpenAI client
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ??
throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
var client = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsIChatClient();
Figyelmeztetés
DefaultAzureCredential a fejlesztéshez kényelmes, de a termelési környezetben gondos megfontolást igényel. Éles környezetben fontolja meg egy adott hitelesítő adat (pl. ManagedIdentityCredential) használatát a késési problémák elkerülése, a hitelesítő adatok nem szándékos próbálgatásának és a tartalék mechanizmusokból eredő esetleges biztonsági kockázatok elkerülése érdekében.
Az ügynökök definiálása
Speciális ügynökök létrehozása a csoportbeszélgetés különböző szerepköreihez:
// Create a copywriter agent
ChatClientAgent writer = new(client,
"You are a creative copywriter. Generate catchy slogans and marketing copy. Be concise and impactful.",
"CopyWriter",
"A creative copywriter agent");
// Create a reviewer agent
ChatClientAgent reviewer = new(client,
"You are a marketing reviewer. Evaluate slogans for clarity, impact, and brand alignment. " +
"Provide constructive feedback or approval.",
"Reviewer",
"A marketing review agent");
Csoportos csevegés konfigurálása Round-Robin Orchestratorral
Hozza létre a csoportos csevegési munkafolyamatot a következővel AgentWorkflowBuilder:
// Build group chat with round-robin speaker selection
// The manager factory receives the list of agents and returns a configured manager
var workflow = AgentWorkflowBuilder
.CreateGroupChatBuilderWith(agents =>
new RoundRobinGroupChatManager(agents)
{
MaximumIterationCount = 5 // Maximum number of turns
})
.AddParticipants(writer, reviewer)
.Build();
A csoportos csevegés munkafolyamatának futtatása
Hajtsa végre a munkafolyamatot, és figyelje meg az iteratív beszélgetést:
// Start the group chat
var messages = new List<ChatMessage> {
new(ChatRole.User, "Create a slogan for an eco-friendly electric vehicle.")
};
StreamingRun run = await InProcessExecution.StreamAsync(workflow, messages);
await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
await foreach (WorkflowEvent evt in run.WatchStreamAsync().ConfigureAwait(false))
{
if (evt is AgentResponseUpdateEvent update)
{
// Process streaming agent responses
AgentResponse response = update.AsResponse();
foreach (ChatMessage message in response.Messages)
{
Console.WriteLine($"[{update.ExecutorId}]: {message.Text}");
}
}
else if (evt is WorkflowOutputEvent output)
{
// Workflow completed
var conversationHistory = output.As<List<ChatMessage>>();
Console.WriteLine("\n=== Final Conversation ===");
foreach (var message in conversationHistory)
{
Console.WriteLine($"{message.AuthorName}: {message.Text}");
}
break;
}
}
Minta interakció
[CopyWriter]: "Green Dreams, Zero Emissions" - Drive the future with style and sustainability.
[Reviewer]: The slogan is good, but "Green Dreams" might be a bit abstract. Consider something
more direct like "Pure Power, Zero Impact" to emphasize both performance and environmental benefit.
[CopyWriter]: "Pure Power, Zero Impact" - Experience electric excellence without compromise.
[Reviewer]: Excellent! This slogan is clear, impactful, and directly communicates the key benefits.
The tagline reinforces the message perfectly. Approved for use.
[CopyWriter]: Thank you! The final slogan is: "Pure Power, Zero Impact" - Experience electric
excellence without compromise.
A csevegőügyfél beállítása
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
# Initialize the Azure OpenAI chat client
chat_client = AzureOpenAIChatClient(credential=AzureCliCredential())
Az ügynökök definiálása
Speciális ügynökök létrehozása különböző szerepkörökkel:
from agent_framework import Agent
# Create a researcher agent
researcher = Agent(
name="Researcher",
description="Collects relevant background information.",
instructions="Gather concise facts that help answer the question. Be brief and factual.",
chat_client=chat_client,
)
# Create a writer agent
writer = Agent(
name="Writer",
description="Synthesizes polished answers using gathered information.",
instructions="Compose clear, structured answers using any notes provided. Be comprehensive.",
chat_client=chat_client,
)
Csoportos csevegés konfigurálása egyszerű választóval
Csoportos csevegés létrehozása egyéni beszélőválasztási logikával:
from agent_framework.orchestrations import GroupChatBuilder, GroupChatState
def round_robin_selector(state: GroupChatState) -> str:
"""A round-robin selector function that picks the next speaker based on the current round index."""
participant_names = list(state.participants.keys())
return participant_names[state.current_round % len(participant_names)]
# Build the group chat workflow
workflow = GroupChatBuilder(
participants=[researcher, writer],
termination_condition=lambda conversation: len(conversation) >= 4,
selection_func=round_robin_selector,
).build()
Csoportos csevegés konfigurálása Agent-Based Orchestratorral
Alternatív megoldásként használjon ügynökalapú vezénylőt az intelligens beszélő kiválasztásához. A vezénylő teljes Agent körű hozzáféréssel rendelkezik az eszközökhöz, a környezethez és a megfigyelhetőséghez:
# Create orchestrator agent for speaker selection
orchestrator_agent = Agent(
name="Orchestrator",
description="Coordinates multi-agent collaboration by selecting speakers",
instructions="""
You coordinate a team conversation to solve the user's task.
Guidelines:
- Start with Researcher to gather information
- Then have Writer synthesize the final answer
- Only finish after both have contributed meaningfully
""",
chat_client=chat_client,
)
# Build group chat with agent-based orchestrator
workflow = GroupChatBuilder(
participants=[researcher, writer],
# Set a hard termination condition: stop after 4 assistant messages
# The agent orchestrator will intelligently decide when to end before this limit but just in case
termination_condition=lambda messages: sum(1 for msg in messages if msg.role == "assistant") >= 4,
orchestrator_agent=orchestrator_agent,
).build()
A csoportos csevegés munkafolyamatának futtatása
Hajtsa végre a munkafolyamatot és dolgozza fel az eseményeket:
from typing import cast
from agent_framework import AgentResponseUpdate, Role
task = "What are the key benefits of async/await in Python?"
print(f"Task: {task}\n")
print("=" * 80)
final_conversation: list[Message] = []
last_executor_id: str | None = None
# Run the workflow
async for event in workflow.run_stream(task):
if event.type == "output" and isinstance(event.data, AgentResponseUpdate):
# Print streaming agent updates
eid = event.executor_id
if eid != last_executor_id:
if last_executor_id is not None:
print()
print(f"[{eid}]:", end=" ", flush=True)
last_executor_id = eid
print(event.data, end="", flush=True)
elif event.type == "output":
# Workflow completed - data is a list of Message
final_conversation = cast(list[Message], event.data)
if final_conversation:
print("\n\n" + "=" * 80)
print("Final Conversation:")
for msg in final_conversation:
author = getattr(msg, "author_name", "Unknown")
text = getattr(msg, "text", str(msg))
print(f"\n[{author}]\n{text}")
print("-" * 80)
print("\nWorkflow completed.")
Minta interakció
Task: What are the key benefits of async/await in Python?
================================================================================
[Researcher]: Async/await in Python provides non-blocking I/O operations, enabling
concurrent execution without threading overhead. Key benefits include improved
performance for I/O-bound tasks, better resource utilization, and simplified
concurrent code structure using native coroutines.
[Writer]: The key benefits of async/await in Python are:
1. **Non-blocking Operations**: Allows I/O operations to run concurrently without
blocking the main thread, significantly improving performance for network
requests, file I/O, and database queries.
2. **Resource Efficiency**: Avoids the overhead of thread creation and context
switching, making it more memory-efficient than traditional threading.
3. **Simplified Concurrency**: Provides a clean, synchronous-looking syntax for
asynchronous code, making concurrent programs easier to write and maintain.
4. **Scalability**: Enables handling thousands of concurrent connections with
minimal resource consumption, ideal for high-performance web servers and APIs.
--------------------------------------------------------------------------------
Workflow completed.
Alapfogalmak
- Központosított kezelő: A csoportos csevegés egy vezetővel koordinálja a beszélő kiválasztását és a folyamatot
- AgentWorkflowBuilder.CreateGroupChatBuilderWith(): Munkafolyamatokat hoz létre egy manager factory függvénnyel
- RoundRobinGroupChatManager: Beépített kezelő, amely körkörös módon váltogatja a beszélőket
- MaximumIterationCount: Az ügynök leállítás előtti fordulásának maximális számát szabályozza
-
Egyéni menedzserek:
RoundRobinGroupChatManagerkiterjesztése vagy egyéni logika implementálása - Iteratív pontosítás: Az ügynökök áttekintik és javítják egymás hozzájárulását
- Megosztott környezet: Minden résztvevő a teljes beszélgetési előzményt látja
-
Rugalmas vezénylési stratégiák: Válasszon az egyszerű választók, az ügynökalapú vezénylők vagy az egyéni logika között, konstruktorparaméterek (
selection_func,orchestrator_agent, vagyorchestrator) használatával. - GroupChatBuilder: Munkafolyamatok létrehozása konfigurálható hangszóró-kijelöléssel
- GroupChatState: Beszélgetési állapotot biztosít a kiválasztási döntésekhez
- Iteratív együttműködés: Az ügynökök egymás hozzájárulásaira építenek
-
Eseménystreamelés: Adatok valós idejű feldolgozása
WorkflowOutputEventAgentResponseUpdate - list[Message] Kimenet: Minden folyamat a csevegőüzenetek listáját adja vissza
Speciális: Egyéni hangszóró kiválasztása
Egyéni csoport csevegőmenedzserének létrehozásával implementálhatja az egyéni kezelő logikáját:
public class ApprovalBasedManager : RoundRobinGroupChatManager
{
private readonly string _approverName;
public ApprovalBasedManager(IReadOnlyList<AIAgent> agents, string approverName)
: base(agents)
{
_approverName = approverName;
}
// Override to add custom termination logic
protected override ValueTask<bool> ShouldTerminateAsync(
IReadOnlyList<ChatMessage> history,
CancellationToken cancellationToken = default)
{
var last = history.LastOrDefault();
bool shouldTerminate = last?.AuthorName == _approverName &&
last.Text?.Contains("approve", StringComparison.OrdinalIgnoreCase) == true;
return ValueTask.FromResult(shouldTerminate);
}
}
// Use custom manager in workflow
var workflow = AgentWorkflowBuilder
.CreateGroupChatBuilderWith(agents =>
new ApprovalBasedManager(agents, "Reviewer")
{
MaximumIterationCount = 10
})
.AddParticipants(writer, reviewer)
.Build();
A beszélgetési állapot alapján kifinomult kiválasztási logikát implementálhat:
def smart_selector(state: GroupChatState) -> str:
"""Select speakers based on conversation content and context."""
conversation = state.conversation
last_message = conversation[-1] if conversation else None
# If no messages yet, start with Researcher
if not last_message:
return "Researcher"
# Check last message content
last_text = last_message.text.lower()
# If researcher finished gathering info, switch to writer
if "I have finished" in last_text and last_message.author_name == "Researcher":
return "Writer"
# Else continue with researcher until it indicates completion
return "Researcher"
workflow = GroupChatBuilder(
participants=[researcher, writer],
selection_func=smart_selector,
).build()
Fontos
Ha egyéni implementációt használ BaseGroupChatOrchestrator a speciális forgatókönyvekhez, minden tulajdonságot be kell állítani, beleértve a participant_registry, a max_rounds és a termination_condition.
max_rounds és termination_condition, amelyeket a létrehozóban állítottak be, a rendszer figyelmen kívül hagyja.
Környezetszinkronizálás
Ahogy az útmutató elején említettük, a csoportos csevegés összes ügynöke a teljes beszélgetési előzményeket látja.
Az Ügynök-keretrendszerben az ügynökök az ügynöki munkamenetekre (AgentSession) támaszkodnak a környezet kezeléséhez. A csoportos csevegések vezénylésében az ügynökök nem ugyanazt a munkamenet-példányt használják, de a vezénylő biztosítja, hogy minden ügynök munkamenete szinkronizálva legyen a teljes beszélgetési előzményekkel minden egyes sor előtt. Ennek érdekében az egyes ügynökök sorát követően a vezénylő az összes többi ügynöknek közvetíti a választ, biztosítva, hogy minden résztvevő a legújabb kontextusban legyen a következő fordulóhoz.
Jótanács
Az ügynökök nem osztják meg ugyanazt a munkamenet-példányt, mert a különböző ügynöktípusok eltérő implementációval rendelkezhetnek az AgentSession absztrakcióhoz. Ha ugyanazt a munkamenet-példányt osztja meg, az inkonzisztenciát okozhat abban, hogy az egyes ügynökök hogyan dolgoznak fel és tartanak fenn kontextust.
A válasz elküldése után a vezénylő eldönti a következő előadót, és egy kérést küld a kiválasztott ügynöknek, amely most már a teljes beszélgetési előzményekkel rendelkezik a válasz létrehozásához.
Mikor érdemes csoportos csevegést használni?
A csoportos csevegés vezénylése ideális az alábbiakhoz:
- Iteratív finomítás: A felülvizsgálat és a fejlesztés több fordulója
- Együttműködésen alapuló problémamegoldás: A kiegészítő szakértelemmel rendelkező ügynökök együttműködnek
- Tartalom létrehozása: Író-véleményező munkafolyamatok dokumentumlétrehozáshoz
- Több perspektíva-elemzés: Különböző nézőpontok lekérése ugyanazon a bemeneten
- Minőségbiztosítás: Automatizált felülvizsgálati és jóváhagyási folyamatok
A következő esetekben érdemes megfontolni az alternatív megoldásokat:
- Szigorú szekvenciális feldolgozásra van szükség (szekvenciális vezénylés használata)
- Az ügynököknek teljesen függetlenül kell működnie (egyidejű vezénylés használata)
- Közvetlen ügynök-ügynök átadásra van szükség (átadás-irányítás használata)
- Összetett dinamikus tervezésre van szükség (Magentic vezénylés használata)