Anthropic公式『Prompt Engineering Interactive Tutorial』完全日本語化ガイド — 全13章(00〜10.3)を超絶初心者向けに16章で再構成
SINYBLOG — Anthropic公式『Prompt Engineering Interactive Tutorial』完全日本語化ガイド — 全13章(00〜10.3)を超絶初心者向けに16章で再構成

スポンサードリンク



目次

Anthropic Official · Prompt Engineering Interactive Tutorial · 完全日本語版

Anthropic が GitHub に公開している 「Prompt Engineering Interactive Tutorial」[1]——通称「Anthropic 1P」は、Claude を業務に組み込みたいエンジニアにとって 最初に通るべき教科書として、Anthropic 公式ドキュメントからも繰り返しリンクされている入門講座[2]です。Jupyter Notebook 形式・全 13 章・全編英語のハンズオン教材で、Anthropic の Applied AI チームが「これを通れば、あとは現場で磨ける」という実装最低ラインを設定しています。本記事は、その全 13 章(00_Tutorial_How-To10.3_Appendix_Search & Retrieval)を、API を一度も触ったことがない人でも置いていかれない超絶初心者向け日本語化で 16 章にわたり完全再構成し、要所では Anthropic 公式 Docs[2][3][4]と公式の Prompting 101 セッション[5]からの補足を加えて「動画もドキュメントも見なくても全部分かる」決定版にしました。所要時間は約 35 分、読み終わるころには「クラッシュコース 1 周分」の理解と、自分のプロンプトを直す具体的な手順が手に入ります。

you@anthropic-1p:~/tutorial 01_tldr.md結論:このチュートリアルで身につく「プロンプト工学の地金」

13 章すべてを通読する時間がない読者のために、まず結論から圧縮します。Anthropic 1P チュートリアルが伝えたい「絶対外せない 9 つの考え方」は次のとおりです。

  1. Claude には「文脈なし」を見せない。Claude は新人スタッフと同じで、あなたが言わなかったことは何も知らない[1]。文脈・役割・ゴール・出力形式を毎回 1 から教える前提で書く。
  2. Messages API と System Prompt を分けて使う。Claude API は messages 配列(user / assistant 交互)と system パラメータを別物として扱う設計で、ここを混ぜると遵守率が落ちる[3]
  3. 「明確かつ直接的に」が最強の節約術。プロンプトを友人や同僚に見せて「これ何してほしいか分かる?」と聞き、迷わせるならそこを直す——これが Anthropic 公式の Golden Rule[1]
  4. 役割を与えると性能が上がる。「あなたは論理パズル専門のボットです」と一文足すだけで、Claude は同じ問題で正答する確率が跳ね上がる[1]
  5. データと命令は XML タグで囲って区別する<email> ... </email><document> ... </document> で囲むだけで、Claude は「ここは加工対象、ここは指示」を一発で見分ける[4]
  6. 出力は XML / JSON で構造化し、Prefill で先頭を固定する。Assistant ターンの先頭に {<haiku> を書いておくと、Claude はその続きから書く——機械処理がほぼ確実に決まる[6]
  7. 難しい質問は「順番に考えて」と言わせる。Chain of Thought(CoT)はワンフレーズで実装可能。<brainstorm><scratchpad> タグを使って思考を吐き出させてから結論を書かせる[1]
  8. 例示(Few-Shot)は説明より強い。「こういう形式で出して」と 5 行説明するより、正解の見本を 2〜3 個並べる方が遥かに高精度[1]
  9. ハルシネーションは「言わせない」設計で止まる。「分からないなら『分からない』と答えていい」と逃げ道を与えるだけで、Claude は捏造をやめる[1]

これらは独立したテクニックではなく、10 章で示される「複雑プロンプトの 10 要素アナトミー」として 1 つの設計フレームに統合されます。本記事の後半(ch12 以降)で、その 10 要素を 1 つずつ順番に当てはめていく実例を示します。

この記事の読者像

「ChatGPT や Claude を 会話 UI で触ったことはあるが、API を呼んだことはない」初心者が中心読者です。Python の構文は print() が分かるくらいで OK。途中、コード例にはすべて行頭に日本語コメントを付け、専門用語は初出時に必ず日本語で言い換えます。「自分のプロンプトが動かない理由」を腹落ちさせたい全エンジニア・全プロダクト担当者に役立つ構成です。

you@anthropic-1p:~/tutorial 02_about.mdなぜ Anthropic 公式の 1P チュートリアルが「最良の入門」なのか

本記事の題材は、Anthropic が GitHub の公式アカウント anthropics/prompt-eng-interactive-tutorial[1] に置いている Anthropic 1P ディレクトリ配下の Jupyter Notebook 群です。「1P」は 「ファーストパーティ」(Anthropic 自身が書いた)を意味する社内呼称で、AWS Bedrock 経由用のサードパーティ版(AmazonBedrock/)と区別されています。

項目 内容
正式名称 Anthropic Prompt Engineering Interactive Tutorial(Anthropic 1P)
提供元 Anthropic 公式 GitHub anthropics/prompt-eng-interactive-tutorial
ライセンス MIT
形式 Jupyter Notebook(.ipynb)× 13 ファイル
章構成 本編 9 章(00〜09)+ 付録 3 章(10.1〜10.3)
使用モデル Claude 3 Haiku(claude-3-haiku-20240307、temperature = 0)/付録 10.2 のみ Claude 3 Sonnet
所要時間 標準 6〜10 時間(演習込み)
必要環境 Anthropic API キー+ Python 3.x + pip install anthropic のみ

Anthropic 公式 Docs の Prompt engineering overview ページ[2] でも、最初の学習リソースとしてこのチュートリアルがリンクされており、Anthropic 自身が「まずこれを通れ」と推している事実上の標準教材です。本記事が「決定版」として再構成する根拠は、次の 3 点に集約されます。

  1. 「動かないプロンプト」を題材にしている。各章は「素朴に書いた失敗例 → なぜ失敗したかの解説 → 直し方 → 演習」という共通構造で進み、抽象論ではなく 「あなたのプロンプトが今動かない理由」 を実物で見せる。
  2. すべて Claude 3 Haiku(最も小さく安いモデル)で動く。最も性能の低いモデルでも、プロンプト工学を正しく使えば本番品質に届くことを実証している。Sonnet / Opus 級のモデルに頼って解決する誘惑を断つ作りになっている。
  3. 付録の 3 章(チェイン / Tool Use / RAG)が「次の学習」への橋渡しになっている。ここを通らずに Agent 開発に進むと迷子になる、という Anthropic 自身の経験則がカリキュラムに織り込まれている。
本家 GitHub と本記事の対応表

本記事の「ch03」は GitHub の 00_Tutorial_How-To.ipynb、「ch04」は 01_Basic_Prompt_Structure.ipynb、というように、本記事の章番号 − 2 = 本家ファイル番号になるよう設計しました。本家を並走で開きながら読むと、各 Notebook のセル単位で対応箇所が見つかります。

you@anthropic-1p:~/tutorial 03_setup.md【Chapter 0】準備編 — API キー取得から最初の 1 行まで

本家チュートリアルの 1 ファイル目 00_Tutorial_How-To.ipynb に対応します。ここで詰まる人が一番多いので、ステップを 3 つに分解して説明します。

0-1. API キーを取得する

Anthropic Console(https://console.anthropic.com/)にサインアップし、ダッシュボード左メニューの 「API Keys」 から新規キーを発行します。発行直後の 1 度だけ全文がコピーできるので、必ず安全な場所に控えてください[1]

無料枠と料金の注意

Console アカウントには初回サインアップ時の少額クレジットが付きますが、本チュートリアル全 13 章を一周するだけでも数十回〜数百回 API を叩きます。Haiku は最も安いモデル(2024 年時点で input $0.25 / 1M tokens、output $1.25 / 1M tokens 程度)ですが、念のため Console の Usage 画面で残高確認を習慣にしてください。API キーを公開リポジトリに push しないことは絶対です。

0-2. ライブラリをインストールする

本家 Notebook の Cell 1 で実行されているのが、たった 1 行のインストールコマンドです。

bash— Anthropic SDK のインストール


pip install anthropic

これだけで Python から Claude API を呼び出すための公式 SDK が入ります。Notebook 内では !pip install anthropic のように ! プレフィックスを付けますが、これは「Notebook の中で Shell コマンドを実行する」という Jupyter の記法で、ターミナルから打つ場合は不要です。

0-3. API キーとモデル名を変数に格納する

本家 Cell 4 の冒頭にある、初心者が一番つまずく %store マジックコマンドの正体を解説します。

python— 00_Tutorial_How-To.ipynb / Cell 4


# API キーをここに貼り付ける(先頭に "sk-ant-" が付く長い文字列)
API_KEY = "your_api_key_here"
# 使用するモデル名(チュートリアルでは Haiku で固定)
MODEL_NAME = "claude-3-haiku-20240307"

# IPython の永続ストアに保存して、後続の Notebook 全体で再利用する
%store API_KEY
%store MODEL_NAME

%storeIPython(Jupyter の中身)が持つ「Notebook 間で変数を引き継ぐ」機能です[1]。本家は 13 個の Notebook が独立したファイルになっているため、毎回 API キーを書き直さずに済むよう、最初の Notebook で %store API_KEY しておけば、2 章以降の Notebook では %store -r API_KEY で復元できる、という導線になっています。

Notebook を使わない人は環境変数で OK

普通の .py ファイルでチュートリアルを写経する場合は、%store は無視して os.environ["ANTHROPIC_API_KEY"] から読む方が現実的です。SDK は環境変数 ANTHROPIC_API_KEY が設定されていれば anthropic.Anthropic() を引数なしで呼べます。.env ファイルに保存して python-dotenv で読むのが安全。

0-4. ヘルパー関数 get_completion を定義する

本家 Cell 7 で定義される、本チュートリアル全章で使い回される最重要ヘルパー関数です。

python— 全章で使うヘルパー関数


import anthropic

# Anthropic クライアントを API キーで初期化
client = anthropic.Anthropic(api_key=API_KEY)

def get_completion(prompt: str):
    # Messages API を呼び出してレスポンスを取得
    message = client.messages.create(
        model=MODEL_NAME,           # 使用するモデル
        max_tokens=2000,            # 最大生成トークン数(ハードリミット)
        temperature=0.0,            # 0 = ほぼ決定的、1 = 創造的
        messages=[
            {"role": "user", "content": prompt}   # ユーザーロールで質問を渡す
        ]
    )
    # 返却された Message オブジェクトの本文部分だけを取り出す
    return message.content[0].text

4 つの引数すべてに意味があります。1 つずつ初心者に向けて解説します。

引数 意味 初心者が触るべきか
model 呼び出すモデルの ID。claude-3-haiku-20240307 は最も安く速い。 当面は固定で OK
max_tokens レスポンスの最大長(トークン数)。途中で打ち切られることもあるハードリミット。 長文出力で足りなければ増やす
temperature 0〜1 の創造性パラメータ。0 で再現性最大、1 でばらつき最大[3] デバッグ中は 0 が鉄則
messages 会話履歴の配列。要素は {"role": "user|assistant", "content": "..."} 本チュートリアルの主役

最後の message.content[0].text が「なぜ [0] なのか」を疑問に思う初心者が多いですが、これは Messages API のレスポンスが 複数のコンテンツブロック(テキスト・画像・ツール呼び出しなど)の配列として返ってくる仕様のためです。テキスト 1 つだけが入っているケースが大半なので [0] でほぼ困りません。

0-5. Hello, Claude を打ってみる

準備完了。最初の 1 行を実行します。

python— 最初の API 呼び出し


prompt = "Hello, Claude!"
print(get_completion(prompt))

"Hello! It's nice to meet you. How can I assist you today?" のような挨拶が返れば、Chapter 0 はクリア。ここまでで API キー周辺の躓きは全部終わりました。次章から本論に入ります。

you@anthropic-1p:~/tutorial 04_basic_structure.md【Chapter 1】プロンプトの基本構造 — Messages API と System Prompt

本家 01_Basic_Prompt_Structure.ipynb に対応します。Anthropic の Messages API を「正しく動く形」で叩くための、絶対外せない 3 原則を扱います。

1-1. Messages API の必須パラメータは 3 つだけ

Anthropic は歴史的に Text Completions API(旧)と Messages API(現行)の 2 種類を提供してきましたが、新規開発で使うべきは Messages API 一択です[3]。最低限必要なパラメータは次の 3 つ。

パラメータ 意味 典型的な値
model 呼び出すモデルの ID claude-3-haiku-20240307 など
max_tokens 最大生成トークン数(途中打ち切りあり) 2000〜4000
messages user / assistant ロールの会話配列 [{"role":"user", "content":"..."}]

そして任意パラメータの中で 絶対に押さえるべきのが systemtemperature。前章で見た通り、temperature は 0〜1 の創造性ダイヤル。system は本章後半で扱うシステムプロンプト用の独立フィールドです。

1-2. user / assistant の交互ルール

Messages API には 「絶対に守らなければエラーになる」3 つの形式ルールがあります。

  1. 各メッセージは rolecontent のキーを持つオブジェクトでなければならない
  2. userassistant ロールは交互に並ばなければならないuser, user, ... のような連続は不可。
  3. 最初のメッセージは必ず user ロールでなければならない

本家 Cell 8 では、わざと「文字列の集合体だけを messages に渡す」誤った例を提示し、エラーが出ることを体験させます。

python— ❌ NG例:role/content がない


# ❌ これは API エラーになる
response = client.messages.create(
    model=MODEL_NAME,
    max_tokens=2000,
    temperature=0.0,
    messages=[
        {"Hi Claude, how are you?"}    # role / content がない set 型
    ]
)

同じく Cell 10 では 「user が 2 連続するパターン」がエラーになることを示します。これは Anthropic のモデルが「会話のターン」を厳密に区切ることで学習データの一貫性を保っている設計上の制約で、緩めることはできません。マルチターン会話を扱うときは、過去のやり取りを user → assistant → user → assistant → ... の順に並べるロジックを必ず実装します。

1-3. System Prompt の役割

System Prompt は 「ユーザーターンが始まる前に、Claude に全体的な指示・背景・人格・ルールを与える」専用の独立フィールドです[3]messages 配列とは別の system パラメータに渡します。

python— System Prompt を使うヘルパー関数


def get_completion(prompt: str, system_prompt=""):
    message = client.messages.create(
        model=MODEL_NAME,
        max_tokens=2000,
        temperature=0.0,
        system=system_prompt,    # ★ system を独立して渡す
        messages=[
            {"role": "user", "content": prompt}
        ]
    )
    return message.content[0].text

本家 Cell 13 で示される具体例を、日本語訳付きで再掲します。

python— 01 / Cell 13: クリティカルシンキング誘導


# System Prompt:「答えを返さず、会話を深める質問だけを返せ」と指示
SYSTEM_PROMPT = "Your answer should always be a series of critical thinking questions that further the conversation (do not provide answers to your questions). Do not actually answer the user question."

# User Prompt:「なぜ空は青いの?」
PROMPT = "Why is the sky blue?"

print(get_completion(PROMPT, SYSTEM_PROMPT))

このプロンプトは「なぜ空は青いの?」と聞かれても、Claude は 答えずに「では、光の散乱について何を知っていますか?」のような質問だけを返すようになります。System Prompt がいかに振る舞いを根本から書き換えるか、初心者にも一発で伝わる名サンプルです。

演習 1.1 / 1.2 の目的

本家のエクササイズは「3 まで数えさせる」と「3 歳児のように振る舞わせる」の 2 つ。前者は user メッセージで明示指示するだけで通り、後者は System Prompt に「You are a 3-year-old child. Use words like 'soo' and 'giggles' a lot.」のように書けば通ります。「ユーザー指示で十分なときは user に書く、振る舞いを根本から変えたいときは system に書く」——これが Anthropic 公式の使い分けです。

you@anthropic-1p:~/tutorial 05_clear_direct.md【Chapter 2】明確かつ直接的に — Golden Rule of Clear Prompting

本家 02_Being_Clear_and_Direct.ipynb に対応します。本章で出てくるのが、Anthropic 公式が 「Golden Rule of Clear Prompting(明確なプロンプトの黄金律)」 と呼ぶ判定基準です。

Show your prompt to a colleague or friend and have them follow the instructions themselves to see if they can produce the result you want. If they're confused, Claude's confused.

"Anthropic Prompt Engineering Interactive Tutorial — Chapter 2" / [1]

「同僚にプロンプトを見せて、その指示に従って同じ結果を出せるかやってもらえ。混乱するなら、Claude も混乱している」——プロンプト工学の出発点であり、終着点でもある一文です。

2-1. 「俳句の前置きが消えない」問題

本家 Cell 4 の例。「ロボットの俳句を書いて」とだけ頼むと、Claude はこんな返事をします。

Here is a haiku about robots:
Metallic hands clutch /
Whirring gears and circuits hum /
Robots stand, alert

Claude (typical v1 response)

「Here is a haiku about robots:」という前置きが必ず付く。これを下流で機械処理したいなら邪魔者でしかありません。直し方は単純で、「前置きはスキップして、いきなり詩から始めて」と明示するだけです。

python— 02 / Cell 6: 前置きスキップ指示


# 「前置きはスキップして、直接詩から始めて」と明示
PROMPT = "Write a haiku about robots. Skip the preamble; go straight into the poem."
print(get_completion(PROMPT))

これだけで返答は Metallic hands clutch / ... から直接始まります。「言わなければ Claude は気を利かせない」——むしろ「気を利かせて補ってくる」傾向があるという事実を、最初の演習で体に染み込ませる構造です。

2-2. 「決めかねるバスケ問題」と「決めさせる」テクニック

「歴代最高のバスケ選手は誰?」と聞くと、Claude は判断を避けて Jordan / LeBron / Kareem を並列で挙げてしまいます。「絶対に 1 人だけ選ばないといけないとしたら誰?」と追い詰めると、初めて Michael Jordan を返します[1]

これは LLM が「断定を避けて多様な意見を提示する」ようにアラインメント(調整)されている自然な反応で、業務システムでは邪魔になることが多い。「強制」を明示することで突破できることを覚えておくと、分類タスクで効きます。

演習 2.1〜2.3 の要点

2.1 スペイン語化:System Prompt に「Always respond in Spanish.」と書く。2.2 1 人だけ答えさせる:「Reply with ONLY the player's name and nothing else, no punctuation.」のように 許される出力を 100% 限定する2.3 800 語以上書かせる:「Write a 1000-word story about ...」のように具体的な目標長を与える。すべての答えに共通するのは 「曖昧さを残さない」ことだけです。

you@anthropic-1p:~/tutorial 06_role_prompting.md【Chapter 3】ロール付与 — 「あなたは○○です」が劇的に効く理由

本家 03_Assigning_Roles_Role_Prompting.ipynb に対応します。「ロールプロンプティング」とは、Claude に 「あなたは○○の専門家です」 と人格や肩書きを与える技法です[1]。書く・書く・要約する・コードを読む——あらゆるタスクで効きます。

3-1. 「猫として答えて」のスタイル変化

本家 Cell 4 → Cell 6 の対比が分かりやすい例です。

python— ロールなし vs. 「猫」ロール


# ロールなし
PROMPT = "In one sentence, what do you think about skateboarding?"
print(get_completion(PROMPT))
# → "Skateboarding is a popular recreational activity..."(事務的)

# ロール付与
SYSTEM_PROMPT = "You are a cat."
print(get_completion(PROMPT, SYSTEM_PROMPT))
# → "Mrow! Skateboarding looks fun, but I prefer chasing my tail..."(猫っぽい)

同じ質問で、トーン・語彙・関心事が一変します。Claude は与えられた役割の 世界観から推論を組み立てるため、応答の質と方向性が根底から変わるのです。

3-2. 論理問題が解けるようになる

もっと実用上重要なのは、ロール付与だけで Claude の論理推論精度が上がるという事実です。本家 Cell 8 の有名な論理パズル:

Jack is looking at Anne. Anne is looking at George. Jack is married, George is not, and we don't know if Anne is married. Is a married person looking at an unmarried person?

ロールなしだと Claude は「アンの婚姻状態が不明なので答えられません」と答えがち。しかし以下のロールを付けると正答(Yes)に変わります。

python— 03 / Cell 10: 論理ボットの役割を与える


SYSTEM_PROMPT = "You are a logic bot designed to answer complex logic problems."
PROMPT = "Jack is looking at Anne. Anne is looking at George. Jack is married, George is not, and we don't know if Anne is married. Is a married person looking at an unmarried person?"
print(get_completion(PROMPT, SYSTEM_PROMPT))
# → "Yes. Case分け:もしAnneが既婚なら...(場合分けで証明)"

「論理問題のボットだ」と告げただけで、Claude は 場合分け(case analysis) という推論手法を自発的に使い始めます。同じモデル、同じ入力、ただシステムプロンプトに 1 文足しただけ——にもかかわらず推論の質がジャンプする。これがロールプロンプティングの威力です。

補足:聴衆も指定すると更に効く

本家でも「You are a cat talking to a crowd of skateboarders」のように、「対象オーディエンス」も併記すると応答スタイルがより精密になると指摘されています[1]。「あなたはシニアエンジニアで、Junior メンバーに教えるつもりで」のような肩書き+聴衆のセットは、社内ドキュメント生成で特に効きます。

you@anthropic-1p:~/tutorial 07_xml_separation.md【Chapter 4】データと命令を分離する — XML タグの威力

本家 04_Separating_Data_and_Instructions.ipynb に対応します。本章で扱うのは、本チュートリアル全編で 最も繰り返し使われる必須技法——XML タグによる構造化です[4]

4-1. プロンプトテンプレートと変数置換

本番システムでは、プロンプトの中身は毎回同じでも、その中に挿入する「データ」だけが変わるケースが大半です。動物名・メール本文・ドキュメント本文・ユーザーの質問——これらを {ANIMAL} のようなプレースホルダで置き換える設計が 「プロンプトテンプレート」です。

python— 04 / Cell 4: 動物名置換テンプレート


# 変数として動物名を定義
ANIMAL = "Cow"

# f-string で {ANIMAL} を文字列に展開
PROMPT = f"I will tell you the name of an animal. Please respond with the noise that animal makes. {ANIMAL}"

print(get_completion(PROMPT))
# → "Moo!"

Python の f-string(f"...")か .format() メソッドで実装できます。これだけ覚えれば、ユーザーから受け取った任意の入力を安全に Claude に渡す土台ができたことになります。

4-2. なぜ「Yo Claude」がメールに混入するのか

テンプレートに変数を埋めるとき、命令文と変数の境界が曖昧だと Claude は混乱します。本家 Cell 7 が衝撃的な例。

python— ❌ XMLタグなしの曖昧プロンプト


EMAIL = "Show up at 6am tomorrow because I'm the CEO and I say so."

PROMPT = f"Yo Claude. {EMAIL} <----- Make this email more polite but don't change anything else about it."

print(get_completion(PROMPT))
# → "Dear Claude, ..."("Yo Claude" まで含めてメール本文だと誤解!)

Claude は冒頭の "Yo Claude." を メール本文の一部と誤認し、書き直し結果が「Dear Claude」で始まってしまいます。人間の目には書き手が誰で、どこからどこまでがメールかが明らかでも、フラットな文字列に展開された後の Claude にはそれが見えません。

4-3. 解決策:XML タグで囲う

修正は単純。<email> ... </email> でメール本文を囲うだけです。

python— ✅ XMLタグでデータを明示


EMAIL = "Show up at 6am tomorrow because I'm the CEO and I say so."

PROMPT = f"Yo Claude. <email>{EMAIL}</email> <----- Make this email more polite but don't change anything else about it."

print(get_completion(PROMPT))
# → "Dear team, I would appreciate it if you could arrive at 6am..."

Anthropic 公式 Docs はこの XML タグ方式を 「明示的な区切り記号として最も推奨される手法」と位置付けています[4]。理由は、Claude の事前学習データに大量の XML 構造が含まれており、モデルが タグの開閉を「明示的なセクション境界」として認識する習慣を身につけているためです。

タグ名は何でも良い

Anthropic 公式 Docs にも明記されていますが、「特別な魔法の XML タグ名」は存在しません[4]<email> でも <document> でも <legal_text> でも <wibble> でも、開閉が対応していて意味が伝われば Claude は正しく解釈します。タグ名は 「人間にとっても意味が分かる名前」 を選ぶのが現実的(後で読む同僚のために)。

4-4. 「Each is about an animal」問題

本家 Cell 12 で示されるもう一つの落とし穴。リスト形式で文を渡すとき、命令文も同じ - プレフィックスで始めると、Claude は命令文をリストの一部だと誤認します。

python— ❌ 命令とデータが見分けられない


SENTENCES = """- I like how cows sound
- This sentence is about spiders
- This sentence may appear to be about dogs but it's actually about pigs"""

PROMPT = f"""Below is a list of sentences. Tell me the second item on the list.

- Each is about an animal, like rabbits.
{SENTENCES}"""

# Claude は "Each is about an animal, like rabbits." をリストの 1 番目だと判断し、
# 「2 番目は I like how cows sound」と誤答する

これも修正は <sentences> ... </sentences> で囲うだけ。これで Claude は「ここからここまでがデータだ」と理解し、正しく "This sentence is about spiders" を返します。

小さなタイポは Claude にも伝染する

本家でも強調されていますが、Claude は入力文のスタイルに釣られます[1]。あなたが知的に書けば Claude も知的に答え、雑に書けば雑に答え、誤字だらけで書けば誤字を真似する傾向がある。プロンプトのタイポは「Claude を賢く保つため」にも、見つけ次第直すのが投資効率が良い習慣です。

you@anthropic-1p:~/tutorial 08_format_prefill.md【Chapter 5】出力フォーマットの制御と Prefill 技法

本家 05_Formatting_Output_and_Speaking_for_Claude.ipynb に対応します。Claude の出力形式を 機械処理しやすい形に固定するための 2 大技法——「XML 出力の明示」と「Prefill(プレフィル)」を学びます。

5-1. 出力にも XML タグを使う

入力で XML タグが効くなら、出力にも効きます。「俳句を <haiku> タグで囲んで出して」と頼むだけで、後段の Python から re.search(r"<haiku>(.*?)</haiku>", text, re.DOTALL) のような正規表現で確実に抽出できる構造になります。

python— 05 / Cell 4: タグで出力を構造化


ANIMAL = "Rabbit"
PROMPT = f"Please write a haiku about {ANIMAL}. Put it in <haiku> tags."
print(get_completion(PROMPT))
# →
# Here is a haiku about rabbits:
# <haiku>
# Soft furry creatures
# Hopping through the green meadow
# Rabbits, free and bright
# </haiku>

5-2. Prefill:「Claude の口に文字を挿す」

本章の核心が Prefill(プレフィル)です[6]。Anthropic ドキュメント上の名称は「Prefill Claude's response」または「Speaking for Claude」。仕組みはシンプルで、messages 配列の末尾に assistant ロールのメッセージを 1 つ追加し、その内容として「Claude が言ってほしい先頭の文字列」を渡すだけです。Claude はその続きから書き始めます。

python— Prefill 対応の get_completion


def get_completion(prompt: str, system_prompt="", prefill=""):
    message = client.messages.create(
        model=MODEL_NAME,
        max_tokens=2000,
        temperature=0.0,
        system=system_prompt,
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": prefill}   # ★ ここに先頭文字列を入れる
        ]
    )
    return message.content[0].text

本家 Cell 6 の活用例:「俳句を書いて」というユーザーターンに対し、Assistant ターンに <haiku> だけ書いておく。すると Claude は前置きなしで <haiku> の続きから書き始めます——前章の「前置き問題」がワンショットで解決します。

5-3. JSON 出力を強制する裏技

もっと強力な使い方が、JSON 出力の強制です。Prefill に {(オープニング波カッコ)だけを入れておくと、Claude はその続きから JSON を書かざるを得なくなります。

python— 05 / Cell 8: JSON出力の強制


ANIMAL = "Cat"

PROMPT = f'Please write a haiku about {ANIMAL}. Use JSON format with the keys as "first_line", "second_line", and "third_line".'

PREFILL = "{"   # ★ これだけで JSON が確定

print(get_completion(PROMPT, prefill=PREFILL))
# →
# "first_line": "Whiskers in the moonlight",
# "second_line": "Soft paws on the windowsill",
# "third_line": "Cat dreams of the hunt"
# }

返答の冒頭に { が来ることが API 仕様レベルで保証されるため、後段で json.loads("{" + response) として確実にパースできます。これは LLM 製品開発で頻出する「構造化出力(structured output)」問題の最もシンプルな解です[6]

5-4. ボーナス:stop_sequences で出力を切る

本家 Cell 11 のボーナスレッスン。閉じタグを stop_sequences パラメータに渡すと、Claude は そのタグを生成した瞬間に出力を打ち切るように制御できます。

python— stop_sequences の活用


message = client.messages.create(
    model=MODEL_NAME,
    max_tokens=2000,
    temperature=0.0,
    messages=[
        {"role": "user", "content": "Write a haiku in <haiku> tags."},
        {"role": "assistant", "content": "<haiku>"}
    ],
    stop_sequences=["</haiku>"]   # ★ ここに到達した時点で生成停止
)

これにより、必要な部分だけが返ってきて、結びの言葉や蛇足が混じりません。レイテンシも料金も削減できるので、本番運用では積極的に使うべきテクニックです。

you@anthropic-1p:~/tutorial 09_step_by_step.md【Chapter 6】Precognition(事前考察)— Step by Step 思考

本家 06_Precognition_Thinking_Step_by_Step.ipynb に対応します。「Chain of Thought(CoT)」とも呼ばれるこの技法は、Claude に 「結論を出す前に思考を声に出して書け」 と指示することで、特に複雑なタスクの精度を劇的に上げます[1]

「思考は声に出さなければ存在しない」

本家がはっきり書いている重要原則:「Thinking only counts when it's out loud」。「考えてから答えて」と言うだけで、出力は答えだけ——という頼み方では思考自体が起きません。Claude は 「書いたものがすべて」のモデルなので、推論ステップを 本文として書かせる必要があります。

6-1. 「皮肉な映画レビュー」が分類できない

本家 Cell 4 の有名な例。

"This movie blew my mind with its freshness and originality. In totally unrelated news, I have been living under a rock since the year 1900."
(この映画は新鮮さと独創性で度肝を抜かれた。なお、まったく無関係な話だが、私は 1900 年から岩の下に住んでいる)

人間にはすぐ「2 文目で 1 文目を皮肉ってる」と分かりますが、Claude に「これは positive ですか negative ですか?」と単純に聞くと、"unrelated"(無関係)という言葉を額面通り受け取って positive と答える失敗を起こします。

6-2. 解決策:「両側の論拠を書き出せ」

修正は次のとおり。

python— 06 / Cell 6: 両論を書き出させる


SYSTEM_PROMPT = "You are a savvy reader of movie reviews."

PROMPT = """Is this review sentiment positive or negative? First, write the best arguments for each side in <positive-argument> and <negative-argument> XML tags, then answer.

This movie blew my mind with its freshness and originality. In totally unrelated news, I have been living under a rock since 1900."""

print(get_completion(PROMPT, SYSTEM_PROMPT))

Claude は <positive-argument><negative-argument> の両方を書き出した結果、「2 文目は皮肉なので、これは negative である」と正しく判定するようになります。

6-3. ⚠️ 順序の罠:Claude は「2 番目の選択肢」を好む

本家 Cell 7 で警告される、初心者を 100% 引っかける罠。Claude は与えられた 2 択のうち、後に書かれた方を選ぶ確率がやや高い傾向があります[1]。これは学習データ中で「正解選択肢が後に来る」パターンが多かった統計的バイアスと推測されています。

対策は 「重要な選択肢の順序を意図して制御する」 こと。本家 Cell 8 では順序を逆にした例("negative or positive" と "negative-argument" を先に書く)で、判定が逆転することを実演しています。本番システムでは、選択肢の出現順をランダム化するか、CoT を二度回して結果が一致するか確かめるのが堅牢な実装です。

6-4. ブレインストーミングタグで知識を引き出す

本家 Cell 12 のもう一つの頻出パターン。「1956 年生まれの俳優が出演した有名映画を 1 本挙げよ」という質問は、Claude にとって 俳優の生年という事実知識その俳優が出ている映画の知識の 2 段検索が必要です。何も指示しないと、Claude は適当に名前を捏造(=ハルシネーション)してしまうことがあります。

python— 06 / Cell 12: brainstorm タグで思考を吐かせる


PROMPT = "Name a famous movie starring an actor who was born in the year 1956. First brainstorm about some actors and their birth years in <brainstorm> tags, then give your answer."

print(get_completion(PROMPT))
# →
# <brainstorm>
# - Tom Hanks (1956) - "Forrest Gump"
# - Mel Gibson (1956) - "Braveheart"
# ...
# </brainstorm>
# Tom Hanks starred in "Forrest Gump"...

事実知識の照合を 明示的に紙の上で行わせることで、Claude は出力前に自己検証する余裕が生まれます。これが Anthropic 公式が <scratchpad><brainstorm> タグを多用する理由です[7]

you@anthropic-1p:~/tutorial 10_few_shot.md【Chapter 7】Few-Shot プロンプティング — 「説明より例示」

本家 07_Using_Examples_Few-Shot_Prompting.ipynb に対応します。Few-Shot とは 「期待する入出力の見本を 1〜数個プロンプトに含める」技法。「シェル」がない=ゼロショット、1 つ=ワンショット、N 個=N ショットと呼びます。

7-1. 「Santa は来るの?」問題

本家 Cell 4 の例。「クリスマスにサンタは来る?」と聞くと、デフォルトの Claude は 「Santa Claus is a beloved figure in Western Christmas traditions...(サンタは西洋のクリスマスの伝統的人物で...)」 のような 事務的・百科事典的な答えを返してきます。子供向けの「親 bot」を作るアプリには大事故。

これを「子供を傷つけない優しい親風」に直すには、例を 1 個見せるだけで済みます。

python— 07 / Cell 6: 1ショットでトーン伝達


PROMPT = """Please complete the conversation by writing the next line, speaking as "A".
Q: Is the tooth fairy real?
A: Of course, sweetie. Wrap up your tooth and put it under your pillow tonight. There might be something waiting for you in the morning.
Q: Will Santa bring me presents on Christmas?"""

print(get_completion(PROMPT))
# → "Of course, sweetheart! If you've been a good little one all year, Santa will visit your house tonight..."

「歯の妖精」の答え方を 1 つ見せただけで、Claude は 同じトーン・同じ語彙レベル・同じ世界観でサンタの質問にも答えるようになる。「優しい親のように答えてください」と 5 行説明するより、見本 1 つの方が遥かに強い——これが Few-Shot の本質です。

7-2. フォーマット見本を見せると抽出も精密になる

本家 Cell 8 では、3 つの架空の村の説明文から「人物名 [職業]」を抽出させるタスクで、見本 2 つ+本番 1 つの Few-Shot 構造が示されます。指示は「Extract names and professions」のような曖昧なものではなく、正解のフォーマット例 2 つを見せて、3 つ目はそれに倣わせる。

python— 07 / Cell 8: 抽出タスクの Few-Shot


PROMPT = """Silvermist Hollow, a charming village... [中略:人物紹介の文章]
<individuals>
1. Dr. Liam Patel [NEUROSURGEON]
2. Olivia Chen [ARCHITECT]
3. Ethan Kovacs [MUSICIAN AND COMPOSER]
4. Isabella Torres [CHEF]
</individuals>

At the heart of the town, Chef Oliver Hamilton... [中略:別の村の文章]
<individuals>
1. Oliver Hamilton [CHEF]
2. Elizabeth Chen [LIBRARIAN]
3. Isabella Torres [ARTIST]
4. Marcus Jenkins [COACH]
</individuals>

Oak Valley, a charming small town... [本番:抽出させたい新しい文章]"""

PREFILL = "<individuals>"   # ★ Prefill で形式を確定
print(get_completion(PROMPT, prefill=PREFILL))

見本 2 つ+ Prefill の組み合わせで、Claude は「番号. 名前 [職業全部大文字]」というフォーマットを 説明されなくても完璧に再現します。Anthropic 公式 Docs では、これが 「最も簡単で、最も効果が高い」プロンプト改善として位置付けられています[1]

何個見本を入れるべきか

本家は「多ければ多いほど良い(generally more examples = better)」と書いていますが、現場では 3〜5 個でほぼ頭打ちすることが多いです。エッジケース(境界条件)の見本を意識して入れることのほうが、単純に数を増やすより効果が出ます。「これは A に分類すべき」「でもこのケースは B」「曖昧なときは C」——という 3 つを見せるイメージ。

you@anthropic-1p:~/tutorial 11_hallucination.md【Chapter 8】ハルシネーション抑制の 3 技法

本家 08_Avoiding_Hallucinations.ipynb に対応します。ハルシネーションとは、Claude が「事実でないこと」を「事実のように」答えてしまう現象。本章では、これを 「設計で止める」3 つの技法を学びます。

8-1. 技法 ① 「逃げ道」を与える

本家 Cell 4 の有名な例。「歴代で最も重い hippo(カバ)は誰?」と聞くと、Claude は 役に立とうとして架空のカバの名前と体重を捏造します。これが Anthropic が指す「Claude が役立とうとする善意の副作用」としてのハルシネーションです[1]

解決策は驚くほど単純。「確信があるときだけ答えていい」と一文足すだけです。

python— 08 / Cell 6: 逃げ道を与える


PROMPT = "Who is the heaviest hippo of all time? Only answer if you know the answer with certainty."
print(get_completion(PROMPT))
# → "I don't have certain information about the heaviest hippo of all time..."

たったこれだけ。「確信がなければ答えなくて良い」という許可を 明示的に与えると、Claude は無理して答えるのをやめます。

8-2. 技法 ② 「先に証拠を集めさせる」(scratchpad パターン)

本家 Cell 8 〜 10 で示される、長文ドキュメントから情報を引き出すときの最強パターン。

本家ではマターポート社(3D 撮影 SaaS)の SEC 10-K(米国の決算報告書)を Claude に読ませ、「2020 年 5 月 31 日時点の subscriber 数は?」と質問します。実は文中に「2022 年 12 月 31 日時点で 701,000 人」という別日付の数字しかないのに、何の指示もないと Claude は 近い数字を 2020 年 5 月 31 日のものとして捏造してしまいます。

修正パターンは <scratchpad> タグで「まず関連する引用を抜き出させ、それが質問に答えているか自己検証させてから、答える」フローを強制すること。

python— 08 / Cell 10: scratchpad で証拠優先


PROMPT = """<question>What was Matterport's subscriber base on the precise date of May 31, 2020?</question>
Please read the below document. Then, in <scratchpad> tags, pull the most relevant quote from the document and consider whether it answers the user's question or whether it lacks sufficient detail. Then write a brief numerical answer in <answer> tags.

<document>
... [SEC filing 全文] ...
</document>"""

print(get_completion(PROMPT))
# →
# <scratchpad>
# Most relevant quote: "As of December 31, 2022, our subscriber base had grown approximately 39% to over 701,000 subscribers from 503,000 subscribers as of December 31, 2021..."
# This quote is about 2022 and 2021, not May 31, 2020. The document does not mention May 31, 2020.
# </scratchpad>
# <answer>The document does not provide subscriber data for May 31, 2020.</answer>

scratchpad で 「引用→質問との照合→答えに足りるかの判断」 という人間の文献調査プロセスを Claude にトレースさせる——これが Anthropic 公式の RAG / 文献分析プロンプトの定石です。

本家からの重要な小ネタ:質問は文末に置け

本家 Cell 7 のノートに明記されている 「ベストプラクティス」「質問は長文ドキュメントの後に置く」。本家サンプルは読みやすさのために質問を文頭に置いていますが、本番では System に背景・User の最後に質問 という構造の方が、Claude の参照精度が上がる傾向があります[1]。これは次章 (Chapter 9) のテンプレートにも反映されている設計原則です。

8-3. 技法 ③ Temperature を下げる

本家 Cell 11 のボーナスレッスン。Temperature は 創造性ダイヤル。0 に近づけるほど決定的な答えに、1 に近づけるほどばらつき大きい答えになります[3]。事実問答・分類・抽出のような 「正解が 1 つ」のタスクでは temperature=0 一択。創作・ブレインストーミング・命名のような 「多様性が欲しい」タスクでは 0.7 前後が目安、というのが Anthropic 公式の経験則です。

you@anthropic-1p:~/tutorial 12_complex_anatomy.md【Chapter 9】複雑プロンプトを 10 要素で組み立てる

本家 09_Complex_Prompts_from_Scratch.ipynb に対応します。本チュートリアルの 知的最高峰であり、ここまで学んだすべての技法を 1 つのフレームに統合する 「10 要素プロンプトアナトミー」を扱います。Code w/ Claude 2025 の Prompting 101 セッション[5]でも、同じ枠組みが繰り返し示されました。

9-1. 10 要素一覧表

# 要素名 役割 典型的な配置
1 User role messages 配列の最初は必ず user ロールから始める。 messages[0]
2 Task context Claude に「あなたが誰で、何を達成しようとしているか」を伝える。 System Prompt 先頭
3 Tone context 応答のトーン・口調・人格を指定。 System Prompt
4 Detailed task description & rules 具体的な制約、禁止事項、ガードレール(逃げ道含む)。 System Prompt
5 Examples 正解の入出力ペアを 1〜数個。Few-Shot。 System Prompt(推奨)
6 Input data to process 分析対象のデータ。XML タグで囲って区切る。 User Prompt(動的)
7 Immediate task description 「今このターンで何をしてほしいか」の念押し。 User Prompt 末尾
8 Precognition (think step by step) 「順番に考えてから答えて」の明示。 User Prompt(タスク直後)
9 Output formatting JSON / XML / Markdown など出力形式の指定。 User Prompt 末尾
10 Prefilled response Assistant ターンの先頭に書いておく文字列。 messages の最後の assistant

すべての要素が必須ではありません。タスクに応じて取捨選択しますが、順序にはベストプラクティスがあると本家は明言しています[1]

9-2. キャリアコーチ Bot の実装例

本家 Cell 4 の有名な例題——AdAstra Careers 社の AI キャリアコーチ「Joe」を、10 要素すべてを使って組み立てるサンプルを 日本語コメント付きで再構成します。

python— 09 / Cell 4: 10要素フル装備のキャリアコーチ Bot


######## 入力変数 ########
# 過去の会話履歴
HISTORY = """Customer: Give me two possible careers for sociology majors.

Joe: Here are two potential careers for sociology majors:
- Social worker - ...
- Human resources specialist - ..."""

# ユーザーの今回の質問
QUESTION = "Which of the two careers requires more than a Bachelor's degree?"

######## 10 要素 ########

# 要素 2: Task context(あなたは誰で、何をする)
TASK_CONTEXT = "You will be acting as an AI career coach named Joe created by the company AdAstra Careers. Your goal is to give career advice to users. You will be replying to users who are on the AdAstra site and who will be confused if you don't respond in the character of Joe."

# 要素 3: Tone context(口調)
TONE_CONTEXT = "You should maintain a friendly customer service tone."

# 要素 4: Detailed task description and rules(ガードレール)
TASK_DESCRIPTION = """Here are some important rules for the interaction:
- Always stay in character, as Joe, an AI from AdAstra Careers
- If you are unsure how to respond, say "Sorry, I didn't understand that. Could you rephrase your question?"
- If someone asks something irrelevant, say, "Sorry, I am Joe and I give career advice. Do you have a career question today I can help you with?"
"""

# 要素 5: Examples(Few-Shot)
EXAMPLES = """Here is an example of how to respond in a standard interaction:
<example>
Customer: Hi, how were you created and what do you do?
Joe: Hello! My name is Joe, and I was created by AdAstra Careers to give career advice. What can I help you with today?
</example>"""

# 要素 6: Input data to process
INPUT_DATA = f"""Here is the conversational history (between the user and you) prior to the question. It could be empty if there is no history:
<history>
{HISTORY}
</history>

Here is the user's question:
<question>
{QUESTION}
</question>"""

# 要素 7: Immediate task description(念押し)
IMMEDIATE_TASK = "How do you respond to the user's question?"

# 要素 8: Precognition(思考促進)
PRECOGNITION = "Think about your answer first before you respond."

# 要素 9: Output formatting
OUTPUT_FORMATTING = "Put your response in <response></response> tags."

# 要素 10: Prefill(出力先頭固定)
PREFILL = "[Joe] <response>"

######## 結合 ########
PROMPT = f"""{TASK_CONTEXT}

{TONE_CONTEXT}

{TASK_DESCRIPTION}

{EXAMPLES}

{INPUT_DATA}

{IMMEDIATE_TASK}

{PRECOGNITION}

{OUTPUT_FORMATTING}"""

# 実行
print(get_completion(PROMPT, prefill=PREFILL))

このプロンプトは 本家の演習解答(Codebot や Financial Bot)でも同じ構造で使い回されます。要素の順序は厳密ではなく、本家 Cell 8(Legal Services の例)では順序を入れ替えていることが 「scientific trial and error(科学的試行錯誤)」 として明示的に推奨されています[1]

本家の哲学:「全部入れて削れ」

本家が繰り返す原則:「複雑なプロンプトは、まず 10 要素全部入れて動かしてから、不要な要素を削っていけ」。最初から最小化を狙うと、どの要素が効いているか分からないまま動かない状態が続きます。「動く状態」をまず作って、そこから引き算するのが Anthropic 公式の流儀です[1]

9-3. 演習 9.1 / 9.2 のヒント

  • 9.1 Financial Services Chatbot:83(b) elections のような税法の質問に、{TAX_CODE} を参照しながら答える Bot を組む。XML タグでコード本文を囲い、scratchpad で関連条文を引用させてから結論を書かせる構造が正解パターン。
  • 9.2 Codebot:壊れた Python コード(x / ii=0 のときゼロ除算が起きる)を渡し、教えるトーンで指摘させる Bot。Persona に「優しい教育者」を入れ、「答えだけを教えない、ヒントから始める」ルールをガードレールに書く。

you@anthropic-1p:~/tutorial 13_chaining.md【Appendix 10.1】Prompt Chaining — 思考を連鎖させる

本家 10.1_Appendix_Chaining Prompts.ipynb に対応します。プロンプトチェーンとは、1 つの大きなプロンプトを 1 回叩く代わりに、複数の小さなプロンプトを順番に叩いて結果を次の入力に渡す設計パターンです[8]

10.1-1. ヘルパー関数の進化

本章から get_completion「単一プロンプト」ではなく「messages 配列」を受け取る形に変わります。これは「過去のターンを保持したまま追加のターンを送る」マルチターン操作を可能にするためです。

python— 10.1 / Cell 1: messages 配列対応版


def get_completion(messages, system_prompt=""):
    message = client.messages.create(
        model=MODEL_NAME,
        max_tokens=2000,
        temperature=0.0,
        system=system_prompt,
        messages=messages   # ★ 配列をそのまま渡せる
    )
    return message.content[0].text

10.1-2. 「自己批判→自己修正」チェーン

本家 Cell 4〜6 の例。最初に「'ab' で終わる単語を 10 個挙げて」と頼むと、Claude は 1〜2 個は架空の単語を混ぜてしまうことがあります("Crab" は OK だが "Drab" は実在語、"Splab" は捏造、など)。これを修正させる第 2 ターンを足すパターン:

python— 10.1 / Cell 6: 2ターンで自己修正


# ターン1:最初の依頼
first_user = "Name ten words that all end with the exact letters 'ab'."
messages = [{"role": "user", "content": first_user}]
first_response = get_completion(messages)

# ターン2:最初の回答を assistant として残し、修正を依頼
second_user = "Please find replacements for all 'words' that are not real words."
messages = [
    {"role": "user", "content": first_user},
    {"role": "assistant", "content": first_response},
    {"role": "user", "content": second_user}
]
print(get_completion(messages))

これだけで、Claude は最初の答えを自己批判して、捏造した単語を実在語に置き換えるようになります。「Writing is rewriting(書くとは、書き直すことだ)」という Anthropic 公式の格言通り、Claude も書き直しによって精度が上がるのです[8]

10.1-3. 「逃げ道」を残してオーバー修正を防ぐ

本家 Cell 8〜10 で示される重要な発展。Claude は「修正しろ」と言われると、すでに正しい答えでも何かしら直そうとして改悪することがあります。これを防ぐには、再び 「逃げ道を与える」 のが有効:

python— 10.1 / Cell 10: オーバー修正防止


second_user = "Please find replacements for all 'words' that are not real words. If all the words are real words, return the original list."

「全部実在語だったら元のリストをそのまま返せ」と書くだけ。Chapter 8 で学んだ「逃げ道」原則の、まさに横展開です。

10.1-4. 関数呼び出しの土台としてのチェーン

本家 Cell 16〜18 で示される最後のパターン:「メールから人名を抽出 → 抽出結果を別のプロンプトに渡してアルファベット順に並べ替え」というチェーンです。第 1 ターンの出力を、第 2 ターンの入力に渡す——この単純な発想が、次章で学ぶ Tool Use(関数呼び出し)の基礎になります。

you@anthropic-1p:~/tutorial 14_tool_use.md【Appendix 10.2】Tool Use / Function Calling — Claude に「道具」を持たせる

本家 10.2_Appendix_Tool Use.ipynb に対応します。Tool Use(関数呼び出し)は、Claude に 外部関数や API を呼び出す能力を与える技法です。本家の言葉を借りれば「実は単なる substitution(置換)と prompt chaining の組み合わせ」[1]

本家の重要注意:仕組みを理解するための旧式

本家チュートリアルが書かれた当時は、Anthropic 公式の Tool Use API(現在の tools パラメータ)はまだ正式版がなく、System Prompt に <function_calls> 構造を手書きする旧方式で実装されています。本記事も 仕組みを理解するために 旧方式で解説します。本番運用では Anthropic 公式 Docs の tools パラメータを使うのが現行ベストプラクティス[9]です。

10.2-1. Tool Use の 3 ステップフロー

Claude は実際に関数を実行できません。代わりに、次の 3 段階フローで「外部の関数の結果」を取り込みます[1]

  1. Claude が「この関数をこの引数で呼びたい」と書く(System Prompt で関数仕様を定義済み)。
  2. あなたのプログラムが Claude の出力をパースして、実際にその関数を実行する。
  3. 関数の戻り値を所定のフォーマットで Claude に再投入し、続きを書かせる。

10.2-2. システムプロンプトで関数仕様を宣言

本家 Cell 7〜9 で示される 2 段構成。第 1 段は「関数呼び出しの一般的な仕組み」、第 2 段は「今回 Claude に持たせる具体的な関数」を XML で定義します。

python— 10.2 / Cell 9: 計算機ツールの定義


system_prompt_tools_specific = """Here are the functions available in JSONSchema format:
<tools>
<tool_description>
<tool_name>calculator</tool_name>
<description>
Calculator function for doing basic arithmetic.
Supports addition, subtraction, multiplication
</description>
<parameters>
<parameter>
<name>first_operand</name>
<type>int</type>
<description>First operand (before the operator)</description>
</parameter>
<parameter>
<name>second_operand</name>
<type>int</type>
<description>Second operand (after the operator)</description>
</parameter>
<parameter>
<name>operator</name>
<type>str</type>
<description>The operation to perform. Must be either +, -, *, or /</description>
</parameter>
</parameters>
</tool_description>
</tools>
"""

10.2-3. Claude が関数呼び出しを書く

1,984,135 × 9,343,116 を計算して」と頼むと、Claude は 計算しません(LLM は大きい数の暗算が苦手)。代わりに、関数呼び出しを <function_calls> ブロックで出力します。

text— Claude の応答(旧形式)


<function_calls>
<invoke name="calculator">
<parameter name="first_operand">1984135</parameter>
<parameter name="second_operand">9343116</parameter>
<parameter name="operator">*</parameter>
</invoke>
</function_calls>

ここで stop_sequences=["</function_calls>"] を渡しておくと、Claude は閉じタグを書いた瞬間に止まり、あなたの Python に制御が戻ります。あとは正規表現でパラメータを抜き出して、ローカルで 1984135 * 9343116 = 18,538,003,464,660 を計算するだけ。

10.2-4. 結果を Claude に戻す

計算結果は次の決まったフォーマットで Claude に返します(このフォーマットは Claude が学習している専用構造)。

text— 関数結果の注入フォーマット


<function_results>
<result>
<tool_name>do_pairwise_arithmetic</tool_name>
<stdout>
18,538,003,464,660
</stdout>
</result>
</function_results>

これを assistant ロールに </function_calls> を補完した形で残し、続けて user ロールで上記の結果を投入。Claude は最終回答として「1,984,135 × 9,343,116 = 18,538,003,464,660 です」と人間向けの文章を返してきます。

10.2-5. 関数を呼ばないケースも自然に動く

本家 Cell 21 の最後の確認。「フランスの首都を教えて」と聞くと、Claude は 計算機は呼ばずに「Paris」と直接答えます必要なときだけ道具を使う判断ができることが、Tool Use 設計の最大の強みです。

演習 10.2.1:3 行 SQL データベースを Claude に操作させる

本家の演習は、辞書で表現した極小データベースに対して get_user / get_product / add_user / add_product の 4 関数を Claude に持たせるもの。前述のテンプレに沿って 4 つの <tool_description> を書き、4 種類のユーザー指示(「Deborah を追加して」「ID 2 のユーザー名は?」など)に対して正しい関数呼び出しが生成されるかを確認する内容です。Tool Use 全体の流れを身体化する最良の演習。

you@anthropic-1p:~/tutorial 15_search_rag.md【Appendix 10.3】Search & Retrieval (RAG) — 知識を後付けで注入する

本家 10.3_Appendix_Search & Retrieval.ipynb に対応します。本家の最後の章で、内容は意図的に 「次の学習リソースへの橋渡し」に絞られています。

Did you know you can use Claude to search through Wikipedia for you? Claude can find and retrieve articles, at which point you can also use Claude to summarize and synthesize them, write novel content from what it found, and much more. And not just Wikipedia! You can also search over your own docs, whether stored as plain text or embedded in a vector datastore.

"Anthropic Prompt Engineering Interactive Tutorial — Appendix 10.3" / [1]

10.3-1. RAG とは何か

RAG(Retrieval-Augmented Generation、検索拡張生成)は、Claude の「知らないこと」を補うため 外部の知識ベースから関連情報を検索 → プロンプトに含めて → 回答させる設計パターンです。Anthropic 公式が推奨するのは次の 2 段構成:

  1. 検索フェーズ:ユーザーの質問をクエリにして、Wikipedia / 社内ドキュメント / ベクトル DB などから関連ドキュメントを取り出す。Claude にクエリ生成を任せても良いし、ベクトル類似度検索(embeddings)を使っても良い[1]
  2. 生成フェーズ:取り出したドキュメントを <document> タグで囲ってプロンプトに含め、Chapter 8 で学んだ <scratchpad> パターンで「証拠 → 検証 → 回答」させる。

10.3-2. Anthropic 公式が指す次のリソース

本家 10.3 章は短いので、Anthropic 公式が推奨する 次の学習リソースを実用的な順に整理します。

リソース 内容 本家での位置付け
anthropic-cookbook 本番運用レベルの実装例コレクション。Wikipedia 検索の RAG 実装も含む。 「次の自学」として明示推奨
Embeddings ドキュメント Voyage 等の埋め込みモデル&ベクトル DB の使い方。 RAG の検索フェーズの土台
Prompt Engineering Overview[2] 本チュートリアルを補完する公式ガイド。 本家からも明示リンク
Prompt Library 商用利用可能なプロンプトテンプレート集。 本家からも明示リンク
本記事から RAG を本格学習したい人へ

本チュートリアルを終えたら、次に Anthropic Cookbook の third_party/Wikipedia/wikipedia-search-cookbook.ipynb を写経することを Anthropic 公式が推奨しています[1]。本記事の Chapter 9 で学んだ「10 要素アナトミー」と Chapter 14 で学んだ「Tool Use」を、検索 API という具体的な道具に当てはめる、最良の橋渡し演習です。

you@anthropic-1p:~/tutorial 16_checklist.md全 13 章 DO / DON'T チェックリスト 30 項目と次のステップ

本記事で扱った全 13 章のエッセンスを、明日のプロンプトを直すための実用チェックリストに圧縮しました。動かないプロンプトに当たったら、上から順に確認してください。

DO ✅ — 必ずやるべきこと(15 項目)

  1. messages 配列は必ず user ロールから始める(Chapter 1)。
  2. user / assistant は必ず交互に並べる。連続不可(Chapter 1)。
  3. System Prompt は messages ではなく system パラメータに渡す(Chapter 1)。
  4. 事実問答・分類タスクでは temperature=0。創作系は 0.7 前後(Chapter 8)。
  5. プロンプトを同僚に見せて「分かる?」と聞く。これが Golden Rule(Chapter 2)。
  6. 役割を 1 文で与える("You are a logic bot...")。論理タスクの精度が跳ね上がる(Chapter 3)。
  7. 変数は必ず XML タグで囲う<email> <document> など)(Chapter 4)。
  8. 長文ドキュメントは System に、質問は User の最後に置く(Chapter 8)。
  9. 出力に XML タグを要求する。下流での抽出が確定する(Chapter 5)。
  10. JSON 出力が欲しいときは Prefill に { を入れる(Chapter 5)。
  11. 難しい質問には Chain of Thought を強制する<brainstorm> <scratchpad>)(Chapter 6)。
  12. 正解の見本を 2〜3 個入れる。説明より遥かに強い(Chapter 7)。
  13. 「分からないなら『分からない』と答えていい」と逃げ道を与える(Chapter 8)。
  14. 長文ドキュメントは scratchpad で証拠 → 検証 → 回答のフローを強制(Chapter 8)。
  15. 複雑なプロンプトは 10 要素で組み立て、後から削る(Chapter 9)。

DON'T ❌ — やってはいけないこと(15 項目)

  1. messages の最初を assistant にしない。エラーになる。
  2. user を 2 連続で並べない。エラーになる。
  3. System Prompt と User Prompt の役割を混ぜない。指示遵守率が落ちる。
  4. 「曖昧な指示」を残さない。「best」「nice」「good」だけは Claude が困る。
  5. Claude に「気を利かせる」ことを期待しない。明示しないことは無視される。
  6. 変数を XML タグなしで埋め込まない。"Yo Claude" がメール本文に混入する。
  7. 命令とリストを同じ - 記号で並べない。Claude がリストの一部と誤認する。
  8. 「考えて、でも答えだけ書いて」と頼まない。CoT は声に出させないと発動しない。
  9. 2 択を順序固定で何度も聞かない。Claude は 2 番目を選びやすいバイアスがある。
  10. 長文ドキュメントの中ほどに質問を埋めない。最後に置く。
  11. 「修正して」とだけ頼んで逃げ道を与えない。正しい答えまで改悪される。
  12. Tool Use のレスポンスフォーマットを自己流にしない<function_results> 構造を厳守する。
  13. Extended Thinking を本番に残さない(Code w/ Claude 2025 のベストプラクティス[5])。デバッガとして使い、推論ロジックは System Prompt に焼き直す。
  14. API キーをコードに直書きしない。環境変数か .env + python-dotenv を使う。
  15. 本家 Notebook を「読むだけ」で終わらせない。13 章すべての演習を実際に手で動かす。Anthropic 公式の言葉を借りれば、「prompt engineering is rarely purely formulaic(プロンプト工学は決して定型的なものではない)」[1]

本記事を超えて — 次の 3 ステップ学習路線

  1. 本家 Notebook を写経する。本記事は読み物として「全部分かる」ように作ったが、手を動かす経験を完全に置き換えるものではない。GitHub の anthropics/prompt-eng-interactive-tutorial[1]git clone して、Jupyter で 1 セルずつ実行する。
  2. Code w/ Claude 2025 の "Prompting 101" 動画を見る。本記事の 10 要素アナトミー(Chapter 9)の理解を、Anthropic Workbench 上のライブ実演で立体化できる[5]。当 ブログの 『Prompting 101』完全ガイドと併読すると吸収速度が倍速。
  3. Anthropic Cookbook で本番品質のサンプルを写経する。RAG / Tool Use / Vision / Streaming など、本チュートリアルの先にある全テーマの実装例が揃っている。
本記事の運用宣言

本記事は、Anthropic が将来 1P チュートリアルを更新したり、新しいモデル(Claude 4 系)に対応した版が出た時点で、内容を追従改訂する方針です。Tool Use の章は、本家が将来 Anthropic 公式 tools パラメータを使った版に書き換えた時点で、本記事の Chapter 14 も tools パラメータの解説に差し替える予定です。

Anthropic 1P チュートリアル全 13 章の日本語化、ここで完結です。最初の "Hello, Claude!" から、複雑な Tool Use チェーンまで、Claude API でできる「ほぼすべての基礎」が手に入ったはず。残るは あなた自身のプロダクトに当てはめて、動かして、直すこと——本家の最終章が祝うとおり、"You are now in the top 0.1% of LLM whisperers" の世界へ、ようこそ。


References

  1. Anthropic, Inc. "Prompt Engineering Interactive Tutorial — Anthropic 1P." GitHub repository. https://github.com/anthropics/prompt-eng-interactive-tutorial/tree/master/Anthropic%201P
  2. Anthropic, Inc. "Prompt engineering overview." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview
  3. Anthropic, Inc. "Messages API reference." Anthropic Documentation. https://docs.anthropic.com/en/api/messages
  4. Anthropic, Inc. "Use XML tags to structure your prompts." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/use-xml-tags
  5. Hannah Moran & Christian Ryan (Anthropic Applied AI). "Prompting 101 | Code w/ Claude." YouTube, 2025-05-22. https://www.youtube.com/watch?v=ysPbXH0LpIE
  6. Anthropic, Inc. "Prefill Claude's response for greater output control." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/prefill-claudes-response
  7. Anthropic, Inc. "Let Claude think (chain of thought prompting) to increase performance." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/chain-of-thought
  8. Anthropic, Inc. "Chain complex prompts for stronger performance." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/chain-prompts
  9. Anthropic, Inc. "Tool use with Claude." Anthropic Documentation. https://docs.anthropic.com/en/docs/build-with-claude/tool-use

おすすめの記事