Response APIのFile Search機能をPHPで実装:ファイルから情報を取得できるチャットボットの作り方
作成日:2025.03.18
更新日:2025.03.24
OpenAIのResponse APIに新しく追加されたFile Search機能を使って、ファイルから情報を取得できるチャットボットをPHPで実装する方法を解説します。Vector Storeの作成から、実際のコード例まで、ステップバイステップで説明していきます。
Open AI のResponse API で File Search の機能を使って、チャットボットがファイルから情報を取得して回答するようにしてみます。
前回までの Response API の記事:
- OpenAIの新APIを使ってみた:Response APIによるチャットボットをPHPで実装
- Response APIのWeb Search機能をPHPで実装:最新情報を取得できるチャットボットの作り方
File Search とは
1. 機能
File Searchツールは、大量の文書から関連情報を迅速に取得するために使用されます。複数のファイルタイプをサポートしています。
ツールは、特定のキーワードや質問に基づいてファイルを検索し、結果をAIモデルに提供します。
※サポートしているファイルタイプについては、公式ドキュメントを参照してください。
2. 料金体系
File Search のツール呼び出しにかかる費用と、ファイルを保存するストレージにかかる費用がそれぞれ別に設定されています。
詳しくは、公式ドキュメントを参照してください。
Vector Store にファイルを追加する
File Search の機能を使用するために、検索対象となるファイル群を Vector Store に追加する必要があります。
Vector Store って何?
公式のドキュメントによると、
Vector stores are the containers that power semantic search for the Retrieval API and the Assistants API file search tool. When you add a file to a vector store it will be automatically chunked, embedded, and indexed.※Open AI 公式ドキュメントより
AIに翻訳してもらうと、
Vector stores(ベクトルストア)は、Retrieval APIとAssistants APIのファイル検索ツールで使用される意味検索の基盤となるコンテナです。ファイルをベクトルストアに追加すると、自動的にチャンク分割、埋め込み、インデックス化が行われます。
ということらしいです。
Vector Store の作成
OpenAI developer platform にログインして、「Dashboard」⇒「Storage」⇒「Vector stores」と進み、「+ Create」をクリックします。

Vector Store の名前を入力して、保存します。

作成された Vector Store の「ID」をコピーしておきます(後ほど API で File Search を利用する際に必要になります)。
Vector Store にファイルを追加する
続いて、Vector Store にファイルを追加します。「+ Add files」をクリック。

以下のようなファイルアップロードダイアログが出るので、ファイルをドラッグして「Attach」ボタンをクリックします。

※サポートしているファイルタイプについては、公式ドキュメントを参照してください。
これで、Vector Store にファイルが追加されました。
今回はテスト用に、ChatGPTに適当に生成してもらった、架空のファンタジー世界の地名と設定を記述した jsonファイルを追加してみました。確実にモデルがもともとは知らないことなので、ちゃんと回答できるかの確認にちょうど良いかなと思います。
File Search の実装
File Search の実装は、前々回の記事で作成したチャットボットのコードをベースに行います。
前々回の記事で作成した chat.php の createResponse
関数を以下のように変更します。
// Response API 実行
function createResponse($message) {
// リクエストデータの作成
$data = array(
'input' => $message,
'model' => 'gpt-4o-mini',
'temperature' => 0.8,
'instructions' => 'あなたは架空のファンタジー世界を案内するAIアシスタントです。ユーザーの質問に対して、ファイル検索を行い、架空のファンタジー世界の情報を提供します。',
'tool_choice' => 'required',
);
// previous_response_id がセッションに存在する場合、リクエストデータに追加
if(isset($_SESSION['previous_response_id'])) {
$data['previous_response_id'] = $_SESSION['previous_response_id'];
}
// リクエストデータに File Search のツールを追加
$functions = array();
$functions[] = array(
'type' => 'file_search',
'vector_store_ids' => array(
'vs_0123456789',
),
);
$data['tools'] = $functions;
// リクエストデータを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;
}
変更点は、主にリクエストデータの作成時の処理です。
- instructions
- カスタムインストラクションの内容を、「あなたは架空のファンタジー世界を案内するAIアシスタントです。ユーザーの質問に対して、ファイル検索を行い、架空のファンタジー世界の情報を提供します。」と変更しました。
- tool_choice
- tool_choice を 'required' と指定しました。
これにより、ツールの使用が必須となり、必ずFile Search の機能を使用して回答するようになります。 - tools
- tools に File Search を指定しました。
File Search は、以下のパラメータで指定します。- type
- ツールの種類を指定します。
File Search の場合は、'file_search' と指定します。 - vector_store_ids
- ファイルを検索するVector Store の ID を配列として指定します。
今回は、Vector Store の ID を 1 つだけ指定していますが、複数指定することも可能です。
これで、チャットボットがFile Search の機能を使用して回答するようになります。
動作確認
動作確認のため、チャットボットに以下のような質問をしてみます。
どんな港町がありますか?
すると、チャットボットがFile Search の機能を使用して以下のように回答しました。
以下は、架空のファンタジー世界に存在する港町のいくつかです。
1. **海都エルドラダ**
- **特徴**: イスカリオン島の北端に位置し、商業が活発な港がある。騎士や貴族の居住地も多く、様々な文化が融合しています。
2. **モークリーフポート**
- **特徴**: モークレイン湾に面した賑やかな交易都市。多くの商人や冒険者が集まり、活気に満ちた市場があります。
3. **海霧の街ライムハーバー**
- **特徴**: 湾の河口に形成された街で、漁業や海運業が盛ん。海霧に包まれた神秘的な雰囲気があります。
4. **ヒドラ港都**
- **特徴**: ヒドラ湖の北岸に位置し、交易や漁業で賑わっている文化的に発展した街。
5. **レイクサークル**
- **特徴**: 湖畔の港が村の中心となっており、交易と航海が盛ん。古い伝統を重んじる住民が住んでいます。
これらの港町はそれぞれ独自の文化や特徴を持っており、訪れる者に新しい冒険を提供してくれます。
ちゃんと Vector Store に追加した JSONファイルから情報を取得して回答してくれていました。
特定のコンテキストを前提とした回答を得たい場合に、非常に便利な機能だと思います。
まとめ
- File Search の機能を使用することで、チャットボットがファイルから情報を取得して回答するようになります。
- File Search の機能で参照するファイルは、Vector Store に追加する必要があります。
- 特定のコンテキストを前提とした回答を得たい場合に、非常に便利な機能だと思います。
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のWeb Search機能をPHPで実装:最新情報を取得できるチャットボットの作り方
2025.03.17
Response APIの新機能"Web Search"を使って、インターネット上の最新情報を取得できるチャットボットを作ります。PHPによる実装方法や、APIレスポンスの処理方法など、実用的な内容をコード例とともに解説していきます
OpenAIの新APIを使ってみた:Response APIによるチャットボットをPHPで実装
2025.03.16
OpenAIが新たに発表したResponse APIを使用して、PHPでシンプルなチャットボットを実装してみました。Chat Completions APIとの違いや、実装時のポイントを、実際のコード例と共に解説します。特に会話履歴の管理方法の違いに注目して、両APIの特徴を比較しています。
GPTのfunction callingを活用した関数呼び出し入門
2023.11.23
OpenAI APIのfunction calling機能を使えば、GPTに特定の関数を呼び出させることで、複雑なタスクの自動化が可能になります。本記事では、PHPを用いた基本的な関数指定の方法やレスポンス処理のフローを詳しく解説。日記投稿を例に、APIの設定から応答データの再利用まで実践的なスクリプトを紹介します。