AIを単なる「会話ツール」から「実行可能なエージェント」に進化させるカギとなるのが Tool Calling。
LangChainを使えば、LLM(大規模言語モデル)がプログラムの関数を直接呼び出し、実用的なタスクをこなすことが可能になります。
しかし、
「Tool Callingって具体的に何をするの?」
「どうやって実装すればいい?」
「エージェントとの組み合わせ方は?」
と疑問に思う方も多いはず。
そこで本記事では、Tool Callingの基礎から応用まで徹底解説します!
【本記事のもくじ】
📌 本記事の内容
✅ 基礎編
- Tool Callingとは?
- Tool Callingの仕組みと対応モデル
✅ 実践編
- Tool Callingの基本的な実装(関数の定義・呼び出し)
- LangGraphを使ったエージェントの活用
- AgentExecutorを使った実行方法
✅ 応用編
- Structured Outputとの違いと連携
- Tool Callingをカスタム実装する方法
- よくあるエラーと対策
1. Tool Callingとは?
🛠️ LangChainのTool Callingの役割
Tool Calling とは、LLM(大規模言語モデル)が外部の関数やツールを呼び出せる仕組みのこと。
通常、LLMは「テキストを生成する」ことが主な機能ですが、Tool Callingを使うことで次のようなタスクもこなせるようになります。
✅ 計算を実行(例:「3+5」の計算結果を求める)
✅ 外部APIを呼び出す(例:天気情報を取得)
✅ データベースクエリを実行(例:売上データを検索)
✅ システムコマンドを実行(例:ファイル操作)
2. Tool Callingの仕組みと対応モデル
🔍 Tool Callingの動作原理
- ユーザーが質問を入力(例:「3 + 4 の計算結果は?」)
- LLMが「計算するべき」と判断
- 関連する関数(ツール)を呼び出し、引数を渡す
- 関数が処理を実行し、結果をLLMに返す
- LLMが最終的な応答を生成(「答えは7です」)
📌 対応しているLLMモデル
モデル | Tool Calling対応 |
---|---|
OpenAI GPT-4 | ✅ Function Calling |
Anthropic Claude | ✅ Tool Use |
Google Gemini | ✅ Function Calling |
Mistral | ❌ 非対応 |
LangChainでは、これらの異なるモデルのTool Callingを 統一したインターフェース で扱うことができます。
3. Tool Callingの基本的な実装(関数の定義・呼び出し)
🔧 ① Toolの定義(関数を作る)
Tool Callingを使うには、まず 呼び出す関数(ツール)を定義 します。
LangChainでは @tool
デコレーターを使うことで、関数を「ツール」として登録できます。
from langchain_core.tools import tool
@tool
def add(a: int, b: int) -> int:
"""2つの数値を足し算して返す"""
return a + b
# 関数の直接実行
print(add.invoke({"a": 3, "b": 4})) # 出力: 7
🔗 ② LLMとToolを紐づける(bind_tools)
次に、この add
関数を LLM に紐づけます。bind_tools
メソッドを使うことで、LLMが add
を認識し、必要なときに呼び出せるようになります。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# プロンプトの作成
prompt = ChatPromptTemplate.from_messages([
("system", "ユーザーの質問に応じて関数を呼び出してください"),
("placeholder", "{messages}"),
])
# LLMとツールの紐づけ
chain = prompt | ChatOpenAI() | bind_tools([add])
# LLMに処理を依頼
print(chain.invoke({"messages": ["3 + 4"]}))
🔹 ポイント
ChatOpenAI()
は OpenAI の LLM を利用する設定bind_tools([add])
でadd
関数をLLMに紐づけ
🔄 ③ LLMからToolを実行する
LLMは、ツールの呼び出し情報を tool_calls
というプロパティで返します。
この情報を使って、実際に関数を実行することが可能です。
# LLMの実行
result = chain.invoke({"messages": ["3 + 4 の答えは?"]})
# LLMがツールを呼び出したか確認
if "tool_calls" in result:
tool_call = result["tool_calls"][0]
print(add.invoke(tool_call["args"])) # 出力: 7
4. LangGraphを使ったエージェントの活用
LangChainには、Tool Callingを エージェント(自律的に判断するAI) と組み合わせる仕組みがあります。
その一つが LangGraph の create_react_agent()
。
これを使うことで、LLMが「ツールを使うべきかどうか」を自動で判断できるようになります。
from langgraph.prebuilt import create_react_agent
# エージェントの作成
agent = create_react_agent(
model=ChatOpenAI(),
tools=[add]
)
# エージェントの実行
result = agent.invoke({"messages": ["3 + 4 の答えは?"]})
print(result["messages"][-1].content) # 出力: 7
5. Structured Outputとの違いと連携
LangChainには、Tool Callingと似た機能として Structured Output があります。
機能 | 説明 |
---|---|
Tool Calling | LLMが関数を呼び出して実行する |
Structured Output | LLMの出力をPydanticモデルに構造化する |
📌 Structured Outputのサンプル
from pydantic import BaseModel, Field
class OutputModel(BaseModel):
name: str = Field(..., description="名前")
age: int = Field(..., description="年齢")
# LLMの出力を構造化する
chain = ChatOpenAI().with_structured_output(OutputModel)
6. まとめ & 次のステップ
✅ Tool Callingを使うことで、LLMが関数を実行できるようになる
✅ bind_tools を使うことで、簡単にツールを紐づけ可能
✅ LangGraphを活用すれば、エージェントとして自律的に判断もできる
✅ Structured Outputとの組み合わせで、より柔軟な処理が可能に
LangChainを活用して、より実用的なAIアプリケーションを作っていきましょう!🚀