Building with the Claude API 第7章 — Anthropicアプリ・Claude Code・エージェントとワークフロー
Lesson: Anthropic apps(Anthropicのアプリ)
このモジュールでは、Anthropic自身が構築してデプロイした2つのアプリケーションを見ていく。それが Claude Code と Computer Use である。
- Claude Code: ターミナルベースのコーディングアシスタント。まずセットアッププロセスを一緒に進め、その後、非常に小さなサンプルプロジェクトで実際にどう動くかを理解していく。
- Computer Use: Claudeの能力を劇的に拡張するツール群。
Claude CodeとComputer Useはどちらもそれ自体で非常に有用だが、この2つを取り上げるにはもう一つ理由がある。Claude CodeとComputer Useはagentの完璧な実例であり、これらがどう動くかを理解することで、agentとは何か、効果的なagentをどう構築するかをより深く理解できるようになる、という位置づけである。
次のビデオではまず、Claude Codeのセットアッププロセスを進めていく。
Lesson: Claude Code setup(Claude Codeのセットアップ)
Claude Codeを見ていく。セットアップを行い、動作の仕組みを学び、いくつかの高度なユースケースも見ていく。
Claude Codeとは: ターミナルで実行されるプログラムで、幅広いコード関連タスクを支援してくれる、ターミナルベースのコーディングアシスタント。現在はターミナルCLIを中核としつつ、Web版・デスクトップアプリ・VS Code/JetBrains拡張・Slack統合・CI連携など複数のサーフェスでも利用できる。
Claude Codeが持つツール:
- コーディングプロジェクトを支援するため、Claude Codeは多くの異なるツールにアクセスできる。
- 基本的なツール: ファイルの検索・読み込み・編集などの能力。
- 高度なツール: web fetchingやターミナルアクセスなど。
- Claude CodeはMCPクライアントとしても動作できる。つまり、MCPサーバーが提供するツールを消費(consume)できるということであり、追加のMCPサーバーを組み込むことでClaude Codeの能力を簡単に拡張できる。
セットアップ手順(3ステップ):
- Node.jsをインストールする。すでにNodeがインストール済みかもしれないので、ターミナルを開いて
node --versionを実行して確認する(npm helpはnpmの使い方テキストを表示するだけなので、Node/npmの導入有無の確認には使えない)。 - Nodeがインストールされたら、
npm install -g @anthropic-ai/claude-codeコマンドでClaude Code自体をインストールする(単なるnpm installではカレントディレクトリの依存関係インストールになってしまうため、-gフラグとパッケージ名が必要)。なお現在の公式ドキュメントでは、npm経由のインストールは「Advanced installation options」に位置づけられる代替手段(Node.js 22以降が必要)であり、主要な推奨手順はNode.js不要のネイティブインストーラ(curl -fsSL https://claude.ai/install.sh | bashなど、macOS/Linux/WSL向け)やHomebrew、WinGetになっている。 - インストールが完了したら、ターミナルで
claudeコマンドを実行する。これによりAnthropicアカウントへのログインを促される。
完全なセットアップガイドは公式Anthropicドキュメント(docs.anthropic.com)にある。この3ステップを各自で進め、完了したら小さなプロジェクトを一緒に見ていき、Claude Codeが実際に何をしてくれるのかを確認する。
Lesson: Claude Code in action(実践するClaude Code)
Claude Codeのハンズオン経験を積むため、講師が取り組み用の小さなプロジェクトを用意した。このレクチャーに添付されたzipファイルにプロジェクトのソースがある。zipをダウンロードし、内容を展開し、この新しいプロジェクトディレクトリの中でコードエディタを起動することが推奨される。
Claude Codeについて理解すべき重要なこと: プロジェクトの中身を見たりReadMeファイルに書かれたセットアップを進めたりする前に、まず理解してほしいことがある。Claude Codeは単にコードを書いてくれるだけのツールではない。もちろんコードを書くことは完全にできるが、それだけがClaude Codeの本質ではない。むしろ、Claude Codeはプロジェクトを一緒に手がけるもう一人のエンジニアとして捉えるべきである。通常のプロジェクトで行うあらゆるタスク——プロジェクトの初期セットアップから新機能の設計、デプロイ、サポートまで——をすべてClaudeに委任できる。このプロジェクトを進める中で、プロジェクトのセットアップ、新機能の計画、テストとコードの記述にClaudeを大いに活用し、さらに後で別のプロジェクトを使って、本番環境のエラーを自動的に発見・修正する方法も紹介する。
プロジェクトのセットアップをClaudeに任せる
エディタに戻り、ターミナルを開いて claude を実行しClaude Codeを起動する。最初の指示として、ReadMeファイルの内容を読み、そこに書かれたセットアップ手順を実行するようClaudeに依頼する。Claudeは様々なツールを使ってそのファイルを読み込み、一連のコマンドを実行する。新しい仮想環境を作成し、環境をアクティベートし、いくつかの依存関係をインストールする。
init コマンドとCLAUDE.mdファイル
セットアップが完了したら、Claudeにプロジェクトをより深く理解してもらうため init コマンドを実行する。これはClaude Code自体の中で実行するコマンドである。このコマンドを実行すると、Claudeは自動的にコードベースをスキャンし、プロジェクトの全体的なアーキテクチャやコーディングスタイルなどを理解する。完了すると、Claudeはその発見内容すべてを CLAUDE.md という特別なファイルに書き込む。以降Claudeを実行するたびに、このファイルは自動的にコンテキストとして含まれる。
なお、CLAUDE.mdファイルには Project・Local・User に加え、組織管理者が配布する Managed policy を合わせた4種類がある(Project・Local・Userについてはこの後すぐに参照が出てくるので、その時に詳しく説明する)。
init コマンドを実行するときには、Claudeに注目してほしい特定の領域について特別な指示を追加することもできる。実際に試してみると、講師は「MCPツールの定義について詳細なメモを含めてほしい」という特別な指示を加えて init を実行した。完了後、新しく生成されたCLAUDE.mdファイルの内容を確認すると:
- ファイルの先頭には、将来必要になりそうな重要なコマンドの一覧が記載される。
- プロジェクトで使われているコーディングスタイルに関する記述が得られる。
- 特別にリクエストした通り、MCPツールの定義に関する情報も含まれていた。
このファイルは、以後Claudeに送るあらゆるフォローアップリクエストのコンテキストとして含まれることになる。
CLAUDE.mdの更新方法:
- プロジェクトは時間とともに変化する(コーディングスタイルの変更や新しいコマンドの追加など)。そうした変化があれば、このファイルを手動で簡単に編集することもできるし、
initコマンドを再実行することもできる。再実行すると、ClaudeはCLAUDE.mdファイルの内容を更新する。 - ちょっとしたショートカットとして、当時のClaude Codeでは
#(Pound記号) に続けて特定のメモを入力すると、そのメモがファイルの内容に追記される機能があった(この#ショートカットは現在は廃止されており、現行の公式ドキュメントでは代わりにClaudeへ「これをCLAUDE.mdに追加して」のように会話的に依頼するか、/memoryコマンドでファイルを直接編集する方法が案内されている)。これにより、以後のすべてのリクエストに含めたい非常に具体的で小さな指示をClaudeに与えることができる。
Project memory / Local memory / User memory: 例えば「関数の引数には常に適切な型を付けること(always apply appropriate types to function args)」という指示を # で追加すると、そのメモをどこに追加したいか尋ねられる。これがProject・Local・Userメモリが登場する場面である。講師の場合、このプロジェクトに関わる全員と共有したいメモだったため、Project memoryに追加した。追加後、CLAUDE.mdファイルの内容を確認すると、Code Styleのセクションの下か、あるいはファイルの一番下あたりに、追加したメモが反映されているのが見られる。
変更のコミット
この時点で、プロジェクトに新しいファイル(CLAUDE.md)が追加されており、このプロジェクトはGitで管理されている。通常であれば、ターミナルを開いてこの新しいファイルをGitにステージし、変更をコミットするところだが、それをClaudeに依頼した方がずっと速い。「すべての変更をステージしてコミットして」とClaudeに依頼すると、Claudeはコードベースに加えられたすべての変更を確認し、説明的なコミットメッセージを書いて、それらのファイルをコミットする。
Claudeの効果を高めるテクニック
次に、コードを書く際にClaudeの効果を高めるテクニックをいくつか紹介する。このプロジェクトに新機能を追加する題材として、WordドキュメントまたはPDFファイルを読み込み、その内容をMarkdownに変換する新しいツールをMCPサーバーに追加するというタスクを扱う(このプロジェクトは非常に小さくシンプルなMCPサーバーである)。
単純に「Word doc + PDF file to markdown conversion tool を作って」と直接指示することも当然できるが、その前に理解してほしいことがある。Claude Codeは「effort multiplier(努力の乗数)」だと考えてほしい(注: ここでの「effort」はユーザー側の努力を指す比喩表現であり、Claude Code / Claude API に実装されている公式のリクエストパラメータ Effort(low/medium/high/xhigh/max のレベルでClaude自身の思考・作業量を制御するもの)とは別物なので混同しないよう注意)。Claudeへの指示の出し方に少し努力を注げば、それに応じて大幅に良い結果が返ってくる。ここでは、Claudeにタスクへの取り組み方を指示する2つの異なるワークフローを紹介する。どちらも多少の努力を要するが、その分Claudeはより複雑な問題に取り組めるようになる。
ワークフロー1: 3ステップの「調査→計画→実装」
- 関連ファイルを特定して読ませる: コードベースの中で、取り組もうとしている機能に関連すると分かっている箇所を特定する。そのファイルを具体的に読んで分析するようClaudeに依頼する。プロジェクトには
Toolsディレクトリがあり、その中にMath.pyファイルがある。これはすでに作られているツールの一例であり、ツールをどう実装するかのイメージをClaudeに与えるのに役立つ。また、バイナリデータをMarkdownに変換する非常に便利な関数binary document to markdownを含むdocument.pyファイルも見せる。これらのファイルを読ませることで、Claudeはツールの書き方と実際の変換方法の両方について、より良いイメージを持てるようになる。 - 機能を伝えて計画を立てさせる: 構築したい機能をClaudeに伝え、解決策を計画するよう依頼する。具体的には、PDFまたはWordドキュメントへのパスを受け取り、ファイルを読み込み、内容をMarkdownに変換して結果を返す、
Document Path to Markdownという新しいツールの実装を計画するよう依頼する。ここで重要なのは、まだコードは書かず、計画だけを立てるよう明示的に指示することである。これに対しClaudeは、この機能全体を実装するために必要となる複数のステップを含む、かなり詳細な計画を返してくる。 - 計画を実装させる: 最後に、この計画を実装するようClaudeに依頼する。Claudeはまず
document.pyファイルを更新し(これは間違いなく正しい)、次にmain.pyファイルを更新し(これも良い)、最後にこの新しいツールに関するテストを1本書く。そして、そのテストスイートを実行してテストが実際に通ることを確認する。サマリーメッセージの中でClaudeは、存在しないファイルや未サポートのファイルタイプに対するエラーハンドリングも追加したと報告してくる。これは講師が機能の説明の中で明示的に依頼していなかったことだが、適切な対応だった。
ワークフロー2: テスト駆動開発(TDD)ワークフロー
別のアプローチとして、TDDワークフローを紹介する前に、Claudeが直前に書いたコードをすべて取り除く(変更をstashする)。これでその機能に関連するものが何もないクリーンな状態に戻る。
TDDワークフローも事前に多少の努力を要するが、Claudeの効果を劇的に高める。手順:
- 関連するコンテキストを見せる(前と同様)。
- コードを書く前に、この機能に関連してどんなテストを書けるかをClaudeに考えさせる。
- その中から最も関連性の高いテストを選び、実装するようClaudeに依頼する。
- 動作するテストが揃ったら、テストが通るまでコードを書くようClaudeに依頼する。
同じ機能(ハードドライブ上のドキュメントを読み込みMarkdownに変換するツール)に対してこのアプローチを実演する。
- まず
/clearコマンドを実行する。これによりClaudeとの会話履歴をクリアし、コンテキストを本質的にリセットする。今回これを行う理由は、Claudeが前回の解決策を「カンニング」しないようにするためである。 - 先ほどの2つの関連ファイルを再度読ませる。
- この新機能を評価するために書けそうなテストを考えるよう、非常に明確な指示を追加する。ここでも、まだコードは書かないよう明示的に依頼する。返ってきた提案は非常に良い内容だった。
- テスト6・7・8は、現在取り組んでいる範囲を超えたやや特殊なものだったため、テスト1〜5だけを実装するようClaudeに依頼する。
- 最後のステップとして、これらのテストを通すためのコードを書くようClaudeに依頼する。結果、すべてのテストが通った。
まとめ: Claude Codeは本当に「effort multiplier」である。非常にシンプルな指示だけでもClaudeは最善を尽くしてくれるが、こちら側にも少し努力を注ぐことで、Claudeの効果を劇的に高めることができる。
Lesson: Enhancements with MCP servers(MCPサーバーによる機能拡張)
Claude Codeの最も興味深い側面の一つを紹介する。Claude CodeにはMCPクライアントが内蔵されている。つまり、MCPサーバーをClaude Codeに接続することで、その機能を劇的に拡張できるということである。
これを実演するため、これまで取り組んできたMCPサーバーにClaude Codeを接続する。先ほど Document Path to Markdown というツールを作成した。このツールをClaude Codeに公開することで、PDFやWordドキュメントの内容を読めるようになる——つまり、Claude Codeの能力を動的に拡張しているということである。
セットアップ手順:
- ターミナルに戻り、Control-Cで実行中のセッションを終了する。
claude mcp addを実行してMCPサーバーをClaude Codeに追加する。まずMCPサーバーの名前を入力する(名前は何でもよい。今回はドキュメントに関連するサーバーなのでdocumentsと名付けた)。- 最後に、サーバーを起動するために使うコマンドを入力する。今回の場合は
uv run main.pyである。 - これを実行し、
claudeでClaude Codeを再び起動する。
これで、先ほど作成したツールを実際にテストできる。テストディレクトリの中に fixtures フォルダがあり、その中にデモファイルが2つ(Wordドキュメントと PDFドキュメント)ある。どちらもMCPに関するごく短いドキュメントを含んでいる。このどちらかのファイルの内容をMarkdownに変換するようClaudeに依頼すると、先ほど作成したツールを利用してくれることが期待される。実際、少し上にスクロールして確認すると、うまく動作しており、そのファイルの内容が実際に表示された。
MCPサーバーを消費できることの意義: このMCPサーバーを消費できる能力は、Claude Codeに信じられないほどの柔軟性を加え、実に興味深い開発の可能性を切り開く。例えば:
- Sentryを本番監視に使っているなら、Sentry MCPサーバーを追加することで、本番環境で発生しているエラーの詳細をClaudeに取得させられる。
- JIRAを使っているなら、特定のチケットの内容をClaudeに閲覧させるMCPサーバーを追加できる。
- Slackを使っているなら、Claudeが特定の問題への取り組みを完了したときに自分にメッセージを送るよう、Slackを追加できる。
これらはほんの一例に過ぎない。自分の開発ワークフローをどう強化できるか、時間をかけて考える価値は十分にある。
Lesson: Agents and workflows(agentとworkflow)
このモジュールでは、workflowとagentに焦点を当てる。さっそく、これらが何なのかを理解しよう。
定義: workflowとagentは、Claudeが単一のリクエストでは完了できないユーザータスクを扱うための戦略である。実は、このコースを通じてすでにworkflowとagentを作ってきている。例えば、tool useを学んだとき、タスクをClaudeに与え、提供されたツールを使ってどう完了するかをClaudeに委ねていた。これはagentの一例だった。
workflowかagentかを決める経験則:
- タスクを完了するために必要な正確なステップの連なりを事前に把握しているなら → workflowを使う。
- タスクの詳細について本当に確信が持てない(Claudeがどう解くべきか分からない)なら → agentを使う。
このレッスンとこの後の数レッスンは、100%workflowに焦点を当てる。いくつもの実例を示していく。
最初のworkflow例: 金属部品の画像から3Dモデルを生成するアプリ
ユーザーが金属部品の画像を画面にドラッグ&ドロップできる小さなWebアプリを作っていると想像する。このアプリの目標は、その画像から何らかの方法で3Dモデルを構築することである。最終的にユーザーには STEPファイル を返す(STEPファイルに馴染みがなくても問題ない。STEPファイルは3Dモデルを共有・伝達するための業界標準的な方法にすぎない)。つまり、画像から3Dモデルを作っているということである。
3Dモデリングにあまり詳しくなくても、少しの助けと時間があれば、このアプリの実装方法を思いつけるはずである。想定される実装手順:
- ユーザーがアップロードした画像をClaudeに渡し、その物体を詳細に記述するよう依頼する。
- その記述を別途Claudeに渡し戻し、CAD QueryというPythonライブラリを使ってその物体をモデリングするよう依頼する(CAD Queryは3Dソリッドモデリングを行えるPythonライブラリで、このプロセスからSTEPファイルを出力できる)。
- Claudeが最初からこのモデルを完全に正確に作れるとは限らない。そこで、初期モデルを構築したらエラーチェックのステップを追加してもよい。レンダリング結果を1枚の画像として作成し、その画像を再びClaudeに渡して、元の画像とのレンダリング結果の一致度を尋ねる。
- Claudeがレンダリング結果に大きな問題があると判断したら、ステップ2に戻ってもう一度部品のレンダリングを試みるようClaudeに依頼する。
- このプロセスを繰り返し、最終的に元の部品の正確なモデルにたどり着くことを目指す。
ここで重要なのは、このステップの流れ全体を事前に想像できるという点である。このプロセス全体を事前に設計し、それを実装するコードを簡単に書き出せる。実際、講師はこれとほぼ同じものを以前に実装したことがある。すべてのステップを事前に明確にリストアップし詳細化できるため、これをworkflowと呼ぶ。workflowとは、非常に具体的な問題を解決することを目的とした、Claudeへの一連の呼び出しであり、そのステップが何であるべきかを事前に正確に把握しているものだと定義する。
evaluator optimizer
このモデリングworkflowは、evaluator optimizerと呼ばれるworkflowの一例である(注: 本ガイドでは分かりやすさのため、以下このワークフロー内の役割を「プロデューサー」「グレーダー」と呼ぶが、Anthropic公式の "Building effective agents" およびclaude-cookbooksの実装ではそれぞれ generator・evaluator と呼ばれている。特に「グレーダー」という呼び方は、本コース前半で扱った eval のグレーダー——モデルの出力を採点する仕組み——とは別の概念なので混同しないよう注意)。考え方:
- 入力をproducer(プロデューサー)と呼ばれるものに渡す。今回の場合、プロデューサーはCAD Queryライブラリを使って部品をモデリングし、そこからレンダリングを作成するClaudeである。
- この出力(レンダリング)はgrader(グレーダー)と呼ばれるものに渡される。graderは出力を見て、何らかの基準を満たしているかどうかを判断する。
- 基準を満たしていればworkflowは終了する。満たしていなければ、フィードバックがプロデューサーに戻され、プロデューサーは何らかの方法で出力を改善する機会を得る。
- このサイクルは、graderが出力を受け入れるまで繰り返され続ける。
重要な補足: workflowを識別すること自体は、それ単体では何も生み出さない。それらを実装する実際のコードは、依然として自分で書き下す必要がある。workflowについて議論する理由、そしてworkflowが人気の話題になっている理由は、多くの他のエンジニアたちが、まさにこれと同じパターンを使ってworkflowを実装し、大きな成功を収めてきたからである。これらの異なるworkflowを紹介しているのは、同じパターンを自分自身のプロジェクトで使い、それらが他のエンジニアにとってうまく機能してきたのと同様に、自分のプロジェクトでも成功を見出せるようにするためである。
Lesson: Parallelization workflows(parallelizationワークフロー)
別のworkflowを見ていく。アプリケーションを少し変更する。引き続きユーザーには部品の画像をドラッグ&ドロップしてもらうが、今回はユーザーに分析結果、つまり様々な基準に応じて、その部品を作るのに最適な材料を伝えるレポートを返す。
素朴なアプローチとその問題点
この機能を実装するには、ユーザーが提供した画像を短いプロンプトと共にClaudeに送り、そのプロンプトの中で、この部品を金属・ポリマー・セラミックなどのどれで作るのが最良かを判断するよう依頼する、という方法が考えられる。これはおそらく動作するが、この非常にシンプルなプロンプトでClaudeに多くのことを求めすぎている。例えば、材料を選ぶ際に考慮すべき本当の判断基準をClaudeに何も伝えていない。動作はするかもしれないが、最良の結果は得られないかもしれない。
自然な改善策は、このプロンプトに戻ってより多くの詳細を追加することだろう。金属やポリマーなどを推奨すべき様々なシナリオをClaudeに伝える。金属を使うべき基準、ポリマーを使うべき基準、セラミック・コンポジット・最後に木材などについての基準を与えていくと、結果として非常に巨大なプロンプトになる。Claudeは1つのステップの中で多くの分析と多くの作業をこなさなければならず、Claudeを混乱させかねない。これでは最良の結果につながらない可能性がある。
改善策: 並列にリクエストを分割する
より良いアプローチとして、ユーザーが画像を最初に送信したときに、並列で複数の異なるリクエストをClaudeに送るという方法がある。個々のリクエストにはそれぞれ専用のプロンプトを含め、この部品を金属・ポリマー・セラミック・コンポジットなどのどれで作るのが良いかをClaudeに尋ねる。つまり、それぞれ別々のリクエストの中で、Claudeに1つの材料についての適合性を尋ねているということである。
このアプローチでは、個々のプロンプトを特定の材料に特化させることができる。Claudeはもはやすべての材料を同時に気にする必要がなく、一度に1つの材料だけに集中できる。
Claudeから応答が返ってきたら、それぞれの分析結果——金属・ポリマー・セラミック・コンポジットなどでこの部品を作る適合性——を取得できる。これらの分析結果をすべて取得したら、フォローアップリクエストの中で再びClaudeに渡し、それぞれの分析結果を検討した上で最終的にどの材料を使うべきかを判断するよう依頼する。ここでもClaudeは事前にすべての材料を比較検討する必要はなく、最も有望に見える分析結果だけを見ればよい。
parallelization workflowの定義
これは parallelization workflow の一例である。parallelization workflowの考え方は、1つのタスクを複数の異なるサブタスクに分割するというものである。これらのサブタスクはそれぞれ並列に、つまり同時に実行できる。そして、これらすべての異なるサブタスクからの結果を取得し、最終的なaggregator(アグリゲーター)ステップの中で結合する。今回の例では、アグリゲーターはClaudeによるこの最終ステップだった。各並列タスクの結果をアグリゲーターに渡し、Claudeがこの最終的な推奨を出してくれた。
このworkflowの3つの利点:
- Claudeが一度に1つのタスクに集中できる。先ほど述べた通り、部品の元画像を多くの異なる材料タイプの基準を列挙した非常に大きなプロンプトと一緒にClaudeに渡すと、Claudeはすべての材料の長所と短所を同時に検討しようとして少し混乱したり気が散ったりする可能性がある。
- 各サブタスクで使われているプロンプトを非常に簡単に改善・評価できる。
- このフローは一般によくスケールする。他のサブタスクの実行を損なうことなく、いつでも追加のサブタスクを追加できる。
Lesson: Chaining workflows(chainingワークフロー)
次に見ていくworkflowは少し当たり前で単純に見えるかもしれないが、実は特定の状況——非常によく遭遇することになる状況——において、最も有用なworkflowの一つになる。
ソーシャルメディア動画マーケティングツールの例
アプリケーションをまた少し変更する。ソーシャルメディアマーケティングツールを構築していると想像する。ユーザーは自分のソーシャルメディアアカウントの話題(トピック)を入力するよう求められる——アカウントが主にどんな内容にフォーカスしているか、といったものである。このアプリケーションの目標は、動画を生成してそのアカウントに投稿することである。
実装イメージ: 大量のツールを備えた高度なagentは特に必要ない。事前に定義されたステップを一つずつ順番にたどっていくworkflowを組み立てればよい。
- ユーザーがフォームに入力したトピックを使って、Twitterでトレンドのトピックを検索する。
- トピックのリストをすべてClaudeに渡し、最も興味深いトピックを選ぶよう依頼する。
- そのトピックについてWebリサーチを行うよう、Claudeへのフォローアップリクエストを行う。
- リサーチが完了したら、ショート動画向けのスクリプトを書くようClaudeに依頼する。
- スクリプトができたら、AIアバターとテキスト読み上げ(text-to-speech)プログラムを使って実際の動画を作成する。
- 最後にその動画をソーシャルメディアに投稿する。
これは chaining workflow の一例である。chaining workflowでは、1つの大きなタスク(今回の場合は動画を生成してソーシャルメディアに投稿すること)を取り、それを一連の明確なステップに分割する。今回の場合、サブタスクはClaudeに送った個々の呼び出しだった。これら3つのタスクすべてを単一のClaude呼び出しの中でまとめて達成しようとすることもできた——トピックのリストをClaudeに渡し、最も興味深いトピックを選ばせ、そのトピックをリサーチさせ、単一のプロンプトの中でスクリプトを書かせる、という具合に。しかし、これを3つの別々の呼び出しに分割することで、Claudeが一度に1つのタスクだけに集中できるようにしている。
chaining workflowが本当に重要になる理由: 長いプロンプトでの制約遵守問題
このworkflow自体は単純で当たり前に思えるかもしれず、すでに過去に実装したことがあるようなものかもしれない。しかし講師がこのworkflowを特に取り上げる理由は、Claudeを使って大きなプロンプトから一貫して質の高い出力を得るために理解すべき、最も重要なworkflowの一つになるからである。
まだ遭遇したことがなくても、いつか必ず遭遇するであろうシナリオを紹介する。あるトピックについての記事を書くためにClaudeを使っているとする。最初は非常にシンプルなプロンプトをClaudeに送り、記事を書くよう依頼するかもしれない。結果は返ってくるが、まずまずではあっても気に入らない部分があるかもしれない。
- Claudeが、自分がAIであることに言及してしまう(これはおそらく望まない)。
- 絵文字を過剰に使用してしまう(これも望まないかもしれない)。
- ありきたりな(cliché)言い回しをあちこちで使ってしまう(これも望まないかもしれない)。
時間をかけてプロンプトを発展させていくうちに、「これは絶対にやらないで」というやってほしくないことの長いリストを作ることになるかもしれない。しかし、どれだけこれらの項目を繰り返し伝えても、Claudeはなぜか常に絵文字を使い、AIによって書かれたことに言及し、全体的に安っぽく(cringey)非プロフェッショナルなトーンになってしまう応答を返してくることがある。このような制約を何度繰り返しても、Claudeがこのような記事を書き続けてしまうことがある。
解決策: シンプルなprompt-chaining workflow
- すべての制約を含んだ最初の長いプロンプトを送り、求めているものに完全には合致しない最初の記事を受け取ることをいったん受け入れる。Claudeは書き出した制約の一部を必然的に破ってしまうかもしれない。
- その問題を修正するため、Claudeが今書いたばかりの記事を渡してフォローアップリクエストを行う。記事の下に、特定の方法で記事を書き直すようClaudeに依頼する。例えば「著者がAIであると識別している箇所を見つけてその言及を削除する」「すべての絵文字を見つけて削除する」「プロのテクニカルライターが書くようなスタイルでテキストを書く」といった指示を与える。
このchaining workflowを使い、タスクを複数のステップに分割することで、Claudeは提示された個々のタスクにずっと集中しやすくなる。最初の長いプロンプトに詰め込んだすべての要件を必ずしも満たせなかったとしても、フォローアッププロンプトによってClaudeは本当に気にしている制約だけに集中できるようになり、望んでいたスタイルで記事を書き直してくれることが期待できる。
まとめ: prompt chainingは一見単純で当たり前のことに思えるかもしれないが、多くの制約を伴うタスクをClaudeに与え、Claudeが期待するほどそれらの制約に常に従ってくれるわけではないという場面に遭遇するたびに、頻繁に使うことになる手法である。
Lesson: Routing workflows(routingワークフロー)
次のworkflowは、先ほどのソーシャルメディアマーケティングツールを改善する一つの方法を示す。再び、ユーザーがトピックを入力し、何らかの方法で動画を生成し、ユーザーのソーシャルメディアアカウントに投稿する、という想定である。
問題: トピックによってスクリプトのトーンが大きく異なるべき
考えてほしいのは、スクリプト生成プロセス——つまり、これらの異なる動画で使われる実際のトーンや言葉遣い——についてである。例えば「プログラミング」というトピックと「サーフィン」というトピックという、2つの異なるトピックが与えられたとき、性質がまったく異なる動画スクリプトを期待するはずである。
- プログラミング(左側): 多くの情報を伝え、定義を丁寧に説明し、全体として教育的な性質を持つ動画を望むだろう。
- サーフィン(右側): これとはまったく異なるスクリプトを望むだろう。おそらく教育的な性質はずっと薄く、サーフィンとは何かについての長い定義説明などは持たないものになるはずである。
解決策: routing workflow
与えられたトピックが、そのトピックの性質にうまく合った動画スクリプトを生成できるようにするworkflowを紹介する。
- まず、ユーザーが作成を依頼してきそうな動画のあらゆる可能なジャンルについて考える。例えば、トピックが当てはまりうるジャンルとして「エンターテインメント」「教育」「コメディ」など6つの異なるジャンルを決めるとする。先ほどの例で言えば、プログラミングは教育、サーフィンはエンターテインメントに当てはまるだろう。
- これらの異なるジャンルそれぞれについて、スクリプト生成用のプロンプトを書く。教育的な性質のトピックだと分類された場合は、興味深い例や興味深い問いかけなどを含む、明確で魅力的なスクリプトを書くようClaudeに依頼するプロンプトを使う。ユーザーがサーフィンというトピックを与えてきた場合はエンターテインメントに分類し、トレンド感のある言葉遣いや魅力的なフック(引き込み)などを持つサーフィンについてのスクリプトを書くようClaudeに依頼するプロンプトを使う。
実際のフロー:
- ユーザーが入力したトピック(例: 「Python functions」)だけを含むリクエストを最初にClaudeに送り、そのトピックをあらかじめ用意したカテゴリのいずれかに分類するよう依頼する。この例では、「Python functions」は最も近いカテゴリとして「教育」に分類されるだろう。
- Claudeからのこの応答を受け取り、フォローアップリクエストを行う。Python関数について、明確で魅力的な情報と、考えさせられるような例を持つスクリプトを書くようClaudeに依頼する。
- そのようにして、教育的な動画にふさわしいトーンと質を持ったスクリプトが返ってくることが期待される。
これは routing workflow の一例である。routing workflowでは、ユーザーの元の入力を取り、それをrouting stepに渡す。このrouting stepはおそらくClaudeへの呼び出しそのものであり、ユーザーの入力やタスクを何らかの方法で分類するようClaudeに依頼する。そして、Claudeの回答に応じて、ユーザーの入力を特定のフォローアップ処理パイプラインへと転送する——複数ある候補のうちの一つだけに、という具合である。これらの異なるルーティング先の選択肢は、それぞれ異なるworkflowや、カスタマイズされたプロンプト、あるいはユーザーが求めるタスクの処理に特化したカスタマイズされたツールのセットを内部に持つことができる。
Lesson: Agents and tools(agentとtool)
これまで複数のworkflowを見てきたので、ここからは方向転換してagentについて議論を始める。agentを理解する最も簡単な方法は、workflowを思い出すことである。特に、workflowを実際に使う場面を思い出すとよい。
- workflowが最も効果的なのは、タスクを完了するために必要な正確なステップの連なりが分かっている場合。
- agentが効果的なのは、正確にどんなステップが必要になるか分からない場合。こうしたシナリオでは、Claudeにタスクとツールのセットを与え、与えられたツールを使ってタスクを完了する計画をClaude自身に立てさせる。
agentを取り巻くこの柔軟性こそが、agentを構築する上で非常に魅力的な点である。考え方としては、agentを作り、それが十分にうまく機能することを確認すれば、そのagentは幅広い異なるタスクを解決できる、というものである。ただし、このアプローチには大きな欠点もある(これは後ほど議論する)。
ツールを組み合わせる能力
agentの重要な側面の一つは、異なる組み合わせでツールを利用する能力である。これを理解するために、コースの前半で取り組んだ例——Get Current Date Time、Add duration to Date Time、Set Reminderという3つのツールを組み合わせた例——を思い出してほしい。これらのツールはそれぞれかなりシンプルなものだったが、Claudeはこれらを異なる、時に意外な方法で組み合わせて、事前には計画していなかったような幅広いタスクを達成できた。いくつか例を挙げる:
- 「今何時?」と尋ねると、Claudeは単に
get current date timeツールだけを呼び出して質問に答えられる。 - 「11日後は何曜日?」と尋ねると、Claudeはまず
get current date timeを呼び出し、次にadd duration to date timeを呼び出せる。 - 「来週の水曜日にジムに行くリマインダーをセットして」と頼むと、Claudeはまず現在の曜日を割り出し、そこに期間を加算し、その特定の日にリマインダーをセットできる。
- Claudeは、ツールをうまく呼び出すために追加情報が必要だということも判断できる。例えば「90日間の保証はいつ切れる?」とユーザーが尋ねた場合、ユーザーが今日その保証を取得したという保証はどこにもない。そこでClaudeはまず、実際にいつ保証を取得したのかという追加情報をユーザーに尋ねるかもしれない。ユーザーがその情報を伝えたら、Claudeは
add duration to date timeを呼び出して保証がいつ切れるかを割り出せる。
これらはすべて、Claudeが一連のツールを取り、興味深い方法で組み合わせて特定のタスクを解決できる例である。ここから、agentに関する最初の大きな教訓が導かれる。
教訓: agentに与えるツールセットは「合理的に抽象的」であるべき
agentに提供するツールのセットは、合理的に抽象的(reasonably abstract)である必要がある。これを理解するのに最適な例が、Claude Codeとそこに提供されている具体的なツールである。
Claude Codeは非常に小さな抽象的なツールセットにアクセスできる。ここで言う「抽象的」とは、汎用的・一般的、あるいは目的として多少あいまい、という意味であり、何か一つの用途にハイパー特化しているわけではない。Claude Codeが持つツールの例:
- Bash: コマンドを実行するため。
- Web fetch: URLを取得するため。
- Write: ファイルを作成するため。
- その他、これらに類する種類のツール。
Claude Codeは、こうした異なるツールを組み合わせることで、既存のコードベースを驚くべき方法で修正し、機能を追加できる。逆に、Claude Codeは、1つの非常に具体的なタスクを1つの具体的なシナリオでのみ果たすような、ハイパー特化したツールにはアクセスできない。Claude Codeに明確に存在しないツールの例:
- refactorツール: ファイルを魔法のようにリファクタリングしてくれるツールは存在しない。代わりに、Claude Codeは左側にあるようなツールをどう組み合わせてリファクタリングを実現するかを自分で考える必要がある。
- install dependenciesツール: 同様に存在しない。代わりに、Claude Codeはファイルを読んでプロジェクトの設定を理解し、Bashツールを実行して依存関係をインストールする適切なコマンドを実行する必要がある。
得られる教訓: agentを作るときは常に、Claudeが何らかの方法で組み合わせて目標を達成できるような、合理的に抽象的なツールを提供することを心がけるべきである。
具体例: ソーシャルメディア動画作成agent
先ほどのソーシャルメディア動画作成agentの例に戻ると、4つの異なるツールを提供することが考えられる:
- Bash: FFmpegへのアクセスを与える。FFmpegは、画像・動画・テキスト・音声などの入力から動画を生成するためによく使われるCLIツールである。
- Generate imageツール
- Text to speechツール: 動画生成プロセスを補強するため。
- Post mediaツール: 生成されたコンテンツをソーシャルメディアアカウントに投稿するため。
Claudeはこのツールセットを、かなり予想外の方法で使いこなすことができる。例えば:
- 左側のフロー: ユーザーがagentとチャットし、Pythonプログラミングについての動画を作成して投稿するよう依頼する。
- 右側のフロー: このツールセットはユーザーとのより動的なやり取りも可能にする。ユーザーは動画を依頼しつつ、まずはその動画で使うサンプルのカバー画像を生成するようagentに依頼するかもしれない。その場合、agentはまず画像を生成してユーザーに見せ、ユーザーの承認を得てから、動画生成プロセスに進むことができる。
Lesson: Environment inspection(環境の検査)
agentに関して次に議論する考え方は、environment inspection(環境の検査)である。
前にcomputer useを見たときのことを思い出してほしい。何かアクション(タイピングやマウスの移動など)が左側のログに記録されるたびに、その直後にスクリーンショットが現れていたはずである。Claudeが何らかのテキストを入力しようとし、それが最初のパネルにログとして記録され、その直後にスクリーンショットが現れる、というものである。
これをClaudeの視点から見てほしい。Claudeが何かをタイプしたりクリックしたりすると、おそらくページが変化するはずだが、Claudeにはそれがどう変化したのか本当には分からない。ボタンをクリックすると新しいページに遷移するかもしれないし、メニューが開くだけかもしれない。取った行動の結果を理解するために、Claudeは新しい状態、つまり自分が置かれている環境を理解するためのスクリーンショットを必要としていた。
この考え方は、組み立てるあらゆるagentに当てはまる: 行動を取った後(そして時には行動を取る前にも)、Claudeは単にツールが返す値を超えて、その行動の結果を評価する何らかの方法を本当に必要としている。自分の環境を理解できるようClaudeを助けることで、Claudeはタスク完了に向けた進捗をより良く判断でき、予期しない結果やエラーにもより良く対処できるようになる。
Claude Codeでの同様の例
Claude Codeを使うときにも、非常によく似た考え方が見られる。ある例では、講師が main.py ファイルを更新するようClaudeに依頼している。ここで与えたタスク(追加のルートを1つ加えるだけ)は非常にシンプルなものである。しかし、このファイルを何らかの形で修正する前に——これは当たり前に思えるだろうが——Claudeはまずファイルの現在のコードが何であるかを理解する必要がある。つまり、Claudeはファイルの内容を読む何らかの方法を必要としている。当たり前に思えるかもしれないが、自分でagentを構築する際には、書き込む前に読むというこの考え方を常に意識することが推奨される。
ソーシャルメディア動画agentへの適用
この考え方は、先ほどのソーシャルメディア動画agentにも当てはまる。Claudeへのリクエストを行うとき、「Pythonについての動画を作成してソーシャルメディアアカウントに投稿して」というようなタスクとツールのリストを与えるだけでなく、動画を生成した後どのように環境を検査できるかをClaudeに理解させる特別な指示を、システムプロンプトの中に含めることが考えられる。
個人的には、FFmpegを使って動画を生成する作業をClaudeに任せる場合、テキスト読み上げ機能を使って生成した音声クリップのセリフの配置(音声クリップがいつ再生されるか)について、時々ミスをすることが予想される、と講師は述べる。タスク完了に向けた進捗をClaudeがより良く理解できるよう助けるため、以下のような指示を与えることが考えられる:
- Bashツールで Whisper CPP というプログラムを特に実行するよう指示する。これは動画から自動的にキャプションファイルを生成するために使えるプログラムである。キャプションファイルにはタイムスタンプが含まれているため、Claudeはこのプログラムを使ってセリフが正しく配置されているかを確認できる。
- Bashツールでffmpegを実行することも推奨できる。これは動画からスクリーンショットを抽出する能力を持つ。1秒ごと、あるいは10秒ごとにスクリーンショットを抽出するようClaudeに指示し、動画が期待通りに見えるかどうかを確認するためにそのスクリーンショットを見るよう指示できる。
これにより、Claudeは自分の行動の結果——実際に作成した動画——を検査し、タスクを本来あるべき通りに完了しているかを確認できるようになる。
Lesson: Workflows vs agents(workflowとagentの比較)
workflowとagentの様々な側面を比較・対照してまとめる。
workflow
- あらかじめ定義された、Claudeへの一連の呼び出し。
- タスクを完了するために必要な正確なステップの連なりについて、良い見通しを持っている場合によく使う。
- 大きなタスクを、より小さなタスクに分割するという共通のテーマがある。それぞれの小さなタスクはより具体的な性質を持ち、Claudeが一度に1つの領域に集中できるようにする。この集中の高まりは、一般にagentと比較してタスク完了の精度の高さにつながる。
- workflowが実行する正確なステップの連なりを把握しているため、テストや評価もはるかに容易である。
agent
- どんなタスクが与えられるか正確には分からないため、代わりに堅実な基本ツールのセットを提供し、Claudeがそれらのツールを組み合わせてタスクを完了することを期待する。
- 石に刻まれたような一連のステップに縛られない。代わりに、Claudeは幅広い課題への対処法を創造的に考え出せる。
- この柔軟性に伴い、ユーザー体験にも柔軟性が生まれる。workflowは非常に特定の入力セットを受け取ることを想定しているのに対し、agentはユーザーから受け取ったクエリに基づいて自分自身の入力を作り出すことができ、必要なときにはユーザーにさらなる入力を求めることもできる。
- agentの欠点: 多くの作業をClaudeに委ねているため、一般にworkflowと比べてタスク完了の成功率が低くなる。また、agentがタスクを完了するためにどんな一連のステップを実行するか、良い見通しを持てないことが多いため、テストや評価もより難しい。
結論: 基本はworkflow、agentは本当に必要なときだけ
agentは確かに興味深いものだが、エンジニアとしての第一の目標は信頼性を持って問題を解決することである。ユーザーは、こちらが作った凝ったagentのことなど気にしていない。ユーザーが本当に求めているのは、100%の確率で動作する製品である。この点を踏まえると、一般的な推奨は、可能な限りworkflowの実装に焦点を当て、本当に必要な場合にのみagentに頼る、というものである。
Lesson: Course Wrap Up(コースのまとめ)
このコースを最後までやり遂げたなら、それは相当な努力を注いだ証であり、講師から祝福が述べられる。締めくくる前に、扱った主要トピックを簡単に振り返り、今後研究すべき推奨フォローアップトピックが紹介される。
コースの振り返り
- Anthropicが提供するモデルの話から開始した。速く小規模なリクエスト向けのHaiku、知性・速度・コストのバランスが取れたSonnet、そして複雑なタスク向けの最上位モデルOpusという3層構成でモデルにアクセスできることを思い出してほしい(2026年半ば時点ではさらに上位のClaude Fable 5も追加されている)。
- APIを介したClaudeへのアクセス方法と、Claudeの応答を調整するために渡せる様々なパラメータについて、多くの時間を費やして議論した。例えば temperature、stop sequences、message prefillingなどである。これらはすべて、Claudeを特定の方向に導き、その創造性をコントロールし、期待通りの正しいフォーマットのデータや出力を得るために使えるパラメータである(ただし2026年時点では、Claude Opus 4.7以降・Sonnet 4.6以降の最新世代モデルはtemperature/top_p/top_kとmessage prefillingを受け付けなくなっており、指定すると400エラーになる。stop_sequencesは引き続き全モデルで有効で、旧世代モデルでは従来どおりtemperatureとprefillingも利用できる)。
- prompt evaluations(プロンプト評価)についてもかなりの時間を費やした。講師はこれを「自分自身のプロジェクトで実践すべき、断然最も重要なプラクティス」だと強調する。プロンプトを自分で10回実行してすべて問題ないと思っても、本番環境にデプロイした途端、ユーザーが期待通りの結果を得られないかもしれない。効果的なプロンプトを書けていることを確認する唯一の方法は、それを評価することである。そして、prompt evalは難しいものである必要はない。凝ったフレームワークを使ったり、複雑な大掛かりなセットアップをしたりする必要はない。このコースで見たように、Claude自身にprompt evaluationフレームワークを生成させることができる——実際、このコースで使用したprompt devalフレームワークのコードの多くは、Claude自身によって直接書かれたものだった。
- prompt engineeringにも時間を割いた。数多くのテクニックの中でも、最も重要なのは、Claudeに何を期待しているかを明確かつ直接的に伝えることである。
- その後、tool useに多くの労力を注いだ。これはコースの中でも最も複雑なセクションの一つだったはずである。tool useはClaudeの能力を劇的に拡張するため、非常に重要である。
- Anthropicが直接リリースした2つの重要なアプリケーション、Claude CodeとComputer Useにも時間を費やした。Claude Codeでのハンズオン経験を楽しんでもらえたなら幸いである。講師個人としては、コードやプロジェクトの執筆を助けるために実際に使っているツールであり、凝ったエディタ内アシスタントはあまり使わず、このコースの動画で見せたのとまったく同じスタイルで、ターミナルでClaude Codeを実行しているとのことである。
- 最後に、workflowとagentについてかなりの時間を割いて議論した。agentは間違いなく興味深く、とてもエキサイティングなトピックだが、多くの場合、workflowを使うことでより良い結果と高い精度が得られる、ということを思い出してほしい。
今後の推奨フォローアップトピック
時間の制約上、このコース内ではすべてのトピックをカバーすることはできなかった。今後自分で調べることが推奨される主要なトピック:
- agent orchestration: agent同士がどう連携して動作するかの理解。
- agentのパフォーマンスの評価とモニタリングの方法。
- agentic RAG: RAGのバリエーションの一つ。
- RAG evaluationの様々な技法。
- tool evaluation: prompt evalに似たもので、ツールの説明がClaudeを本当に期待通りに助けているかを確認するためのもの。
以上でコースは終了する。講師はこのコンテンツを楽しんでもらえたこと、そしてこの内容に取り組む時間を割いてくれたことへの感謝を述べて締めくくる。
章末まとめ
- Anthropicアプリ: Anthropicが自ら構築した2つのアプリ、Claude CodeとComputer Useを紹介。両者はagentの完璧な実例であり、agent理解の土台になる。取得できたトランスクリプトの範囲ではComputer Useの個別レッスンを確認できず以降はClaude Codeのみが扱われていたが、これは確認漏れの可能性もあり、削除されたと断定はできない(詳細は冒頭の注記を参照)。
- Claude Codeのセットアップ: Node.jsインストール(
node --versionで確認)→npm install -g @anthropic-ai/claude-codeでClaude Code導入(現在の公式推奨手順はネイティブインストーラ等、npmは代替手段)→claudeコマンドでログイン、の3ステップ。 - Claude Codeの本質: 単なるコード生成ツールではなく「プロジェクトを共に進めるもう一人のエンジニア」。
initコマンドでコードベースを解析しCLAUDE.md(Managed policy/Project/Local/User の4種)を自動生成、Claudeへの会話的な指示や/memoryコマンドで追記可能。 - Claudeの効果を高める2つのワークフロー: (1) 関連ファイルの読み込み→計画のみ立てさせる→実装させる、の3ステップ型。(2)
/clearでコンテキストをリセットしてから、テストを先に考えさせ選定・実装し、テストが通るまでコードを書かせるTDD型。どちらも「effort multiplier」(ユーザー側の努力を指す比喩表現であり、公式のリクエストパラメータ Effort とは別物)としてのClaude Codeを最大限活かす型。 - MCPサーバーとの連携:
claude mcp addでMCPサーバーを追加すると、自作ツール(例: ドキュメント→Markdown変換)をClaude Codeから直接呼び出せる。Sentry・JIRA・Slackなど外部サービスとの連携も同じ仕組みで拡張できる。 - workflow: タスク完了の正確なステップが事前に分かっている場合に使う、Claudeへの一連の呼び出し。evaluator optimizer(producer/generator→grader/evaluator→フィードバックのループ。公式名称は generator・evaluator)、parallelization(サブタスクを並列実行しaggregatorで統合)、chaining(大タスクを順次ステップに分割、特に長大な制約リストの遵守に有効)、routing(入力を分類し適切な処理パイプラインへ振り分け)の4パターンを学んだ。
- agent: タスクの正確なステップが不明な場合に使う。抽象的なツールセット(Bash・web fetch・writeなど)をClaudeに与え、Claude自身に計画・組み合わせを委ねる。ツールは「合理的に抽象的」であるべきで、ハイパー特化したツールは避ける。
- environment inspection: agentが行動の結果を把握するための環境検査の重要性。Computer useのスクリーンショット、Claude Codeの「書く前に読む」、動画生成agentでのWhisper CPP/ffmpegによる検証などが具体例。
- workflow vs agent の使い分け: workflowは精度・テスト容易性で優位、agentは柔軟性で優位だが成功率・評価容易性で劣る。エンジニアの第一目標は信頼性ある問題解決であり、可能な限りworkflowを優先し、agentは本当に必要な場合にのみ使う、というのが講師の結論。
- コース総括の推奨フォローアップ: agent orchestration、agentのパフォーマンス評価・モニタリング、agentic RAG、RAG evaluation、tool evaluation。