你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
对于希望帮助用户提高创造力、提升工作效率并实现健康目标的开发人员来说,将 AI 集成到应用程序中正迅速成为一项必备技能。 AI 支持的功能(如智能聊天机器人、个性化建议和上下文回复)为现代应用带来了巨大的价值。 自 ChatGPT 激发了我们的想象力以来,AI 支持的应用主要是在一个用户和一个 AI 助手之间进行互动。 随着开发人员越来越熟悉 AI 的功能,他们开始探索如何将 AI 支持的应用用于团队场景中。 他们关注的是“AI 可以为协作团队带来什么价值?”
本教程将指导你构建一个实时群组聊天应用程序。 在一个由人类协作者组成的聊天中,会有一个 AI 助手,它可以访问历史聊天记录,并且任何协作者发消息时以 @gpt
开头,都可以邀请它提供帮助。 完成的应用如下所示。
我们使用 OpenAI 生成智能的、可感知上下文的回复,并使用 SignalR 将回复传递给组中的用户。 可以在此存储库中找到完整的代码。
依赖项
可以使用 Azure OpenAI 或 OpenAI 来完成此项目。 请确保更新 appsetting.json
中的 endpoint
和 key
。 OpenAIExtensions
会在应用启动时读取配置,这些配置在进行身份验证并使用任一服务时是必需的。
若要构建此应用程序,需要以下组件:
- ASP.NET Core:用于创建 Web 应用程序并托管 SignalR 中心
- SignalR:用于客户端与服务器之间的实时通信
- Azure SignalR:用于大规模管理 SignalR 连接
- OpenAI 客户端:用于与 OpenAI 的 API 交互,以生成 AI 回复
实现
在本部分中,我们将演练将 SignalR 与 OpenAI 集成的代码的关键部分,以创建一个 AI 增强的群组聊天体验。
数据流
SignalR 中心集成
GroupChatHub
类管理用户连接、消息广播和 AI 交互。 当用户以 @gpt
开头发送消息时,中心会将消息转发到 OpenAI,OpenAI 会生成一个回复。 AI 的回复会实时流式传输到组中。
var chatClient = _openAI.GetChatClient(_options.Model);
await foreach (var completion in chatClient.CompleteChatStreamingAsync(messagesIncludeHistory))
{
// ...
// Buffering and sending the AI's response in chunks
await Clients.Group(groupName).SendAsync("newMessageWithId", "ChatGPT", id, totalCompletion.ToString());
// ...
}
通过历史记录保持上下文
每个对 OpenAI 聊天补全 API 的请求都是无状态的 - OpenAI 不会存储过去的交互。 在聊天应用程序中,用户或助理所说的内容对于生成与上下文相关的回复非常重要。 我们可以通过在每个对补全 API 的请求中包含历史聊天记录来实现此目的。
GroupHistoryStore
类管理每个组的历史聊天记录。 它存储用户和 AI 助手发布的消息,确保会话上下文在交互过程中得以保留。 此上下文对于生成一致的 AI 回复至关重要。
// Store message generated by AI-assistant in memory
public void UpdateGroupHistoryForAssistant(string groupName, string message)
{
var chatMessages = _store.GetOrAdd(groupName, _ => InitiateChatMessages());
chatMessages.Add(new AssistantChatMessage(message));
}
// Store message generated by users in memory
_history.GetOrAddGroupHistory(groupName, userName, message);
流式传输 AI 回复
CompleteChatStreamingAsync()
方法以增量方式从 OpenAI 流式传输回复,这样应用程序就可以在生成部分回复时将部分回复发送到客户端。
代码使用 StringBuilder
来累积 AI 的回复。 它会检查缓冲内容的长度,并在超过特定阈值(例如 20 个字符)时将其发送到客户端。 此方法可确保用户可以看到 AI 的答复在形成过程中逐步显示,模拟了类似于人类打字的效果。
totalCompletion.Append(content);
if (totalCompletion.Length - lastSentTokenLength > 20)
{
await Clients.Group(groupName).SendAsync("newMessageWithId", "ChatGPT", id, totalCompletion.ToString());
lastSentTokenLength = totalCompletion.Length;
}
进一步探索
此项目为进一步增强提供了令人期盼的可能性:
- 高级 AI 功能:使用其他 OpenAI 功能,例如情绪分析、翻译或汇总。
- 合并多个 AI 代理:可以在同一聊天中引入多个具有不同角色或专业知识领域的 AI 代理。 例如,一个代理可能专注于文本生成,而另一个则提供图像或音频生成。 这种交互可以创造更丰富、更动态的用户体验,让不同的 AI 代理可以与用户和其他代理进行无缝互动。
- 在服务器实例之间共享历史聊天记录:实现数据库层以跨会话持久保存历史聊天记录,即使在断开连接后也能继续对话。 除了基于 SQL 或 NO SQL 的解决方案之外,还可以考虑使用像 Redis 这样的缓存服务。 它可以将经常访问的数据(例如历史聊天记录或 AI 回复)存储在内存中,从而显著提高性能。 这可以减少延迟并减轻数据库操作负担,从而提高响应速度,尤其是在高流量场景中。