先に結論
PTC(Programmatic Tool Calling、プログラムによるツール呼び出し)は、LLMがコードを書き、そのコードからツールを呼び出す仕組みです。
繰り返し、条件分岐、集計をコードで処理し、必要な結果をLLMに返す。
ツールを何度も使うAIエージェントで、処理の往復や読み込むデータ量を減らせるのが特徴です。
1. ツールが増えると、途中のデータも増える
例えば、「20人分の経費を調べて、予算を超えた人を教えて」という依頼。
通常のツール呼び出しでは、取得結果をLLMが受け取り、次の呼び出しを判断する流れになりがちです。
人数が増えるほど、大量の明細を読み込むことになります。
最終的に知りたいのは超過した人だけでも、途中のデータはかなり多いです。
2. PTCでは、処理の手順をコードにする
PTCなら、LLMが次のような処理を書きます。
# 概念例:各関数は登録済みツール
# ツールの戻り値は辞書・リストとして扱える前提
over_budget = []
for member in await get_members():
expenses = await get_expenses(member["id"])
total = sum(item["amount"] for item in expenses)
if total > member["budget"]:
over_budget.append({
"name": member["name"],
"total": total,
})
print(over_budget)
経費明細はコード側で集計し、LLMには超過した人の情報だけを返します。
LLMが手順を組み立て、実行環境が繰り返し処理を進める、という役割分担です。
3. 効果が出やすいのは、取得してから絞り込む処理
PTCが向いているのは、例えばこんな場面です。
- 複数のAPIから情報を取得して集計する
- 大量のログから必要な行だけを取り出す
- 取得結果に応じて、次に使うツールを切り替える
中間結果を毎回LLMに読ませる必要が減るため、トークン消費や待ち時間を抑えやすくなります。
ただ、1回の呼び出しで終わる処理では、コード実行の準備が余分な負担になることもあります。
4. 導入時は、戻り値の設計が大事
コードから扱うため、ツールの戻り値は形式を揃えておきたいです。
項目名、型、エラー時の返し方が曖昧だと、集計や条件分岐が壊れやすくなります。
Anthropicの実装では、コード実行ツールを有効にし、対象ツールの allowed_callers でコードからの呼び出しを許可します。アプリ側でツールを実行し、結果を返す処理も必要です。
まずは、複数のデータを取得して集計する小さな処理から試すと、違いを確認しやすいと思います。
