Function Callingとは?使い方を初心者向けに徹底解説【実践例付き】

kento_morota 20分で読めます

「ChatGPTから自社の在庫情報を確認できたら便利なのに」「顧客データを自然な会話で検索したい」――そんな要望を実現する仕組みが、Function Callingです。

本記事では、ChatGPTと外部システムを連携させるFunction Callingの基本から、中小企業での実践的な使い方・実装手順まで、初心者にもわかりやすく解説します。

Function Callingとは?ChatGPTと外部システムをつなぐ仕組み

「ChatGPTで顧客情報を検索したい」「在庫状況を自然な会話で確認できたら便利なのに」——そんな風に思ったことはありませんか?

ChatGPTは単独では外部のデータベースやシステムにアクセスできません。しかし、Function Calling(ファンクション・コーリング)という仕組みを使えば、ChatGPTと自社システムを連携させ、業務の自動化が可能になります。

本記事では、中小企業のIT担当者や経営者の方に向けて、Function Callingの基本から実践的な使い方まで、初心者でも理解できるように解説します。

Function Callingの定義と役割

Function Callingとは、ChatGPTなどのAIが外部の関数やAPIを呼び出して情報を取得したり、処理を実行したりする仕組みです。

例えば、「顧客番号123の注文履歴を教えて」と質問すると、ChatGPTは:

  • 顧客データベースにアクセスする関数を呼び出す
  • 顧客番号123の情報を取得する
  • その結果を自然な文章で返答する

このように、AIと既存システムの橋渡し役として機能し、リアルタイムの業務データにアクセスできるようになります。

従来のChatGPTとの違い

従来のChatGPTは学習済みの一般的な知識のみで回答していましたが、Function Callingによって以下が可能になりました:

  • 外部データベースやAPIから最新情報を取得
  • 自社の業務システムと連携
  • 在庫確認、顧客情報検索など実務に直結
  • ユーザーの質問に応じて適切な関数を自動選択

つまり、ChatGPTは「知識を教えるツール」から「業務を支援するツール」へと進化したのです。

Function Callingの活用シーン

Function Callingは、特に以下のような場面で威力を発揮します。

顧客データベースとの連携

課題:
顧客からの問い合わせ時に、過去の注文履歴や対応記録を確認するのに時間がかかり、お客様を待たせてしまう。

Function Callingでの解決:
「顧客番号456の過去の注文履歴を教えて」と入力するだけで、顧客情報、注文履歴、対応メモなどを一覧表示。「この顧客は過去3回ご注文があり、最終注文は〇〇です」と自然な文章で回答します。

導入効果:
- 問い合わせ対応時間が平均3分短縮
- 新人スタッフでもベテランと同等の対応が可能
- 顧客満足度の向上

在庫管理システムとの連携

課題:
営業担当が外出先から在庫を確認したいとき、会社に電話するか帰社してシステムにログインする必要があり、機会損失が発生する。

Function Callingでの解決:
スマホのチャットで「商品A(SKU: 12345)の在庫数は?」と質問すると、在庫管理システムから最新データを取得し、「現在の在庫は15個です。先週比で5個減少しています」と回答。

社内のExcelデータ活用

課題:
社内の知識が複数のExcelファイルに分散保存されており、「あの情報、どのファイルだっけ?」という状況が頻発。

Function Callingでの解決:
「過去に対応したクレーム事例で、配送遅延に関するものを教えて」と質問すると、対応事例Excelを検索し、「配送遅延のクレームは過去3件あり、対応方法は〇〇でした」と要約して回答。

これらに共通するのは、大げさなシステム導入ではなく、既存のデータやツールを活かすという点です。中小企業にとって「ちょうどいい」デジタル化の形と言えるでしょう。

Function Callingの仕組みを3ステップで理解する

Function Callingがどのように動作するのか、3つのステップで解説します。

ステップ1:ユーザーの質問をChatGPTが解釈

ユーザーが「顧客番号123の最新の注文状況を教えて」と質問すると、ChatGPTは質問の意図を理解し、「これは顧客データベースにアクセスする必要がある」と判断します。

従来のシステムでは「SELECT * FROM customers WHERE id=123」のようなSQL文を書く必要がありましたが、Function Callingでは自然な会話で済みます。

ステップ2:必要な関数とパラメータをChatGPTが判断

ChatGPTは、質問に答えるためにどの関数を呼び出すべきか、どんな情報(パラメータ)が必要かを自動的に判断します。

例の場合:
- 呼び出す関数:get_customer_order
- 必要なパラメータ:customer_id=123

複数の関数が定義されていても、自動で最適なものを選択し、「顧客番号123」という情報を自動的にcustomer_idとして認識します。

ステップ3:関数を実行して結果を返す

選ばれた関数が実際に実行され、結果が返されます。

  1. get_customer_order(customer_id=123)が呼び出される
  2. データベースから顧客123の注文情報を取得
  3. 「注文番号456、商品A、配送中」といったデータが返される
  4. ChatGPTがこのデータを「顧客番号123の最新注文は、注文番号456で商品Aです。現在配送中となっています」と自然な文章に変換

生のデータではなく、読みやすい文章で回答してくれるのがFunction Callingの大きな利点です。

Function Callingの基本的な使い方【実装の流れ】

実際にFunction Callingを使うための具体的な手順を解説します。

必要な準備:OpenAI APIキーの取得

Function Callingを使うには、OpenAIのAPIキーが必要です。APIキーの取得方法やPythonでの基本的な使い方についてはOpenAI APIのPython活用ガイドで詳しく解説しています。

  1. https://platform.openai.com/ にアクセスし、メールアドレスで新規登録(無料)
  2. ログイン後、「API keys」メニューから「Create new secret key」をクリック
  3. 生成されたキーをコピーして安全な場所に保存
  4. クレジットカード情報を登録し、使用量の上限を設定(例:月5,000円まで)

注意点:
- APIキーは他人に見せない(GitHubなどに公開しない)
- 環境変数として管理する
- 定期的に使用量をチェックする

関数の定義方法(JSON形式での記述)

ChatGPTに「どんな関数が使えるか」をJSON形式で教えます。

{
  "name": "get_customer_info",
  "description": "顧客IDを指定して顧客情報を取得する",
  "parameters": {
    "type": "object",
    "properties": {
      "customer_id": {
        "type": "string",
        "description": "顧客ID(例:123)"
      }
    },
    "required": ["customer_id"]
  }
}

各項目の説明:
- name:関数の名前
- description:関数の説明(ChatGPTがこれを読んで、いつ使うべきか判断)
- parameters:関数に渡すパラメータの定義

descriptionは具体的に書くことで、ChatGPTの判断精度が上がります。

ChatGPTへのリクエストの送り方

関数を定義したら、ChatGPTにリクエストを送ります。

import openai
import os

openai.api_key = os.environ.get("OPENAI_API_KEY")

functions = [
    {
        "name": "get_customer_info",
        "description": "顧客IDを指定して顧客情報を取得する",
        "parameters": {
            "type": "object",
            "properties": {
                "customer_id": {
                    "type": "string",
                    "description": "顧客ID"
                }
            },
            "required": ["customer_id"]
        }
    }
]

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "顧客番号123の情報を教えて"}],
    functions=functions,
    function_call="auto"
)

function_call="auto"でChatGPTに自動判断させます。

レスポンスの受け取りと関数の実行

ChatGPTからのレスポンスを受け取り、関数呼び出しが必要かを判断します。

message = response["choices"][0]["message"]

if message.get("function_call"):
    function_name = message["function_call"]["name"]
    arguments = json.loads(message["function_call"]["arguments"])

    # 実際に関数を実行
    if function_name == "get_customer_info":
        result = get_customer_info(arguments["customer_id"])

実際の関数の実装例:

def get_customer_info(customer_id):
    customer_data = {
        "123": {
            "name": "山田太郎",
            "email": "yamada@example.com",
            "phone": "090-1234-5678",
            "last_order": "2024-01-15"
        }
    }
    return customer_data.get(customer_id, "顧客が見つかりません")

結果をChatGPTに返して回答を生成

関数の実行結果を再度ChatGPTに渡して自然な文章にします。

function_result = get_customer_info(arguments["customer_id"])

second_response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "顧客番号123の情報を教えて"},
        message,
        {
            "role": "function",
            "name": function_name,
            "content": json.dumps(function_result, ensure_ascii=False)
        }
    ]
)

final_answer = second_response["choices"][0]["message"]["content"]
print(final_answer)

出力例:
「顧客番号123は山田太郎様です。メールアドレスはyamada@example.com、電話番号は090-1234-5678です。最終注文日は2024年1月15日となっています。」

実践例:天気情報取得機能を作ってみる

最もシンプルな例として、天気情報を取得するFunction Callingを実装してみましょう。

天気情報を取得する関数を定義する

functions = [
    {
        "name": "get_weather",
        "description": "指定された都市の現在の天気情報を取得する",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {
                    "type": "string",
                    "description": "都市名(例:東京、大阪、札幌)"
                }
            },
            "required": ["city"]
        }
    }
]

def get_weather(city):
    weather_data = {
        "東京": {"temp": 15, "condition": "晴れ", "humidity": 60},
        "大阪": {"temp": 17, "condition": "曇り", "humidity": 65},
        "札幌": {"temp": 8, "condition": "雪", "humidity": 75}
    }

    if city in weather_data:
        data = weather_data[city]
        return {
            "city": city,
            "temperature": data["temp"],
            "condition": data["condition"],
            "humidity": data["humidity"]
        }
    else:
        return {"error": f"{city}の天気情報は見つかりませんでした"}

完全なコード例と実行結果

import openai
import json
import os

openai.api_key = os.environ.get("OPENAI_API_KEY")

user_message = "東京の今日の天気はどう?"

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": user_message}],
    functions=functions,
    function_call="auto"
)

message = response["choices"][0]["message"]

if message.get("function_call"):
    function_name = message["function_call"]["name"]
    arguments = json.loads(message["function_call"]["arguments"])

    if function_name == "get_weather":
        weather_info = get_weather(**arguments)

        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "user", "content": user_message},
                message,
                {
                    "role": "function",
                    "name": function_name,
                    "content": json.dumps(weather_info, ensure_ascii=False)
                }
            ]
        )

        print(second_response["choices"][0]["message"]["content"])

出力例:
「東京の今日の天気は晴れです。気温は15度、湿度は60%となっています。お出かけには良い天気ですね。」

自社の業務データへの応用

この天気情報の例を、自社の業務データに置き換えることは簡単です。

顧客情報検索への応用:

def get_customer_info(customer_id):
    import pandas as pd
    df = pd.read_csv("customers.csv")
    customer = df[df["customer_id"] == customer_id]

    if not customer.empty:
        return customer.to_dict('records')[0]
    else:
        return {"error": "顧客が見つかりません"}

このように、関数の実装部分を変更するだけで、様々な業務データに対応できます。

Function Calling導入時の注意点

セキュリティ面で気をつけるべきこと

  • APIキーの管理:環境変数として管理し、コードに直接書かない
  • アクセス制限:関数が取得できるデータの範囲を制限する
  • 入力検証:不正なパラメータが渡されないようバリデーションを実施

コスト(API利用料)の考え方

OpenAI APIは従量課金制です。目安として:

  • GPT-3.5-turbo:1,000トークンあたり約0.2円
  • 月間1,000回の問い合わせで約2,000〜3,000円程度

使用量の上限設定と定期的なモニタリングで予想外の課金を防ぎましょう。

関数設計のポイント

  • シンプルに保つ:1つの関数は1つの役割に集中
  • 明確な命名:関数名とdescriptionは分かりやすく
  • エラーハンドリング:データが見つからない場合の処理を必ず実装

よくあるエラーと対処法

  1. APIキーの設定ミス:echo $OPENAI_API_KEYで環境変数を確認
  2. JSON形式のエラー:オンラインのJSONバリデーターで検証
  3. 関数名の不一致:定義した関数名と実際の関数名が一致しているか確認
  4. パラメータの型エラー:文字列と数値の型が正しく定義されているか確認

中小企業がFunction Callingで業務改善するためのヒント

まずは小さな業務から自動化してみる

いきなり大規模なシステムを構築するのではなく、以下のような小さな業務から始めましょう:

  • 顧客情報の検索
  • 在庫数の確認
  • 過去の対応履歴の参照

成功体験を積み重ねることで、社内の理解と協力が得られやすくなります。

Excel管理からの脱却:データベース連携の第一歩

多くの中小企業がExcelで管理している業務データを、Function Callingで活用できます。まずはExcelファイルをそのまま読み込む形から始め、徐々にデータベース化を検討しましょう。

属人化解消:誰でも使える仕組みづくり

Function Callingは、特定の社員しか知らない情報を共有化する有効な手段です。「〇〇さんに聞かないと分からない」という状況を解消し、誰でも必要な情報にアクセスできる環境を作りましょう。

専門家に相談するタイミング

以下のような場合は、専門家への相談を検討しましょう:

  • セキュリティ要件が厳しい情報を扱う場合
  • 複数のシステムを統合する必要がある場合
  • 社内にIT人材がいない場合

Harmonic Societyでは、中小企業向けの「ちょうどいい」AI活用サポートを提供しています。計画づくりから実際に使えるようになるまで伴走支援しますので、お気軽にご相談ください。


Function Callingは、大げさなシステム導入ではなく、既存のデータやツールを活かす「ちょうどいい」デジタル化の形です。さらに高度な自律型のシステムを構築したい場合は、AIエージェントの仕組みと活用法もぜひご覧ください。まずは小さく始めて、徐々に業務改善の範囲を広げていきましょう。

#Function#Calling#とは
共有:

ちょっとした業務の悩みも、気軽にご相談ください。

まずは話だけ聞いてもらう