今回は、VS Code内のOpenAI Codexと一緒に、資料検索つきAI(RAG)に“根拠がなければ答えない”ルールを加えます。
準備から、安全なAPIキー管理、実装、テストでの確認まで、迷わず進められるよう画面操作つきで案内します。
この回のゴール
- できること:資料に根拠が十分でないときはノーアンサーを返し、根拠があるときは出典を添えて答える小さなWebアプリを完成させる。
- 用意するもの:VS Code、OpenAI Codex、OpenAIアカウント(API利用)、練習用のサンプル資料、評価用の質問セット。
- 大切な約束:APIキーは環境変数で管理し、コード・画面・Codexへの依頼に実値を書かない。料金や仕様はOpenAI公式で必ず最新を確認する。
最初に知っておきたい用語
- RAG:質問に関連する資料を先に探し、その内容を見ながら答える仕組み。図書館で係の人が本の該当ページを開いて教えてくれるイメージ。
- File Search:OpenAIが提供する資料検索の道具。登録したファイルを「意味」で探せる保管場所(ベクトルストア)を使う。
- ベクトルストア:文章の意味を数の並びにして保存し、似ている内容を見つけやすくした倉庫のようなもの。
- ノーアンサー設計:根拠が弱いときは無理に答えず「分からない」と返すルール。もっともらしい誤回答(ハルシネーション)を減らすための守り。
- 閾値(いきち):検索の確からしさを数で区切る線。これより低ければ答えない、と決める基準。
- トップk:検索で上位何件の候補を使うかという数。少なすぎると見落とし、多すぎるとノイズが増える。
- Responses API:OpenAIの回答生成API。File Searchの結果を参照しながら回答を作れる。
- 評価テスト:想定質問をまとめて流し、狙い通りに動くかを確かめること。
1. この記事でできること
今回の目標は、RAGの「資料にない質問へ答えない」ふるまいを最小構成で入れることです。
買い物で「レシートにない商品は返品できない」のと同じで、根拠が記録にないときは処理を止めます。
このルールにより、もっともらしいけれど裏付けのない回答を減らします。
- 資料にない質問へ“答えない”安全設計を実装。
- VS CodeでCodexに依頼し、指示文からコード自動生成。
- ノーアンサー検出の評価用質問セットを作り、再実行で確認。
2. 完成イメージ

- チャットUIに質問を入れると、資料に根拠がなければ「登録した資料の中では確認できません」と返す。
- 根拠が見つかったときは、回答の下に出典ファイル名と根拠スニペットが付く。
- テスト用の質問リストを一括で流し、合否を一覧で表示。
3. 最初に知っておきたいこと
RAG(Retrieval-Augmented Generation)は「地図+メガネ」。地図=登録資料、メガネ=関係部分を拡大して読む道具です。
この記事では「地図に載っていない場所は案内しない」=ノーアンサー設計を入れます。
誤回答(ハルシネーション)は0にはなりませんが、根拠が薄いときに止めることで大きく減らせます。
モデル名、対応ファイル、上限、料金などは変わることがあるため、作業前にOpenAIの公式ドキュメントとPlatformの画面で最新を確認してください。
4. 対象読者

- シリーズ#4までの基本RAG検索アプリを動かせた人。
- 業務資料での「もっともらしい誤回答」に困っている人。
- 評価テストを簡単に回したい人。
前回の記事をまだ読んでいない場合は、短い準備の流れを先に確認してください。
中学生にも分かる 自分の資料に答えるAI検索アプリの作り方 #4
5. 必要なものと入れ方
ここでは、道具を「これは何?→用意→入れ方→最初の設定→できたか確認」の順に説明します。
道具は料理のレシピ本とキッチンの関係に似ています。VS Codeはキッチン、Codexは助っ人シェフ、OpenAI APIは食材の宅配サービスです。
VS Code
- これは何?:プログラムや設定を編集し、動かすための作業机のアプリです。
- 用意するもの:インターネットにつながるPC、ブラウザ(Edge/Chrome/Safariなど)。
- 入れ方・開き方:公式サイトからOSに合うインストーラを取得し、案内に従って入れ、アプリを開きます。公式の入手先はVS CodeのWebサイトをご確認ください。
- 最初の設定:初回起動時に日本語表示が必要なら拡張機能で言語パックを追加します。
- できたか確認:「Visual Studio Code」のウィンドウが開き、左側に「拡張機能」アイコン(四角が4つ)が見えたら成功です。
OpenAI Codex(VS Code拡張)
- これは何?:VS Codeの中で指示文を渡すと、コードを書いてくれるコーディングの相棒です。
- 用意するもの:OpenAIアカウント(ChatGPTアカウントまたはOpenAI APIキーでサインイン)。
- 入れ方・開き方:左の「拡張機能」を開き、検索ボックスに「Codex」と入れて検索。OpenAIのCodex拡張を選び、「インストール」を押します。完了後、VS Codeの再読み込みが求められたら従います。
- 最初の設定:「サインイン」ボタンを押し、画面の案内に沿ってサインイン。サインイン後、コマンドパレット(上の検索欄)から「Codex: Open Chat」を実行し、エディタ右側にチャット欄を開きます。
- できたか確認:「Codex Chat」ペインが現れ、メッセージ入力欄が表示されていれば成功です。
OpenAI Platform(API)
- これは何?:アプリからAIに質問したり、File Searchで資料を探したりするための公式サービスです。
- 用意するもの:OpenAIアカウント、支払い方法の設定(必要に応じて)。料金は利用量により発生する可能性があります。最新の金額はOpenAIの料金ページとPlatformのダッシュボードで確認してください。
- 入れ方・開き方:ブラウザでOpenAIのPlatformにサインインし、APIを利用できる状態にします。
- 最初の設定:ダッシュボードでAPIキーの発行やアクセス権限を確認します。画面の操作方法は公式ドキュメントを参考にしてください。
- できたか確認:ダッシュボードでAPIキーが管理でき、利用状況の画面が見られたら準備完了です。
Node.js(実行環境)
- これは何?:JavaScriptでサーバーを動かすための土台です。コンロのような存在です。
- 用意するもの:PCの管理者権限。
- 入れ方・開き方:公式サイトからLTS版をダウンロードしてインストール。案内に従って完了します。
- 最初の設定:特に難しい設定は不要です。
- できたか確認:VS Codeの下部ステータスバーや、プロジェクトの初期化時にNode.jsバージョンが表示されればOKです。
練習用のサンプル資料と評価用質問セット
- これは何?:アプリに登録して検索させる資料と、動作確認のための質問リストです。スポーツの練習で使う標的のような役割です。
- 用意するもの:個人情報や会社の秘密、有料コンテンツは使いません。Codexに依頼して、架空のサンプル資料を作ってもらいます。
- 入れ方・開き方:Codexが用意したサンプルファイルをプロジェクト内に保存します。
- 最初の設定:ファイル形式はPDF/TXT/Markdown/DOCXなど最小限を許可します。
- できたか確認:アプリ画面の「登録状態」で、サンプル資料が登録済みと表示されればOKです。
6. エージェントと作るものの全体像

完成形は「最小プロダクト」。
流れは、質問→File Searchで検索→スコア判定(閾値)→回答またはノーアンサー→ログ保存です。
家の玄関で「宅配便か訪問販売か」を表札で判定するように、一定の条件を満たすときだけ中へ通します。
- バックエンド:Responses APIで回答生成し、File Searchの検索結果とスコアを参照。
- フロント:質問入力、回答表示、根拠スニペットと出典ファイル名の表示。
- ノーアンサー:検索スコアが閾値未満、または出典が揃わない場合に固定文面を返す。
- テスト:質問CSV/JSONを流し、合否と理由(閾値未満、出典なし等)を表示。
7. 手順1: ツールを準備する
目的と動き
VS CodeでCodexを使える状態にし、プロジェクトを開けるようにします。
ここが土台です。運動前のストレッチのように、後の作業をスムーズにします。
画面で行うこと
- VS Codeを起動し、左の「拡張機能」を開く。
- 検索欄に「Codex」と入力し、OpenAIのCodex拡張を選んで「インストール」。
- インストール後、「サインイン」ボタンからサインイン。
- コマンドパレットで「Codex: Open Chat」を実行し、チャット欄を開く。
終えたら確認
右側にCodexチャットが開き、メッセージ入力欄があればOKです。
見当たらないときは、拡張機能の一覧でインストール状態を再確認します。
8. 手順2: APIキーを安全に用意する

目的と理由
APIキーはアプリの合鍵です。見える場所に置くと、家の鍵を玄関に貼るのと同じ危険があります。
環境変数や.envでサーバー側だけが読むようにします。.gitignoreでリポジトリに載せません。
画面で行うこと
- OpenAI Platformにサインインし、APIキーを発行・確認する。
- VS CodeのCodexに、.envの作成と読み込み、.gitignore設定を依頼します(後述のプロンプトを使用)。
- プロジェクトごとにキーを分け、必要に応じて使用上限や権限を調整します。
終えたら確認
アプリの設定画面やログに、APIキーの実値が一切表示されていないことを確認します。
SDKやCLIの動作確認はCodexに自動チェックを依頼します。
9. 手順3: エージェントにアプリを作ってもらう
目的と完成物
Codexに、日本語の依頼文だけで以下を作ってもらいます。
バックエンド(Responses API+File Search)、フロント(チャットUI)、ノーアンサー判定、出典表示、ログ保存、評価用テストスクリプトです。
このボックスをコピーして、VS Code内のCodexチャットに送ります。
Codexに送るプロンプト
目的:RAGのノーアンサー設計を最小実装した小さなWebアプリを作る。前回(#4)までの機能(資料登録・検索・参照表示)を壊さないこと。
要件:
- サーバーはNode.js/Express。OpenAI Responses APIを使用し、File Searchツールで登録資料を検索する。Assistants APIは使わず、Responses API+File Searchの組み合わせで実装。
- 秘密情報(OPENAI_API_KEYなど)はサーバー側の環境変数から読み、ブラウザへ送らない。APIキーの実値をコード、HTML、ログ、依頼文に書かない。
- 安全なAPIキー管理:.envを用意し、.gitignoreに.envを追加。サンプルとして.env.exampleを作る(ダミー値)。
- 取り扱うファイル形式はPDF/TXT/Markdown/DOCXなど必要最小限。ファイル名だけで安全と判断しない。サイズ上限と拡張子チェックをサーバーで実装。
- File Search:ベクトルストアを利用し、検索スコア(または類似度スコア)を取得。トップkとスコア閾値を設定可能にする(例:TOP_K、SCORE_THRESHOLD を環境変数で)。
- ノーアンサー判定:
1) 上位ドキュメントのスコアが閾値未満、または根拠の一致が確認できない場合は、一般知識で補わず固定文面「登録した資料の中では確認できません」を返す。
2) 回答時は、引用できた根拠スニペットと出典ファイル名(APIが返す引用情報の範囲で)を回答下に配列で返す。
- フロント:シンプルなチャットUI。質問欄、回答欄、参照元一覧(ファイル名+スニペット)。
- ログ:各リクエストごとに、質問、検索クエリ、スコア、採否(回答/ノーアンサー)、参照元ファイル名、時刻をJSON Linesでlogs/以下に保存。
- 評価:tests/ に評価用の質問セット(CSVまたはJSON)を用意。nodeスクリプトから一括実行し、各質問の合否(期待:answer/none)、理由(閾値未満/出典なし/OK)を表で標準出力する。
- 動作確認:
a) ローカル起動方法をREADMEに記載(コマンドは自動で生成・実行ボタンも用意)。
b) ブラウザで動作確認できるURLと、初回テスト手順をREADMEに記載。
- 質問方針:不明点(Responses APIとFile Searchの具体的な呼び出し、引用情報の取り出し方、スコアの向きなど)があれば、作業前に質問してから実装して。
- サンプル資料:実在の秘密情報は使わず、あなたが架空の安全な資料を数点作成し、登録・検索できる状態にして。
出力:変更ファイル一覧、主要ファイルの要点、環境変数の項目、テスト実行方法、初回の確認チェックリスト。
Codexが作るものと確認ポイント
- ノーアンサー時の固定文面が正しく表示される。
- 回答時に根拠スニペットと出典ファイル名が添付される。
- 評価スクリプトが質問セットを読み、合否と理由を一覧表示する。
- .envと.gitignoreが正しく設定され、APIキーの実値が露出しない。
10. 手順4: 動かして確認する

目的
根拠あり/なしの分岐が正しく働くかを、画面とテストで確かめます。
水道の元栓を少しずつ開けて漏れがないか点検するイメージです。
画面で行うこと
- Codexが用意した実行ボタンまたはスクリプトでローカル起動。
- ブラウザでアプリを開き、次を順に入力:答えられる質問、言い換えた質問、資料にない質問、内容が食い違う質問。
- 回答の下に、根拠スニペットと出典ファイル名が表示されるかを確認。
- テスト質問セットを一括実行し、合否と理由を一覧で確認。
成功の目印
- 資料にない質問で「登録した資料の中では確認できません」と返る。
- 根拠ありの質問で、参照元ファイル名が1つ以上添付される。
- テスト結果に合否の内訳(閾値未満、出典なし、OK)が表示される。
11. 手順5: エージェントと直す
目的
誤回答をさらに減らすため、パラメータと前処理を調整します。ラジオのチューニングを微調整する感覚です。
Codexへの依頼例と観察ポイント
- 閾値の上げ下げ:高すぎると何も答えない、低すぎると誤回答が増える。テスト結果を見て調整。
- トップkの変更:拾い漏れがあるときは増やす、ノイズが多いときは減らす。
- 再検索回数:言い換えに弱いときは、クエリ拡張や再検索を提案してもらう。
- 矛盾資料:複数根拠が一致しているかを軽くチェックし、不一致ならノーアンサーに倒す。
12. よくあるエラー

- 症状:APIキー関連のエラー(認証失敗、権限なし、レート制限)。
原因:キー未設定、権限不足、短時間の連続実行。
最初に見る場所:環境変数の読込、OpenAIダッシュボードのUsage/Rate制限表示。
Codexへの質問:「環境変数からAPIキーを読み込めているか、ログに露出させず確認し、必要なら待ち時間やリトライを実装して。」 - 症状:検索結果が0件。
原因:ファイル取り込み失敗、文字コードや拡張子の不一致。
最初に見る場所:ファイル登録処理のログ、許可拡張子とサイズ上限の設定。
Codexへの質問:「File Searchへの登録とインデックス化が成功しているか、失敗時のメッセージをユーザーに分かる形で表示して。」 - 症状:スコアの向きや閾値の誤解で常にノーアンサー/常に回答。
原因:スコアが高いほど類似か低いほど類似かの取り違え。
最初に見る場所:Responses API+File Searchの返すスコア定義。
Codexへの質問:「このスコアは大きいほど近い/小さいほど近いのどちらか。仕様を確認し、判定ロジックをテスト付きで修正して。」 - 症状:CORSやポート競合でフロントが呼べない。
原因:同一ポートの別アプリ起動、CORS設定不足。
最初に見る場所:サーバーの起動ログ、CORSミドルウェア設定。
Codexへの質問:「使用中のポートを避ける設定にし、CORSを最小安全設定で有効化して。」 - 症状:テストスクリプトがファイルを読めない、改行コードで失敗。
原因:相対パスのずれ、CRLF/LFの差。
最初に見る場所:テストスクリプトのパス解決、テキストの正規化。
Codexへの質問:「OS差を吸収するパス解決に直し、改行コードを正規化して。」
13. 次に試すこと
- 評価質問を増やし、自動レポート(Precision/Recallなどの指標)を追加。
- 出典のハイライト表示や、複数根拠の整合チェック。
- 差分テストを自動で回す仕組み(CI)に接続。
14. まとめ

「資料に根拠がないなら答えない」は、RAGにおける最重要ガードレールです。
小さく作り、テストで守備範囲を見える化し、運用で定期的に見直しましょう。
料金や仕様は変動するため、OpenAIの公式ドキュメントとPlatformの画面で都度確認してください。
参考文献・公式情報
- OpenAI Retrieval guide:RAG構成の基本と、検索結果を回答に反映する設計上のポイント。
- OpenAI File Search guide:ファイル検索ツールの使い方、インデックス、検索とスコアの扱い。
- OpenAI API safety best practices:安全対策、境界条件での振る舞い、ポリシー遵守のベストプラクティス。