PR

ChatGPTで関数呼び出し(Function Calling)の組み込みについて解説

プログラミング

はじめに

 前回の記事では、プログラミングの基本である関数の呼び出し(Function Calling)について解説しました。今回は、それを踏まえて、OpenAIのChatGPTにおける関数呼び出しの組み込み方法について、初学者の方向けにわかりやすく解説します。

 ChatGPTは自然言語での対話を可能にする強力なAIモデルですが、開発者はこれを活用して自分のアプリケーションやサービスに高度な機能を組み込むことができます。その中でも関数呼び出しを活用することで、ユーザーの入力に基づいて特定の処理を実行したり、動的な応答を生成したりすることが可能です。

OpenAIのChatGPT APIと関数呼び出し

ChatGPT APIとは

 ChatGPT APIは、OpenAIが提供するAPIで、開発者はこれを利用して自分のアプリケーションにChatGPTの機能を組み込むことができます。APIを通じて、ユーザーからの入力を送り、ChatGPTからの応答を受け取ることができます。

Just a moment...

関数呼び出し(Function Calling)の機能

 2023年6月、OpenAIはChatGPT APIにおいて関数呼び出しの機能を導入しました。この機能により、ChatGPTはユーザーの要求に基づいてプログラム内の特定の関数を呼び出すことができます。

主なメリット:

  • ユーザーの自然言語による指示をコード内の関数呼び出しにマッピングできる。
  • データベースアクセス、API呼び出し、計算処理など、さまざまな機能を動的に実行できる。
  • 構造化データの取得や操作が容易になる。

関数呼び出しの仕組み

大まかな流れ

  1. 関数の定義:開発者が実装したい関数を定義し、その関数のシグネチャ(名前、引数、戻り値の型など)をAPIに登録します。
  2. ユーザーからのプロンプト:ユーザーが自然言語で指示を入力します。
  3. ChatGPTの応答:モデルはユーザーの指示を解析し、適切な関数の呼び出しを提案します。
  4. 関数の実行:提案された関数を実行し、結果を取得します。
  5. 最終的な応答:関数の結果を基に、ユーザーへの最終的な応答を生成します。

JSON Schemaによる関数の定義

 関数はJSON Schemaを用いて定義します。これにより、ChatGPTは関数の引数や戻り値の構造を理解し、正確な関数呼び出しを提案できます。

例:簡単な天気情報取得関数の定義

{
  "name": "get_current_weather",
  "description": "指定された都市の現在の天気を取得します",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "都市名、例:東京、ニューヨーク"
      },
      "unit": {
        "type": "string",
        "enum": ["摂氏", "華氏"],
        "description": "温度の単位"
      }
    },
    "required": ["location"]
  }
}

実装方法

ステップ1:APIキーの取得

 OpenAIのAPIを使用するためには、APIキーが必要です。OpenAIのアカウントを作成し、APIキーを取得してください。

ステップ2:環境の準備

Pythonの例で解説します。
※開発環境はGoogle Colabを利用しています。

!pip install openai==0.28

ステップ3:関数の定義と登録

import openai
import json

# セキュリティの観点から、本来は環境変数に保管し、コード上に記載しないようにしましょう
openai.api_key = 'YOUR_API_KEY'

# 関数の定義
def get_current_weather(location, unit="摂氏"):
    # ここで実際の天気情報を取得する処理を実装
    # ダミーのデータを返します
    return {
        "location": location,
        "temperature": "22",
        "unit": unit,
        "description": "晴れ"
    }

# 関数のメタデータを定義(JSON Schema)
functions = [
    {
        "name": "get_current_weather",
        "description": "指定された都市の現在の天気を取得します",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "都市名、例:東京、ニューヨーク"
                },
                "unit": {
                    "type": "string",
                    "enum": ["摂氏", "華氏"],
                    "description": "温度の単位"
                }
            },
            "required": ["location"]
        }
    }
]

ステップ4:ユーザーからの入力を処理

user_query = "東京の天気を教えてください。"

response = openai.ChatCompletion.create(
		# ここに利用しているgptのモデル名を設定
    model="gpt-4o-mini-2024-07-18",
    messages=[{"role": "user", "content": user_query}],
    functions=functions,
    function_call="auto"
)

ステップ5:関数呼び出しの処理

モデルの応答を解析し、関数を実行します。

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_current_weather":
        result = get_current_weather(location=arguments.get("location"), unit=arguments.get("unit"))

        # 関数の結果をモデルに渡して最終的なレスポンスを生成
        final_response = openai.ChatCompletion.create(
						# ここに利用しているgptのモデル名を設定
            model="gpt-4o-mini-2024-07-18",
            messages=[
                {"role": "user", "content": user_query},
                message,
                {"role": "function", "name": function_name, "content": json.dumps(result)}
            ]
        )

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

出力例

東京の現在の天気は晴れで、気温は22度です。

注意点

  • セキュリティ対策:ユーザーからの入力をそのまま関数に渡すと、セキュリティリスクになります。必ず入力の検証を行ってください。
  • エラーハンドリング:関数の実行中にエラーが発生した場合、適切に対処する必要があります。
  • APIの利用制限:OpenAI APIには利用制限があります。大量のリクエストを送る場合は、APIの使用量とコストに注意してください。

関数呼び出しの実践的な活用例

1. カレンダーアプリとの連携

 ユーザーが「明日の午後3時に会議を設定して」と入力すると、ChatGPTが適切な関数を呼び出してカレンダーにイベントを追加します。

2. データベースの問い合わせ

 「商品ID123の在庫を確認して」といった指示に対して、データベースから情報を取得し、ユーザーに返答します。

3. 外部APIの統合

 天気情報やニュース、為替レートなど、外部のAPIから情報を取得してユーザーに提供します。

まとめ

 OpenAIのChatGPTにおける関数呼び出しの機能を活用することで、ユーザーの自然な言語による指示をプログラムの具体的な操作に変換できます。これにより、よりインタラクティブで高度なアプリケーションを開発することが可能になります。

重要なポイント:

  • 関数のシグネチャをJSON Schemaで正確に定義すること。
  • ユーザー入力の検証とセキュリティ対策を怠らないこと。
  • 関数呼び出し後のモデルとの対話を適切に設計すること。ぜひ、この機能を活用して、革新的なアプリケーション開発に挑戦してみてください。

参考資料


注記:上記のコード例は理解を助けるためのものです。実際に使用する際は、最新のOpenAIのドキュメントを確認し、適切なエラーチェックやセキュリティ対策を実装してください。

コメント