Изучение совместной работы агента в чате агента (экспериментальный)
Предупреждение
Платформа агента семантического ядра является экспериментальной, по-прежнему в разработке и подлежит изменению.
Подробная документация по API, связанная с этим обсуждением, доступна по адресу:
Агенты в настоящее время недоступны в Java.
Что такое чат агента?
Чат агента предоставляет платформу, которая обеспечивает взаимодействие между несколькими агентами, даже если они имеют разные типы. Это позволяет агенту завершения чата и агенту Open AI Assistant работать вместе в рамках одной беседы. Чат агента также определяет точки входа для инициирования совместной работы между агентами, будь то через несколько ответов или один ответ агента.
В качестве абстрактного класса агент чат может быть подклассом для поддержки пользовательских сценариев.
Один из таких подклассов, групповой чат агента, предлагает конкретную реализацию чата агента, используя стратегию для управления динамикой беседы.
Создание чата группы агентов
Чтобы создать чат группы агентов, можно указать участвующих агентов или создать пустой чат, а затем добавить участников агента. Настройка параметров чата и стратегий также выполняется во время инициализации группового чата агента. Эти параметры определяют, как динамические беседы будут функционировать в группе.
Примечание. Параметры чата по умолчанию приводят к беседе, которая ограничена одним ответом. Дополнительные сведения о настройке _Chat-settings см. в разделе "Поведение чата агента".
Создание чата группы агентов с агентами:
// 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])
Агенты в настоящее время недоступны в Java.
Добавление агентов в чат группы агентов:
// 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)
Агенты в настоящее время недоступны в Java.
Использование группового чата агента
Чат агента поддерживает два режима работы: одинарный и многоэтапный. В одном повороте определенный агент назначается для предоставления ответа. В многоэтапном режиме все агенты в беседе по очереди отвечают до тех пор, пока не будет выполнен критерий завершения. В обоих режимах агенты могут совместно работать, отвечая друг другу на достижение определенной цели.
Предоставление входных данных
Добавление входного сообщения в чат агента соответствует тому же шаблону, что и объект журнала чата.
AgentGroupChat chat = new();
chat.AddChatMessage(new ChatMessageContent(AuthorRole.User, "<message content>"));
chat = AgentGroupChat()
await chat.add_chat_message(ChatMessageContent(role=AuthorRole.USER, content="<message content>"))
Агенты в настоящее время недоступны в Java.
Вызов агента с одним поворотом
В вызове с несколькими поворотами система должна решить, какой агент отвечает далее и когда беседа должна завершиться. В отличие от этого, вызов с одним поворотом просто возвращает ответ от указанного агента, что позволяет вызывающему объекту напрямую управлять участием агента.
После того как агент участвует в чате агента через вызов с одним поворотом, он добавляется в набор агентов, имеющих право на вызов с несколькими поворотами.
// 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)
Агенты в настоящее время недоступны в Java.
Вызов агента с несколькими поворотами
Хотя совместная работа агентов требует, чтобы система была на месте, которая не только определяет, какой агент должен реагировать во время каждого поворота, но и оценивает, когда беседа достигла своей целевой цели, инициируя многоэтапную совместную работу, остается простой.
Ответы агента возвращаются асинхронно по мере их создания, что позволяет беседе разворачиваться в режиме реального времени.
Примечание. В следующих разделах выбор агента и завершение чата подробно проявит параметры выполнения . Параметры выполнения по умолчанию используют последовательный или циклический выбор и ограничивает участие агента одним поворотом.
API параметров выполнения .NET: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)
Агенты в настоящее время недоступны в Java.
Доступ к журналу чата
Журнал бесед агента всегда доступен, даже если сообщения доставляются с помощью шаблона вызова. Это гарантирует, что прошлые обмены остаются доступными во время беседы.
Примечание. Последнее сообщение предоставляется первым (убывание: самый старый к старым).
// 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()
Агенты в настоящее время недоступны в Java.
Так как различные типы агентов или конфигурации могут поддерживать собственную версию журнала бесед, журнал конкретных агентов также доступен путем спецификации агента. (Например: Открытие помощника по искусственному интеллекту и агента завершения чата.)
// 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)
Агенты в настоящее время недоступны в Java.
Определение поведения группового чата агента
Совместная работа между агентами для решения сложных задач — это основной шаблон агента. Чтобы эффективно использовать этот шаблон, система должна быть на месте, которая не только определяет, какой агент должен реагировать во время каждого поворота, но и оценивает, когда беседа достигла своей цели. Для этого требуется управление выбором агента и установление четких критериев прекращения беседы, обеспечивая простое сотрудничество между агентами и решением. Оба этих аспекта управляются свойством "Параметры выполнения".
В следующих разделах, выбор агента и завершение чата подробно рассматриваются эти рекомендации.
Выбор агента
При многоэтапном вызове выбор агента руководствуется стратегией выбора. Эта стратегия определяется базовым классом, который можно расширить для реализации пользовательских поведения, адаптированных к конкретным потребностям. Для удобства также доступны две стандартные конкретные стратегии выбора, предлагающие готовые подходы к использованию для обработки выбора агента во время бесед.
Если известно, начальный агент может быть указан всегда для первого поворота. Кроме того, для ограничения использования маркеров при использовании стратегии на основе функции ядра можно также использовать редуктор журнала.
API стратегии выбора .NET:
SelectionStrategy
SequentialSelectionStrategy
KernelFunctionSelectionStrategy
Microsoft.SemanticKernel.Agents.History
// 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 }
};
REVIEWER_NAME = "Reviewer"
WRITER_NAME = "Writer"
agent_reviewer = ChatCompletionAgent(
service_id=REVIEWER_NAME,
kernel=kernel,
name=REVIEWER_NAME,
instructions="<instructions>",
)
agent_writer = ChatCompletionAgent(
service_id=WRITER_NAME,
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",
),
)
Агенты в настоящее время недоступны в Java.
Завершение чата
В многоэтапном вызове стратегия завершения определяет, когда происходит окончательный поворот. Эта стратегия гарантирует, что беседа заканчивается в соответствующей точке.
Эта стратегия определяется базовым классом, который можно расширить для реализации пользовательских поведения, адаптированных к конкретным потребностям. Для удобства также доступны стандартные конкретные стратегии выбора сервера, предлагая готовые подходы к использованию для определения условий прекращения бесед агентов чата.
API стратегии выбора .NET:
TerminationStrategy
RegexTerminationStrategy
KernelFunctionSelectionStrategy
KernelFunctionTerminationStrategy
AggregatorTerminationStrategy
Microsoft.SemanticKernel.Agents.History
// 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(selectionFunction, 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 }
};
REVIEWER_NAME = "Reviewer"
WRITER_NAME = "Writer"
agent_reviewer = ChatCompletionAgent(
service_id=REVIEWER_NAME,
kernel=kernel,
name=REVIEWER_NAME,
instructions="<instructions>",
)
agent_writer = ChatCompletionAgent(
service_id=WRITER_NAME,
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,
),
)
Агенты в настоящее время недоступны в Java.
Сброс состояния завершения чата
Независимо от того, вызывается ли групповой чат агента с помощью единого или многоэтапного подхода, состояние группового чата агента обновляется, чтобы указать, что он завершен после выполнения условий завершения. Это гарантирует, что система распознает, когда беседа полностью завершена. Чтобы продолжить использование экземпляра чата группы агентов после достижения завершенного состояния, это состояние должно быть сброшено, чтобы разрешить дальнейшее взаимодействие. Без сброса дополнительных взаимодействий или ответов агента не удастся.
В случае вызова с несколькими поворотами, достигающими максимальное ограничение поворота, система прекратит вызов агента, но не помечает экземпляр как завершенный. Это позволяет расширить беседу без необходимости сброса состояния завершения .
// 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
Агенты в настоящее время недоступны в Java.
Очистка состояния полной беседы
Когда вы закончите работу с помощью чата агента, в котором участвовал помощник open AI, может потребоваться удалить удаленный поток, связанный с помощником. Агент чат поддерживает сброс или очистку всего состояния беседы, включая удаление любого определения удаленного потока . Это гарантирует, что данные остаточной беседы остаются связанными с помощником после завершения чата.
Полный сброс не удаляет агенты, присоединенные к чату агента, и покидает чат агента в состоянии, где его можно повторно использовать. Это позволяет продолжать взаимодействие с теми же агентами без необходимости повторно инициализировать их, что делает будущие беседы более эффективными.
// 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()
Агенты в настоящее время недоступны в Java.
Инструкции
Полный пример использования группового чата агента для совместной работы с агентом см. в следующих статье: