Поделиться через


Изучение семантического ядра OpenAIResponsesAgent

Это важно

Эта функция находится на экспериментальном этапе. Функции на этом этапе находятся в стадии разработки и могут измениться перед переходом к этапу предварительного просмотра или релиз-кандидата.

Скоро появится OpenAIResponsesAgent.

Подсказка

Подробная документация по API, связанная с этим обсуждением, доступна по адресу:

Функция в настоящее время недоступна в Java.

Что такое агент ответов?

API ответов OpenAI — это самый сложный интерфейс OpenAI для создания ответов модели. Он поддерживает входные данные текста и изображения, а также текстовые выходные данные. Вы можете создавать взаимодействия с моделью с отслеживанием состояния, используя выходные данные предыдущих ответов в качестве входных данных. Кроме того, можно расширить возможности модели с помощью встроенных средств для поиска файлов, поиска в Интернете, использования компьютера и т. д.

Подготовка среды разработки

Чтобы продолжить разработку OpenAIResponsesAgent, настройте среду разработки с соответствующими пакетами.

Скоро появится OpenAIResponsesAgent.

Установите пакет semantic-kernel.

pip install semantic-kernel

Это важно

Он OpenAIResponsesAgent поддерживается в пакетах Python для семантического ядра версии 1.27.0 и выше.

Функция в настоящее время недоступна в Java.

Создание объекта OpenAIResponsesAgent

Чтобы создать OpenAIResponsesAgent, необходимо сначала создать клиента, чтобы иметь возможность общаться с удаленной службой.

Скоро появится OpenAIResponsesAgent.

Чтобы настроить модель, используемую API ответов OpenAI или Azure OpenAI, добавляются новые переменные среды:

OPENAI_RESPONSES_MODEL_ID=""
AZURE_OPENAI_RESPONSES_DEPLOYMENT_NAME=""

Задайте соответствующую переменную в зависимости от того, какой поставщик вы используете.

Подсказка

Минимально допустимая версия Azure OpenAI API — 2025-03-01-preview. Перейдите по следующей ссылке , чтобы просмотреть доступность региона, поддержку моделей и дополнительные сведения.

Чтобы создать AzureResponsesAgent, который можно использовать с моделями Azure OpenAI, выполните следующие действия.

from semantic_kernel.agents import AzureResponsesAgent
from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings, OpenAISettings


# Set up the client and model using Azure OpenAI Resources
client = AzureResponsesAgent.create_client()

# Create the AzureResponsesAgent instance using the client and the model
agent = AzureResponsesAgent(
    ai_model_id=AzureOpenAISettings().responses_deployment_name,
    client=client,
    instructions="your instructions",
    name="name",
)

В качестве альтернативы, чтобы создать OpenAIResponsesAgent для использования с моделями OpenAI:

from semantic_kernel.agents import OpenAIResponsesAgent

# Set up the client and model using OpenAI Resources
client = OpenAIResponsesAgent.create_client()

# Create the OpenAIResponsesAgent instance using the client and the model
agent = OpenAIResponsesAgent(
    ai_model_id=OpenAISettings().responses_model_id,
    client=client,
    instructions="your instructions",
    name="name",
)

Функция в настоящее время недоступна в Java.

Использование OpenAIResponsesAgent

Скоро появится OpenAIResponsesAgent.

API ответов OpenAI поддерживает необязательное удаленное хранилище бесед. По умолчанию при использовании ResponsesAgentThreadответы хранятся удаленно. Это позволяет использовать API ответов previous_response_id для поддержания контекста для всех вызовов.

Каждая беседа рассматривается как поток, определяемый уникальным идентификатором строки. Все взаимодействия с вашим OpenAIResponsesAgent ограничиваются этим идентификатором потока.

Базовая механика потока API ответов абстрагируется классом ResponsesAgentThread , который реализует AgentThread интерфейс.

В настоящее время OpenAIResponsesAgent поддерживает только потоки типа ResponsesAgentThread.

Можно вызвать OpenAIResponsesAgent без указания AgentThread, чтобы запустить новый поток, и в ответе на вызов будет возвращен новый AgentThread.

from semantic_kernel.agents import AzureResponsesAgent

# Set up the client and model using Azure OpenAI Resources
client = AzureResponsesAgent.create_client()

# Create the AzureResponsesAgent instance using the client and the model
agent = AzureResponsesAgent(
    ai_model_id=AzureOpenAISettings().responses_deployment_name,
    client=client,
    instructions="your instructions",
    name="name",
)

USER_INPUTS = [
    "My name is John Doe.",
    "Tell me a joke",
    "Explain why this is funny.",
    "What have we been talking about?",
]

thread = None

# Generate the agent response(s)
for user_input in USER_INPUTS:
    print(f"# User: '{user_input}'")
    # Invoke the agent for the current message and print the response
    response = await agent.get_response(messages=user_input, thread=thread)
    print(f"# {response.name}: {response.content}")
    # Update the thread so the previous response id is used
    thread = response.thread

# Delete the thread when it is no longer needed
await thread.delete() if thread else None

Функция в настоящее время недоступна в Java.

Обработка промежуточных сообщений с помощью OpenAIResponsesAgent

Семантические ядра OpenAIResponsesAgent предназначены для вызова агента, выполняющего запросы пользователей или вопросы. Во время вызова агент может использовать инструменты для получения окончательного ответа. Чтобы получить доступ к промежуточным сообщениям, созданным во время этого процесса, вызывающие могут предоставить функцию обратного вызова, которая обрабатывает экземпляры FunctionCallContent или FunctionResultContent.

Скоро появится OpenAIResponsesAgent.

Настройка обратного вызова on_intermediate_message в agent.invoke(...) или agent.invoke_stream(...) позволяет вызывающему объекту получать промежуточные сообщения, создаваемые в процессе формирования окончательного ответа агента.

import asyncio
from typing import Annotated

from semantic_kernel.agents import AzureResponsesAgent
from semantic_kernel.contents import AuthorRole, FunctionCallContent, FunctionResultContent
from semantic_kernel.contents.chat_message_content import ChatMessageContent
from semantic_kernel.functions import kernel_function


# Define a sample plugin for the sample
class MenuPlugin:
    """A sample Menu Plugin used for the concept sample."""

    @kernel_function(description="Provides a list of specials from the menu.")
    def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
        return """
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        """

    @kernel_function(description="Provides the price of the requested menu item.")
    def get_item_price(
        self, menu_item: Annotated[str, "The name of the menu item."]
    ) -> Annotated[str, "Returns the price of the menu item."]:
        return "$9.99"


# This callback function will be called for each intermediate message,
# which will allow one to handle FunctionCallContent and FunctionResultContent.
# If the callback is not provided, the agent will return the final response
# with no intermediate tool call steps.
async def handle_intermediate_steps(message: ChatMessageContent) -> None:
    for item in message.items or []:
        if isinstance(item, FunctionResultContent):
            print(f"Function Result:> {item.result} for function: {item.name}")
        elif isinstance(item, FunctionCallContent):
            print(f"Function Call:> {item.name} with arguments: {item.arguments}")
        else:
            print(f"{item}")


async def main():
    # 1. Create the client using Azure OpenAI resources and configuration
    client = AzureResponsesAgent.create_client()

    # 2. Create a Semantic Kernel agent for the OpenAI Responses API
    agent = AzureResponsesAgent(
        ai_model_id=AzureOpenAISettings().responses_deployment_name,
        client=client,
        name="Host",
        instructions="Answer questions about the menu.",
        plugins=[MenuPlugin()],
    )

    # 3. Create a thread for the agent
    # If no thread is provided, a new thread will be
    # created and returned with the initial response
    thread = None

    user_inputs = ["Hello", "What is the special soup?", "What is the special drink?", "How much is that?", "Thank you"]

    try:
        for user_input in user_inputs:
            print(f"# {AuthorRole.USER}: '{user_input}'")
            async for response in agent.invoke(
                messages=user_input,
                thread=thread,
                on_intermediate_message=handle_intermediate_steps,
            ):
                thread = response.thread
                print(f"# {response.name}: {response.content}")
    finally:
        await thread.delete() if thread else None


if __name__ == "__main__":
    asyncio.run(main())

Ниже приведен пример выходных данных из процесса вызова агента:

AuthorRole.USER: 'Hello'
Host: Hi there! How can I assist you with the menu today?
AuthorRole.USER: 'What is the special soup?'
Function Call:> MenuPlugin-get_specials with arguments: {}
Function Result:>
        Special Soup: Clam Chowder
        Special Salad: Cobb Salad
        Special Drink: Chai Tea
        for function: MenuPlugin-get_specials
Host: The special soup is Clam Chowder. Would you like to know more about any other specials?
AuthorRole.USER: 'What is the special drink?'
Host: The special drink is Chai Tea. Would you like any more information?
AuthorRole.USER: 'How much is that?'
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item":"Chai Tea"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
Host: The Chai Tea is $9.99. Is there anything else you would like to know?
AuthorRole.USER: 'Thank you'
Host: You're welcome! If you have any more questions, feel free to ask. Enjoy your day!

Функция в настоящее время недоступна в Java.

Декларативная спецификация

В ближайшее время будет представлена документация по использованию декларативных спецификаций.

Это важно

Эта функция находится на экспериментальном этапе. Функции на этом этапе находятся в стадии разработки и могут измениться перед переходом к этапу предварительного просмотра или релиз-кандидата.

Элемент OpenAIResponsesAgent поддерживает создание экземпляров из декларативной спецификации YAML. Декларативный подход позволяет определить свойства агента, инструкции, конфигурацию модели, средства и другие параметры в одном, проверяемом документе. Это делает состав агента переносимым и легко управляемым в разных средах.

Замечание

Все средства, функции или подключаемые модули, перечисленные в декларативном YAML, должны быть доступны агенту во время строительства. Для плагинов на основе ядра это означает, что они должны быть зарегистрированы в ядре. Для встроенных инструментов, таких как интерпретатор кода или поиск файлов, необходимо указать правильную конфигурацию и учетные данные. Загрузчик агента не создаст функции с нуля. Если обязательный компонент отсутствует, создание агента не удастся.

Как использовать декларативную спецификацию

Вместо перечисления каждой возможной конфигурации YAML в этом разделе описываются основные принципы и приводятся ссылки на примеры концепций, показывающие полный код для каждого типа инструмента. Ознакомьтесь с этими примерами концепции для комплексных реализаций OpenAIResponsesAgent декларативных спецификаций:

AzureResponsesAgent Образцы:

OpenAIResponsesAgent Образцы:

Пример. Создание AzureAIAgent из YAML

Минимальное декларативное представление YAML может выглядеть следующим образом:

type: openai_responses
name: Host
instructions: Respond politely to the user's questions.
model:
  id: ${OpenAI:ChatModelId}
tools:
  - id: MenuPlugin.get_specials
    type: function
  - id: MenuPlugin.get_item_price
    type: function

Дополнительные сведения о подключении агента можно найти в приведённых выше полных образцах кода.

Основные моменты

  • Декларативные спецификации позволяют определять структуру агента, средства и поведение в YAML.
  • Все указанные средства и подключаемые модули должны быть зарегистрированы или доступны во время выполнения.
  • Встроенные средства, такие как Bing, поиск файлов и интерпретатор кода, требуют надлежащей настройки и учетных данных (часто через переменные среды или явные аргументы).
  • Полные примеры см. в приведенных примерах ссылок, демонстрирующих практические сценарии, включая регистрацию подключаемых модулей, конфигурацию удостоверений Azure и расширенное использование средств.

Эта функция недоступна.

Дальнейшие шаги