いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「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向けの案件が豊富。 | 公式 |
【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を試すための準備をします。
pipコマンドでopenaiパッケージをインストールします。
pip install openaiOpenAIのアカウントでAPIキーを発行し、環境変数OPENAI_API_KEYに設定します。
export OPENAI_API_KEY="your_api_key"環境変数に設定しておけば、コード内にAPIキーを直接書く必要がなくなります。
実装(コード付き)
準備ができたので、実際にFunction Callingを実装してみます。
まずは、モデルに呼び出させたい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関数で、今回はサンプルとして固定文字列を返しています。
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].messagetool_choiceに”auto”を指定すると、質問の内容に応じてモデルが関数を呼ぶかどうかを自分で判断します。
関数呼び出しが必要と判断された場合、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を実行結果と一緒に返すのを忘れがちなので注意してください(笑)
関数の実行結果を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つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- 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を使った実装をする方法について解説しました。
以下が本記事のまとめになります。



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。








