langchain4j-tool-function-calling-patterns
LangChain4jのツール・関数呼び出しパターンを提供・生成します。`@Tool`アノテーションによるメソッドのツール定義、ツールエグゼキューターの設定、AiServicesへのツール登録、ツールパラメーターの検証、ツール実行エラーのハンドリングに対応します。ツールを呼び出すAIエージェントの構築、関数仕様の定義、ツールレスポンスの管理、LLM駆動アプリケーションへの外部API統合を行う際にご活用ください。
description の原文を見る
Provides and generates LangChain4j tool and function calling patterns: annotates methods as tools with @Tool, configures tool executors, registers tools with AiServices, validates tool parameters, and handles tool execution errors. Use when building AI agents that call tools, define function specifications, manage tool responses, or integrate external APIs with LLM-driven applications.
SKILL.md 本文
LangChain4j ツール & 関数呼び出しパターン
LangChain4j アプリケーションで、メソッドをツールとしてアノテーションする、ツール実行器を構成する、AI サービスにツールを登録する、パラメータを検証する、ツール実行エラーを処理するためのパターンを提供します。
概要
LangChain4j は @Tool アノテーションを使用して、Java メソッドを AI エージェント用の呼び出し可能な関数として公開します。AiServices ビルダーはツールをチャットモデルに登録し、LLM がテキスト生成を超えたアクション(データベースクエリ、API 呼び出し、計算、ビジネスシステム統合)を実行できるようにします。パラメータは @P を使用して、LLM を導くための説明を指定します。
使用時機
- 外部ツール(天気、株価、データベースクエリ)を呼び出す AI エージェントを構築する
- LLM ツール使用のための関数仕様を定義する(
@Tool、@Pアノテーション) AiServices.builder().tools()でツールセットを登録・管理する- ツール実行エラー、タイムアウト、幻覚ツール名を処理する
@ToolMemoryId経由でユーザー状態を注入するコンテキスト対応ツールを実装する- 大規模または条件付きツールセット用の動的ツールプロバイダーを構成する
手順
1. @Tool でメソッドにアノテーションを付ける
@Tool アノテーション付きメソッドを持つツールクラスを定義します。最初のパラメータとして説明を指定します。各パラメータの説明に @P を使用します。
public class WeatherTools {
private final WeatherService weatherService;
public WeatherTools(WeatherService weatherService) {
this.weatherService = weatherService;
}
@Tool("Get current weather for a city")
public String getWeather(
@P("City name") String city,
@P("Temperature unit: celsius or fahrenheit") String unit) {
return weatherService.getWeather(city, unit);
}
}
検証: インスタンスを作成し、クラスがエラーなく読み込まれることを確認します。
2. AiServices でツールを登録する
AiServices.builder() を使用してツールインスタンスをチャットモデルに登録します。
MathAssistant assistant = AiServices.builder(MathAssistant.class)
.chatModel(chatModel)
.tools(new Calculator(), new WeatherTools(weatherService))
.build();
検証: assistant.chat("What is 2 + 2?") を呼び出し、LLM が例外をスローせず応答することを確認します。
3. ツール呼び出しをエンドツーエンドでテストする
ツール使用をトリガーするプロンプトを送信し、ツールが実行されて結果が組み込まれることを確認します。
String response = assistant.chat("What is the weather in Rome?");
System.out.println(response);
検証: ログでツール呼び出しを確認し、応答がツール出力を使用していることを確認します。
4. ツール実行エラーを処理する
スタックトレースを公開せずに失敗を適切に管理するエラーハンドラーを追加します。
AiServices.builder(Assistant.class)
.chatModel(chatModel)
.tools(new ExternalServiceTools())
.toolExecutionErrorHandler((request, exception) -> {
logger.error("Tool '{}' failed: {}", request.name(), exception.getMessage());
return "An error occurred while processing your request";
})
.hallucinatedToolNameStrategy(request ->
ToolExecutionResultMessage.from(request,
"Error: tool '" + request.name() + "' does not exist"))
.toolArgumentsErrorHandler((error, context) ->
ToolErrorHandlerResult.text("Invalid arguments: " + error.getMessage()))
.build();
検証: エラー条件をトリガーし、LLM が安全なエラーメッセージを受け取ることを確認します。
5. パフォーマンスとスケーラビリティのために最適化する
並行ツール実行を有効にし、長時間実行ツールのタイムアウトを設定します。
AiServices.builder(Assistant.class)
.chatModel(chatModel)
.tools(new DbTools(), new HttpTools())
.executeToolsConcurrently(Executors.newFixedThreadPool(5))
.toolExecutionTimeout(Duration.ofSeconds(30))
.build();
検証: 並行リクエストを実行し、スレッド競合やデッドロックがないことを確認します。
例
完全なクラスの電卓ツール
public class Calculator {
@Tool("Perform basic arithmetic")
public double calculate(
@P("Expression like 2+2 or 10*5") String expression) {
// Parse and evaluate expression
return eval(expression);
}
}
Assistant assistant = AiServices.builder(Assistant.class)
.chatModel(ChatModel.builder()
.apiKey(System.getenv("API_KEY"))
.model("gpt-4o")
.build())
.tools(new Calculator())
.build();
即座返却ツール(LLM 応答なし)
@Tool(value = "Send email notification", returnBehavior = ReturnBehavior.IMMEDIATELY)
public void sendEmail(@P("Recipient email address") String to,
@P("Email subject") String subject,
@P("Email body") String body) {
emailService.send(to, subject, body);
}
動的ツールプロバイダー
ToolProvider provider = request -> {
if (request.userContext().contains("admin")) {
return List.of(new AdminTools());
}
return List.of(new UserTools());
};
AiServices.builder(Assistant.class)
.chatModel(chatModel)
.toolProvider(provider)
.build();
ベストプラクティス
- 説明的な
@Tool名: 明確なスコープを持つ命令型動詞("Get"、"Send"、"Calculate")を使用する - 正確な
@P説明: 形式、制約、有効な値を含める — 曖昧な説明は LLM の不正な呼び出しを引き起こす - 安全なエラー処理: スタックトレースを公開しない;ユーザーフレンドリーなエラー文字列を返す
- タイムアウト構成: 外部サービス呼び出しに対して常に
.toolExecutionTimeout()を設定する - 並行実行: ツールが独立している場合は
.executeToolsConcurrently()を有効にする - 入力検証: ツールメソッド内でパラメータを検証;説明的なエラーを返す
- パーミッションチェック: AI サービスレベルではなく、ツール内で認可を実行する
- 監査ログ: デバッグとコンプライアンスのためにツール名、パラメータ、実行結果をログに記録する
一般的な問題と解決策
| 問題 | 解決策 |
|---|---|
| LLM が存在しないツールを呼び出す | 安全なエラーメッセージを返す .hallucinatedToolNameStrategy() を追加する |
| ツールが間違ったパラメータを受け取る | @P 説明を改善;.toolArgumentsErrorHandler() を追加する |
| ツール実行がハング状態になる | .toolExecutionTimeout(Duration.ofSeconds(N)) を設定する |
| 外部 API からのレート制限エラー | リトライロジックまたはレート制限をツールメソッド内に追加する |
| LLM がツール出力を無視する | ツールが LLM が解釈できる文字列を返すことを確認する |
復元力パターンは references/error-handling.md を、パラメータと戻り値の型の詳細は references/core-patterns.md を参照してください。
クイックリファレンス
| アノテーション / API | 目的 |
|---|---|
@Tool | メソッドを呼び出し可能なツールとしてマークする |
@P | LLM のためのツールパラメータを説明する |
@ToolMemoryId | 会話/ユーザー ID をツールに注入する |
AiServices.builder() | 登録されたツールを持つ AI サービスを作成する |
ReturnBehavior.IMMEDIATELY | LLM 応答を待たずにツールを実行する |
ToolProvider | コンテキストに基づく動的ツール提供 |
executeToolsConcurrently() | 独立したツール呼び出しを並列実行する |
toolExecutionTimeout() | 個別ツール呼び出しのタイムアウト |
制約と警告
- 機密データ:
@Toolや@P説明に API キー、パスワード、認証情報を絶対に渡さない - 副作用: データを変更するツールは説明で警告する;AI モデルは複数回呼び出す可能性がある
- 大規模ツールセット: 過剰なツールは LLM モデルを混乱させる — 条件付き登録には
ToolProviderを使用する - ブロッキング操作: ツールは長い同期 I/O をタイムアウト構成なしで実行しない
- スタックトレース公開: 例外を常に安全な文字列を返すエラーハンドラーを経由してルートする
- パラメータ精度: 曖昧な
@P説明は直接不正なツール呼び出しを引き起こす — 形式と制約について具体的に指定する - 並行安全性:
executeToolsConcurrently()を使用する場合、ツールクラスがステートレスまたはスレッドセーフであることを確認する
関連スキル
langchain4j-ai-services-patterns— 高レベル AI サービス構成langchain4j-rag-implementation-patterns— ツール統合を使用した RAG 取得langchain4j-spring-boot-integration— Spring Boot アプリケーションでのツール登録
参考資料
references/setup-configuration.md— Maven セットアップ、チャットモデル構成、最初のツール登録references/core-patterns.md— 基本的なツール定義、複雑なパラメータ、戻り値の型references/advanced-features.md— メモリコンテキスト、動的ツールプロバイダー、ストリーミング、即座返却references/error-handling.md— エラーハンドラー、リトライロジック、監視references/integration-examples.md— データベース、REST API、コンテキスト対応ツール例
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- giuseppe-trisciuoglio
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。