Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Viktigt!
Agentorkestreringsfunktionerna i Agent Framework är i den experimentella fasen. De är under aktiv utveckling och kan ändras avsevärt innan de går vidare till förhandsversionen eller lanseringsfasen.
Med överlämningsorkestrering kan agenter överföra kontroll till varandra baserat på kontexten eller användarbegäran. Varje agent kan "överlämna" konversationen till en annan agent med lämplig expertis, vilket säkerställer att rätt agent hanterar varje del av uppgiften. Detta är särskilt användbart i kundsupport, expertsystem eller i alla scenarier som kräver dynamisk delegering.
Mer information om när du ska använda eller undvika mönstret i din arbetsbelastning finns i Handoff orchestration.
Vanliga Användningsfall
En kundsupportagent hanterar en allmän förfrågan och lämnar sedan över till en teknisk expertagent för felsökning eller till en faktureringsagent om det behövs:
Vad du ska lära dig
- Definiera agenter och deras överlämningsrelationer
- Så här konfigurerar du en överlämningsorkestrering för dynamisk agentroutning
- Så här engagerar du en människa i konversationsloopen
Definiera specialiserade agenter
Varje agent ansvarar för ett visst område. I det här exemplet definierar vi en sorteringsagent, en återbetalningsagent, en orderstatusagent och en orderreturagent. Vissa agenter använder plugin-program för att hantera specifika uppgifter.
Tips/Råd
ChatCompletionAgent Används här, men du kan använda vilken agenttyp som helst.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Orchestration;
using Microsoft.SemanticKernel.Agents.Orchestration.Handoff;
using Microsoft.SemanticKernel.Agents.Runtime.InProcess;
using Microsoft.SemanticKernel.ChatCompletion;
// Plugin implementations
public sealed class OrderStatusPlugin {
[KernelFunction]
public string CheckOrderStatus(string orderId) => $"Order {orderId} is shipped and will arrive in 2-3 days.";
}
public sealed class OrderReturnPlugin {
[KernelFunction]
public string ProcessReturn(string orderId, string reason) => $"Return for order {orderId} has been processed successfully.";
}
public sealed class OrderRefundPlugin {
[KernelFunction]
public string ProcessReturn(string orderId, string reason) => $"Refund for order {orderId} has been processed successfully.";
}
// Helper function to create a kernel with chat completion
public static Kernel CreateKernelWithChatCompletion(...)
{
...
}
ChatCompletionAgent triageAgent = new ChatCompletionAgent {
Name = "TriageAgent",
Description = "Handle customer requests.",
Instructions = "A customer support agent that triages issues.",
Kernel = CreateKernelWithChatCompletion(...),
};
ChatCompletionAgent statusAgent = new ChatCompletionAgent {
Name = "OrderStatusAgent",
Description = "A customer support agent that checks order status.",
Instructions = "Handle order status requests.",
Kernel = CreateKernelWithChatCompletion(...),
};
statusAgent.Kernel.Plugins.Add(KernelPluginFactory.CreateFromObject(new OrderStatusPlugin()));
ChatCompletionAgent returnAgent = new ChatCompletionAgent {
Name = "OrderReturnAgent",
Description = "A customer support agent that handles order returns.",
Instructions = "Handle order return requests.",
Kernel = CreateKernelWithChatCompletion(...),
};
returnAgent.Kernel.Plugins.Add(KernelPluginFactory.CreateFromObject(new OrderReturnPlugin()));
ChatCompletionAgent refundAgent = new ChatCompletionAgent {
Name = "OrderRefundAgent",
Description = "A customer support agent that handles order refund.",
Instructions = "Handle order refund requests.",
Kernel = CreateKernelWithChatCompletion(...),
};
refundAgent.Kernel.Plugins.Add(KernelPluginFactory.CreateFromObject(new OrderRefundPlugin()));
Konfigurera överlämningsrelationer
Använd OrchestrationHandoffs för att ange vilken agent som kan lämna över till vilken, och under vilka omständigheter.
var handoffs = OrchestrationHandoffs
.StartWith(triageAgent)
.Add(triageAgent, statusAgent, returnAgent, refundAgent)
.Add(statusAgent, triageAgent, "Transfer to this agent if the issue is not status related")
.Add(returnAgent, triageAgent, "Transfer to this agent if the issue is not return related")
.Add(refundAgent, triageAgent, "Transfer to this agent if the issue is not refund related");
Observera agentens svar
Du kan skapa ett återanrop via egenskapen ResponseCallback för att samla in agentsvar under konversationens gång.
ChatHistory history = [];
ValueTask responseCallback(ChatMessageContent response)
{
history.Add(response);
return ValueTask.CompletedTask;
}
Människa i loopen
En viktig funktion i överlämningsorkestrering är möjligheten för en människa att delta i konversationen. Detta uppnås genom att tillhandahålla en InteractiveCallback, som anropas när en agent behöver indata från användaren. I ett riktigt program uppmanas användaren att ange indata. i ett exempel kan du använda en kö med svar.
// Simulate user input with a queue
Queue<string> responses = new();
responses.Enqueue("I'd like to track the status of my order");
responses.Enqueue("My order ID is 123");
responses.Enqueue("I want to return another order of mine");
responses.Enqueue("Order ID 321");
responses.Enqueue("Broken item");
responses.Enqueue("No, bye");
ValueTask<ChatMessageContent> interactiveCallback()
{
string input = responses.Dequeue();
Console.WriteLine($"\n# INPUT: {input}\n");
return ValueTask.FromResult(new ChatMessageContent(AuthorRole.User, input));
}
Konfigurera överlämningshantering
Skapa ett HandoffOrchestration objekt, skicka in agenter, överlämningsrelationer och återanrop som parametrar.
HandoffOrchestration orchestration = new HandoffOrchestration(
handoffs,
triageAgent,
statusAgent,
returnAgent,
refundAgent)
{
InteractiveCallback = interactiveCallback,
ResponseCallback = responseCallback,
};
Starta körningen
En körmiljö krävs för att hantera exekveringen av agenter. Här använder vi InProcessRuntime och startar den innan vi anropar orkestreringen.
InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();
Anropa orkestreringen
Anropa orkestreringen med din första uppgift (t.ex. "Jag är en kund som behöver hjälp med mina beställningar"). Agenterna dirigerar konversationen efter behov och involverar den mänskliga när det behövs.
string task = "I am a customer that needs help with my orders";
var result = await orchestration.InvokeAsync(task, runtime);
Samla in resultat
Vänta tills orkestreringen har slutförts och hämta det slutliga resultatet.
string output = await result.GetValueAsync(TimeSpan.FromSeconds(300));
Console.WriteLine($"\n# RESULT: {output}");
Console.WriteLine("\n\nORCHESTRATION HISTORY");
foreach (ChatMessageContent message in history)
{
// Print each message
Console.WriteLine($"# {message.Role} - {message.AuthorName}: {message.Content}");
}
Valfritt: Stoppa körningen
När bearbetningen är klar stoppar du körningen för att rensa resurser.
await runtime.RunUntilIdleAsync();
Exempelutdata
# RESULT: Handled order return for order ID 321 due to a broken item, and successfully processed the return.
ORCHESTRATION HISTORY
# Assistant - TriageAgent: Could you please specify what kind of help you need with your orders? Are you looking to check the order status, return an item, or request a refund?
# Assistant - OrderStatusAgent: Could you please tell me your order ID?
# Assistant - OrderStatusAgent: Your order with ID 123 has been shipped and will arrive in 2-3 days. Anything else I can assist you with?
# Assistant - OrderReturnAgent: I can help you with that. Could you please provide the order ID and the reason you'd like to return it?
# Assistant - OrderReturnAgent: Please provide the reason for returning the order with ID 321.
# Assistant - OrderReturnAgent: The return for your order with ID 321 has been successfully processed due to the broken item. Anything else I can assist you with?
Tips/Råd
Den fullständiga exempelkoden finns här
Definiera specialiserade agenter
Varje agent ansvarar för ett visst område. Till exempel:
- TriageAgent: Hanterar inledande kundförfrågningar och bestämmer vilken specialist som ska involveras.
- RefundAgent: Hanterar begäranden om återbetalning.
- OrderStatusAgent: Kontrollerar orderstatus.
- OrderReturnAgent: Hanterar orderreturer.
Tillägg
Först måste vi definiera de plugin-program som ska användas i agenterna. Dessa plugin-program innehåller logiken för att hantera specifika uppgifter.
from semantic_kernel.functions import kernel_function
class OrderStatusPlugin:
@kernel_function
def check_order_status(self, order_id: str) -> str:
"""Check the status of an order."""
# Simulate checking the order status
return f"Order {order_id} is shipped and will arrive in 2-3 days."
class OrderRefundPlugin:
@kernel_function
def process_refund(self, order_id: str, reason: str) -> str:
"""Process a refund for an order."""
# Simulate processing a refund
print(f"Processing refund for order {order_id} due to: {reason}")
return f"Refund for order {order_id} has been processed successfully."
class OrderReturnPlugin:
@kernel_function
def process_return(self, order_id: str, reason: str) -> str:
"""Process a return for an order."""
# Simulate processing a return
print(f"Processing return for order {order_id} due to: {reason}")
return f"Return for order {order_id} has been processed successfully."
Agenter
Därefter definierar vi de agenter som ska använda dessa plugin-program.
Tips/Råd
ChatCompletionAgent Används här med Azure OpenAI, men du kan använda valfri agenttyp eller modelltjänst.
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
support_agent = ChatCompletionAgent(
name="TriageAgent",
description="A customer support agent that triages issues.",
instructions="Handle customer requests.",
service=OpenAIChatCompletion(),
)
refund_agent = ChatCompletionAgent(
name="RefundAgent",
description="A customer support agent that handles refunds.",
instructions="Handle refund requests.",
service=OpenAIChatCompletion(),
plugins=[OrderRefundPlugin()],
)
order_status_agent = ChatCompletionAgent(
name="OrderStatusAgent",
description="A customer support agent that checks order status.",
instructions="Handle order status requests.",
service=OpenAIChatCompletion(),
plugins=[OrderStatusPlugin()],
)
order_return_agent = ChatCompletionAgent(
name="OrderReturnAgent",
description="A customer support agent that handles order returns.",
instructions="Handle order return requests.",
service=OpenAIChatCompletion(),
plugins=[OrderReturnPlugin()],
)
Definiera överlämningsrelationer
Använd OrchestrationHandoffs för att ange vilken agent som kan lämna över till vilken, och under vilka omständigheter.
from semantic_kernel.agents import OrchestrationHandoffs
handoffs = (
OrchestrationHandoffs()
.add_many( # Use add_many to add multiple handoffs to the same source agent at once
source_agent=support_agent.name,
target_agents={
refund_agent.name: "Transfer to this agent if the issue is refund related",
order_status_agent.name: "Transfer to this agent if the issue is order status related",
order_return_agent.name: "Transfer to this agent if the issue is order return related",
},
)
.add( # Use add to add a single handoff
source_agent=refund_agent.name,
target_agent=support_agent.name,
description="Transfer to this agent if the issue is not refund related",
)
.add(
source_agent=order_status_agent.name,
target_agent=support_agent.name,
description="Transfer to this agent if the issue is not order status related",
)
.add(
source_agent=order_return_agent.name,
target_agent=support_agent.name,
description="Transfer to this agent if the issue is not order return related",
)
)
Observera agentens svar
Du kan definiera ett återanrop för att skriva ut varje agents meddelande allt eftersom konversationen fortskrider.
from semantic_kernel.contents import ChatMessageContent
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"{message.name}: {message.content}")
Människa i loopen
En viktig funktion i överlämningsorkestrering är möjligheten för en människa att delta i konversationen. Detta uppnås genom att tillhandahålla ett human_response_function återanrop som anropas när en agent behöver indata från användaren.
from semantic_kernel.contents import AuthorRole, ChatMessageContent
def human_response_function() -> ChatMessageContent:
user_input = input("User: ")
return ChatMessageContent(role=AuthorRole.USER, content=user_input)
Konfigurera överlämningshantering
Skapa ett HandoffOrchestration objekt, skicka in agenter, överlämningsrelationer och återanrop som parametrar.
from semantic_kernel.agents import HandoffOrchestration
handoff_orchestration = HandoffOrchestration(
members=[
support_agent,
refund_agent,
order_status_agent,
order_return_agent,
],
handoffs=handoffs,
agent_response_callback=agent_response_callback,
human_response_function=human_response_function,
)
Starta körningen
Starta runtime för att hantera agentutförande.
from semantic_kernel.agents.runtime import InProcessRuntime
runtime = InProcessRuntime()
runtime.start()
Anropa orkestreringen
Anropa orkestreringen med din första uppgift (t.ex. "En kund är på linjen."). Agenterna dirigerar konversationen efter behov och involverar den mänskliga när det behövs.
orchestration_result = await handoff_orchestration.invoke(
task="A customer is on the line.",
runtime=runtime,
)
Samla in resultat
Vänta tills orkestreringen har slutförts.
value = await orchestration_result.get()
print(value)
Valfritt: Stoppa körningen
När bearbetningen är klar stoppar du körningen för att rensa resurser.
await runtime.stop_when_idle()
Exempelutdata
TriageAgent: Hello! Thank you for reaching out. How can I assist you today?
User: I'd like to track the status of my order
OrderStatusAgent: Sure, I can help you with that. Could you please provide me with your order ID?
User: My order ID is 123
OrderStatusAgent: Your order with ID 123 has been shipped and is expected to arrive in 2-3 days. Is there anything else I can assist you with?
User: I want to return another order of mine
OrderReturnAgent: I can help you with returning your order. Could you please provide the order ID for the return and the reason you'd like to return it?
User: Order ID 321
OrderReturnAgent: Please provide the reason for returning the order with ID 321.
User: Broken item
OrderReturnAgent: The return for your order with ID 321 has been successfully processed due to the broken item. Is there anything else I can assist you with?
User: No, bye
Task is completed with summary: Handled order return for order ID 321 due to a broken item, and successfully processed the return.
Tips/Råd
Den fullständiga exempelkoden finns här.
Anmärkning
Agentorkestrering är ännu inte tillgängligt i Java SDK.