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


сообщения бота Stream

Примечание.

  • Потоковая передача сообщений бота доступна только для чатов с одним подключением и в общедоступной предварительной версии для разработчиков.
  • Потоковая передача сообщений бота недоступна при вызове функции и модели OpenAI o1 .
  • Потоковая передача сообщений бота поддерживается в Интернете, на настольных компьютерах и мобильных устройствах (Android). Он не поддерживается в iOS.

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

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

Потоковые сообщения бота имеют два типа обновлений:

  • Информативные обновления. Информативные обновления отображаются в виде синего индикатора выполнения в нижней части чата. Он информирует пользователя о текущих действиях бота во время создания ответа.

    Снимок экрана: информативные обновления потоковой передачи для ботов.

  • Потоковая передача ответов. Потоковая передача ответа отображается в виде индикатора ввода. Он показывает ответ бота пользователю в виде небольших обновлений, пока создается полный ответ.

    Снимок экрана: потоковая передача ответов ботов.

Вы можете реализовать потоковую передачу сообщений бота в приложении одним из следующих способов:

Stream сообщения через библиотеку ИИ Teams

Библиотека ИИ Teams предоставляет возможность потоковой передачи сообщений для ботов на основе ИИ. Потоковая передача сообщений бота помогает облегчить задержку ответа, в то время как модель большого языка (LLM) создает полный ответ. Основные факторы, влияющие на медленное время отклика, включают несколько шагов предварительной обработки, таких как Retrieval-Augmented поколение (RAG) или вызовы функций, а также время, необходимое LLM для создания полного ответа.

Примечание.

Потоковая передача сообщений бота недоступна при вызове функции.

Благодаря потоковой передаче бот на основе ИИ может предложить пользователю привлекательный и адаптивный интерфейс. Настройте следующие функции потоковой передачи сообщений для приложения на основе ИИ:

  1. Включите потоковую передачу для бота на основе ИИ:

    Сообщения бота можно передавать через пакет SDK для искусственного интеллекта. Бот на основе ИИ отправляет фрагменты пользователю, когда модель создает ответ. Потоковые сообщения поддерживают текст. Однако вложение, метка ИИ, цикл обратной связи и метки конфиденциальности доступны только для окончательного сообщения потоковой передачи.

  2. Задать информативное сообщение:

    Вы можете определить информативное сообщение для бота на основе ИИ. Это сообщение появляется для пользователя каждый раз, когда бот отправляет обновление. Ниже приведены некоторые примеры информативных сообщений, которые можно задать в приложении:

    • Сканирование документов
    • Сводка содержимого
    • Поиск соответствующих рабочих элементов

    В следующем примере показаны обновления информации в боте на основе ИИ:

    На рисунке показана потоковая передача обновлений информации в боте на основе ИИ.

  3. Отформатируйте окончательное потоковое сообщение:

    С помощью пакета SDK для искусственного интеллекта текстовые сообщения и простой markdown можно форматировать во время потоковой передачи. Однако для адаптивных карточек, изображений или форматированного HTML-кода форматирование можно применить после завершения окончательного сообщения. Бот может отправлять вложения только в последнем потоковом фрагменте.

    В следующем примере показан ответ потоковой передачи в боте на основе ИИ:

    На изображении показаны потоковые ответы в боте на основе ИИ.

    В следующем примере показано, как бот на основе ИИ форматирует потоковый ответ:

    На рисунке показано, как бот на основе ИИ применяет форматирование к потоку ответа.

    В следующем примере показан окончательный потоковый ответ в боте на основе ИИ после завершения форматирования:

    На рисунке показан окончательный потоковый ответ в боте на основе ИИ.

  4. Включите функции на основе ИИ для окончательного сообщения:

    Вы можете включить следующие функции на основе ИИ для окончательного сообщения, отправленного ботом:

    • Ссылки. Библиотека ИИ Teams автоматически включает ссылки в ответы бота. Он предоставляет ссылки на источники, которые бот использовал для создания ответа. Она позволяет пользователям ссылаться на источник с помощью текстовых ссылок и ссылок.
    • Метка конфиденциальности. Используйте метку конфиденциальности, чтобы помочь пользователям понять конфиденциальность сообщения.
    • Цикл обратной связи. Это позволяет пользователям предоставлять положительные или отрицательные отзывы о сообщениях бота.
    • Создано СИ. Библиотека ИИ Teams автоматически включает метку Generated by AI в ответы бота. Эта метка помогает пользователям определить, что сообщение было создано с помощью ИИ.

    Дополнительные сведения о форматировании сообщений бота на основе ИИ см. в статье Сообщения ботов с содержимым, созданным ИИ.

Настройка сообщений бота потоковой передачи

Чтобы настроить сообщения бота потоковой передачи, выполните следующие действия.

  1. Включите потоковую передачу для бота на основе ИИ:

    А. DefaultAugmentation Используйте класс в config.json файле и в одном из следующих main классов приложений бота:

    • Для приложения бота C#: обновите Program.cs.
    • Для приложения JavaScript: обновите index.ts.
    • Для приложения Python: обновите bot.py.

    Б. Задайте значение stream true в объявлении OpenAIModel .

  2. Задать информативное сообщение. Укажите информативное сообщение в ActionPlanner объявлении с помощью конфигурации StartStreamingMessage .

  3. Отформатируйте окончательное потоковое сообщение:

    • Установите переключатель цикла обратной связи в объекте AIOptions в объявлении приложения и укажите обработчик.
      • Для приложения бота, созданного с помощью Python, установите переключатель цикла обратной ActionPlannerOptions связи в объекте в дополнение к объекту AIOptions .
    • Задайте вложения в заключительном блоке EndStreamHandler с помощью в объявлении ActionPlanner .

В следующем фрагменте кода показан пример потоковой передачи сообщений бота:

    // Create OpenAI Model
    builder.Services.AddSingleton<OpenAIModel > (sp => new(
        new OpenAIModelOptions(config.OpenAI.ApiKey, "gpt-4o")
        {
            LogRequests = true,
            Stream = true,              // Set stream toggle
        },
        sp.GetService<ILoggerFactory>()
    ));

ResponseReceivedHandler endStreamHandler = new((object sender, ResponseReceivedEventArgs args) =>
    {
        StreamingResponse? streamer = args.Streamer;

        if (streamer == null)
        {
            return;
        }

        AdaptiveCard adaptiveCard = new("1.6")
        {
            Body = [new AdaptiveTextBlock(streamer.Message) { Wrap = true }]
        };

        var adaptiveCardAttachment = new Attachment()
        {
            ContentType = "application/vnd.microsoft.card.adaptive",
            Content = adaptiveCard,
        };


        streamer.Attachments = [adaptiveCardAttachment];    // Set attachments

    });


    // Create ActionPlanner
    ActionPlanner<TurnState> planner = new(
        options: new(
            model: sp.GetService<OpenAIModel>()!,
            prompts: prompts,
            defaultPrompt: async (context, state, planner) =>
            {
                PromptTemplate template = prompts.GetPrompt("Chat");
                return await Task.FromResult(template);
            }
        )
        {
            LogRepairs = true,
            StartStreamingMessage = "Loading stream results...", // Set informative message
            EndStreamHandler = endStreamHandler // Set final chunk handler
        },
        loggerFactory: loggerFactory
    );

Разработка пользовательских Планировщик и моделей

Класс StreamingResponse является вспомогательным классом для потоковой передачи ответов клиенту. Он позволяет отправлять ряд обновлений в одном ответе, что делает взаимодействие более плавным. Если вы используете собственную пользовательскую модель, вы можете легко использовать этот класс для потоковой передачи ответов. Это отличный способ обеспечить вовлеченность пользователя.

Сообщения бота потоковой передачи должны использовать следующую последовательность:

  • queueInformativeUpdate()
  • queueTextChunk()
  • endStream()

После вызова endStream()модели поток заканчивается, и бот не сможет отправлять дальнейшие обновления.

Ниже приведен список других методов, которые можно использовать для настройки взаимодействия с приложением:

  • setAttachments
  • setSensitivityLabel
  • setFeedbackLoop
  • setGeneratedByAILabel

Ограничения для Azure OpenAI или OpenAI

  • Когда бот вызывает API потоковой передачи слишком быстро, это может вызвать проблемы и прервать процесс потоковой передачи. Чтобы избежать этого, потоковая передача по одному сообщению за раз в согласованном темпе. В противном случае запрос может быть отрегулироваться. Буферизация маркеров из модели на 1,5–2 секунды, чтобы обеспечить бесперебойную потоковую передачу.
  • Функции на основе ИИ, такие как ссылки, метка конфиденциальности, цикл обратной связи и метка "Создано с помощью ИИ ", поддерживаются только в окончательном фрагменте. Ссылки задаются для каждого фрагмента текста, помещенного в очередь.
  • Потоком может быть только форматированный текст.
  • Можно задать только одно информативное сообщение. Бот повторно использует это сообщение для каждого обновления. Вот некоторые примеры.
    • Сканирование документов
    • Сводка содержимого
    • Поиск соответствующих рабочих элементов
  • Модель отображает информативное сообщение только в начале каждого сообщения, возвращенного из LLM.
  • Вложения можно отправлять только в последнем фрагменте.
  • Потоковая передача пока недоступна с помощью вызовов функций пакета SDK для ИИ и модели AOAI или OAI o1 .
  • Ниже приведены требования к использованию streamSequence пакета SDK для искусственного интеллекта.
    • Последовательность должна начинаться с числа "1".
    • Последующие числа (кроме окончательных) должны быть монотонным увеличивающимся целым числом (например, 1-2-3>>).
    • Для окончательного сообщения streamSequence не должно быть задано.

Stream сообщение через REST API

Сообщения бота можно передавать через REST API. Потоковые сообщения поддерживают форматированный текст и ссылки. Вложение, метка ИИ, кнопка обратной связи и метки конфиденциальности доступны только для окончательного сообщения потоковой передачи. Дополнительные сведения см. в статье вложения и сообщения бота с содержимым, созданным ИИ.

Когда бот вызывает потоковую передачу через REST API, убедитесь, что следующий API потоковой передачи вызывается только после получения успешного ответа от первоначального вызова API. Если бот использует пакет SDK, убедитесь, что вы получили объект ответа NULL от метода действия отправки, чтобы убедиться, что предыдущий вызов успешно передан.

При слишком быстром вызове API потоковой передачи бот может столкнуться с проблемами, а взаимодействие с потоковой передачей может быть прервано. Рекомендуется, чтобы бот транслировал по одному сообщению за раз, чтобы убедиться, что он вызывает API потоковой передачи в согласованном темпе. В противном случае запрос может быть отрегулироваться. Буферизация маркеров из модели в течение 1,5–двух секунд, чтобы обеспечить плавный процесс потоковой передачи.

Ниже приведены свойства для потоковой передачи сообщений бота.

Property Обязательный Описание
type ✔️ Поддерживаемые значения: typing или message.
• : typingиспользуется при потоковой передаче сообщения.
• : messageиспользуется для окончательного потокового сообщения.
text ✔️ Содержимое сообщения для потоковой передачи.
entities.type ✔️ Необходимое значение — streamInfo.
entities.streamId ✔️ streamId из исходного запроса потоковой передачи начните потоковую передачу.
entities.streamType Тип потоковых обновлений. Поддерживаемые значения: informative, streamingили final. Значение по умолчанию — streaming. final используется только в последнем сообщении.
entities.streamSequence ✔️ Добавочное целое число для каждого запроса.

Примечание.

Ниже приведены требования к использованию streamSequence rest API:

  • Первый должен быть номером "1".
  • Последующие числа (кроме окончательных) должны быть монотонным увеличивающимся целым числом (например, 1-2-3>>).
  • Для конечного сообщения streamSequence не должно быть задано.

Чтобы включить потоковую передачу в ботах, выполните следующие действия.

  1. Запуск потоковой передачи
  2. Продолжить потоковую передачу
  3. Окончательная потоковая передача

Запуск потоковой передачи

Бот может отправить информативное или потоковое сообщение в качестве исходного сообщения. Ответ включает в streamIdсебя , который важен для выполнения последующих вызовов.

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


//Ex: A bot sends the first request with content & the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1 
{
  "type": "typing",
  "serviceurl": "https://smba.trafficmanager.net/amer/",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id": "<conversationId>"
  },
  "recipient": {
    "id": "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US",
  "text": "Searching through documents...", //(required) first informative loading message.
  "entities":[
    {
      "type": "streaminfo",
      "streamType": "informative", // informative or streaming; default= streaming.
      "streamSequence": 1 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}

201 created { "id": "a-0000l" } // return stream id

На следующем рисунке показан пример запуска потоковой передачи:

Снимок экрана: запуск потоковой передачи.

Продолжить потоковую передачу

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

Начните с информативных обновлений

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


// Ex: A bot sends the second request with content & the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1 
{
  "type": "typing",
  " serviceurl": "https://smba.trafficmanager.net/amer/",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id": "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en -US",
  "text ": "Searching through emails...", // (required) second informative loading message.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "informative", // informative or streaming; default= streaming.
      "streamSequence": 2 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
} 
202 0K { }

На следующем рисунке показан пример бота, предоставляющего информативные обновления:

Снимок экрана: информативные обновления потоковой передачи.

Переключение на потоковую передачу ответов

Когда бот будет готов к созданию окончательного сообщения для пользователя, переключитесь с предоставления информативных обновлений на потоковую передачу ответов. Для каждого обновления потоковой передачи ответов содержимое сообщения должно быть последней версией окончательного сообщения. Это означает, что бот должен включать все новые маркеры, созданные крупными языковыми моделями (LLM). Добавьте эти маркеры в предыдущую версию сообщения, а затем отправьте их пользователю.

Когда бот отправляет запрос потоковой передачи, убедитесь, что бот отправляет запрос с минимальной скоростью один запрос в секунду.


// Ex: A bot sends the third request with content & the content is actual streaming content.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "typing",
  " serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US" ,
  "text ": "A brown fox", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "streaming", // informative or streaming; default= streaming.
      "streamSequence": 3 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}
202 0K{ }


// Ex: A bot sends the fourth request with content & the content is actual streaming content.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "typing",
  " serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US" ,
  "text ": "A brown fox jumped over the fence", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "streaming", // informative or streaming; default= streaming.
      "streamSequence": 4 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}
202 0K{ }

На следующем рисунке показан пример бота, предоставляющего обновления блоками:

Снимок экрана: потоковая передача ответов.

Окончательная потоковая передача

Когда бот завершит создание сообщения, отправьте сигнал конечной потоковой передачи вместе с окончательным сообщением. Для конечного сообщения type значение действия имеет значение message. Здесь бот задает все поля, которые разрешены для обычного действия сообщения, но final являются единственным допустимым значением для streamType.


// Ex: A bot sends the second request with content && the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "message",
  " serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US",
  "text ": "A brown fox jumped over the fence.", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "final", // (required) final is only allowed for the last message of the streaming.
    }
  ],
  }
202 0K{ }

На следующем рисунке показан пример окончательного ответа бота:

Снимок экрана: последнее потоковое сообщение.

Коды ответа

Ниже приведены коды успешного выполнения и ошибки.

Коды успешного выполнения

Код состояния HTTP Возвращаемое значение Описание
201 streamId, это то же самое, что и activityId{"id":"1728640934763"} Бот возвращает это значение после отправки первоначального запроса потоковой передачи.
Для всех последующих запросов потоковой передачи streamId требуется .
202 {} Код успешного выполнения для всех последующих запросов потоковой передачи.

Коды ошибок

Код состояния HTTP Код ошибки Сообщение об ошибке Описание
202 ContentStreamSequenceOrderPreConditionFailed PreCondition failed exception when processing streaming activity. Немногие запросы потоковой передачи могут поступать вне последовательности и удаляться. Самый последний запрос потоковой передачи, определяемый параметром streamSequence, используется при получении запросов неупорядоченным образом. Убедитесь, что каждый запрос отправляется последовательно.
400 BadRequest В зависимости от сценария могут возникать различные сообщения об ошибках, например Start streaming activities should include text Входящие полезные данные не соответствуют необходимым значениям или не содержат их.
403 ContentStreamNotAllowed Content stream is not allowed Функция API потоковой передачи не разрешена для пользователя или бота.
403 ContentStreamNotAllowed Content stream is not allowed on an already completed streamed message Бот не может непрерывно выполнять потоковую передачу сообщения, которое уже было выполнено и завершено.
403 ContentStreamNotAllowed Content stream finished due to exceeded streaming time. Боту не удалось завершить процесс потоковой передачи в течение строгого срока в две минуты.
403 ContentStreamNotAllowed Message size too large Бот отправил сообщение, которое превышает текущее ограничение на размер сообщения .
429 Н/Д API calls quota exceeded Количество сообщений, передаваемых ботом, превысило квоту.

Пример кода

Название примера Описание Node.js C# Python
Пример бота потоковой передачи Teams В этом примере кода показано, как создать бот, подключенный к LLM, и отправлять сообщения через Teams. Н/Д Просмотр Н/Д
Бот потоковой передачи беседы Это бот потоковой передачи бесед с библиотекой ИИ Teams. Просмотр Просмотр Просмотр

См. также