【AI】PythonでOpenAI Function Callingを実装する方法

当ページのリンクには広告が含まれています。
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

PythonでOpenAIのFunction Callingを使った実装をする方法を知りたい」とお考えではありませんか?

ChatGPTのAPIから天気情報やデータベースの検索結果など、外部の関数を呼び出したいと考えている方へ。

Function Callingを使えば、モデルに関数の実行を判断させて、実際の処理はPython側で行う仕組みを構築可能です。

いずみ

仕組みさえ理解すれば実装自体はシンプルなので、サクッと解説します。

ということで、本記事ではPythonでOpenAIのFunction Callingを使った実装をする方法を解説します。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AI】PythonでOpenAI Function Callingを実装する方法

早速ですが、PythonでOpenAIのFunction Callingを使う方法と簡単な実装をしてみます。

Function Callingとは

Function Callingとは、モデルに対して利用可能な関数の一覧を渡しておき、必要に応じてモデル側がどの関数をどんな引数で呼ぶべきか判断してくれる機能です。

実際に関数を実行するのはPythonのコードであり、モデルは関数名と引数のJSONを返すだけという役割分担になっています。

OpenAIのAPIではfunction_callという名前のパラメータから、toolsとtool_choiceという名前に置き換わっている仕様になっています。

いずみ

function_callは非推奨になっているので、新しくコードを書くならtoolsパラメータを使いましょう。

事前準備

まずは、Function Callingを試すための準備をします。

STEP
openaiパッケージをインストールする

pipコマンドでopenaiパッケージをインストールします。

pip install openai
STEP
APIキーを環境変数に設定する

OpenAIのアカウントでAPIキーを発行し、環境変数OPENAI_API_KEYに設定します。

export OPENAI_API_KEY="your_api_key"

環境変数に設定しておけば、コード内にAPIキーを直接書く必要がなくなります。

実装(コード付き)

準備ができたので、実際にFunction Callingを実装してみます。

STEP
呼び出したい関数とtools定義を作成する

まずは、モデルに呼び出させたいget_weather関数と、get_weather関数の説明をJSON Schemaで定義します。

def get_weather(city: str) -> str:
    # 本来は天気APIを呼び出す処理を書く
    return f"{city}は晴れ、気温は25度です。"


tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "指定した都市の現在の天気を取得する",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "天気を調べたい都市名"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

get_weather関数自体は普通のPython関数で、今回はサンプルとして固定文字列を返しています。

STEP
toolsを指定してAPIを呼び出す

chat.completions.createのtoolsパラメータに、先ほど定義したtoolsを渡します。

from openai import OpenAI

client = OpenAI()

messages = [{"role": "user", "content": "東京の天気を教えて"}]

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

message = response.choices[0].message

tool_choiceに”auto”を指定すると、質問の内容に応じてモデルが関数を呼ぶかどうかを自分で判断します。

STEP
tool_callsを処理して関数を実行する

関数呼び出しが必要と判断された場合、message.tool_callsに実行すべき関数名と引数が入ります。

import json

if message.tool_calls:
    messages.append(message)

    for tool_call in message.tool_calls:
        if tool_call.function.name == "get_weather":
            args = json.loads(tool_call.function.arguments)
            result = get_weather(args["city"])

            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result
            })

tool_call.function.argumentsはJSON形式の文字列で返ってくるため、json.loadsでパースしてから使います。

いずみ

tool_call_idを実行結果と一緒に返すのを忘れがちなので注意してください(笑)

STEP
実行結果をモデルに渡して最終回答を得る

関数の実行結果をmessagesに追加した状態で、もう一度APIを呼び出します。

second_response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages
)

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

second_responseには、get_weather関数の実行結果を踏まえた自然な文章の回答が入ります。

いずみ

関数を呼ぶかどうかの判断も引数の組み立ても、すべてモデルに任せられるのは便利ですね。

tool_choiceで呼び出し方を制御する

tool_choiceパラメータは、autoの他にいくつかの指定方法があります。

  • "auto": 関数を呼ぶかどうかをモデルが判断する(デフォルト)
  • "required": 必ずいずれかの関数を呼ばせる
  • "none": 関数を呼ばせず、通常の回答のみ返させる
  • {"type": "function", "function": {"name": "get_weather"}}: 特定の関数を必ず呼ばせる

用途に応じてtool_choiceを使い分けることで、関数呼び出しの挙動を細かく制御可能です。

いずみ

チャットボットならauto、決まった処理を必ず実行させたいバッチ処理ならrequiredが向いています。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

function_callとtoolsの違いは何ですか?

function_callは古いパラメータ名で、非推奨になっています。

toolsとtool_choiceというパラメータ名に統一されており、新しくコードを書く場合はtoolsを使います。

複数の関数を同時に定義できますか?

toolsのリストに複数の関数定義を並べることで、複数の関数を同時に登録可能です。

1回の応答でmessage.tool_callsに複数の関数呼び出しが含まれることもあるため、ループで順番に処理します。

モデルが誤った引数を渡してくることはありますか?

parametersのJSON Schemaに沿った値が基本的に返りますが、想定外の値が来る可能性はゼロではありません。

  • 関数の説明文(description)を具体的に書く
  • requiredで必須項目を明示する
  • Python側でも引数のバリデーションを行う

まとめ

今回は、PythonでOpenAIのFunction Callingを使った実装をする方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Function Callingは、モデルが関数呼び出しを判断し、実行はPython側で行う仕組み。
  • toolsとtool_choiceパラメータを使うのが標準的な実装方法。
  • tool_callsの実行結果はtool_call_idと一緒にmessagesへ追加して再度APIを呼び出す。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次