Claude 学習
カリキュラム

Lv1 API基礎

🔮 ウォームアップ — 読む前に予想する

まだ解けなくて正常です(採点されません)。先に予想を立てると本文の読み方が変わり、学習効果が上がります(事前テスト効果 → 設計根拠)。頭の中で答えてから開いてください。同じ概念は本編の自己チェックで再登場します。

Q1. リアルタイム性が命の高トラフィックなユーザー向けチャット。第一候補と棄却理由は。

Haiku。速度・コスト効率に最適化されリアルタイム向き。Opus は知性最優先だがレイテンシ/コスト高で棄却。選定はコスト×品質×レイテンシのトレードオフで決め、深い推論が要る処理だけ別モデルへ逃がす使い分けも検討(各モデルの thinking 対応は世代で変わるため公式で確認する)。

本編で学ぶ → 自己チェック

Q3. 「streaming で生成が速くなった」という同僚の理解をどう正すか。

速くなったのは「最初のテキストが見え始めるまでの体感」。streaming は待ち時間中の UX 改善技法。測定でも「最初のチャンク到達」と「全体完了」を分けて評価する。

本編で学ぶ → 自己チェック

安全2. 「開発中だけだから」とフロントエンドの JS から直接 API を叩くデモを共有された。承認してよいか。

不可。ブラウザに配られたコードの key は秘匿できない。開発中でもサーバー(最低限のプロキシ)を経由させ key はサーバー側のみに置く。

本編で学ぶ → 安全必須問題(全問正解が必要・配点と独立)

前提: L0修了 or 免除 / CCAドメイン: ④ / 力量マップ: D. プロンプト・構造化出力 の基礎

主教材: Building with the Claude API 全文日本語ガイド(動画字幕ベース・2026-07-10改訂版。1.1 の「読む」に体験できる疑似ターミナルを埋め込み) 横断必修: 安全性・セキュリティ(safety-security.md)— 本レベルは「APIキーの秘匿」が該当

ゴール: Anthropic API を素の状態で正しく扱えること。モデルをタスクで選び、Messages API でマルチターン会話を実装し(会話状態はクライアント管理という本質を理解した上で)、system prompt / temperature / streaming / 構造化出力を使い分けられる状態。

進め方と環境準備

  1. 読む → やる → 自己チェック の順。L1 は序盤なので演習は手順付き。
  2. 環境: Python + Jupyter notebook(%pip install anthropic python-dotenv)。API key は notebook と同じディレクトリの .envANTHROPIC_API_KEY="..." として保存。
  3. 安全(必須): key をハードコードしない。.env.gitignore に入れる。クライアントから直接 API を叩かない——key はサーバー側のみ(Lesson: Accessing the API の最初の原則)。
  4. コストが不安なら各演習の低コスト版(Haiku・短プロンプト・小さい max_tokens・少ない試行)から。
  5. 演習の提出物は共通4点: ① 実装 ② テストデータ(入力と期待) ③ 実行結果(出力・usage・観察) ④ 設計判断メモ(採用案・却下案・トレードオフ)

1.1 モデル選定とAPIアクセス

学ぶこと

鮮度注意: 教材内のモデル名(Claude 3.7 Sonnet)は古くなる。名前は公式ドキュメントで都度確認し、「使い分けの原理」を持ち帰る。またコース収録時点の説明では「Haiku=reasoning 非対応」とされたが、Haiku 4.5 は extended thinking(thinking: {type: "enabled", budget_tokens: N} 方式)に対応している(adaptive thinking / effort パラメータは非対応。2026-07-11 に公式 API リファレンスで確認)。逆に現行モデル(Opus 4.6+ / Sonnet 4.6+)では adaptive thinking({type: "adaptive"})が標準で、budget_tokens 方式は Opus 4.7 以降・Sonnet 5・Fable 5 では 400 エラーになる(モデル別の分岐表は L3B 3B.3 の注記参照)。モデル別の thinking 対応は世代で変わるため、公式 docs / Models API で確認すること。

読む

🔮 まず予想する: レスポンスの本文はどこに入っている? trailing の改行やMarkdown装飾は自動で外れる?

頭の中で(または紙に)予想を書いてから、下の「実行」を押して答え合わせをする。

初めての Messages API 呼び出し

本文は content というブロックの配列に入る(content[0].text で取り出す。装飾は自動で外れたりしない——欲しい形式は system prompt で指定する)。stop_reason は「なぜ止まったか」(end_turn=自然終了・max_tokens=打ち切り)、usage は課金対象のトークン数。全文ガイドの Lesson: Welcome to the course / Overview of Claude models / Accessing the API

やる — 演習1.1「初リクエストとモデル比較」

  1. ベースライン: .env → クライアント作成 → create() で一問一答。message.content[0].textusagestop_reason を記録。
  2. 実装: 同一プロンプトを Haiku と Sonnet に投げる比較スクリプト(モデル名は変数化)。
  3. 敵対テスト: max_tokens=15 で応答が切れる様子と stop_reason の変化を観察。存在しないモデル名でエラーを読む。
  4. 測定: モデル別のレイテンシと usage を表に。
  5. 言語化: 「このタスクにどちらを使うか。なぜ Opus でないか」を3行で。

低コスト版: 1文プロンプト・max_tokens=100・各モデル1回。

自己チェック

Q1. リアルタイム性が命の高トラフィックなユーザー向けチャット。第一候補と棄却理由は。

Q2. モバイルアプリに key を埋め込み直接 API を呼ぶ案が出た。問題点と正しい構成は。

Q3. 応答が文の途中でぶつ切りに。どのフィールドを見て何を疑うか。


1.2 リクエストの基本 — Messages API とマルチターン

学ぶこと

まず次の図で、リクエストに何を積み、レスポンスのどのフィールドを読むのかの全体像を掴む。

リクエスト — create() model 使うモデルの指定 max_tokens 生成量の上限(安全機構) system トーン・スタイルの制御(任意) messages[role, content] user と assistant の会話の履歴 ①送る Claude API ②返す レスポンス — message content 本文。message.content[0].text stop_reason なぜ止まったか(max_tokens 等) usage 入出力のトークン消費
Messages API の解剖 — リクエストは model・max_tokens・system・messages を積み、レスポンスは content・stop_reason・usage を読む

続いて次の図で、「サーバーが会話を記憶してくれる」という誤ったメンタルモデルを捨て、「毎回 messages に全履歴を積んで送る」という正しいモデルに置き換える。

サーバーが会話を記憶する(誤) そんな会話セッションは存在しない クライアント 最新の1件だけ送る API 会話セッション 「さっき何て言った?」を忘れる API はステートレス(正) 会話状態はクライアントが管理し、毎回全体を送る クライアント messages(履歴リスト) user, assistant, user, … ① 全履歴を送る ② 応答を返す API ③ 応答を履歴に追加して次のターンへ
API はステートレス — サーバーは会話を記憶しないので、クライアントが履歴リストを維持し毎回 messages に全履歴を積んで送る

✏️ 再現チェック: モジュールを読み終えたら、この図を見ずに白紙へ描き直す(矢印のラベルまで)。描けなかった部分が復習ポイント。

読む

全文ガイドの Lesson: Making a request / Multi-Turn conversations / Chat exercise

やる — 演習1.2「ステートレスの証明とループチャット」

  1. ベースライン: 履歴なしで「量子コンピューティングを一文で定義」→別リクエストで「もう一文書いて」を送り、2問目が無関係になることを記録(ステートレスの実証)。
  2. 実装: 3ヘルパー+input()while True のループチャット(Chat exercise 相当)。
  3. 敵対テスト: 空入力・長入力・「さっき何て言った?」を投入。わざと add_assistant_message を1回スキップし文脈が壊れる様子を観察。
  4. 測定: 各ターンの usage.input_tokens を記録し、ターンが進むほど入力トークンが増える(全履歴再送のコスト構造)ことを示す。
  5. 言語化: 「会話状態をクライアント側で持つ設計の利点と負担」を3〜5行。

低コスト版: 3ターン・max_tokens=200・input_tokens は3点記録のみ。

自己チェック

Q1. 「ボットが前の質問を忘れる」と報告。コードは毎回 messages=[最新の1メッセージ] を送っている。原因と修正は。

Q2. 会話が長くなるほどリクエスト単価が上がる。バグか必然か。

Q3. max_tokens=1000 なのに応答が毎回200トークン程度。設定ミスか。


1.3 system prompt と temperature

学ぶこと

読む

全文ガイドの Lesson: System prompts / System prompts exercise / Temperature

やる — 演習1.3「役割の設計と温度の実験」

モデル分岐⚠️ 2026-07-11確認): 本教材の例は model='claude-sonnet-5'(1.1 参照)を使うが、Sonnet 5 は現行の最上位モデル群に該当し、temperature を非デフォルト値に設定すると400エラーになる(上の「学ぶこと」の注記参照)。手順4「temperature 0.0 / 1.0 で比較」をそのまま実行するとエラーになるため、① temperature 対応モデル(例: Haiku 4.5 などの旧世代モデル)に一時的に切り替えて実施するか、② 現行モデルのまま行うなら temperature 操作をあきらめ「system prompt の指示文で創造性の高低を誘導する」実験に読み替える。どちらを選んだかと理由を設計判断メモに書く。

  1. ベースライン: system prompt なしで「5x + 3 = 2 を解いて」→完全な解答が即返ることを記録。
  2. 実装: chat(messages, system=None, temperature=1.0) に拡張(None 分岐を自分で書く)。家庭教師 system prompt と簡潔コード用 system prompt("You are a Python engineer who writes very concise code." 相当)の2本で挙動差を記録。
  3. 敵対テスト: 家庭教師モードのまま user message で「答えだけ教えて」と押し切り、system prompt がどこまで持つか観察(突破された記録にも価値がある)。
  4. 測定: 「一文の映画のアイデア」を temperature 0.0 / 1.0 で各5回実行し、重複・類似を表に(上のモデル分岐注記に従い対応モデルへ切り替えるか system prompt 誘導に読み替えて実施)。
  5. 言語化: 自分の実プロジェクトの機能2つについて temperature を宣言し理由を書く。

低コスト版: 各3回・max_tokens=100・敵対テストは1往復。

自己チェック

Q1. 契約書から日付と金額を抽出するタスクで実行のたびに答えが揺れる。どうするか。

Q2. 「常に敬語・3行以内・専門用語に注釈」の恒久ルールはどこに書くか。

Q3. temperature=1.0 で2回連続ほぼ同じ案が返った。故障か。


1.4 streaming

学ぶこと

次の図で、イベントが届く順序と「テキストを運ぶのは content_block_delta だけ」であることを掴む。

stream=True でイベントのストリームが返る 順に届く ① message_start ② content_block_start ③ content_block_delta ×n ④ content_block_stop ⑤ message_delta ⑥ message_stop テキストを運ぶのはこのイベント 複数回届く。1イベント=1語とは限らない SDK の messages.stream() なら完了後 get_final_message() で完全なメッセージに
streaming のイベント列 — message_start から message_stop まで順に届き、テキストを運ぶのは複数回届く content_block_delta

読む

全文ガイドの Lesson: Response streaming

やる — 演習1.4「イベントを読んでから隠す」

  1. ベースライン: stream=True で生イベントを全部 print し、種類と順序を確認(1回でよい)。
  2. 実装: client.messages.stream()text_stream に書き換え、print(text, end="") でチャンク表示。get_final_message() の結果を 1.2 の履歴に append できることを確認。
  3. 敵対テスト: max_tokens を絞って途中で切れるケースを観察。ループチャットに組み込んだ際、履歴追加を忘れると次ターンが壊れることを確認。
  4. 測定: 同一プロンプトで「非 streaming の完了時間」と「最初のチャンク到達時間」を比較。
  5. 言語化: 「streaming を入れるかスピナーで済ませるか」の判断基準を測定値を根拠に3行。

低コスト版: 各パターン1回の計測でよい。

自己チェック

Q1. イベント列から表示用テキストを組み立てる。どれを拾うか。

Q2. streaming 表示にしつつ会話の完全な記録も DB に残したい。チャンク自前連結以外の方法は。

Q3. 「streaming で生成が速くなった」という同僚の理解をどう正すか。


1.5 構造化データ生成 — prefilling と stop sequences

学ぶこと

現行API

⚠️ 現行API注記(2026-07-11確認): assistant message prefilling は現行モデル(Fable 5 / Opus 4.6以降 / Sonnet 4.6以降)では削除済みで、送ると 400 エラーになる。使えるのは旧世代モデル(Sonnet 4.5 / Haiku 4.5 等)のみ。現行の標準解は structured outputsoutput_config={"format": {"type": "json_schema", "schema": {...}}} — スキーマ準拠の JSON が API 側で保証され、フェンスや解説文も付かない)または strict tool use(tool 定義に strict: true。L3A で学ぶ)。教材の prefill+stop_sequences は「Claude に生成の続きから書かせる」仕組みの理解として今も重要で、旧世代モデルでは実際に動く。

次の図で、使うモデルの世代で手法が分岐すること——現行モデルでは structured outputs が標準解で、教材の prefill+stop_sequences は旧世代モデルでのみ動く——を掴む。

生データだけ欲しい (JSON・コード・リスト) 現行モデルを使う 旧世代モデルを使う structured outputs(標準) 対象: Fable 5 / Opus 4.6+ / Sonnet 4.6+ output_config.format に json_schema を指定する → スキーマ準拠の JSON を API 側で保証 フェンスや解説文も付かない prefill+stop_sequences(教材) 対象: 旧世代(Sonnet 4.5 / Haiku 4.5 等) ```json をプリフィルする ``` を stop_sequences で止める → 間の生 JSON だけが返る ⚠ 現行モデルに送ると 400 エラー 取り出す 取り出す json.loads で検証する
構造化出力の手法分岐 — 現行モデルは structured outputs(output_config.format)が標準解、prefill+stop_sequences は旧世代モデルでのみ動き、どちらも json.loads で検証する

読む

全文ガイドの Lesson: Structured data / Structured data exercise

やる — 演習1.5「生JSONだけを取り出す」(足場少なめ)

モデル分岐⚠️ 2026-07-11確認): 旧世代モデル(Haiku 4.5 / Sonnet 4.5)なら以下を教材どおり prefill+stop_sequences で実施。現行モデル(Opus 4.6+ / Sonnet 4.6+)では prefill が 400 エラーになるため、手順2・4の「prefill+stop_sequences」を structured outputs(output_config.format の json_schema)に読み替えて実施する(json.loads 成功率の測定は同じ)。どちらを選んだかと理由を設計判断メモに書く。

  1. ベースライン: 「非常に短い EventBridge ルールを JSON で」を素のまま実行し、フェンスや解説が付くことを記録。
  2. 実装: prefill(```json)+ stop_sequences=["```"] で生 JSON を取得し json.loads まで通す。続いて AWS CLI コマンド3つの演習を、プロンプト本文は変えず prefill の文言設計だけで「コメント無し・1ブロック」に安定させる。
  3. 敵対テスト: あいまいな指示(「いい感じの設定を JSON で」)等でパースが落ちるケースを最低1つ見つけ、失敗時の扱い(エラー or 1回だけ再試行)を実装。
  4. 測定: 同一リクエストを10回実行し json.loads 成功率を記録(prefill 改善前後で比較)。
  5. 言語化: 「prefill+stop_sequences」と「プロンプトで『JSONだけ返して』」の違い・使い分けを実験結果を根拠に5行以内。

低コスト版: 各5回・max_tokens=300・敵対テスト2ケース。

自己チェック

以下の Q1〜Q3 は教材の手法(旧世代モデル+prefill+stop 構成)を前提とする。現行モデルでは 1.5 の現行API注記のとおり structured outputs が標準解。

Q1. 毎回フェンスと説明文が付く。プロンプトを書き換えずに直すには。

Q2. ``` だけプリフィルしたら先頭に bash が混入した。なぜ起き、どう防ぐか。

Q3. prefill+stop でも複数ブロックに分かれたりコメントが混ざる。次の一手は。


キャップストーン増分 — ドキュメント調査アシスタント 第1形態(v0.1)「構造化出力つきチャットCLI」

累積キャップストーン(L1〜L6)の第1形態。このレベルの要素だけで作る。置き場所は任意(例: learn/claude/capstone/)。以後のレベルで積み増すため使い捨てにしない

要件

  1. チャットCLI: input() ループ。履歴はクライアント側リストで管理し毎ターン全履歴を送る(1.2)。
  2. system prompt: 「ドキュメント調査アシスタント」の役割・スタイル(例: 日本語・簡潔・不明なことは不明と言う)を定義(1.3)。
  3. streaming: 応答は text_stream でチャンク表示し、get_final_message() で履歴に追加(1.4)。
  4. 構造化出力コマンド: :note で会話の調査メモを JSON(例: {"topic": ..., "key_points": [...], "open_questions": [...]})出力。手法は使うモデルで分岐(1.5 の現行API注記): 旧世代モデルなら prefill+stop_sequences、現行モデルなら structured outputs(output_config.format)。いずれも json.loads で検証し、失敗時は1回だけ再試行、それでも失敗ならエラー表示して会話は継続(1.5)。どちらを選んだかと理由を設計判断メモに書く。
  5. 設定の使い分け: 通常応答と :note(抽出寄り=低 temperature)で temperature を変える(1.3)。低 temperature の設定は使うモデルで分岐(1.3 のモデル分岐注記): 現行モデル(claude-sonnet-5 等)では非デフォルト temperature が400エラーになるため、temperature 対応の旧世代モデルへ切り替えるか、system prompt の指示文(例:「抽出は一字一句正確に、推測や言い換えをしない」)で揺らぎを抑える方式に読み替える。
  6. 安全: key は .env から。ハードコード・コミット禁止。.gitignore を成果物に含める。

提出物(4点)

提出物 中身
実装 CLI スクリプト一式(.gitignore 込み)
テストデータ 会話シナリオ5本以上(通常・履歴依存質問・空入力・長入力・:note)と期待挙動
実行結果 各シナリオのログ、:note の JSON パース成功率(10回中)、ターンごとの input_tokens 推移
設計判断メモ temperature 選定理由/構造化出力手法の選択(使ったモデルと prefill / structured outputs の対応、prefill 文言 or スキーマの設計過程。失敗案含む)/履歴管理で迷った点

低コスト版: シナリオ3本・:note 検証5回・max_tokens=500。ロジック検証は、記録済み応答テキストを返すフェイク chat 関数に差し替えてオフラインで行ってよい。


修了ゲート(L1)

共通ルール(DESIGN.md): 知識20% / 実技60% / 説明20%、総合80%以上で合格。安全性の必須問題は配点と独立に全問正解。 採点は自動テスト+ルーブリック+Claude 一次レビュー+本人による反証。再受験時は Claude に類題を作らせ同じ問題を使い回さない。

知識確認(5問・シナリオベース)

K1. 大量問い合わせの一次仕分けボット(速度重視・常時稼働)と、月次の複雑な契約分析バッチ。それぞれのモデル選定と根拠は。

K2. 「Claude 側に会話セッションを作る API が見つからない」という相談への正しい回答は。

K3. 応答スタイルの恒久ルールを user message に毎回コピペしている。何をどこへ移すか。また system=None で SDK がエラーになる場合の実装は。

K4. レビュー要約(正確性重視)とキャッチコピー案出し(多様性重視)が同じ temperature=1.0。それぞれどうするか。「高くすれば必ず毎回違う案が出る」という同僚の誤解も正せ。

K5. :note の JSON が「たまにパースできない」。旧世代モデル+prefill+stop 構成として、原因調査と堅牢化の手順を2つ以上。

安全必須問題(全問正解が必要・配点と独立)

安全1. notebook に api_key = "sk-ant-..." と直書き、リポジトリは public 予定。直させる点を最低3つ。

安全2. 「開発中だけだから」とフロントエンドの JS から直接 API を叩くデモを共有された。承認してよいか。

実技 — キャップストーン増分のルーブリック(5観点 × 0〜3点)

観点 0 1 2 3
機能 動かない 単発チャットのみ マルチターン+system prompt+streaming 左+:note 構造化出力まで全要件
堅牢性 異常入力で即クラッシュ 正常系のみ 空入力・長入力・履歴依存質問を処理 左+パース失敗の再試行/エラー処理と敵対テスト記録
安全性 key ハードコード .env あるが ignore 漏れ env 管理+ignore 済み 左+「なぜ直叩き禁止か」を設計メモで説明
評価 記録なし 動作ログのみ usage/レイテンシ/成功率のいずれか測定 input_tokens 推移とパース成功率の両方を測定・考察
説明 メモなし 実装の羅列 採用理由を記述 左+却下案とトレードオフまで記述

説明課題(20%)

どちらか1つを選び、初学者向けに書面または口頭(3分)で説明。正確さと「何が保証で何が確率か」の区別を評価:

  1. temperature は内部で何を操作しているか+低くすべき/高くしてよいタスクの実例(「高 temperature=毎回違う出力」「temperature=0=完全に決定的」という2つの誤解の訂正を含める)。
  2. prefill+stop_sequences で生 JSON だけが返る仕組みを、Claude の視点(「もう書き始めたと想定する」)から説明。あわせて「現行モデルでは prefill は 400 エラーで、標準解は structured outputs」というモデル分岐と使い分けに触れる。

遅延チェック

修了1〜2週間後に10〜20分: ヘルパー3関数を白紙から書けるか/K2・安全1 相当の類題/:note 成功率の再測定。不合格モジュールは復習キューへ(修了取消はしない)。

部分合格方式: ゲート本体は不合格項目のみ補習して再受験すればよい(合格済み項目は保持。共通運用は README.md 参照)。


力量マップ・CCA接続


最終確認日: 2026-07-11(教材: 全文ガイド 2026-07-10 改訂版に基づく。モデル名・SDK 仕様など製品依存の記述は公式ドキュメントで随時確認)

Claude 学習サイト — 完全ローカル静的サイト(build.py で生成)。進捗はこのブラウザの localStorage に保存されます。