TS初めてのTypeScript

Day 6AIをフロントから呼ぶ(この教材の看板)

AIプロダクトの構成(UI→APIルート→LLM)

画面・サーバー・LLMの3つの登場人物と、APIキーをサーバー側に置く理由を理解する。

AIプロダクトは「3人の登場人物」でできている

「AIを使ったアプリ」と聞くと難しそうですが、登場人物は3つだけです。ユーザーが触る画面(UI)、あなたのサーバー(APIルート)、そして文章を生成するLLM(大規模言語モデル。ChatGPTやClaudeの中身にあたるAI)です。この3つが順番にバケツリレーをするだけ、と考えると一気に楽になります。

  1. UI(画面): ユーザーが入力し、結果を見る場所。ブラウザで動く。
  2. APIルート(サーバー): 画面からのお願いを受け取り、LLMに橋渡しする中継役。あなたのサーバーで動く。
  3. LLM: 実際に文章を生成するAI。会社(OpenAIやAnthropicなど)のサーバーで動く。

流れはいつも一方向です。ユーザーが画面に「猫の俳句を作って」と入力する → 画面が(サーバー)にお願いを送る → サーバーがLLMに問い合わせる → LLMが答えを返す → サーバーが画面に渡す → 画面が表示する。この一本道を頭に入れておけば、どこで何が起きているか迷いません。

なぜ画面から直接LLMを呼ばないの?

技術的には画面(ブラウザ)から直接LLMを呼ぶこともできます。しかしそれをやると、LLMを使うための「APIキー」が全ユーザーに丸見えになってしまいます。だから間にサーバー(APIルート)を挟むのです。

APIキーは絶対にサーバー側に置く

APIキー(APIキー = LLMの会社があなたを識別し、料金を請求するための秘密のパスワードのようなもの)は、他人に知られると勝手に使われて高額請求につながります。ブラウザに置いたコードは、ユーザーが「開発者ツール」を開けば中身を読めてしまうので、キーを置いてはいけません。逆にサーバー側のコードはユーザーからは見えないので、ここに置くのが正解です。

危険: 画面(ブラウザ)にキーを書く

TSX
"use client";

// このコードはブラウザで動く。ユーザーに全部見える
const apiKey = "sk-abcd1234..."; // 丸見え。悪用される

async function ask() {
  await fetch("https://api.example-llm.com/chat", {
    headers: { Authorization: "Bearer " + apiKey }
  });
}

安全: サーバー(APIルート)にキーを置く

TYPESCRIPT
// これはサーバーで動く。ユーザーからは見えない
// process.env は環境変数(サーバーだけが読める設定置き場)
const apiKey = process.env.LLM_API_KEY;

// 画面からはこの中継役にお願いするだけ。キーは渡さない

AIにはこう聞く

「Next.jsで、APIキーをサーバー側だけに置いてブラウザに漏らさない構成にしたい。UIからAPIルートを経由してLLMを呼ぶ最小構成の全体像を、ファイル分割込みで教えて」と頼むと、この3層構造のひな形を出してくれます。

実装そのものはAIに任せてよいのですが、「なぜサーバーを挟むのか」「キーがどこにあるのか」はあなたが説明できる必要があります。ここを理解していれば、AIが生成したコードがブラウザにキーを書いてしまっていても「これは危険だ」と一目で気づけます。

ありがちな事故

AIに「一番簡単なコードで」と頼むと、動作を優先してブラウザ側にキーを直書きした例を出すことがあります。動いても本番では絶対NGです。生成コードにキーが直書きされていないか、必ず自分の目で確認しましょう。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

AIプロダクトで、画面(ブラウザ)から直接LLMを呼ばずにサーバー(APIルート)を挟む主な理由はどれ?

Q2

APIキーを置くべき場所として最も適切なのは?

Q3

AIプロダクトの「UI→APIルート→LLM」という3層構成を、なぜこう分けるのかを含めて説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。