【完全ガイド】LangChainのTool Callingとは?仕組み・実装・応用まで徹底解説🚀

LLM

AIを単なる「会話ツール」から「実行可能なエージェント」に進化させるカギとなるのが Tool Calling
LangChainを使えば、LLM(大規模言語モデル)がプログラムの関数を直接呼び出し、実用的なタスクをこなすことが可能になります。

しかし、

「Tool Callingって具体的に何をするの?」
「どうやって実装すればいい?」
「エージェントとの組み合わせ方は?」

と疑問に思う方も多いはず。

そこで本記事では、Tool Callingの基礎から応用まで徹底解説します!

【本記事のもくじ】


📌 本記事の内容

✅ 基礎編

  1. Tool Callingとは?
  2. Tool Callingの仕組みと対応モデル

✅ 実践編

  1. Tool Callingの基本的な実装(関数の定義・呼び出し)
  2. LangGraphを使ったエージェントの活用
  3. AgentExecutorを使った実行方法

✅ 応用編

  1. Structured Outputとの違いと連携
  2. Tool Callingをカスタム実装する方法
  3. よくあるエラーと対策

1. Tool Callingとは?

🛠️ LangChainのTool Callingの役割

Tool Calling とは、LLM(大規模言語モデル)が外部の関数やツールを呼び出せる仕組みのこと。

通常、LLMは「テキストを生成する」ことが主な機能ですが、Tool Callingを使うことで次のようなタスクもこなせるようになります。

計算を実行(例:「3+5」の計算結果を求める)
外部APIを呼び出す(例:天気情報を取得)
データベースクエリを実行(例:売上データを検索)
システムコマンドを実行(例:ファイル操作)


2. Tool Callingの仕組みと対応モデル

🔍 Tool Callingの動作原理

  1. ユーザーが質問を入力(例:「3 + 4 の計算結果は?」)
  2. LLMが「計算するべき」と判断
  3. 関連する関数(ツール)を呼び出し、引数を渡す
  4. 関数が処理を実行し、結果をLLMに返す
  5. 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) と組み合わせる仕組みがあります。

その一つが LangGraphcreate_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アプリケーションを作っていきましょう!🚀

最新情報をチェックしよう!