LAC WATCH

セキュリティとITの最新情報

RSS

株式会社ラック

メールマガジン

サイバーセキュリティや
ラックに関する情報をお届けします。

テクニカルレポート | 

ChatGPT APIの新機能Function callingを使って、天気を聞いてみた

プロダクト開発を手掛けている、ソフトウエアエンジニアリンググループの加藤です。

6月13日にChatGPT(OpenAI) APIがアップデートされました。今回の記事では、アップデートで公開された気になる新機能「Function calling」を試してみたので、サンプルプログラムと実行結果、Function callingを使う際のセキュリティ上の注意についてお伝えします。

Function calling and other API updates

Function callingとは

Function callingは、プロンプト(ユーザーからの入力)に応じた関数を簡単に呼び出せるようになる新機能です。関数の定義を含めてAPIを呼び出すことで、その関数の実行に必要な引数などの情報を返してくれます。Function callingを使うことでプロンプトから関数の実行に必要な情報を抜き出すことができ、抜き出した情報を使って処理を行えます。

例えば、「東京の天気は?」と入力したら、「晴れです」と回答してくれます。ChatGPT APIだけでは天気に答えることはできませんが、地名を引数として天気を返す関数を作成し、その関数定義を含めてAPIを呼び出すことで、プロンプトから地名を取得します。取得した地名を引数として天気を返す関数を実行することで、プロンプトに含まれる地名の天気に回答します。

ChatGPTを利用するイメージ

Function callingを試す

OpenAI社からはPythonとNode.js用にAPIを利用するライブラリが提供されています。ここではNode.js用のライブラリを使いFunction callingを利用して天気を答えるサンプルプログラムを作成します。

ライブラリの準備

Node.jsでAPIを利用するライブラリを使うために、後述の内容のpackage.jsonファイルを用意しnpm installコマンドを実行してライブラリをインストールします。

package.jsonファイルの内容

{
  "dependencies": {
    "openai": "3.3.0"
  }
}

サンプルプログラム

コマンドラインの引数でプロンプトを渡してAPIを実行するサンプルプログラムは後述のfunction-calling.jsファイルの通りです。このサンプルプログラムでは、Function callingを利用して天気を聞かれた場合はプロンプトから地名を取得し、作成した天気を返す関数を使って天気を答えます。

function-calling.jsファイルの内容

// openai ライブラリを読み込む
const { OpenAIApi, Configuration } = require("openai");
 
// 環境変数 OPENAI_API_KEY から API キーを読み込んで設定する
const config = new Configuration({ apiKey: process.env.OPENAI_API_KEY });
 
// openai ライブラリを使えるよう設定する
const openai = new OpenAIApi(config);
 
// Function calling 対象の関数を JSON Schema 形式で定義する
const functions = [
  {
    name: "get_current_weather",
    description: "指定された地名の天気を取得する",
    parameters: {
      type: "object",
      properties: {
        location: {
          type: "string",
          description: "天気を取得する地名",
        },
      },
      required: [ "location" ],
    },
  },
];
 
// Function calling 対象の関数の本体を定義する
const functions_body = {
  // 指定された地名の天気を取得する関数、ここでは東京の場合は「晴れ」それ以外の場合は「くもり」を返す
  get_current_weather: function (args) {
    const location = JSON.parse(args).location;
    const weather  = (location === "東京") ? "晴れ" : "くもり";
    return JSON.stringify({ location, weather });
  },
};
 
// API を呼び出す関数を定義する
async function requestAPI(messages) {
  const response = await openai.createChatCompletion({
    model: "gpt-3.5-turbo", messages, functions,
  });
 
  const message = response.data.choices[0].message;
  messages.push(message);
 
  // Function calling の場合は、関数の実行結果を追加して再度 API を呼び出す
  if (message.function_call) {
    const name    = message.function_call.name;
    const content = functions_body[name](message.function_call.arguments);
    messages.push({ role: "function", name, content });
    await requestAPI(messages);
  }
}
 
// メイン関数を定義する
async function main() {
  // コマンドラインの引数からプロンプトを取得する
  const prompt = process.argv[2];
 
  // API を呼び出す
  const messages = [{ role: "user", content: prompt }];
  await requestAPI(messages);
 
  // メッセージを表示する
  console.log(messages[messages.length - 1].content);
}
 
// メイン関数を実行する
main();

実行結果

東京の天気を聞いた場合

後述のようにプロンプトに「東京の天気を教えてください。」と指定してサンプルプログラムを実行した場合、Function callingにより地名として「東京」が抜き出され、それを引数として天気を取得する関数を実行するので、結果として「東京は晴れ」のような答えが表示されます。

$ node function-calling.js '東京の天気を教えてください。'
東京の天気は晴れです。

東京以外の天気を聞いた場合

同様にプロンプトに「大阪の天気を教えてください。」と指定して実行した場合、地名として「大阪」が抜き出され、結果として「大阪はくもり」のような答えが表示されます。

$ node function-calling.js '大阪の天気を教えてください。'
大阪の天気はくもりです。

天気以外のことを聞いた場合

プロンプトに「株式会社ラックについて教えてください。」と指定して実行した場合、プロンプトとFunction calling対象の関数定義の内容からFunction callingの対象ではないと判定され、普通にAPIを呼び出した際と同じ結果になります。

$ node function-calling.js '株式会社ラックについて教えてください。'
株式会社ラックは、日本のIT企業です。(後略)

Function callingを使う際の注意

Function callingを使うことでプロンプトから関数の実行に必要な情報を取得できますが、取得した情報は基本的にプロンプトの一部であり、システム外部からの入力になるので、既知の脆弱性を作りこまないよう対応が必要です。

例えば、サンプルプログラムの場合は後述のようにプロンプトに「<script>の天気を教えてください。」と指定して実行すると、Function callingにより地名として「<script>」が抜き出されます。この値をWEBアプリケーションやDB処理で使う場合、HTMLエンコーディングやプリペアドステートメントを使うなどの対応が必要になります。

$ node function-calling.js '<script>の天気を教えてください。'
<script>の天気はくもりです。

おわりに

Function callingは、指定した関数の定義に応じてプロンプトから関数の実行に必要な情報を取得する機能です。この機能を使うことでChatGPTを組み込んだシステムでできることが広がります。

例えば、サンプルプログラムのように天気を答えるだけでなく、日時と人名を取得して会議をセッティングする処理を行うなども考えられます。しかし、Function callingで取得した情報はシステム外部からの入力になるので既知の脆弱性を作りこまないよう注意が必要です。セキュリティを考慮しつつ生成AIを活用していきましょう。

この記事は役に立ちましたか?

はい いいえ