OpenAIの新APIを使ってみた:Response APIによるチャットボットをPHPで実装
作成日:2025.03.16
更新日:2025.03.24
OpenAIが新たに発表したResponse APIを使用して、PHPでシンプルなチャットボットを実装してみました。Chat Completions APIとの違いや、実装時のポイントを、実際のコード例と共に解説します。特に会話履歴の管理方法の違いに注目して、両APIの特徴を比較しています。
先日発表された、OpenAI の新しい API である Response API を使って、PHPでシンプルなチャットボットを作ってみます。
Responses APIとChat Completions APIの違い
1. 機能と目的
- Response API
- 最新のAPIで、マルチターン対話や外部ツールの統合(Web検索、ファイル検索、コンピュータ操作)が可能です。これにより、より高度なAIエージェントの開発が容易になります。
- Chat Completions API
- 主にチャット形式の会話をシミュレートするために使用され、複数のメッセージを含むリクエストを構成できます。組み込みツールが不要な場合に適しています。
2. ツールの統合
- Response API
- Web検索やファイル検索、コンピュータ操作などが組み込みツールとして提供されています。これにより、最新情報をリアルタイムで取得したり、業務効率を向上させることができます
- Chat Completions API
- 組み込みツールは提供されていません。
※function callingによる自作の関数は Response API でも Chat Completion APIでも使用できます。
3. 会話管理
- Response API
- 会話の状態をOpenAIのサーバー側で管理し、
previous_response_id
を使用して会話のコンテキストを維持できます - Chat Completions API
- 会話履歴はアプリケーション側で管理する必要があります。
4. 料金体系
- Response API
- トークン消費量とツール使用量に基づく従量課金です。
- Chat Completions API
- トークン消費量に基づく従量課金です。
今回は、組み込みツールは使用せずに、シンプルなチャットボットを作って、Chat Completions API を使用した場合との差異を確認してみたいと思います。
データベースのテーブル作成
チャットボットの会話履歴を保存するためのテーブルを作成します。
CREATE TABLE IF NOT EXISTS `chat_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role` varchar(10) NOT NULL,
`message` text NOT NULL,
`raw_data` text NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
- id
- 会話履歴のID(主キー)
- role
- メッセージの送信者(user or assistant)
- message
- メッセージの内容
- raw_data
- APIのレスポンスの生データ
- created_at
- メッセージの送信日時
会話履歴出力用のPHPスクリプト
会話履歴を出力するためのPHPスクリプト view.php を作成します。
<?php
// データベース接続情報
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password';
$db_name = 'chat_history';
// データベース接続
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
die('データベース接続に失敗しました: ' . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
// 会話履歴取得
$sql = "SELECT * FROM chat_history ORDER BY created_at ASC";
$result = $conn->query($sql);
?>
<html>
<head>
<title>会話履歴</title>
</head>
<body>
<?php
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "<p>{$row['role']}: ". htmlspecialchars($row['message']). "</p>";
}
} else {
echo "会話履歴がありません。";
}
?>
<form action="chat.php" method="post">
<textarea name="message" placeholder="メッセージを入力してください"></textarea>
<button type="submit">送信</button>
</form>
</body>
</html>
会話履歴をデータベースから取得して一覧表示し、その下にメッセージを送信するためのフォームを表示するだけのシンプルなページです。
チャットボットのPHPスクリプト
チャットボットのPHPスクリプト chat.php を作成します。
<?php
session_start();
// データベース接続情報
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'password';
$db_name = 'chat_history';
// OpenAI APIキー
define('OPENAI_API_KEY', 'sk-proj-1234567890');
// メッセージ未入力の場合、view.php にリダイレクト
if (empty($_POST['message'])) {
header('Location: view.php');
exit;
}
// データベース接続
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
die('データベース接続に失敗しました: ' . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
// メッセージをデータベースに保存
$message = $_POST['message'];
$stmt = $conn->prepare("INSERT INTO chat_history (role, message) VALUES ('user', ?)");
$stmt->bind_param("s", $message);
if (!$stmt->execute()) {
die('クエリの実行に失敗しました: ' . $stmt->error);
}
$stmt->close();
// Response API のリクエスト
$response = createResponse($message);
// レスポンスをデータベースに保存
if(isset($response->output)){
foreach($response->output as $output){
if(isset($output->type) && $output->type == 'message'){
$content = $output->content[0]->text;
$stmt = $conn->prepare("INSERT INTO chat_history (role, message, raw_data) VALUES ('assistant', ?, ?)");
$stmt->bind_param("ss", $content, json_encode($response ));
if (!$stmt->execute()) {
die('クエリの実行に失敗しました: ' . $stmt->error);
}
$stmt->close();
break;
}
}
}else{
die('APIレスポンスの形式が不正です');
}
// セッションに previous_response_id を保存
if (isset($response->id)) {
$_SESSION['previous_response_id'] = $response->id;
}
// データベース接続を閉じる
$conn->close();
// view.php にリダイレクト
header('Location: view.php');
exit;
// Response API 実行
function createResponse($message) {
// リクエストデータの作成
$data = array(
'input' => $message,
'model' => 'gpt-4o-mini',
'temperature' => 0.8,
'instructions' => 'あなたはシンプルなチャットボットです。ユーザーに楽しい会話を提供します。',
);
// previous_response_id がセッションに存在する場合、リクエストデータに追加
if(isset($_SESSION['previous_response_id'])) {
$data['previous_response_id'] = $_SESSION['previous_response_id'];
}
// リクエストデータをJSON形式に変換
$json_data = json_encode($data);
// curl でリクエスト送信
$url = 'https://api.openai.com/v1/responses';
$headers = array(
'Content-Type: application/json',
"Authorization: Bearer ".OPENAI_API_KEY
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 300);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
$api_response = curl_exec($ch);
if($api_response === false){
echo 'Curl error: ' . curl_error($ch);
exit;
}
curl_close($ch);
$apiresult = json_decode($api_response);
if (json_last_error() !== JSON_ERROR_NONE) {
die('APIレスポンスの解析に失敗しました: ' . json_last_error_msg());
}
return $apiresult;
}
?>
処理を大まかに説明すると、
- ユーザーのメッセージをデータベースに保存
- Response API を使用してレスポンスを取得
- レスポンスをデータベースに保存
- view.php にリダイレクト
という単純な流れです。
Chat Completion API を使用した場合との大きな違いは、
- Response API は、
previous_response_id
を送信するだけで、会話履歴をAIが参照してくれるので、コンテキストの保持が容易 - Chat Completions API は、APIリクエストの
messages
内に毎回会話履歴を含める必要がある
という点です。
なお、最初から会話履歴を含めてリクエストすることで、特定のコンテキストを持ったレスポンスを得るようなテクニックは、Response API でも可能です。Response API では、input
に配列形式で会話履歴を含めることができます。
※参考: Response API のドキュメント
また、Response API では、instructions
にカスタムインストラクションを指定できる点も、Chat Completions API との大きな違いです。とはいえ、role
に system
を指定してカスタムインストラクションのような指示を送れば、Chat Completions API でも同じようなことができます。
チャットボットの実行
ブラウザで view.php を開き、メッセージを入力して送信してみてください。
会話履歴がデータベースに保存され、view.php に表示されるはずです。
セッションに previous_response_id
が保存されているため、会話履歴が維持されます。
まとめ
Response API は、会話履歴を管理するための previous_response_id
を使用するだけで、会話履歴をAIが参照してくれるので、コンテキストの保持が容易です。
複合的な処理を行なうAIアシスタントの実装が主目的と思われる Response API ですが、シンプルなチャットボットレベルのツールでも、今後は Chat Completions API よりも Response API を使用した方が楽に開発できる気がします。
組み込みツールである、web_search や file_search を利用した実装例も、後日紹介したいと思います。
Web Search 機能を実装する
2025.03.17追記
Web Search 機能を実装する方法については、Response APIのWeb Search機能をPHPで実装:最新情報を取得できるチャットボットの作り方を参照。
File Search 機能を実装する
2025.03.18追記
File Search 機能を実装する方法については、Response APIのFile Search機能をPHPで実装:ファイルから情報を取得できるチャットボットの作り方を参照
Function calling を実装する
2025.03.24追記
Function callingを実装する方法については、PHPで実装する Response API と Function Calling を活用したチャットボットの開発ガイドを参照

奈良市を拠点に、25年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
PHPで実装する Response API と Function Calling を活用したチャットボットの開発ガイド
2025.03.24
PHPでOpenAIのResponse APIとFunction Calling機能を活用し、チャットボットにタスク管理機能を実装する方法を解説します。モデルとの再帰的な対話処理や、独自関数によるタスク登録・照会など、具体的なコード例を通して段階的に解説します。
Response APIのFile Search機能をPHPで実装:ファイルから情報を取得できるチャットボットの作り方
2025.03.18
OpenAIのResponse APIに新しく追加されたFile Search機能を使って、ファイルから情報を取得できるチャットボットをPHPで実装する方法を解説します。Vector Storeの作成から、実際のコード例まで、ステップバイステップで説明していきます。
Response APIのWeb Search機能をPHPで実装:最新情報を取得できるチャットボットの作り方
2025.03.17
Response APIの新機能"Web Search"を使って、インターネット上の最新情報を取得できるチャットボットを作ります。PHPによる実装方法や、APIレスポンスの処理方法など、実用的な内容をコード例とともに解説していきます
GPTのfunction callingを活用した関数呼び出し入門
2023.11.23
OpenAI APIのfunction calling機能を使えば、GPTに特定の関数を呼び出させることで、複雑なタスクの自動化が可能になります。本記事では、PHPを用いた基本的な関数指定の方法やレスポンス処理のフローを詳しく解説。日記投稿を例に、APIの設定から応答データの再利用まで実践的なスクリプトを紹介します。