AIエージェント
ルール
- ツールは説明付きの型付き関数として定義する — モデルがどのツールを呼び出すかを選択する
- ツールスキーマ:
{ name, description, parameters: zodSchema, execute: async (args) => result }
- マルチステップループ: メッセージ送信 → モデルがツール呼び出しを返す → ツールを実行 → 結果をフィードバック → 完了するまで繰り返す
maxSteps 制限で無限ループを防ぐ — 複雑さに応じてデフォルト5〜10ステップ
- Zodによる構造化出力:
generateObject({ schema: z.object({...}) }) で形状を保証
- リトライロジック: ツール実行をtry/catchでラップし、一時的な障害を指数バックオフで2〜3回リトライする
- エージェントオーケストレーション: 複雑なタスクを、焦点を絞ったツールセットを持つサブエージェントに分割し、コーディネーターエージェントが委譲する
- ツールの結果をモデルにフィードバックする前に必ず検証する — 信頼できないデータをサニタイズする
streamText と onToolCall を使用して、エージェントの推論をリアルタイムに可視化する
パターン
const tools = {
searchDatabase: tool({
description: "製品データベースを検索する",
parameters: z.object({ query: z.string(), limit: z.number().default(10) }),
execute: async ({ query, limit }) => db.products.search(query, limit),
}),
};
const result = await generateText({
model,
tools,
maxSteps: 10,
messages,
});
避けるべきこと
- エージェントに無制限のツールアクセスを与えること — ツールをタスクにスコープする
maxSteps を設定しないこと — エージェントが無限ループに陥る可能性がある
- ツールの出力を検証せずに信頼すること — 結果に基づいて行動する前に必ず確認する
- モノリシックなエージェント — 20以上のツールを持つ1つのエージェントよりも、焦点を絞ったサブエージェントを優先する