-
タグ
タグ
- セキュリティ
- 人材開発・教育
- システム開発
- アプリ開発
- モバイルアプリ
- DX
- AI
- サイバー攻撃
- サイバー犯罪
- 標的型攻撃
- 脆弱性
- 働き方改革
- 企業市民活動
- 攻撃者グループ
- JSOC
- JSOC INSIGHT
- サイバー救急センター
- サイバー救急センターレポート
- LAC Security Insight
- セキュリティ診断レポート
- サイバー・グリッド・ジャパン
- CYBER GRID JOURNAL
- CYBER GRID VIEW
- ラックセキュリティアカデミー
- すごうで
- ランサムウェア
- ゼロトラスト
- ASM
- EDR
- SASE
- デジタルアイデンティティ
- インシデントレスポンス
- 情シス向け
- 対談
- CIS Controls
- Tech Crawling
- クラウド
- クラウドインテグレーション
- データベース
- アジャイル開発
- DevSecOps
- OWASP
- CTF
- FalconNest
- セキュリティ診断
- IoT
- EC
- サプライチェーンリスク
- スレットインテリジェンス
- テレワーク
- リモートデスクトップ
- アーキテクト
- プラス・セキュリティ人材
- 障がい者採用
- 官民学・業界連携
- カスタマーストーリー
- 白浜シンポジウム
- CODE BLUE
- 情報モラル
- クラブ活動
- 初心者向け
- 趣味
- カルチャー
- 子育て、生活
- 広報・マーケティング
- コーポレート
- ライター紹介
- IR
プロダクト開発を手掛けている、ソフトウエアエンジニアリンググループの加藤です。
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を呼び出すことで、プロンプトから地名を取得します。取得した地名を引数として天気を返す関数を実行することで、プロンプトに含まれる地名の天気に回答します。
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を活用していきましょう。
タグ
- セキュリティ
- 人材開発・教育
- システム開発
- アプリ開発
- モバイルアプリ
- DX
- AI
- サイバー攻撃
- サイバー犯罪
- 標的型攻撃
- 脆弱性
- 働き方改革
- 企業市民活動
- 攻撃者グループ
- JSOC
- もっと見る +
- JSOC INSIGHT
- サイバー救急センター
- サイバー救急センターレポート
- LAC Security Insight
- セキュリティ診断レポート
- サイバー・グリッド・ジャパン
- CYBER GRID JOURNAL
- CYBER GRID VIEW
- ラックセキュリティアカデミー
- すごうで
- ランサムウェア
- ゼロトラスト
- ASM
- EDR
- SASE
- デジタルアイデンティティ
- インシデントレスポンス
- 情シス向け
- 対談
- CIS Controls
- Tech Crawling
- クラウド
- クラウドインテグレーション
- データベース
- アジャイル開発
- DevSecOps
- OWASP
- CTF
- FalconNest
- セキュリティ診断
- IoT
- EC
- サプライチェーンリスク
- スレットインテリジェンス
- テレワーク
- リモートデスクトップ
- アーキテクト
- プラス・セキュリティ人材
- 障がい者採用
- 官民学・業界連携
- カスタマーストーリー
- 白浜シンポジウム
- CODE BLUE
- 情報モラル
- クラブ活動
- 初心者向け
- 趣味
- カルチャー
- 子育て、生活
- 広報・マーケティング
- コーポレート
- ライター紹介
- IR