第3回 ── 種明かし 2/3

あのツールは、
何でできていたのか

── プログラミングと実行環境の基礎。「自分で書く」ためではなく「AIが書いたものを見分け、正しく発注する」ための回

AI活用コーチング 第3回 2026-08-25 所要 約65分 前提:第1回・第2回 講師:柴田建太郎

第1回で作った3つのツール(🍓いちごの種カウンター・🔬神経節細胞チェッカー・👕人物服装判定ツール)は、いまも動いています。中身は英語の文字列が並んだテキストファイルでした。第2回で「頭脳(AIのしくみ)」の種明かしをしたので、今回は「体のつくり」の続き ── ファイル・実行環境・通信・保存形式・エラーという、プログラムを取り巻く道具立てを一通り見ます。

今日のゴールは「自分でコードを書けるようになること」ではありません。AIが出してきたコードや説明を見て「これは設定の話だな」「これは通信の話だな」と見分けられるようになること、そして次に何かを作りたくなったとき、AIに向かって過不足なく発注できる語彙を持つことです。各章の最後に「AIに頼むとき、こう言う」という一言を置いています。そこだけ持ち帰っても元は取れます。

CHAPTER 1

あのツールの正体は「テキストファイル数枚」

🍓いちごの種カウンターの中身を、フォルダごと開いてみます。すごい量のファイルがあると思うかもしれませんが、実物はこれで全部です。

seed-counter-worker/
├── wrangler.toml       ← 設定(どこで・どう動かすか)
├── src/
│   └── index.js        ← 本体のコード(受付の手順書)
├── public/
│   └── index.html       ← 画面(ブラウザに表示されるページ)
└── README.md            ← 人間向けの説明書

プログラムとは、コンピュータ向けに書いた手順書です。クリニカルパスが「この患者にはこの順番でこの処置をする」と書いてあるのと同じで、コードには「この入力が来たらこう確認し、こう転送し、こう返す」と書いてあるだけ。中身はただのテキストなので、専用ソフトがなくてもメモ帳で開けます(開いて眺めるだけなら壊れません)。

拡張子=ファイルの種類の目印

ファイル名の末尾の .js や .py を拡張子と呼びます。カルテの「〇〇科」の表示のようなもので、中身の性格が一目でわかります。

.html画面(ブラウザが表示するページの設計図)
.jsJavaScript のコード。ブラウザやサーバーで動く「手順書」本体
.pyPython のコード。第1回の人物・服装判定ツールの本体
.toml / .json / .yaml設定ファイル。「名前:値」の形で細かい条件を書く
.md説明書(Markdown)。README.md がその代表
.csv表データ(第6章で詳しく)

試しに src/index.js の頭の方だけ、日本語の注釈付きで覗いてみます。英語に見えますが、読めなくて構いません。「ここは設定」「ここは指示文(AIへの日本語)」「ここは事務処理」の3種類に色分けできれば、今日は十分です。

const MODEL = "claude-opus-5";使うAIモデルの名前を指定している(設定)
const PROMPT = [ "この画像に写っているいちごの表面の種(...)を数えてください。",AIへの指示文の書き出し。ここだけ日本語で読める
function json(status, obj) { return new Response(JSON.stringify(obj), ...);結果を決まった形(JSON)に整えて送り返す事務処理

つまり index.js は「設定・日本語の指示文・事務処理」の3つが順番に積み重なった手順書です。神経節細胞チェッカーを作ったとき、書き換えたのは主に指示文と「返事の書式」でした(第2回の「同じ体・違う指示文」の話)。

医師のためのアナロジー ── カルテの構造とそっくり カルテにも「基本情報(設定)」「主訴・所見(自由記載)」「オーダー(決まった書式の指示)」が混在しています。プログラムのファイルも同じで、全部が同じ密度の「難しいコード」ではなく、設定・指示文・事務処理という性格の違う部分が並んでいるだけです。
AIに頼むとき、こう言う 「どのファイルを何のために作ったか、一言ずつ説明して」
CHAPTER 2

そのまま動くか、翻訳がいるか

第1回、Python版のツールを動かすときに ./.venv/bin/python server.py という呪文を打ちました。なぜ単一ファイル版の「いちごの種カウンター.html」はダブルクリックで開くだけで動き、server.py はこの呪文が要ったのか。ここに「実行環境」の正体があります。

同時通訳 vs 事前翻訳

Python や JavaScript のようなコードは、スクリプト言語と呼ばれます。書いた原稿(コード)を、その場で1行ずつ同時通訳する係が必要で、この通訳者のことをランタイム(実行環境)と呼びます。Python のコードには Python の通訳者が、JavaScript のコードには JavaScript の通訳者が要ります。

一方、Swift や C のような言語は、あらかじめ全部を翻訳して製本した本(実行ファイル)を作ってから配ります。これをコンパイル型と呼びます。iPhone のアプリや Word 本体がこちら側です。第1回で作った3つのツールは、全部スクリプト言語(Python / JavaScript)でした。

スクリプト型コンパイル型
動かすのに必要なものその場で読む通訳者(ランタイム)不要(すでに製本済み)
配り方原稿(コード)そのものを配る製本した本(アプリ)を配る
今回の例index.js(JS)/ server.py(Python)─
身近な例ブラウザで動く仕掛け全般iPhoneアプリ、Word 本体

./.venv/bin/python は「今回だけ使う Python の通訳者」を名指ししていました。だからブラウザの JavaScript は何もインストールせず動いたのに、Python は事前に「通訳者を雇う」作業(インストール)が要ったのです。ブラウザには JavaScript の通訳者が最初から住み着いている ── これは第3章の伏線になります。

ライブラリ=既製の部品

server.py の中身をよく見ると、自分では1行も書いていない「画像をAIに送る」処理を、たった数行で呼び出しています。これは anthropic というライブラリ(既製部品)を使っているからです。AIが書くコードの大半は、実はこうした既製部品の呼び出しでできています。院内製剤を一から作るのではなく、市販薬を処方箋どおりに組み合わせるイメージです。

requirements.txt の中身:
  anthropic>=0.121.0   ← 「anthropic という部品を使う」という発注書

package.json(第1回で作ったフォルダ直下):
  { "devDependencies": { "wrangler": "^4.120.1" } }  ← 同じ発想のJS版
node_modules/          ← npm install で届いた部品の実物。27個の部品箱が並ぶ

pip install -r requirements.txt は、この発注書どおりに部品を取り寄せる作業です。届いた部品は .venv というこの道具専用の薬品棚にしまわれます。他のツール用に入れた部品と混ざらないようにするための仕切りです。

補足 ── なぜ専用の棚(.venv)を作るのか ツールAが「部品Xの古いバージョン」、ツールBが「部品Xの新しいバージョン」を必要とすることがあります。ひとつの棚に両方置くと衝突します。だからツールごとに専用の棚を作り、そこにだけ部品を入れる ── これが .venv(仮想環境)の役目です。
AIに頼むとき、こう言う 「何をインストールすればいいか、手順を一つずつ教えて」/エラーが出たら「ModuleNotFoundError のような行をそのまま貼る」(第7章で詳しく)
CHAPTER 3

登場人物:クライアントとサーバー

第2回の資料で「登場人物は3人だけ」という図を見ました。スマホ=クライアント(頼む側)、受付=サーバー(頼まれて働く側)、AI本体という並びです。今回はこの「クライアント/サーバー」という呼び方そのものに焦点を当て、第1回の3つのツールを並べて比較します。

(a) いちごの種カウンター.html(単一ファイル版) ブラウザだけ (クライアント) 鍵を入力欄に入れて直接送る Anthropic (サーバー) (b) 人物・服装判定ツール(Python版・ローカル) ブラウザ (クライアント) 自分のPCの中の server.py 127.0.0.1:8000 Anthropic (サーバー) (c) いちごの種カウンター(Workers版・公開URL) スマホ/PC (クライアント) Cloudflare の受付 (サーバー) *.workers.dev Anthropic (サーバー) (a) はサーバーを一切経由せず、ブラウザから直接AIへ通信する唯一の例 (b)(c) は「自分のPCの中の受付」か「クラウド上の受付」かの違いだけで、構造は同じ → どちらもクライアント(頼む側)とサーバー(頼まれる側)に分かれている
図1|第1回で作った3ツールの構成比較。サーバーの場所が「なし/自分のPC/クラウド」の3段階になっている

ここで重要な気づきがひとつ。ブラウザは「Webページを見る道具」であると同時に「JavaScriptを実行する環境」でもあります。単一HTML版がその証拠で、サーバーを一切使わずに、ブラウザの中だけで「写真を読み込む→AIに送る→結果を表示する」を全部やっていました。第2章で触れた「ブラウザにはJavaScriptの通訳者が最初から住み着いている」の意味が、ここで実物としてつながります。

CLIとGUI ── 命令の打ち方が2種類ある

第1回、黒い画面(ターミナル)に ./.venv/bin/python server.py や npx wrangler deploy と打ちました。これはCLI(コマンドライン)という操作方法です。普段使っているアイコンをクリックする方式はGUI(画面操作)と呼びます。

CLI(黒い画面)手書きのオーダー用紙。自由度は高いが、正しい書式(コマンド)を知っている必要がある
GUI(アイコン操作)電子カルテのオーダー画面。選択肢から選ぶだけで済むが、用意されたことしかできない

黒い画面は怖く見えますが、正体は「打った文字がそのまま命令になる」だけの仕組みです。詳しい使い方は第4回で扱うので、今日は「オーダー用紙の一種」という位置づけだけ覚えておいてください(補足はAppendix A)。

医師のためのアナロジー ── 紹介状のやり取り クライアントとサーバーの関係は、紹介元の医院(クライアント)と紹介先の病院(サーバー)に似ています。紹介元が依頼(リクエスト)を送り、紹介先が対応して返書(レスポンス)を返す。どちらが「偉い」わけでもなく、役割が違うだけです。
AIに頼むとき、こう言う 「これはブラウザだけで完結する? それともサーバーが要る?」
CHAPTER 4

API=書式の決まった依頼書と返書

第2回で「写真を送ってから答えが返るまでの6ステップ」を見ました。復習すると、受付(サーバー)が Anthropic のAPIに「写真+指示文+鍵」を送り、AIが「決まった書式(JSON)」で答えを返す、という流れでした。今日はその「決まった書式」の中身を実際に見ます。

医師のためのアナロジー ── 検査オーダーと結果報告書 API(エーピーアイ)とは、他人のプログラムに仕事を頼むときの「決まった書式」のことです。検査センターへの依頼は、自由作文ではなく検査オーダー用紙(項目名・単位が決まっている)で出しますよね。結果も決まった様式の報告書で返ってきます。API はこれをプログラム同士でやる仕組みです。

index.js の中の依頼書は、ざっくり4項目でできています。「モデル名」(どのAIに頼むか)、「指示文」(何をしてほしいか、日本語)、「画像」(送る材料)、「返事の書式」(どんな項目でどんな順で答えてほしいか)です。第1章で見た PROMPT の変数がこの2つめ、SCHEMA という変数が4つめにあたります。

では実際に返ってきた答え(初見)を見てみましょう。

{
"strawberry_found": true,いちごが写っていたか(真/偽)
"seed_count": 212,数えた種の数(名前と値のペア)
"confidence": "medium",AI自身の確信度
"notes": "画像左のいちご1個を数えました。右下は..."補足コメント
}

波括弧 { } の中に「名前: 値」のペアが並んでいる ── これが JSON(ジェイソン)という書式です。プログラムが読みやすいように統一された書き方で、この形で受け取れれば、受付プログラムは「seed_count の値を画面に表示する」という機械的な処理だけで済みます。この書式は第6章でもう一度出てきます。

URLの読み方

デプロイ済みの URL https://ichigo-seed-counter.seed-counter-worker.workers.dev/api/count を分解してみます。

https://暗号化された通信で送る、という約束
ichigo-seed-counter.〜.workers.devホスト名。「どの建物(サーバー)に届けるか」の住所
/api/countパス。その建物の「どの窓口」に渡すかの指定

Python版で使った 127.0.0.1:8000 は、ホスト名の代わりに「自分のPC自身」を指す特別な住所(127.0.0.1)と、「8000番の窓口」というポート番号の組み合わせでした。どちらも「どの建物の、どの窓口か」という考え方は共通です。

AIに頼むとき、こう言う 「外部のサービスを使うなら、どのAPIを使うか・料金がかかるか教えて」
CHAPTER 5

どこで動かすか:ローカル vs クラウド

図1で見たとおり、受付(サーバー)の置き場所には「自分のPC」と「クラウド」の2択がありました。ここを詳しく見ます。

🏥 ローカル(院内検査室)
使える場所
そのPCの前だけ
動いている時間
自分がサーバーを起動している間だけ
お金
電気代くらい。基本無料(AIの利用料は別途1回数円)
鍵の置き場
export ANTHROPIC_API_KEY=...(環境変数)
向いている用途
自分だけの試作・検証・練習
🏢 クラウド(外注検査センター)
使える場所
どこからでも(スマホからも)
動いている時間
24時間・無人で待機
お金
使った分だけ課金。今回の規模なら Cloudflare 側は無料枠(AIの利用料は別途1回数円)
鍵の置き場
npx wrangler secret put ANTHROPIC_API_KEY(シークレット)
向いている用途
他人(あびこさん)と共有するツール
医師のためのアナロジー ── 院内検査と外注検査 ローカルは院内に検査機器を置くのに似ています。機器代も保守も自分持ちですが、自分がいるときしか動きません。クラウドは検査センターへの外注で、検体(リクエスト)を送れば24時間いつでも結果が返り、費用は件数分だけ。小さく始めるなら外注(クラウド)が楽、という判断は医療と同じです。

「手元で作ったコードを、外注先に預けて、そこで動いてもらう」ことをデプロイと呼びます。第1回、フォルダの中で npx wrangler deploy と1行打っただけで、seed-counter が workers.dev の URL を持つようになりました。あれがデプロイです。手順書(コード)そのものを Cloudflare の建物の中に置いてきた、というのが実際に起きたことです。

鍵の置き場については、ローカルでは export ANTHROPIC_API_KEY=...(そのコマンドを打った端末だけが覚えている「環境変数」)、クラウドでは npx wrangler secret put ANTHROPIC_API_KEY(Cloudflare 側の金庫=シークレット)を使いました。どちらもコードの中に直接鍵を書かないという点は共通です。第2回の「受付に鍵を持たせる」の実装がこれでした。

有名な事業者

AWSAmazon のクラウド
Google CloudGoogle のクラウド
Microsoft AzureMicrosoft のクラウド
Cloudflare今回使ったのはここ

「仮想化」── 1台の機械を何十にも切り分ける

クラウドの安さの理由のひとつが仮想化です。データセンターにある巨大な1台の機械を、ソフトウェアの力で何十もの「仮想の小さなコンピュータ」に仕切って、別々のお客さんに貸し出しています。

データセンターの中の、巨大な1台の物理コンピュータ 仮想マシンA (お客さん1) 仮想マシンB (お客さん2) 仮想マシンC (お客さん3) Cloudflare Workers は さらに小さい「関数 1つぶん」の単位で貸す
図2|仮想化のイメージ。大部屋をパーティションで区切るように、1台の機械を複数の借り手で分け合う

シェアオフィスや大部屋を仕切りで区切るのと同じ発想です。だから「1台まるごと」ではなく「必要なぶんだけ」借りられ、使った分だけ支払えばよい。Cloudflare Workers は、この仮想化をさらに進めて「関数ひとつぶん」という極小の単位で貸し出す方式で、これが Cloudflare 側の費用が無料枠で収まった理由でもあります。

「ネットワーク」── URLを開いてから届くまで

あびこさんがスマホで URL を開いたとき、裏側では次のような経路をたどっています。

スマホ DNS(電話帳) 住所(IP)に変換 インターネット 世界中の回線 どこかの データセンター スマホ → DNS → インターネット → データセンター(実体のある機械) → 返事が戻る
図3|ネットワークの経路。DNS がホスト名を住所(IPアドレス)に変換してから届く

DNSは「ホスト名(〇〇.workers.dev)」を、機械が実際に使う住所であるIPアドレスに変換する電話帳のような仕組みです。そこからインターネットを経由して、実在するどこかの建物の中の機械に届きます。「クラウド」という言葉は雲のように実体がないものを連想させますが、実体は必ずどこかの建物の中の機械です。

AIに頼むとき、こう言う 「自分のPCだけで動けばいい」または「スマホからも使いたい(=クラウドに置く)」を最初に伝える
CHAPTER 6

データをどう残すか

第1回の3つのツールは、判定するだけで何も保存していません(毎回使い捨てです)。もし今後「結果を貯めたい」「表を読ませたい」となったら、次は保存形式の話が出てきます。合成データで、いちご3個の種の数を例に、同じ内容を3つの書き方で並べてみます。

① 平文(メモ帳の自由記載)

いちごA: 178個 いちごB: 205個 いちごC: 190個

② CSV ── Excelの表をテキストにしたもの

name,seed_count いちごA,178 いちごB,205 いちごC,190カンマ(,)で区切って表を表現する

CSV は Excel でそのまま開けます。次回以降扱う「匿名化済み患者テーブル」も、この形式で扱う予定です。

③ JSON ── 第4章で見た「名前: 値」の入れ子

[ {"name": "いちごA", "seed_count": 178}, {"name": "いちごB", "seed_count": 205}, {"name": "いちごC", "seed_count": 190} ]波括弧が入れ子になり、複数件をまとめて表現できる

JSON の前の世代には XML という書式もあります(<name>いちごA</name> のようにタグで囲む方式)。今はあまり新規には使われませんが、名前だけ知っておけば「ああ、あの仲間か」とわかります。

④ データベース ── 電子カルテの裏側

データの量が増え、複数人が同時に読み書きし、検索もしたくなると、テキストファイルでは追いつかなくなります。そこで登場するのがデータベースです。電子カルテの裏側で動いている仕組みも、ほぼ間違いなくデータベースです。

SQL(リレーショナル)厳密な様式が決まった表の集まり。電子カルテのマスタ表のイメージ
NoSQL書類の束。JSON をそのまま箱にしまうような柔軟な保存の仕方

どちらが優れているという話ではなく、用途に応じた使い分けです。今日は名前だけ知っていれば十分です。

RULE ── 鉄則の再確認 保存形式がどれであっても、患者さんの情報はAIに入力しないのが鉄則です。表形式のデータを扱うときも、「匿名化済み」という説明を鵜呑みにせず、AIに渡す前に必ず中身を確認してください。判断に迷ったら手を止めて確認する、が第2回までと変わらぬ原則です。
AIに頼むとき、こう言う 「結果を残したい。Excel で開ける形(CSV)で保存して」
CHAPTER 7

エラーは検査値

プログラムが赤い文字を出すと、多くの人はぎょっとします。しかし赤い文字は「故障」ではなく「検査値」です。機械が「どこで・何が」起きたかを、機械なりの言葉で報告しているだけ。読めなくてよく、正しい対応はそのままAIに貼ることです。第1回・第2回で実際に起きた(起きうる)代表例を3つ見てみます。

ModuleNotFoundError: No module named 'anthropic'既製部品(ライブラリ)が未インストール。requirements.txt の pip install をし忘れている
401 Unauthorized鍵(APIキー)か合言葉が違う。第2回の「金庫の鍵」の話に対応
Address already in use8000番の窓口が既に使用中。さっき起動した server.py を閉じ忘れている

ログとは、プログラムが「いつ・何をしたか」を記録した経過記録です。デバッグとは、症状(エラー)から原因を絞り込む作業 ── いわば鑑別診断です。AIに助けを求めるときのテンプレートは、実はカルテの書き方とほぼ同じ構造をしています。

主訴・現病歴やったこと(何をしようとして、何を打ったか)
期待した結果本来こうなるはずだった、という見込み
検査値実際に出たもの(エラーメッセージ全文をそのまま貼る)
AIに頼むとき、こう言う 「このエラーが出た。原因の候補と、確かめ方を教えて」(エラーメッセージは省略せず全文を貼る)
CHAPTER 8

まとめ:AIへの依頼文チェックリスト

問診が要件定義であるように、AIへの発注も「聞くべきことを聞き漏らさない」ことが質を決めます。今日出てきた語彙を、6項目のチェックリストにまとめました。

この6項目で、実際の「いちごの種カウンター」の依頼文を書くとこうなります。

実例 ── 6項目で書いた依頼文 「いちごの写真を1枚アップロードすると、写っている種の数を数えて表示するツールを作って。スマホからも使えるようにクラウド(Cloudflare)に置いて、合言葉で簡単に制限して。結果は保存しなくていい。Anthropic の Claude API を使うので、料金は使った分だけかかることを教えて。APIキーはコードに書かず、Cloudflare のシークレットに入れて。患者さんの情報は一切扱わない、いちごの写真だけを使う。」
今日の種明かし、4行で ① プログラムは設定・指示文・事務処理が積み重なった、ただのテキストファイル。
② スクリプト言語はその場の通訳者(ランタイム)が読み、既製部品(ライブラリ)を組み合わせて動く。
③ ツールは必ずクライアントとサーバーに分かれ、置き場所はローカルかクラウドの二択。
④ 困ったときの赤い文字は検査値。読めなくていい、そのままAIに見せればいい。
APPENDIX

補足資料

A. CLI(黒い画面)の基本コマンド

第1回で打ったコマンドの読み方だけ、ここにまとめておきます。詳しい操作は第4回で扱います。

cdフォルダ(部屋)を移動する
lsいま居るフォルダの中身を見る
python server.pyPython の通訳者に、この原稿(server.py)を渡して読ませる
npx wrangler deploy手元のコードを Cloudflare(外注先)へ預けて動かしてもらう

B. git(元に戻せる保存履歴)

git は、コードの変更履歴を記録しておき、いつでも過去の状態に戻せる仕組みです。AIにコードを書き換えてもらって、もし壊れてしまっても、git があれば「さっきの状態に戻して」で済みます。詳しい使い方は第4回以降に扱いますが、「壊れても戻れる安心材料がある」とだけ覚えておいてください。

C. 用語ミニ辞典

暗記は不要です。今後の回で出てきたときに、ここに戻って引いてください。

ランタイムスクリプトのコードをその場で読んで実行する「同時通訳者」。Python なら Python のランタイムが必要。
ライブラリ誰かが作った既製の部品。ゼロから書かず、呼び出して使う。
依存関係「このツールを動かすには、あの部品とこの部品が要る」という関係。requirements.txt に書かれている内容。
スクリプト実行のたびにランタイムが読む形式のコード。Python・JavaScript など。
コンパイルコードを事前にひとまとめの実行ファイルへ翻訳しておく方式。iPhoneアプリなど。
クライアントサービスを頼む側。ブラウザ・スマホアプリなど。
サーバー頼まれて働く側。24時間動き続けることが多い。
APIプログラム同士がやり取りする、書式の決まった窓口。
JSON「名前: 値」の組を波括弧で並べる、プログラムが読みやすいデータの書き方。
CSVカンマ区切りの表データ。Excelでそのまま開ける。
デプロイ手元で作ったコードをサーバーに配置して、使える状態にすること。
環境変数・シークレットAPIキーなどの秘密情報をコードの外側に置く仕組み。ローカルは環境変数、クラウドはシークレット。
仮想化1台の物理コンピュータをソフトの力で複数の「仮想のコンピュータ」に分ける技術。
DNSホスト名(〇〇.com)をIPアドレスに変換する、インターネットの電話帳。
IPアドレスインターネット上の機械の実際の「住所」。
ポート同じ建物(住所)の中の「どの窓口か」を示す番号。:8000 など。
ログプログラムが何をしたかの経過記録。
デバッグエラーの原因を、症状から絞り込んでいく作業。鑑別診断に相当。
CLI文字を打って命令する操作方法。黒い画面(ターミナル)を使う。
GUIアイコンやボタンをクリックして操作する、見た目中心の操作方法。