これぞまさに昨年の筆者がやりたかったこと。紹介されているユースケースは取り組んでいたアイデアに近いものがあった。パイプライン実装により複雑さや規模をともなう検索も実現できるのが興味深い。
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 に返す → 根拠のある回答を生成 - 提供済みのメタデータがコンパクトに保存されるためモデルが読めない場合がある
CSSearchableIndexDelegateのsearchableItems(forIdentifiers:)を実装して識別子からフルアイテムを復元- モデルが推論に使える追加属性を付与できる
6:44 – Displaying results and partial replies
- 検索結果は
SpotlightSearchTool自体からも取得可能 - セッションレスポンス:アシスタント UI(自然言語の回答)に適す
- ツールの
searchableItems:リスト UI(具体的なアイテムの一覧表示)に適す tool.searchResults非同期シーケンスで結果をストリーミング受信queryTokenでリフレッシュタイミングを管理- モデルが 1 回のレスポンスでツールを複数回呼び出す場合があるため、各リプライの
queryTokenの変化を検知する
- モデルが 1 回のレスポンスでツールを複数回呼び出す場合があるため、各リプライの
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
- 複雑なリクエストに対してモデルが検索+計算の複数ステージを実行できるパイプラインを定義
@GenerableなCustomStageを実装して登録- 例:ハイキングメモの「幸福度スコア」計算ステージ
inputTypes・outputTypes・execute(on:)を実装- スコア付きアイテム・グループ化アイテム・カウントなど様々な
SearchPipelineDataTypeを扱える
- ツールの設定に
customStagesとして追加するだけでモデルが必要に応じて呼び出す
12:47 – Evaluating response quality
- Evaluations フレームワークでツール呼び出しとレスポンス品質を計測
ModelSampleProtocolでデータセットを定義- 期待する識別子リストとツール呼び出しの軌跡(
TrajectoryExpectation)を含む
- 期待する識別子リストとツール呼び出しの軌跡(
- Sample Generation API でシードサンプルを拡充
- テストでメトリクスを検証