TS初めてのTypeScript

Day 7小さなAIプロダクトを完成させる(実践)

小さく作る設計(入力→AI→表示)

UIとサーバーの役割を分けて、入力→AI→表示の一直線を先に決める。

まず「一直線」を紙に書く

AIプロダクトと聞くと難しそうですが、最初に作るものは驚くほど単純です。やることは3つだけ。ユーザーが何かを入力する、その入力をAIに渡す、返ってきた答えを画面に表示する。この「入力→AI→表示」の一直線を、コードを書く前に日本語で書き出しておくと、途中で迷いません。

たとえば要約ツールなら「長い文章を入力→AIに要約させる→短い要約を表示」。チャットなら「質問を入力→AIに答えさせる→回答を表示」。どちらも形は同じです。まず形を決めて、あとから中身を埋めていきます。

なぜ設計を先に書くのか

実装はAIに任せられますが、「何を作るか」を決めるのは自分です。ここが曖昧だと、AIに頼んでも欲しいものが出てきません。逆に一直線がはっきりしていれば、各パーツを分けてAIに頼めます。

UIとサーバーの役割分担

ここで大事な分け方が「UI(画面)」と「サーバー」です。UIはユーザーが触る部分で、入力欄やボタン、結果の表示を担当します。サーバーはユーザーから見えない裏方で、AIの会社(OpenAIなど)に問い合わせる部分です。この2つを混ぜないことが、安全で分かりやすいアプリの鍵になります。

なぜ分けるのか。AIを呼ぶには「APIキー」という秘密のパスワードが必要です。これをUI(ブラウザで動くコード)に置くと、誰でも見られてしまい悪用されます。だからAIを呼ぶ処理はサーバー側()に置き、UIはそのサーバーにお願いするだけにします。

危険: UIから直接AIを呼ぶ

ブラウザのコードにAPIキーが露出する

TYPESCRIPT
// ブラウザで動くコードに秘密キーを書く
const res = await fetch("https://api.openai.com/v1/chat/completions", {
  headers: { Authorization: "Bearer sk-秘密のキー" }
});
// キーが誰にでも見えてしまう

安全: サーバー経由で呼ぶ

UIは自分のサーバーにお願いし、キーはサーバーだけが持つ

TYPESCRIPT
// UI側: 自分のサーバーに頼むだけ
const res = await fetch("/api/chat", {
  method: "POST",
  body: JSON.stringify({ message: input })
});
// キーはサーバーの中だけにある

型で「境界」を守る

UIとサーバーの間でやり取りするデータの形を、型で決めておきます。たとえば「UIは message という文字列を送る」「サーバーは reply という文字列を返す」と決めれば、両者が同じ約束の上で動けます。この約束をで書いておくのがコツです。

TYPESCRIPT
// リクエスト(UI → サーバー)の形
interface ChatRequest {
  message: string;
}

// レスポンス(サーバー → UI)の形
interface ChatResponse {
  reply: string;
}
UIとサーバーの約束を型で決める

AIにはこう聞く

「入力→AI→表示の一直線で動く要約アプリを作りたい。UIとサーバー(APIルート)の役割分担と、両者でやり取りするリクエスト/レスポンスの型を最初に提案して」と頼むと、設計から一緒に組み立てられます。

  1. 作るものの一直線(入力→AI→表示)を日本語で書く
  2. UI(画面)とサーバー(AIを呼ぶ裏方)を分ける
  3. 秘密のAPIキーはサーバー側だけに置く
  4. UIとサーバーがやり取りするデータの形を型で決める

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

理解度チェック

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

Q1

AIを呼ぶ処理をサーバー側に置く主な理由は?

Q2

小さなAIプロダクトを作るとき、コードを書く前に決めておくべきことを説明してください。

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