<追記:2025/8/26>
「できればいいのに」というタイトルだが、できることが分かったので、記事後半の参考記事や、記事下にあるピンバックを参照。
大規模なテキストベースである日記を Spotlight にインデクシングさせ、Foundation Models と組み合わせて何かできないか実験中。
- Foundation Models の RAG に Core Spotlight を活用できそうか超簡単な実験
- Foundation Models の RAG に Core Spotlight を活用できそうか超簡単な実験:その2
前回で、ツール呼び出しで日記のテキスト(ダミー)を取得して、その内容をもとに回答できることは分かった。が、コンテクストウィンドウサイズの都合上、以下を考慮する必要があることも分かった。
- 日記は全文でなく細分化してツールに渡すべき
- 細分化したうえでも、ヒットした全件をツールに返すわけにはいかない
となると、1度の検索で回答に足る情報が得られるかは怪しい。自律的にキーワードを変えながら、少なくとも2、3度はモデルに検索してもらいたい。
そこで、インストラクションを以下のようにして、前回作成したダミーデータには存在しないエピソードについて尋ねることで、1どのやりとりで複数回同じツール呼び出しをするか実験してみた。
ユーザーは自分の日記について質問を投げかけます。あなたはその質問に答えるために、必ず以下のStepをすべて実行した上で答えてください。
Step1. 検索キーワードを考えます
Step2. Step1で考えたキーワードをもとに日記を検索します
Step3. Step2で得られた結果を確認し、質問に回答できる内容があればそれをもとに回答します。なければStep4に進みます
Step4. Step1とは別の検索キーワードを考えます
Step5. Step4で考えたキーワードをもとに日記を検索します
Step6. Step5で得られた結果を確認し、質問に回答できる内容があれば、それをもとに回答します。なければStep7に進みます
Step7. 該当する記録がないことをユーザーに答えて、終了です。が、2度呼び出されることはなかった。
po session.transcript
Transcript(entries: [
(Instructions) ユーザーは自分の日記について質問を投げかけます。あなたはその質問に答えるために、必ず以下のStepをすべて実行した上で答えてください。
...省略,
(Prompt) 壺を買ったのはいつ?
Response Format: Message,
(ToolCalls) searchDiaryDatabase: {"queries": ["壺"]},
(ToolOutput searchDiaryDatabase) ["日付2025-04-08 21:54:00 +0000 本文: 鏡の前で前髪とにらめっこ。..省略.. 他愛ない近況を話しながら、帰り道の影まで軽くなった気分。"],
(Response) {"text": "壺を買ったことは2025年04月08日の日記には記録されていません。"}
]
プロンプト上、強制的に2度検索するよう指示してもダメ。ちなみに、おなじ日記検索ツールを名前(searchDiaryDatabase/searchDiaryDatabase2/searchDiaryDatabase3)と説明文を変えた異なる定義を増やしたところ、それらを同時並行で呼び出すことは稀にあった。
つまり、ToolCalls→ToolOutput→ToolCalls→… という自律的な再呼び出しは、今のところできなさそう?
ChatGPT に聞いた。
iOS の Foundation Models で tool calling という機能がありますが、1回のレスポンスに対して同じツールを複数回呼び出すことはできるのでしょうか。たとえば、データベースを検索するtoolがあったとして、1度の検索で回答に必要な情報が揃わなかった場合、2度、3度とキーワードを変えながら検索し直す、など。
iOS の Foundation Models フレームワークにおける Tool Calling(ツール呼び出し)では、1 回のレスポンス(session.respond(…) の呼び出し)に対して、モデルが“同じツールを複数回呼び出す”ことが可能です。
実際の動作例として:
- Medium によるデモでは、「Pikachu と Bulbasaur に“love”を送って」というプロンプトに対し、モデルが同じツールを 2回呼び出し、それぞれのキャラクターに処理を行っている様子が確認できます 。
- また、「モデルは複数のツールを並行して呼び出すこともあり、特定の都市ごとに天気情報を取得するような場合には、同じツールを複数回呼ぶ可能性がある」と明記されています 。
このように、同一のツールでも、モデルの判断によって必要に応じて複数回呼び出され、各呼び出しの結果がセッション内のトランスクリプトに含まれて、最終レスポンスに組み込まれます。
動作例で参照しているふたつの事例は、同じ Medium 記事だった。
The model decides to whether to use a tool (or multiple tools) or not, which tool to use, how many times it should use it. (That is the model can call a tool multiple times in parallel to satisfy the request, like when retrieving weather details for several cities.)
As we can see here, the model decided that it needed to call my tool twice, first time with the name
Pikachu, and second time withBulbasaur.
まさにこういうことをしたいのだけど。つまり、できるっちゃできるのか?
ちなみに、この記事にある PromptBuilder というのは知らなかった。条件付きなど動的なプロンプトを生成できるらしい?