сообщения бота Stream
Примечание.
- Потоковая передача сообщений бота доступна только для чатов с одним подключением и в общедоступной предварительной версии для разработчиков.
- Потоковая передача сообщений бота недоступна при вызове функции и модели OpenAI
o1
. - Потоковая передача сообщений бота поддерживается в Интернете, на настольных компьютерах и мобильных устройствах (Android). Он не поддерживается в iOS.
Вы можете выполнять потоковую передачу сообщений бота, чтобы доставить пользователю ответы бота в виде небольших обновлений, пока создается полный ответ для улучшения взаимодействия с пользователем. Часто ботам требуется много времени, чтобы создать ответы без обновления пользовательского интерфейса, что приводит к менее привлекательному интерфейсу.
Когда пользователи наблюдают, как бот обрабатывает свой запрос в режиме реального времени, это может повысить их удовлетворенность и доверие. Такая воспринимаемая скорость реагирования и прозрачность повышают вовлеченность пользователей и уменьшают прекращение беседы с ботом.
Потоковые сообщения бота имеют два типа обновлений:
Информативные обновления. Информативные обновления отображаются в виде синего индикатора выполнения в нижней части чата. Он информирует пользователя о текущих действиях бота во время создания ответа.
Потоковая передача ответов. Потоковая передача ответа отображается в виде индикатора ввода. Он показывает ответ бота пользователю в виде небольших обновлений, пока создается полный ответ.
Вы можете реализовать потоковую передачу сообщений бота в приложении одним из следующих способов:
Stream сообщения через библиотеку ИИ Teams
Библиотека ИИ Teams предоставляет возможность потоковой передачи сообщений для ботов на основе ИИ. Потоковая передача сообщений бота помогает облегчить задержку ответа, в то время как модель большого языка (LLM) создает полный ответ. Основные факторы, влияющие на медленное время отклика, включают несколько шагов предварительной обработки, таких как Retrieval-Augmented поколение (RAG) или вызовы функций, а также время, необходимое LLM для создания полного ответа.
Примечание.
Потоковая передача сообщений бота недоступна при вызове функции.
Благодаря потоковой передаче бот на основе ИИ может предложить пользователю привлекательный и адаптивный интерфейс. Настройте следующие функции потоковой передачи сообщений для приложения на основе ИИ:
Включите потоковую передачу для бота на основе ИИ:
Сообщения бота можно передавать через пакет SDK для искусственного интеллекта. Бот на основе ИИ отправляет фрагменты пользователю, когда модель создает ответ. Потоковые сообщения поддерживают текст. Однако вложение, метка ИИ, цикл обратной связи и метки конфиденциальности доступны только для окончательного сообщения потоковой передачи.
Задать информативное сообщение:
Вы можете определить информативное сообщение для бота на основе ИИ. Это сообщение появляется для пользователя каждый раз, когда бот отправляет обновление. Ниже приведены некоторые примеры информативных сообщений, которые можно задать в приложении:
- Сканирование документов
- Сводка содержимого
- Поиск соответствующих рабочих элементов
В следующем примере показаны обновления информации в боте на основе ИИ:
Отформатируйте окончательное потоковое сообщение:
С помощью пакета SDK для искусственного интеллекта текстовые сообщения и простой markdown можно форматировать во время потоковой передачи. Однако для адаптивных карточек, изображений или форматированного HTML-кода форматирование можно применить после завершения окончательного сообщения. Бот может отправлять вложения только в последнем потоковом фрагменте.
В следующем примере показан ответ потоковой передачи в боте на основе ИИ:
В следующем примере показано, как бот на основе ИИ форматирует потоковый ответ:
В следующем примере показан окончательный потоковый ответ в боте на основе ИИ после завершения форматирования:
Включите функции на основе ИИ для окончательного сообщения:
Вы можете включить следующие функции на основе ИИ для окончательного сообщения, отправленного ботом:
- Ссылки. Библиотека ИИ Teams автоматически включает ссылки в ответы бота. Он предоставляет ссылки на источники, которые бот использовал для создания ответа. Она позволяет пользователям ссылаться на источник с помощью текстовых ссылок и ссылок.
- Метка конфиденциальности. Используйте метку конфиденциальности, чтобы помочь пользователям понять конфиденциальность сообщения.
- Цикл обратной связи. Это позволяет пользователям предоставлять положительные или отрицательные отзывы о сообщениях бота.
- Создано СИ. Библиотека ИИ Teams автоматически включает метку Generated by AI в ответы бота. Эта метка помогает пользователям определить, что сообщение было создано с помощью ИИ.
Дополнительные сведения о форматировании сообщений бота на основе ИИ см. в статье Сообщения ботов с содержимым, созданным ИИ.
Настройка сообщений бота потоковой передачи
Чтобы настроить сообщения бота потоковой передачи, выполните следующие действия.
Включите потоковую передачу для бота на основе ИИ:
А.
DefaultAugmentation
Используйте класс вconfig.json
файле и в одном из следующих main классов приложений бота:- Для приложения бота C#: обновите
Program.cs
. - Для приложения JavaScript: обновите
index.ts
. - Для приложения Python: обновите
bot.py
.
Б. Задайте значение
stream
true в объявленииOpenAIModel
.- Для приложения бота C#: обновите
Задать информативное сообщение. Укажите информативное сообщение в
ActionPlanner
объявлении с помощью конфигурацииStartStreamingMessage
.Отформатируйте окончательное потоковое сообщение:
- Установите переключатель цикла обратной связи в объекте
AIOptions
в объявлении приложения и укажите обработчик.- Для приложения бота, созданного с помощью Python, установите переключатель цикла обратной
ActionPlannerOptions
связи в объекте в дополнение к объектуAIOptions
.
- Для приложения бота, созданного с помощью Python, установите переключатель цикла обратной
- Задайте вложения в заключительном блоке
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
не должно быть задано.
Чтобы включить потоковую передачу в ботах, выполните следующие действия.
Запуск потоковой передачи
Бот может отправить информативное или потоковое сообщение в качестве исходного сообщения. Ответ включает в 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. | Просмотр | Просмотр | Просмотр |
См. также
Platform Docs