03. ツールと Function Calling

この資料は 2025 年 11 月時点での田中正吾の雑感として書いたものです。あくまでもハッカソンでザっと AI の連携を作れるようにするために、動かして進められるような説明用の資料とサンプル群を用意した次第です。

Function Calling を使うと、AI に外部ツールや関数を実行させられます。ハッカソンで最も使う機能です。

学べること

  • Function Calling の基本的な仕組み
  • ツール定義の書き方
  • AI がツールを選択する仕組み
  • 外部 API との連携方法
  • 複数ツールの使い分け

準備するもの

  • Node.js (v18 以上)
  • OpenAI API キー

セットアップ

サンプルコードは本教材の Codespace(リンク集を参照)の 03_function-calling/ にあります。

フォルダ移動

まず、ターミナルに表示されているカレントディレクトリ(現在の作業フォルダ)を確認しましょう。

  • /workspaces/hackathon-ai-and-mcp-sample-202511-codespace/ の場合は、以下のコマンドでフォルダ移動します。
cd 03_function-calling
  • 続けて 02 から勉強している場合は、カレントディレクトリが /workspaces/hackathon-ai-and-mcp-sample-202511-codespace/02_api-basics で一つ階層が深いので、以下のコマンドでフォルダ移動します。
cd ../03_function-calling

手元の Visual Studio Code で作業されている方は、現在作業中のカレントディレクトリを確認いただいて上記を参考にフォルダを移動しましょう。

※フォルダ移動について詳しくは「Codespace でのフォルダ移動」を参照してください。

インストール

カレントディレクトリの移動が確認できたら、関連ライブラリをインストールして準備します。

npm install

これ以降はこのカレントフォルダでコマンドを打って作業していきましょう。

サンプル一覧

ライト ON/OFF 制御

ファイル: 01_light-control.js

最もシンプルな例です。「ライトをつけて」「ライトを消して」といった自然言語を、on_command / off_command に変換します。

IoT デバイス制御のイメージで学べます。

API キーの設定:

以下のコマンドでエディタで開くか、エクスプローラからファイルをダブルクリックして開きましょう。

code 01_light-control.js

ファイルの先頭にある API キー設定箇所を、お使いの OpenAI API キーに書き換えてください。

// OpenAI API キー
const OPENAI_API_KEY = "ここにあなたのAPIキーを入力";

実行:

node 01_light-control.js

色名から RGB 変換

ファイル: 02_color-converter.js

やや複雑な例です。色名(例: "赤")を RGB 値に変換します。成功と失敗で異なるツールを使い分けます。

構造化されたデータ抽出のパターンが学べます。

API キーの設定:

以下のコマンドでエディタで開くか、エクスプローラからファイルをダブルクリックして開きましょう。

code 02_color-converter.js

ファイルの先頭にある API キー設定箇所を、お使いの OpenAI API キーに書き換えてください。

// OpenAI API キー
const OPENAI_API_KEY = "ここにあなたのAPIキーを入力";

実行:

node 02_color-converter.js

天気 API 連携

ファイル: 03_weather-api.js

実践的な例です。AI がツールを選択し、実際に外部 API(wttr.in)を呼び出して天気情報を取得します。

ハッカソンで最も重要なパターン:

  • AI がツール選択
  • 実際の API 呼び出し
  • データ整形

無料 API(wttr.in)を使用するので、外部 API キーは不要です。

API キーの設定:

以下のコマンドでエディタで開くか、エクスプローラからファイルをダブルクリックして開きましょう。

code 03_weather-api.js

ファイルの先頭にある OpenAI API キー設定箇所を、お使いの API キーに書き換えてください。

// OpenAI API キー
const OPENAI_API_KEY = "ここにあなたのAPIキーを入力";

実行:

node 03_weather-api.js

ニュース API 連携(複数 API 呼び出し)

ファイル: 04_news-api.js

より実践的な例です。Hacker News API から最新のテックニュースを取得します。複数回の API 呼び出しを連鎖させるパターンが学べます。

学べるパターン:

  • トップストーリー ID リスト取得
  • 各記事の詳細取得(API 呼び出しの連鎖)
  • ループ処理でのデータ整形

無料 API(Hacker News)を使用するので、外部 API キーは不要です。

API キーの設定:

以下のコマンドでエディタで開くか、エクスプローラからファイルをダブルクリックして開きましょう。

code 04_news-api.js

ファイルの先頭にある OpenAI API キー設定箇所を、お使いの API キーに書き換えてください。

// OpenAI API キー
const OPENAI_API_KEY = "ここにあなたのAPIキーを入力";

実行:

node 04_news-api.js

コードの説明

ツールの定義

Function Calling では、AI が使えるツールを tools パラメータで定義します。

const tools = [
  {
    type: "function",
    function: {
      name: "get_weather",
      description: "指定された都市の天気情報を取得します",
      parameters: {
        type: "object",
        properties: {
          city: {
            type: "string",
            description: "都市名(例: Tokyo, Osaka)",
          },
        },
        required: ["city"],
      },
    },
  },
];

ツール定義のポイント:

  • name: ツールの名前(関数名)
  • description: ツールの説明(AI がツールを選ぶときのヒント)
  • parameters: ツールに渡すパラメータの定義(JSON Schema 形式)

API の呼び出し

ツール定義を含めて API を呼び出します。

const response = await fetch("https://api.openai.com/v1/chat/completions", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${OPENAI_API_KEY}`,
  },
  body: JSON.stringify({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: "東京の天気を教えて" }],
    tools: tools,
    tool_choice: "auto",
  }),
});

tool_choice: "auto" を指定すると、AI が必要に応じてツールを選択します。

ツール呼び出しの取得

API のレスポンスから、AI が選択したツール情報を取得します。

const data = await response.json();
const message = data.choices[0].message;

if (message.tool_calls) {
  const toolCall = message.tool_calls[0];
  const functionName = toolCall.function.name;
  const functionArgs = JSON.parse(toolCall.function.arguments);

  console.log("ツール名:", functionName);
  console.log("引数:", functionArgs);
}

tool_calls が存在する場合、AI がツールを使おうとしています。

ツールの実行

取得した情報をもとに、実際のツールを実行します。

if (functionName === "get_weather") {
  const city = functionArgs.city;
  const weatherData = await getWeather(city);
  console.log("天気情報:", weatherData);
}

実際の処理は、自分で実装した関数やサードパーティの API を呼び出します。

知っておくと良いこと

ツールの説明文が重要

AI は description をヒントにツールを選びます。具体的に書くと、AI がツールを正しく選びやすくなります。

具体的な書き方:

description: "指定された都市の現在の天気情報を取得します。降水確率や気温も含まれます。"

シンプルすぎる書き方:

description: "天気"

上の例だと AI が何をするツールなのか理解しづらいので、動作がわかるように書くと良いです。

パラメータ定義も具体的に

parametersdescription も、AI がパラメータを理解する手がかりになります。

properties: {
  city: {
    type: "string",
    description: "都市名(例: Tokyo, Osaka, New York)",
  },
}

複数ツールの使い分け

複数のツールを定義すると、AI が状況に応じて選択します。

const tools = [
  { /* 天気取得ツール */ },
  { /* ニュース取得ツール */ },
  { /* 画像生成ツール */ },
];

AI は質問内容に応じて、最適なツールを選びます。

ワンショット実行からはじめてみる

ハッカソンでは、まず1回のツール呼び出しで完結する実装からはじめるのも良いアプローチです。

複数ツールを連続実行する会話ループもできますが、実装は複雑になります。まずはシンプルなパターンで動かしてみて、必要に応じて発展させていくのがおすすめです。

次のステップ

Function Calling の仕組みがわかってきたでしょうか。次は継続会話(複数ターンの会話)の基礎を学びましょう。