Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
Las características de orquestación del agente en Agent Framework se encuentran en la fase experimental. Están en desarrollo activo y pueden cambiar significativamente antes de avanzar a la fase de versión preliminar o candidata para lanzamiento.
La orquestación de chat grupal modela una conversación colaborativa entre agentes, que opcionalmente incluye a un participante humano. Un administrador de chat de grupo coordina el flujo, determinando qué agente debe responder a continuación y cuándo solicitar la entrada humana. Este patrón es eficaz para simular reuniones, debates o sesiones de resolución de problemas colaborativas.
Para obtener más información sobre el patrón, como cuándo usar el patrón o cuándo evitar el patrón en la carga de trabajo, consulte Orquestación de chat en grupo.
Casos de uso comunes
Los agentes que representan diferentes departamentos describen una propuesta empresarial, con un agente de gerente moderando la conversación e involucrando a un humano cuando sea necesario:
Temas que se abordarán
- Cómo definir agentes con distintos roles para un chat de grupo
- Cómo usar un administrador de chat de grupo para controlar el flujo de conversación
- Cómo implicar a un participante humano en la conversación
- Cómo observar la conversación y recopilar el resultado final
Definir los agentes
Cada agente del chat de grupo tiene un rol específico. En este ejemplo, definimos un copywriter y un revisor.
Sugerencia
ChatCompletionAgent se usa aquí, pero puede usar cualquier tipo de agente.
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,
};
Opcional: Observar respuestas del agente
Puede crear un 'callback' para recoger las respuestas del agente a medida que la secuencia avanza mediante la propiedad ResponseCallback.
ChatHistory history = [];
ValueTask responseCallback(ChatMessageContent response)
{
history.Add(response);
return ValueTask.CompletedTask;
}
Configurar la orquestación de chat en grupo
Cree un GroupChatOrchestration objeto, pasando los agentes, un administrador de chat en grupo (aquí, un RoundRobinGroupChatManager) y una función de devolución de llamada para la respuesta. El administrador controla el flujo; aquí, alterna turnos de manera sucesiva para un número determinado de rondas.
GroupChatOrchestration orchestration = new GroupChatOrchestration(
new RoundRobinGroupChatManager { MaximumInvocationCount = 5 },
writer,
editor)
{
ResponseCallback = responseCallback,
};
Iniciar el entorno de ejecución
Se requiere un tiempo de ejecución para administrar la ejecución de agentes. Aquí, usamos InProcessRuntime e iniciamos antes de invocar la orquestación.
InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();
Invocar la orquestación
Invoque la orquestación con la tarea inicial (por ejemplo, "Crear un eslogan para un nuevo SUV eléctrico..."). Los agentes tomarán turnos respondiendo, refinando el resultado.
var result = await orchestration.InvokeAsync(
"Create a slogan for a new electric SUV that is affordable and fun to drive.",
runtime);
Recopilar resultados
Espere a que la orquestación se complete y recupere la salida final.
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);
}
Opcional: Detener el tiempo de ejecución
Una vez completado el procesamiento, detenga el tiempo de ejecución para limpiar los recursos.
await runtime.RunUntilIdleAsync();
Salida de ejemplo
# 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.”
Sugerencia
El código de ejemplo completo está disponible aquí.
Definir los agentes
Cada agente del chat de grupo tiene un rol específico. En este ejemplo:
- Escritor: crea y edita el contenido en función de los comentarios.
- Revisor: revisa el contenido y proporciona comentarios para mejorar.
Sugerencia
ChatCompletionAgent Se usa aquí con Azure OpenAI, pero puede usar cualquier tipo de agente o servicio de modelo.
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]
Observar respuestas del agente
Puede definir un "callback" para imprimir el mensaje de cada agente conforme avanza la conversación.
from semantic_kernel.contents import ChatMessageContent
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"**{message.name}**\n{message.content}")
Configurar la orquestación de chat en grupo
Cree un GroupChatOrchestration objeto, proporcionando los agentes, un administrador de chat de grupo (en este caso, un RoundRobinGroupChatManager) y la devolución de llamada de respuesta. El administrador controla el flujo; aquí, alterna turnos de manera sucesiva para un número determinado de rondas.
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,
)
Iniciar el entorno de ejecución
Inicie el entorno de ejecución para gestionar la ejecución del agente.
from semantic_kernel.agents.runtime import InProcessRuntime
runtime = InProcessRuntime()
runtime.start()
Invocar la orquestación
Invoque la orquestación con la tarea inicial (por ejemplo, "Crear un eslogan para un nuevo SUV eléctrico..."). Los agentes tomarán turnos respondiendo, refinando el resultado.
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,
)
Recopilar resultados
Espere a que se complete la orquestación.
value = await orchestration_result.get()
print(f"***** Final Result *****\n{value}")
Opcional: Detener el tiempo de ejecución
Una vez completado el procesamiento, detenga el tiempo de ejecución para limpiar los recursos.
await runtime.stop_when_idle()
Salida de ejemplo
**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!"
Sugerencia
El código de ejemplo completo está disponible aquí.
Nota:
La orquestación del agente aún no está disponible en el SDK de Java.
Personalizar el Administrador de chat en grupo
Puede personalizar el flujo de chat de grupo implementando su propio GroupChatManager. Esto le permite controlar cómo se filtran los resultados, cómo se selecciona el siguiente agente y cuándo solicitar la entrada del usuario o finalizar el chat.
Por ejemplo, puede crear un administrador personalizado heredando de GroupChatManager y reemplazando sus métodos abstractos:
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." });
}
}
A continuación, puede usar su administrador personalizado durante la orquestación.
GroupChatOrchestration orchestration = new (new CustomGroupChatManager { MaximumInvocationCount = 5 }, ...);
Sugerencia
Aquí encontrará un ejemplo completo de un administrador de chat de grupo personalizado .
Puede personalizar el flujo de chat de grupo implementando su propio GroupChatManager. Esto le permite controlar cómo se filtran los resultados, cómo se selecciona el siguiente agente y cuándo solicitar la entrada del usuario o finalizar el chat.
Por ejemplo, puede crear un administrador personalizado heredando de GroupChatManager y reemplazando sus métodos abstractos:
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.")
A continuación, puede usar su administrador personalizado durante la orquestación.
from semantic_kernel.agents import GroupChatOrchestration
group_chat_orchestration = GroupChatOrchestration(manager=CustomGroupChatManager(max_rounds=5), ...)
Sugerencia
Aquí encontrará un ejemplo completo de un administrador de chat de grupo personalizado .
Nota:
La orquestación del agente aún no está disponible en el SDK de Java.
Orden de las llamadas de función del Administrador de chat grupales
Al gestionar un chat grupal, se llama a los métodos del gestor del chat grupal en un orden específico para cada etapa de la conversación.
- ShouldRequestUserInput: comprueba si se requiere la entrada del usuario (humano) antes de que hable el siguiente agente. Si es verdadero, la orquestación se pausa para esperar la entrada del usuario. A continuación, la entrada del usuario se agrega al historial de chat del administrador y se envía a todos los agentes.
- ShouldTerminate: determina si el chat de grupo debe finalizar (por ejemplo, si se alcanza un número máximo de rondas o se cumple una condición personalizada). Si es verdadero, la orquestación continúa con el filtrado de resultados.
- FilterResults: se llama solo si el chat termina, para resumir o procesar los resultados finales de la conversación.
- SelectNextAgent: si el chat no termina, selecciona el siguiente agente para responder en la conversación.
Este orden garantiza que la entrada del usuario y las condiciones de finalización se comprueben antes de avanzar en la conversación y que los resultados se filtren solo al final. Puede personalizar la lógica de cada paso reemplazando los métodos correspondientes en el administrador de chat de grupo personalizado.