AI-Powered 群聊示例演示如何使用 ASP.NET Core SignalR将 OpenAI 的功能集成到实时群组聊天应用程序中。
- 查看或下载完整示例代码。
概述
将 AI 集成到应用程序中对于旨在增强用户创造力、生产力和整体体验的开发人员来说至关重要。 AI 支持的功能(如智能聊天机器人、个性化建议和上下文回复)为现代应用带来了巨大的价值。 虽然许多由 AI 提供支持的应用程序(如受 ChatGPT 启发的应用程序)专注于单个用户与 AI 助手之间的交互,但对探索 AI 在团队环境中的潜力越来越感兴趣。 开发人员现在问:“AI 可以向协作者团队添加什么价值?
此示例指南重点介绍了生成实时群组聊天应用程序的过程。 在此聊天中,一组人类协作者可以与有权访问聊天历史记录的 AI 助手进行交互。 任何协作者都可以通过 @gpt
启动其消息来邀请 AI 提供帮助。 完成的应用如下所示:
AI 支持的群组聊天user interface for the AI-powered group chatuser interface for the AI-powered group chat的用户界面
此示例使用 OpenAI 生成智能上下文感知响应,并 SignalR 向组中的用户传递响应。 可以在此存储库中找到完整的代码。
依赖
Azure OpenAI 或 OpenAI 都可用于此项目。 确保更新 endpoint
中的 key
和 appsettings.json
。 OpenAIExtensions
在应用启动时读取配置,需要 endpoint
和 key
的配置值进行身份验证并使用任一服务。
若要生成此应用程序,需要满足以下条件:
- ASP.NET 核心:创建 Web 应用程序并托管 SignalR 中心。
- SignalR:用于客户端与服务器之间的实时通信。
- OpenAI 客户端:与 OpenAI 的 API 交互以生成 AI 响应。
执行
本部分重点介绍将 SignalR 与 OpenAI 集成以创建 AI 增强的群组聊天体验的代码的关键部分。
数据流
下图重点介绍了使用 OpenAI 服务所涉及的分步通信和处理,并采用迭代方法来响应和数据处理:
在上图中:
- 客户端将指令发送到服务器,然后与 OpenAI 通信以处理这些说明。
- OpenAI 使用部分完成数据进行响应,服务器会将数据转发回客户端。 此过程重复多次,以便在这些组件之间迭代交换数据。
SignalR 中心集成
GroupChatHub
类管理用户连接、消息广播和 AI 交互。
当用户从 @gpt
开始发送消息时:
- 中心将其转发到 OpenAI,这将生成响应。
- AI 的回复被实时流式传输到组中。
以下代码片段演示 CompleteChatStreamingAsync
方法如何以增量方式流式传输 OpenAI 的响应:
var chatClient = _openAI.GetChatClient(_options.Model);
await foreach (var completion in
chatClient.CompleteChatStreamingAsync(messagesInludeHistory))
{
// ...
// Buffering and sending the AI's response in chunks
await Clients.Group(groupName).SendAsync(
"newMessageWithId",
"ChatGPT",
id,
totalCompletion.ToString());
// ...
}
在前面的代码中:
chatClient.CompleteChatStreamingAsync(messagesIncludeHistory)
启动 AI 回复的流式处理。totalCompletion.Append(content)
行累积了 AI 的回复。- 如果缓冲内容的长度超过 20 个字符,将使用
Clients.Group(groupName).SendAsync
将缓冲内容发送到客户端。
这可确保 AI 的响应实时交付给用户,从而提供无缝的交互式聊天体验。
通过历史记录保持上下文连贯性
每个对 OpenAI 的聊天完成 API 的请求都是无状态的。 OpenAI 不存储过去的交互。 在聊天应用中,用户或助理所说的内容对于生成与上下文相关的响应非常重要。 若要实现此目的,请在对完成 API 的每个请求中包含聊天历史记录。
GroupHistoryStore
类管理每个组的历史聊天记录。 它存储用户和 AI 助手发布的消息,确保会话上下文在交互过程中得以保留。 此上下文对于生成一致的 AI 回复至关重要。
以下代码演示如何在内存中存储 AI 助手生成的消息。 调用 UpdateGroupHistoryForAssistant
方法将 AI 助手的消息添加到组历史记录,确保保留聊天上下文:
public void UpdateGroupHistoryForAssistant(string groupName, string message)
{
var chatMessages = _store.GetOrAdd(groupName, _ => InitiateChatMessages());
chatMessages.Add(new AssistantChatMessage(message));
}
调用 _history.GetOrAddGroupHistory
方法将用户的消息添加到组历史记录,确保保留会话上下文:
_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 回复)存储在内存中,从而显著提高性能。 这可以减少延迟并减轻数据库操作负担,从而提高响应速度,尤其是在高流量场景中。
- 利用 Azure SignalR 服务:Azure SignalR 服务 为应用程序提供可缩放且可靠的实时消息传送。 通过将 SignalR 背板卸载到 Azure,可以轻松地横向扩展聊天应用程序,以支持跨多个服务器的数千个并发用户。 Azure SignalR 还简化了管理,并提供内置功能,例如自动重新连接。