WWDC26:LLM search using Core Spotlight

これぞまさに昨年の筆者がやりたかったこと。紹介されているユースケースは取り組んでいたアイデアに近いものがあった。パイプライン実装により複雑さや規模をともなう検索も実現できるのが興味深い。

LLM search using Core Spotlight


0:00 – Introduction

  • アプリコンテンツを言語モデルに提供して会話型検索を構築する方法の紹介
  • デモアプリ:州立公園とトレイルを閲覧し、完了したハイキングのメモを保存するアプリ

1:41 – Grounding answers with Spotlight tool-calling

  • LanguageModelSession だけでは世界知識で答えるためアプリのデータを参照できない
  • Core Spotlight インデックスを Tool プロトコル経由で参照することで LLM の回答をアプリデータに接地(グラウンディング)
  • SpotlightSearchTool:iOS・iPadOS・macOS・visionOS 対応
    • 前提:CSSearchableItem でコンテンツをインデックスに提供済みであること

4:00 – Configure and add SpotlightSearchTool

  • SpotlightSearchTool を組み込み時の確認事項
    • 検索の種類に合わせたツールの設定
      • SpotlightSearchTool.init(configuration:) にカスタム設定を渡すことが可能(e.g. .files サンドボックス内のファイルパスへの検索)
    • モデルへの追加のコンテクスト提供
      • Model Provider API
    • UIで結果を表示する方法
  • セッションへの追加は LanguageModelSession のイニシャライザに SpotlightSearchTool のインスタンスを指定
  • ツール呼び出しの流れ:ユーザークエリ → LLM が SpotlightSearchTool を呼び出す → Spotlight で検索 → 結果を LLM に返す → 根拠のある回答を生成
  • 提供済みのメタデータがコンパクトに保存されるためモデルが読めない場合がある
  • CSSearchableIndexDelegatesearchableItems(forIdentifiers:) を実装して識別子からフルアイテムを復元
    • モデルが推論に使える追加属性を付与できる

6:44 – Displaying results and partial replies

  • 検索結果は SpotlightSearchTool 自体からも取得可能
  • セッションレスポンス:アシスタント UI(自然言語の回答)に適す
  • ツールの searchableItems:リスト UI(具体的なアイテムの一覧表示)に適す
  • tool.searchResults 非同期シーケンスで結果をストリーミング受信
  • queryToken でリフレッシュタイミングを管理
    • モデルが 1 回のレスポンスでツールを複数回呼び出す場合があるため、各リプライの queryToken の変化を検知する

8:12 – Customizing with guidance profiles

  • GuidanceProfile でモデルに渡す Spotlight の検索能力をカスタマイズする
    • 必要な属性・機能だけを有効化することでオンデバイスモデルの限られたコンテキストを節約
  • オンデバイスモデル向けには .focused(.items) ガイドレベルを推奨

11:02 – Reference resolution with a contact resolver

  • 「誰と一緒にハイキングしたか?」のような人物参照クエリへの対応
  • ContactResolver プロトコルを実装してユーザーの連絡先情報を提供
    • 表示名・メールアドレス・名前のバリエーションを含む ResolvedContact を返す
    • ツールが氏名の曖昧さを解消して正しい結果を絞り込む

11:24 – Custom pipeline stages

  • 複雑なリクエストに対してモデルが検索+計算の複数ステージを実行できるパイプラインを定義
  • @GenerableCustomStage を実装して登録
    • 例:ハイキングメモの「幸福度スコア」計算ステージ
    • inputTypesoutputTypesexecute(on:) を実装
    • スコア付きアイテム・グループ化アイテム・カウントなど様々な SearchPipelineDataType を扱える
  • ツールの設定に customStages として追加するだけでモデルが必要に応じて呼び出す

12:47 – Evaluating response quality

  • Evaluations フレームワークでツール呼び出しとレスポンス品質を計測
  • ModelSampleProtocol でデータセットを定義
    • 期待する識別子リストとツール呼び出しの軌跡(TrajectoryExpectation)を含む
  • Sample Generation API でシードサンプルを拡充
  • テストでメトリクスを検証

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です