GPTs + Actions + 簡易APIサーバーの基本(with GPT4先生)
~GPTs+ActionsのハマりどころをGPT4先生といっしょに回避する~
Actionsとは?
GPTsのActionsはネット経由でクラウドサーバー上のAPIにアクセスし、
そのGPTsがサーバーと情報をやりとりできる仕組みです。
GPTsは、Actionsを使わなくてもインターネットの情報にアクセスできますが、
基本的にBing等を経由してのweb上のテキストデータへのアクセスのみですので、
時間がかかり、途中で中断したりすることも多く、今後の改善が期待されます。
Actionsでは、気温や、天気、株価などの刻々と変わる情報を公開されているAPI
サーバーから取得できたり、独自のサーバーを使って情報のやりとりができます。
特にknowledge(知識源)に入りきれない膨大な情報にアクセスする必要がある場合、Actionsを使ってのクラウドサーバーとの情報のやりとりが必須になります。
簡易API
先ず、APIサーバーですが、仕組みを理解するための実験なので、どのサーバーを提供している会社でも使えるPHPで作ってみます。
以下のインストラクション(プロンプト)をGPT4(plu以上)に入力します。
クライアント側から番号が送られたら、その番号に一致するテキストをクライアントに返すPHPのAPIを書け、例として 001 > 桜, 002 > 梅 , 003 > 松 とする
すると、以下のようなコードが出力されます。
<?php
// エラーがある場合は表示する(開発時のみ推奨)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 番号とそれに対応するテキストのマッピング
$textMap = [
'001' => '桜',
'002' => '梅',
'003' => '松',
];
// クライアントからの番号を取得(ここではGETリクエストを想定)
$number = isset($_GET['number']) ? $_GET['number'] : '';
// 番号に基づいてテキストを決定し、クライアントに返す
if (array_key_exists($number, $textMap)) {
// 番号がマッピングに存在する場合、対応するテキストを返す
$response = [
'status' => 'success',
'text' => $textMap[$number],
];
} else {
// 番号がマッピングに存在しない場合、エラーメッセージを返す
$response = [
'status' => 'error',
'message' => 'Invalid number provided',
];
}
// コンテンツタイプをJSONに設定
header('Content-Type: application/json');
// レスポンスをJSON形式で出力
echo json_encode($response);
?>
これを、例えば、testAPI.phpとファイル名にして、サーバー上に置きます。
ActionsGPT
次に、以下のインストラクション(プロンプト)をActionsGPTというGPTsにに入力します。 ActionsGPT --> https://chat.openai.com/g/g-TYEliDU6A-actionsgpt
サーバー側のapiが以下のような場合、このAPIにデータを送るactionsのスキーマを書け --------> <?php
// エラーがある場合は表示する(開発時のみ推奨)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// 番号とそれに対応するテキストのマッピング
$textMap = [
'001' => '桜',
'002' => '梅',
'003' => '松',
];
// クライアントからの番号を取得(ここではGETリクエストを想定)
$number = isset($_GET['number']) ? $_GET['number'] : '';
// 番号に基づいてテキストを決定し、クライアントに返す
if (array_key_exists($number, $textMap)) {
// 番号がマッピングに存在する場合、対応するテキストを返す
$response = [
'status' => 'success',
'text' => $textMap[$number],
];
} else {
// 番号がマッピングに存在しない場合、エラーメッセージを返す
$response = [
'status' => 'error',
'message' => 'Invalid number provided',
];
}
// コンテンツタイプをJSONに設定
header('Content-Type: application/json');
// レスポンスをJSON形式で出力
echo json_encode($response);
?>
上のインストラクションの "-------->" 以下は、上の出力をコピペしたものです。
すると、以下の出力を得ます。
openapi: 3.0.0
info:
title: TextMap API
description: API to retrieve text based on provided number code.
version: 1.0.0
servers:
- url:http://your-server-url.com
description: Main API server
paths:
/getText:
get:
operationId: getTextByNumber
summary: Retrieve text based on number code.
parameters:
- name: number
in: query
description: Number code to get corresponding text
required: true
schema:
type: string
responses:
'200':
description: Successful response with text
content:
application/json:
schema:
type: object
properties:
status:
type: string
text:
type: string
nullable: true
message:
type: string
nullable: true
'400':
description: Bad request when the number is not provided or invalid
content:
application/json:
schema:
type: object
properties:
status:
type: string
message:
type: string
これを、GPTs builderのConfigure -> ActionsのSchemaの欄にコピペし、
仮にドメインがxxxx.comとし、testAPI.phpがwebのルートディレクトリに
あるとすると、
"http://your-server-url.com"の部分をhttps://xxxx.com/testAPI.php
と書き換えます。(testAPi.phpは上で決めた任意のファイル名)
ここで重要なのが、https です。httpではNGです。
GPTsのインストラクションは以下のようにします。
番号をサイトに送ると対応するテキストを得て表示する
これで、Actions->TESTボタンをを押し、右のウィンドウのインストラクション欄に
001を入力しリターンすると
001
[debug] Calling HTTP endpoint
[debug] Response received
Talked to dcf.jp
APIの呼び出しに成功しました。番号「001」に対応するテキストは「桜」です。
と表示され、無事動作していることがわかります。