スマートホームアシスタントのデモ
スマートホームアシスタントのデモ
デモコード:TypeSafe を使ってユーザーのリクエストを評価するスマートホームアシスタント。
実際の動作を見る
仕組み
投機的ファンアウト
ここで示す主なパターンは投機的ファンアウトです。各ユーザーリクエストは長い質問リストに対して評価され、その多くはほとんどのリクエストにとって結局無関係になります。
次のユーザーリクエストを考えてみます:
「家中のすべての照明を消して」
これはごく単純なリクエストで、コードは次の質問の答えだけを考慮すれば済みます:
- 「これはどのカテゴリのリクエストか?」(スマートホームのコマンド)
- 「このリクエストはどの対象範囲を指しているか?」(家中)
- 「このリクエストはどの種類のデバイスを指しているか?」(照明)
- 「照明に対してどの操作を行うべきか?」(消す)
最後の質問は、ユーザーが照明にコマンドを出しているという前提で書かれており、ユーザーが実際に何を求めているかを知る前に尋ねている点に注目してください。これを「投機的質問」と呼びます。関連があるかどうかさえ分かる前に尋ねることで、すべての質問を並列に評価し、無関係な結果は後からコードで除外できます。これは、1 組の質問で多種多様なユーザーリクエストに対応できるシステムを構築するための重要なパターンです。
誤った方法:逐次的な API 呼び出し
誤った方法は、質問を複数の API 呼び出しに分け、答えが必要だと確信できてから初めて尋ねることです:
- 「これはどのカテゴリのリクエストか?」(スマートホームのコマンド)
そして、スマートホームのコマンドだと分かってから初めて:
- 「このリクエストはどの対象範囲を指しているか?」(家中)
- 「このリクエストはどの種類のデバイスを指しているか?」(照明)
そして、照明を指していると分かってから初めて:
- 「照明に対してどの操作を行うべきか?」(消す)
この方法は質問の数を最小にしようとしますが、すべての質問を最初の 1 回の API 呼び出しにまとめるより、はるかに遅く高コストになります。
TypeSafe と LLM の組み合わせ
このデモは、時々文字列生成のステップを必要とするシステムを扱うために、TypeSafe を LLM と組み合わせる方法も示します:
複合的なユーザーリクエストの分割: このデモの質問の 1 つは、ユーザーリクエストが 2 つ以上の異なる操作を求めているかどうかを識別する Noul 質問です。真なら、システムは LLM を使ってリクエストを原子的なコマンドのリストに分割します。分割されたリクエストはそれぞれ TypeSafe で個別に評価されます。
会話型 LLM へのフォールバック: TypeSafe が、ユーザーの問い合わせが一般的な情報や会話の求めだと判断したとき、システムは LLM を呼び出して自由形式の応答を生成します。これにより、インタラクティブなシステムは、既知の決定的な振る舞いをするリクエストを高速かつ低コストで処理しつつ、必要なときには生成 LLM がもたらす柔軟性も確保できます。最初の TypeSafe の応答は LLM の応答に比べて非常に速いので、システム全体に加わるレイテンシはごくわずかです。
自分で動かす
このデモは、TypeSafe API を使ってユーザーリクエストを評価する、シンプルな Vite/React のシングルページアプリです。完全なソースコードはリリース時に GitHub で公開されます。その README には、デモをローカルで動かす手順と、ソースコードのどの部分がデモのどの部分を担うかの概要が書かれています。