智能家居助手演示
演示代码:一个使用 TypeSafe 评估用户请求的智能家居助手。
实际效果
工作原理
推测式扇出
这里演示的主要模式是推测式扇出。每个用户请求都会对照一长串问题进行评估,其中许多问题对大多数请求来说最终并不相关。
我们来看下面这个用户请求:
"关掉房子里所有的灯"
这是一个非常简单的请求,我们的代码只需要考虑以下问题的答案:
"这是什么类别的请求?"(智能家居命令)
"这个请求针对的是哪个领域?"(整栋房子)
"这个请求针对的是哪类设备?"(灯)
"应当对灯执行什么操作?"(关闭)
注意,最后一个问题的编写前提是假设用户正在向灯下达命令,而我们在还不知道用户实际请求什么时就已经在问它了。这就是我们所说的"推测性问题"——在还不知道它是否相关之前就提出,从而可以并行评估所有问题,并依靠代码在事后过滤掉无关的结果。这是构建能够用同一组问题应对各种用户请求的系统的关键模式。
错误做法:顺序 API 调用
错误的做法是把问题拆分到多个 API 调用中,等到确定需要答案时才提问:
"这是什么类别的请求?"(智能家居命令)
然后,只有在知道这是智能家居命令之后:
"这个请求针对的是哪个领域?"(整栋房子)
"这个请求针对的是哪类设备?"(灯)
然后,只有在知道它针对的是灯之后:
"应当对灯执行什么操作?"(关闭)
这种做法以最少的问题数量为目标进行优化,但最终会比把所有问题一次性批量放进一个预先发起的 API 调用慢得多、成本也高得多。
TypeSafe 与 LLM 搭配
本演示还展示了 TypeSafe 如何与 LLM 搭配,以应对有时需要字符串生成步骤的系统:
拆分复合用户请求:本演示中的一个问题是一个 Noul 问题,用于识别用户请求是否要求多个不同的操作。如果为真,系统会用 LLM 把请求拆分为一个原子命令列表,然后由 TypeSafe 逐个评估拆分后的请求。
回退到对话式 LLM:当 TypeSafe 判定用户查询是请求一般性信息或对话时,系统会调用 LLM 生成自由格式的回复。这让交互式系统能够以快速、划算的方式处理行为已知的确定性请求,同时在需要时仍可利用生成式 LLM 提供的灵活性。相比 LLM 响应,TypeSafe 的初始响应非常快,因此给整个系统增加的延迟可以忽略不计。
自己动手运行
本演示是一个简单的 Vite/React 单页应用,使用 TypeSafe API 评估用户请求。完整源代码将在发布时放在 GitHub 上。其 README 包含在本地运行演示的说明,以及源代码各部分与演示各功能之间对应关系的概览。