Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Fontos
Az Ügynök-keretrendszer ügynök-vezénylési funkciói a kísérleti fázisban vannak. Aktív fejlesztés alatt állnak, és jelentősen változhatnak, mielőtt továbblépnének az előzetes verzióra vagy a kiadásra jelölt fázisra.
A csoportos csevegés vezénylése együttműködési beszélgetést modellez az ügynökök között, opcionálisan egy emberi résztvevőt is beleértve. A csoportos csevegés-kezelő koordinálja a folyamatot, meghatározva, hogy melyik ügynök válaszoljon legközelebb, és mikor kérjen emberi bemenetet. Ez a minta hatékony az értekezletek, viták vagy együttműködésen alapuló problémamegoldó munkamenetek szimulálásához.
Ha többet szeretne megtudni a mintáról, például arról, hogy mikor érdemes használni a mintát, vagy mikor szeretné elkerülni a mintát a számítási feladatban, olvassa el a csoportos csevegés vezénylését.
Gyakori használati esetek
A különböző részlegeket képviselő ügynökök megvitatnak egy üzleti javaslatot, egy menedzserügynök moderálásával és szükség esetén egy ember bevonásával:
Tudnivalók
- Különböző szerepkörökkel rendelkező ügynökök definiálása csoportos csevegéshez
- Csoportos csevegés-kezelő használata a beszélgetés folyamatának szabályozásához
- Emberi résztvevő bevonása a beszélgetésbe
- A beszélgetés megfigyelése és a végeredmény összegyűjtése
Az ügynökök definiálása
A csoportos csevegés minden ügynöke rendelkezik egy adott szerepkörrel. Ebben a példában egy szövegírót és egy véleményezőt határozunk meg.
Jótanács
Ez ChatCompletionAgent itt használatos, de bármilyen ügynöktípust használhat.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Orchestration;
using Microsoft.SemanticKernel.Agents.Orchestration.GroupChat;
using Microsoft.SemanticKernel.Agents.Runtime.InProcess;
// Create a kernel with an AI service
Kernel kernel = ...;
ChatCompletionAgent writer = new ChatCompletionAgent {
Name = "CopyWriter",
Description = "A copy writer",
Instructions = "You are a copywriter with ten years of experience and are known for brevity and a dry humor. The goal is to refine and decide on the single best copy as an expert in the field. Only provide a single proposal per response. You're laser focused on the goal at hand. Don't waste time with chit chat. Consider suggestions when refining an idea.",
Kernel = kernel,
};
ChatCompletionAgent editor = new ChatCompletionAgent {
Name = "Reviewer",
Description = "An editor.",
Instructions = "You are an art director who has opinions about copywriting born of a love for David Ogilvy. The goal is to determine if the given copy is acceptable to print. If so, state that it is approved. If not, provide insight on how to refine suggested copy without example.",
Kernel = kernel,
};
Nem kötelező: Ügynökválaszok megfigyelése
Létrehozhat egy visszahívást az ügynök válaszainak rögzítéséhez, amint a sorozat a ResponseCallback tulajdonságon keresztül halad előre.
ChatHistory history = [];
ValueTask responseCallback(ChatMessageContent response)
{
history.Add(response);
return ValueTask.CompletedTask;
}
A csoportos csevegés vezénylése beállítása
Hozzon létre egy GroupChatOrchestration objektumot, adja át az ügynököknek, egy csoportos csevegés-kezelőt (itt, a ), és a válaszvisszahívást RoundRobinGroupChatManager. A vezető vezérli az áramlást – itt körkörös váltakozó módon zajlik a váltás meghatározott számú kör esetén.
GroupChatOrchestration orchestration = new GroupChatOrchestration(
new RoundRobinGroupChatManager { MaximumInvocationCount = 5 },
writer,
editor)
{
ResponseCallback = responseCallback,
};
A futtatókörnyezet indítása
Az ügynökök végrehajtásának kezeléséhez futtatókörnyezetre van szükség. Itt a vezénylés megkezdése előtt használjuk InProcessRuntime és indítjuk el.
InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();
Orchestráció meghívása
Hívja meg az orchestrationt az kezdeti feladattal (pl. "Szlogen megalkotása új elektromos SUV-hoz..."). Az ügynökök felváltva válaszolnak, és finomítják az eredményt.
var result = await orchestration.InvokeAsync(
"Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime);
Eredmények gyűjtése
Várja meg, amíg az orchestration befejeződik, és szerezze meg a végső kimenetet.
string output = await result.GetValueAsync(TimeSpan.FromSeconds(60));
Console.WriteLine($"\n# RESULT: {text}");
Console.WriteLine("\n\nORCHESTRATION HISTORY");
foreach (ChatMessageContent message in history)
{
this.WriteAgentChatMessage(message);
}
Opcionális: A futtatókörnyezet leállítása
A feldolgozás befejezése után állítsa le a futtatókörnyezetet az erőforrások törléséhez.
await runtime.RunUntilIdleAsync();
Mintakimenet
# RESULT: “Affordable Adventure: Drive Electric, Drive Fun.”
ORCHESTRATION HISTORY
# Assistant - CopyWriter: “Charge Ahead: Affordable Thrills, Zero Emissions.”
# Assistant - Reviewer: The slogan is catchy but it could be refined to better ...
# Assistant - CopyWriter: “Electrify Your Drive: Fun Meets Affordability.”
# Assistant - Reviewer: The slogan captures the essence of electric driving and ...
# Assistant - CopyWriter: “Affordable Adventure: Drive Electric, Drive Fun.”
Jótanács
A teljes mintakód itt érhető el
Az ügynökök definiálása
A csoportos csevegés minden ügynöke rendelkezik egy adott szerepkörrel. Ebben a példában:
- Író: Visszajelzés alapján hoz létre és szerkeszt tartalmakat.
- Véleményező: Áttekinti a tartalmat, és visszajelzést ad a fejlesztéshez.
Jótanács
Ez ChatCompletionAgent az Azure OpenAI-val használható, azonban bármilyen ügynöktípust vagy modellszolgáltatást használhat.
from semantic_kernel.agents import Agent, ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
def get_agents() -> list[Agent]:
writer = ChatCompletionAgent(
name="Writer",
description="A content writer.",
instructions=(
"You are an excellent content writer. You create new content and edit contents based on the feedback."
),
service=AzureChatCompletion(),
)
reviewer = ChatCompletionAgent(
name="Reviewer",
description="A content reviewer.",
instructions=(
"You are an excellent content reviewer. You review the content and provide feedback to the writer."
),
service=AzureChatCompletion(),
)
return [writer, reviewer]
Ügynökválaszok megfigyelése
Meghatározhatja a visszahívási funkciót, amely kiírja az egyes ügynökök üzenetét, miközben a beszélgetés előrehalad.
from semantic_kernel.contents import ChatMessageContent
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"**{message.name}**\n{message.content}")
A csoportos csevegés vezénylése beállítása
Hozzon létre egy GroupChatOrchestration objektumot, adja át az ügynököket, egy csoportos csevegéskezelőt (ebben az esetben egy RoundRobinGroupChatManager), és a válaszvisszahívást. A vezető vezérli az áramlást – itt körkörös váltakozó módon zajlik a váltás meghatározott számú kör esetén.
from semantic_kernel.agents import GroupChatOrchestration, RoundRobinGroupChatManager
agents = get_agents()
group_chat_orchestration = GroupChatOrchestration(
members=agents,
manager=RoundRobinGroupChatManager(max_rounds=5), # Odd number so writer gets the last word
agent_response_callback=agent_response_callback,
)
A futtatókörnyezet indítása
Indítsa el a futtatókörnyezetet az ügynök működtetésének kezeléséhez.
from semantic_kernel.agents.runtime import InProcessRuntime
runtime = InProcessRuntime()
runtime.start()
Orchestráció meghívása
Hívja meg az orchestrationt az kezdeti feladattal (pl. "Szlogen megalkotása új elektromos SUV-hoz..."). Az ügynökök felváltva válaszolnak, és finomítják az eredményt.
orchestration_result = await group_chat_orchestration.invoke(
task="Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime=runtime,
)
Eredmények gyűjtése
Várjon, amíg az összehangolás befejeződik.
value = await orchestration_result.get()
print(f"***** Final Result *****\n{value}")
Opcionális: A futtatókörnyezet leállítása
A feldolgozás befejezése után állítsa le a futtatókörnyezetet az erőforrások törléséhez.
await runtime.stop_when_idle()
Mintakimenet
**Writer**
"Drive Tomorrow: Affordable Adventure Starts Today!"
**Reviewer**
This slogan, "Drive Tomorrow: Affordable Adventure Starts Today!", effectively communicates the core attributes...
**Writer**
"Embrace the Future: Your Affordable Electric Adventure Awaits!"
**Reviewer**
This revised slogan, "Embrace the Future: Your Affordable Electric Adventure Awaits!", further enhances the message...
**Writer**
"Feel the Charge: Adventure Meets Affordability in Your New Electric SUV!"
***** Result *****
"Feel the Charge: Adventure Meets Affordability in Your New Electric SUV!"
Jótanács
A teljes mintakód itt érhető el.
Megjegyzés:
Az ügynök-vezénylés még nem érhető el a Java SDK-ban.
A Csoportos csevegés-kezelő testreszabása
A csoportos csevegési folyamatot a saját GroupChatManager implementálásával szabhatja testre. Ez lehetővé teszi az eredmények szűrésének, a következő ügynök kiválasztásának, valamint a felhasználói bemenet kérésének vagy a csevegés leállításának szabályozását.
Létrehozhat például egy egyéni kezelőt az absztrakt metódusok GroupChatManager öröklésével és felülírásával:
using Microsoft.SemanticKernel.Agents.Orchestration.GroupChat;
using Microsoft.SemanticKernel.ChatCompletion;
using System.Threading;
using System.Threading.Tasks;
public class CustomGroupChatManager : GroupChatManager
{
public override ValueTask<GroupChatManagerResult<string>> FilterResults(ChatHistory history, CancellationToken cancellationToken = default)
{
// Custom logic to filter or summarize chat results
return ValueTask.FromResult(new GroupChatManagerResult<string>("Summary") { Reason = "Custom summary logic." });
}
public override ValueTask<GroupChatManagerResult<string>> SelectNextAgent(ChatHistory history, GroupChatTeam team, CancellationToken cancellationToken = default)
{
// Randomly select an agent from the team
var random = new Random();
int index = random.Next(team.Members.Count);
string nextAgent = team.Members[index].Id;
return ValueTask.FromResult(new GroupChatManagerResult<string>(nextAgent) { Reason = "Custom selection logic." });
}
public override ValueTask<GroupChatManagerResult<bool>> ShouldRequestUserInput(ChatHistory history, CancellationToken cancellationToken = default)
{
// Custom logic to decide if user input is needed
return ValueTask.FromResult(new GroupChatManagerResult<bool>(false) { Reason = "No user input required." });
}
public override ValueTask<GroupChatManagerResult<bool>> ShouldTerminate(ChatHistory history, CancellationToken cancellationToken = default)
{
// Optionally call the base implementation to check for default termination logic
var baseResult = base.ShouldTerminate(history, cancellationToken).Result;
if (baseResult.Value)
{
// If the base logic says to terminate, respect it
return ValueTask.FromResult(baseResult);
}
// Custom logic to determine if the chat should terminate
bool shouldEnd = history.Count > 10; // Example: end after 10 messages
return ValueTask.FromResult(new GroupChatManagerResult<bool>(shouldEnd) { Reason = "Custom termination logic." });
}
}
Ezután használhatja az egyéni kezelőt az orchestrationben:
GroupChatOrchestration orchestration = new (new CustomGroupChatManager { MaximumInvocationCount = 5 }, ...);
Jótanács
Az egyéni csoportos csevegéskezelő teljes példája itt érhető el
A csoportos csevegési folyamatot a saját GroupChatManager implementálásával szabhatja testre. Ez lehetővé teszi az eredmények szűrésének, a következő ügynök kiválasztásának, valamint a felhasználói bemenet kérésének vagy a csevegés leállításának szabályozását.
Létrehozhat például egy egyéni kezelőt az absztrakt metódusok GroupChatManager öröklésével és felülírásával:
from semantic_kernel.agents import GroupChatManager, BooleanResult, StringResult, MessageResult
from semantic_kernel.contents import ChatMessageContent, ChatHistory
class CustomGroupChatManager(GroupChatManager):
async def filter_results(self, chat_history: ChatHistory) -> MessageResult:
# Custom logic to filter or summarize chat results
summary = "Summary of the discussion."
return MessageResult(result=ChatMessageContent(role="assistant", content=summary), reason="Custom summary logic.")
async def select_next_agent(self, chat_history: ChatHistory, participant_descriptions: dict[str, str]) -> StringResult:
# Randomly select an agent from the participants
import random
next_agent = random.choice(list(participant_descriptions.keys()))
return StringResult(result=next_agent, reason="Custom selection logic.")
async def should_request_user_input(self, chat_history: ChatHistory) -> BooleanResult:
# Custom logic to decide if user input is needed
return BooleanResult(result=False, reason="No user input required.")
async def should_terminate(self, chat_history: ChatHistory) -> BooleanResult:
# Optionally call the base implementation to check for default termination logic
base_result = await super().should_terminate(chat_history)
if base_result.result:
return base_result
# Custom logic to determine if the chat should terminate
should_end = len(chat_history.messages) > 10 # Example: end after 10 messages
return BooleanResult(result=should_end, reason="Custom termination logic.")
Ezután használhatja az egyéni kezelőt az orchestrationben:
from semantic_kernel.agents import GroupChatOrchestration
group_chat_orchestration = GroupChatOrchestration(manager=CustomGroupChatManager(max_rounds=5), ...)
Jótanács
Az egyéni csoportos csevegéskezelő teljes példája itt érhető el
Megjegyzés:
Az ügynök-vezénylés még nem érhető el a Java SDK-ban.
Csoportos csevegéskezelői függvényhívások sorrendje
Csoportos csevegések vezénylésekor a csoportos csevegés-kezelő metódusai a beszélgetés minden egyes köréhez meghatározott sorrendben lesznek meghívva:
- ShouldRequestUserInput: Ellenőrzi, hogy szükség van-e felhasználói (emberi) bemenetre a következő ügynök beszéde előtt. Ha igaz, a vezénylés szünetel és vár felhasználói bemenetre. A felhasználói bemenet ezután hozzáadódik a kezelő csevegési előzményeihez, és elküldi az összes ügynöknek.
- ShouldTerminate: Meghatározza, hogy a csoportos csevegés befejeződik-e (például, ha eléri a fordulók maximális számát, vagy teljesül egy egyéni feltétel). Ha igaz, az összehangolás az eredményszűrésre lép tovább.
- FilterResults: Csak akkor hívható meg, ha a csevegés befejeződött, a beszélgetés végleges eredményeinek összegzéséhez vagy feldolgozásához.
- SelectNextAgent: Ha a csevegés nem végződik, kiválasztja a következő ügynököt, aki válaszol a beszélgetésben.
Ez a sorrend biztosítja, hogy a beszélgetés folytatása előtt a felhasználói beviteli és a befejezési feltételek legyenek ellenőrizve, és hogy az eredmények csak a végén legyenek szűrve. Az egyes lépések logikáját úgy szabhatja testre, hogy felülírja a megfelelő metódusokat az egyéni csoportos csevegéskezelőben.