# ChatGPTの便利API機能「Function calling」をPythonで実装！自分だけのAI Agentを作ってみよう！

> 当サイト【スタビジ】の本記事では、ChatGPT（正確にはGPTモデル）のAPIに新しく追加されたFunction callingという機能について解説していきたいと思います。実際にPythonを使ってFunction callingでどんな処理が構築できるのか実装していきますよ！

- URL: https://toukei-lab.com/function-calling
- 公開: 2023.07.11 / 更新: 2026.10.28
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、ChatGPT（正確にはGPTモデル）のAPIにおいて非常に便利なFunction callingという機能について解説していきたいと思います。実際にPythonを使ってFunction callingでどんな処理が構築できるのか実装していきますよ！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

この記事ではChatGPTの話題のFunction callingについてどんなことができるか実装例とともに見ていきたいと思います！

Function callingを使うとChatGPTの[API](/api)を利用してプログラムを構築する際の幅がめちゃくちゃ広がるのでぜひおさえておきましょう！

ちなみにFunction Callingを使ったエージェントの詳しい作り方は以下のUdemyの講座で僕自身が詳しく解説していますのでもっと深く知りたい方はチェックしてみてください！

:::box
[【初心者向け】生成系AI時代のPython×自動化！Function Callingを使って煩雑な作業を自動化しよう！](https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF)

[![Python Automate Udemy](/wp-content/uploads/2024/07/Udemy_Python_automate.jpg)](https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF)

<table class="table">
<tbody>
<tr>
<th>【時間】</th>
<td><span>3.5時間</span></td>
</tr>
<tr>
<th>【レベル】</th>
<td><span>初級</span></td>
</tr>
</tbody>
</table>

OpenAIのFunction Callingを使って自分でカスタマイズしたタスクをこなしてくれるエージェントを作りたいならこれ！今なら購入時に「NZWCLGF4BTZENY6E」という講師クーポンコードを入れると90%オフ以上の割引価格になりますのでぜひご受講ください！

＼30日以内なら返金無料／

::button[このコースを見てみる]{href="https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF"}
:::

## Function callingとは？

![robot](/wp-content/uploads/2017/12/Robotics-amico-min.png)

Function callingはOpenAIが2023年6月13日に公開したChatGPT（正確にはChatGPTというかGPTモデル）のAPI新機能であり（現在はTool calling＝ツール呼び出しとも呼ばれています）、<mark>処理の幅が広がるため界隈で非常に話題になっている機能です。</mark>

ざっくり言うと、あらかじめ特定の関数をこちらで定義して渡しておけば、人間の指示に対して[GPTモデル](/llm)側がよしなに必要な関数をピックアップして処理を行い結果を返してくれるというもの。

たとえば、色んな人のスケジュールが格納されているデータベースがありそこから特定の人の特定の日付のスケジュールを取得する関数を作成したとしましょう。

その関数をGPTのAPIに渡してFunction callingの設定をしてあげると・・・

自然言語で”田中さんの6/30のスケジュールを教えてー！”と入力すると、その結果を元に関数を呼び出すかどうか判断して必要であれば関数を呼んでその情報をもとに出力を返してくれる優れものなのです！

![Function calling](/wp-content/uploads/2023/07/a88d95cd63c310d111a6010df9c39edc.jpg)

複数の関数を定義することが可能で、GmailのAPIを利用してメールを送る関数などを定義しておくと”田中さんの6/30のスケジュールをxxxxx.gmail.comにおくってー”などと伝えるだけで、特定の関数を呼び出して実行してくれます。

めちゃくちゃすごいです。

<mark>このような処理を自然言語の指示で出来てしまうのは画期的ですし、ChatGPTのAPIを利用する幅が大きく広がりました！</mark>

## Function callingの実装例

それでは実際にどうやってFunction callingを実装するのか見ていきましょう！

今回は、先ほどお伝えした「誰かの特定日付のスケジュールを取得する」ような処理を簡単なデモで実装していきます。

この時、処理構築の流れとしては以下です。

:::box
**・独自functionの定義**\
**・GPTのAPIを呼ぶ処理**\
**・独自functionを使うかどうか判断する処理**
:::

まず処理構築に入る前に例によって以下のように各種必要なライブラリやAPIキーの設定をしておきましょう！

```python
from openai import OpenAI
import json
client = OpenAI(api_key="<自分のOpenAIのAPIキーを入れる>")
```

### 独自functionの定義

まずは独自functionを定義していきましょう！以下のように記述していきます！

```python
def get_schedule(date, person):
    """
    スケジュール取得用の関数を定義
    - ここではdateとpersonがパラメータとして渡りそれに対するscheduleが返ってくる仕様
    - 本来であればパラメータを元に適切なスケジュールが返ってくるようになるべきだが簡単のために今回は固定値を返す
    """
    schedule_info = {
        "date": date,
        "person": person,
        "schedule": "10時：A社とMTG、12時：友人Bとランチ"
    }
    return json.dumps(schedule_info)
```

get_scheduleはまさにスケジュールを取得する関数であり、dateとpersonを引数としてscheduleを取得します。

今回は簡単のためscheduleは固定値を入れています。

### GPTのAPIを呼ぶ処理

続いてGPTのAPIを呼ぶ処理を作っていきます。ここでは、OpenAIが今おすすめしているResponses API（client.responses.create）を使います。

```python
def run_conversation(prompt):
    # GPTのAPIへのリクエストを定義
    input_list = [{"role": "user", "content": prompt}]
    tools = [
        {
            "type": "function",
            "name": "get_schedule",
            "description": "特定の日付のスケジュールを取得して返す",
            "parameters": {
                "type": "object",
                "properties": {
                    "date": {
                        "type": "string",
                        "description": "日付"
                    },
                    "person": {
                        "type": "string",
                        "description": "人の名前"
                    },
                },
                "required": ["date","person"]
            }
        }
    ]
    response = client.responses.create(
        model="gpt-6-luna",
        input=input_list,
        tools=tools,
        tool_choice="auto",
    )
```

toolsには独自関数名や関数の説明や関数に必要なパラメータなどをセットしていきます（以前はfunctionsという引数でしたが、今は”type”: ”function”をつけてtoolsに渡します）。

tool_choice=”auto”とすることで独自関数を使うか使わないかをGPTモデルが自動で選定してくれるようになります。モデルには、安くて速い”gpt-6-luna”を指定しています。

引数promptにはユーザーが入力する自然言語が入るようになってます。

### 独自functionを呼ぶ選択をしたかどうか判断し処理

続いて独自定義したfunctionを呼ぶかどうかを判断し次の処理に移ります。

先ほどのコードの続きであり、run_conversation関数の中に書いていきます。

```python
    # 独自定義したfunctionを呼ぶのかどうか判断し処理
    function_calls = [item for item in response.output if item.type == "function_call"]
    if function_calls:
        available_functions = {
            "get_schedule": get_schedule,
        }
        # 独自関数のレスポンスを渡す
        input_list += response.output
        for function_call in function_calls:
            function_name = function_call.name
            fuction_to_call = available_functions[function_name]
            function_args = json.loads(function_call.arguments)
            function_response = fuction_to_call(
                date=function_args.get("date"),
                person=function_args.get("person")
            )
            input_list.append(
                {
                    "type": "function_call_output",
                    "call_id": function_call.call_id,
                    "output": function_response,
                }
            )
        # 独自関数のレスポンスをもとに改めてAPIにリクエスト
        second_response = client.responses.create(
            model="gpt-6-luna",
            input=input_list,
            tools=tools,
        )  # get a new response from GPT where it can see the function response
        return second_response

    else:
        return response
```

ここでは、functionを呼ぶ選択をした場合は、よしなにユーザーが入力したpromptから名前や日付を取得してそれを元に関数を呼び出し結果を返してくれます。

モデルが関数を呼ぶと決めたときは、response.outputの中にtypeが”function_call”の要素が入ってくるので、それを見て判断しています。関数の結果は、call_idをつけて”function_call_output”としてモデルに返します。

### 検証

それでは検証していきましょう！

最終的なコードは以下のようになります！

```python
def get_schedule(date, person):
    """
    スケジュール取得用の関数を定義
    - ここではdateとpersonがパラメータとして渡りそれに対するscheduleが返ってくる仕様
    - 本来であればパラメータを元に適切なスケジュールが返ってくるようになるべきだが簡単のために今回は固定値を返す
    """
    schedule_info = {
        "date": date,
        "person": person,
        "schedule": "10時：A社とMTG、12時：友人Bとランチ"
    }
    return json.dumps(schedule_info)


def run_conversation(prompt):
    # GPTのAPIへのリクエストを定義
    input_list = [{"role": "user", "content": prompt}]
    tools = [
        {
            "type": "function",
            "name": "get_schedule",
            "description": "特定の日付のスケジュールを取得して返す",
            "parameters": {
                "type": "object",
                "properties": {
                    "date": {
                        "type": "string",
                        "description": "日付"
                    },
                    "person": {
                        "type": "string",
                        "description": "人の名前"
                    },
                },
                "required": ["date","person"]
            }
        }
    ]
    response = client.responses.create(
        model="gpt-6-luna",
        input=input_list,
        tools=tools,
        tool_choice="auto",
    )

    # 独自定義したfunctionを呼ぶかどうかの処理
    function_calls = [item for item in response.output if item.type == "function_call"]
    if function_calls:
        available_functions = {
            "get_schedule": get_schedule,
        }
        # 独自関数のレスポンスを渡す
        input_list += response.output
        for function_call in function_calls:
            function_name = function_call.name
            fuction_to_call = available_functions[function_name]
            function_args = json.loads(function_call.arguments)
            function_response = fuction_to_call(
                date=function_args.get("date"),
                person=function_args.get("person")
            )
            input_list.append(
                {
                    "type": "function_call_output",
                    "call_id": function_call.call_id,
                    "output": function_response,
                }
            )
        # 独自関数のレスポンスをもとに改めてAPIにリクエスト
        second_response = client.responses.create(
            model="gpt-6-luna",
            input=input_list,
            tools=tools,
        )  # get a new response from GPT where it can see the function response
        return second_response

    else:
        return response

```

では定義したrun_conversationを呼び出して実際にどんな回答が返ってくるのか検証してみましょう！

```python
print(run_conversation("田中さんの6/30のスケジュールを教えて").output_text)
```

結果は以下のようになりました！！

![Function calling](/wp-content/uploads/2023/07/26bd9bba6e332791bc6c907838241dd8.png)

ちゃんといい感じに回答を返してくれていることが分かります。

今回は固定値を返すというシンプルな方法で実装を試みましたが、これでもFunction callingの実装イメージが掴めたかと思います。

ぜひ色んな関数を定義してFunction callingを駆使して面白いプログラムを作ってみてください！

以下がOpenAIのFunction callingのドキュメントであり実装方法などが詳しく記載されているので是非参考にしてみてください。

:::box
[ChatGPTドキュメント：Function calling](https://platform.openai.com/docs/guides/gpt/function-calling)
:::

ちなみにFunction callingと似たことができるライブラリとしてLangChainが存在しました。

Function callingとLangChainの違いはどんなところにあるのでしょうか？

個人的にはFunction callingの方が処理構築が分かりやすいのと出力が正確かつOpenAIが提供している公式機能であることから出来るだけFunction callingを利用した方がいいかなと思っています。

LangChainについては以下の記事で詳しく解説していますので是非チェックしてみてください！

<https://toukei-lab.com/langchain>

## Function calling　まとめ

ここまでで、ChatGPTのAPIをフル活用するのに重要なFunction callingについてまとめてきました！

冒頭でもお伝えしましたが、Function Callingを使ったエージェントの詳しい作り方は以下のUdemyの講座で僕自身が詳しく解説していますのでもっと深く知りたい方はチェックしてみてください！

:::box
[【初心者向け】生成系AI時代のPython×自動化！Function Callingを使って煩雑な作業を自動化しよう！](https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF)

[![Python Automate Udemy](/wp-content/uploads/2024/07/Udemy_Python_automate.jpg)](https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF)

<table class="table">
<tbody>
<tr>
<th>【時間】</th>
<td><span>3.5時間</span></td>
</tr>
<tr>
<th>【レベル】</th>
<td><span>初級</span></td>
</tr>
</tbody>
</table>

OpenAIのFunction Callingを使って自分でカスタマイズしたタスクをこなしてくれるエージェントを作りたいならこれ！今なら購入時に「NZWCLGF4BTZENY6E」という講師クーポンコードを入れると90%オフ以上の割引価格になりますのでぜひご受講ください！

＼30日以内なら返金無料／

::button[このコースを見てみる]{href="https://www.udemy.com/course/ai-python-function-calling/?referralCode=8AD4A1BC14DDA11929EF"}
:::

また、最近話題の生成系AIやLLMの実装方法についてより詳しくは当メディアが運営する[**スタアカ**](https://toukei-lab.com/achademy/)の以下のコースを是非チェックしてみてください！

:::box
**[・](https://toukei-lab.com/achademy/?sfwd-courses=llm)[スタアカ「13.大規模言語モデル（LLM）・生成系AIコース」](https://toukei-lab.com/achademy/?sfwd-courses=llm)[\
・](https://toukei-lab.com/achademy/?sfwd-courses=llm)[スタアカ「プロンプトエンジニアリングコース」](https://toukei-lab.com/achademy/?sfwd-courses=prompt-engeneering)**
:::

[GPTモデル](/gpt)をはじめとした[大規模言語モデル](/llm)の理論やPythonでの扱い方などを幅広く学んでいきます！

[**スタアカ**](https://toukei-lab.com/achademy/)は業界最安級のAIデータサイエンススクールです。

![スタアカトップ](/wp-content/uploads/2021/11/2bc9f22d0f8dfe24080b83884b7a5ec6-1024x576.jpg)

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1280円/月<br>
プレミアムプラン：129,800円（通常149,800円）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>データサイエンスを網羅的に学ぶ<br>
実践的なビジネスフレームワークを学ぶ<br>
SQLとPythonを組みあわせて実データを使った様々なワークを行う<br>
マーケティングの実行プラン策定<br>
マーケティングとデータ分析の掛け合わせで集客マネタイズ</td>
</tr>
</tbody>
</table>

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定\
・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践して稼ぐ**
:::

＼今すぐ試す／

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/"}

<mark>**AIデータサイエンスを学んで市場価値の高い人材になりましょう！**</mark>

データサイエンスやAIの勉強方法は以下の記事でまとめています。

<https://toukei-lab.com/data-scientist>

<https://toukei-lab.com/ai-learning>

PythonでのAPI開発に[FastAPI](/fastapi)を使った方法を以下の記事で解説しています。

<https://toukei-lab.com/fastapi>