微软计划使用 SignalR 和其他开源工具构建 AI 驱动的 Microsoft Copilot

💡 原文中文,约5000字,阅读约需12分钟。
📝

内容提要

Microsoft Copilot是一个AI支持的应用程序,使用多个开源工具来解决构建支持AI的应用程序的挑战。它提供流畅的对话体验,内置于Microsoft Edge侧边栏中。使用SignalR建立低延迟通信通道,使用自适应卡片和Markdown描述和呈现UI。用户可以通过文本、语音和图像与Microsoft Copilot进行交互。

🔎

延伸解读

为何选择 SignalR 而非 SSE

文章指出,团队最初考虑服务器发送事件(SSE),但最终放弃。原因有二:一是 Azure 同事反馈 SSE 可能被代理阻止;二是 SSE 是单向协议,无法支持用户打断 AI 响应的功能。SignalR 则满足低延迟、网络容错、易扩展和双向通信四个关键需求,并能自动选择最佳传输方式,默认使用 WebSocket,回退到 SSE 和长轮询。

每条消息独立连接的设计考量

与游戏等场景不同,Microsoft Copilot 为每条用户消息使用单独的 SignalR 连接。因为用户发送消息的间隔可能长达数秒甚至数分钟,保持长连接并不划算。独立连接让客户端更易管理,无需维护连接引用或检查状态;调试时可在 DevTools 中清晰看到每个请求;后端负载均衡也更简单,每个短连接可分配到不同节点,避免节点间负载不均。

语音交互的延迟优化

语音输入使用与必应相同的识别服务。最初,语音服务作为反向代理,等待文本转语音完成后再返回,导致显示延迟。优化后,对话管理服务异步调用语音服务,语音服务返回每个音频段的 URL,UI 可先显示文本,再按 URL 获取音频播放。这减少了语音服务负载,因为请求不再需要保持整个对话时长。目前团队仍在探索如何分段以最小化段间延迟。

响应流式处理与 object-basin 库

由于模型输出需经过内部处理(如格式化、添加引文、内容检查等),用户看到的是修改后的版本,因此无法简单追加文本。团队采用覆盖消息方式,每次更新发送完整响应,并利用 messageId 和 'w' 事件高效更新消息对象。为此,他们开发了 object-basin 库,支持通过 JSONPath 游标对字符串进行插入、删除等精确修改,弥补了 JSON 修补程序的不足。

❓

Q&A

Microsoft Copilot 使用了哪些开源工具来构建?

Microsoft Copilot 使用了 SignalR、自适应卡片、Markdown 和 object-basin 等开源工具。

为什么 Microsoft Copilot 选择 SignalR 而不是服务器发送事件(SSE)?

因为 SSE 可能被代理阻止,且是单向协议,无法实现用户打断 AI 响应的功能。而 SignalR 支持双向通信,能自动选择最佳传输方式,并具有低延迟、网络容错和易于扩展的特点。

Microsoft Copilot 如何处理语音输入和输出以减少延迟?

语音识别服务将语音转为文本发送到后端,后端异步调用语音服务生成音频 URL,UI 通过 URL 获取音频并分段播放。这样用户能先看到文本结果,无需等待音频准备就绪,同时减少了语音服务负载。

为什么 Microsoft Copilot 为每条消息使用单独的 SignalR 连接?

因为用户发送消息的间隔可能较长,保持连接打开不值得;单独连接使客户端更易管理,便于调试,后端负载均衡更简单,每个连接可使用不同节点,避免不平衡。

Microsoft Copilot 如何利用必应的现有功能来显示消息?

前端以自定义方式解释或处理某些消息,使用必应特有的卡片(如天气、新闻卡片)以用户熟悉的方式显示信息,后端生成查询供客户端使用,并显示搜索决策、搜索结果等处理信息。

object-basin 库在 Microsoft Copilot 中起什么作用?

object-basin 是一个用于 JavaScript/TypeScript 和 .NET 的库,它提供了对 JSON 对象的精确更新,支持在字符串中追加、插入或删除文本,以及创建或修改对象和列表,从而高效地更新流式消息对象。

🏷️

标签

➡️

继续阅读