週次の記事作成、手作業でネタ探しから執筆までやるのって正直しんどいよね。でも大丈夫、Claude CodeとClaude APIを使えば、記事ドラフト生成のパイプラインを自動化できるんだ。
今回は、IVYXON編集部で実際に運用してる記事生成パイプラインの作り方と、APIコストを抑える運用術を教えるね。
一番雑な投げ方
まずは、このプロンプトをClaude Codeに投げてみて。
Node.jsで週次記事生成パイプラインを作って。
ソースをクロールして、Claude APIで記事ドラフトを自動生成する機能が欲しい。
トピックバックログ、重複チェック、キャッシュ、APIコスト抑制も考慮に入れてね。
これだけで、基本的なパイプラインの骨格をClaude Codeが提案してくれるよ。初期構築の叩き台としてかなり使えるから、まずこれで動かしてみるのがおすすめだ。
もうちょい具体的に投げるパターン
上の雑なプロンプトだと「なんかフワッとしたコードが返ってきたな」って感じることがある。そんな時は、もうちょい具体的に指示を出して、特定の機能を強化したり、実装方法を指定したりするんだ。
クロール部分を堅牢にする
Webサイトからの情報収集は不安定になりがちだから、Headlessブラウザを使ってしっかりクロールさせたいときに使うよ。
前回のスクリプトで、ソースクローリングのロジックをPlaywrightを使って実装して。
特定のRSSフィードやWebページリストから、本文とメタデータを抽出してね。
記事生成プロンプトを最適化する
Claude APIに渡すプロンプトの質が、記事ドラフトの品質を大きく左右するから、ここはこだわるポイントだ。
記事ドラフト生成用のClaude APIプロンプトを、以下の制約で書いて。
- ターゲット読者はIVYXONのClaude Code初級者
- カジュアル口調、結論ファースト
- 具体的なコード例を多めに
- Markdown形式で出力
- 記事のテーマは与えられたクロール結果から決定すること
重複チェックとキャッシュの仕組みを強化する
記事の重複は絶対に避けたいし、無駄なAPIコールも減らしたいから、ここも具体的に指示しておこう。
生成された記事ドラフトの重複チェックは、タイトルと内容のハッシュ値を使って既存記事DB(SQLiteで実装)と照合するようにして。
クロールしたコンテンツのキャッシュは、ファイルシステムにJSON形式で保存するシンプルな実装でいいよ。
実践例 / 実録
実は、IVYXON編集部でも、この週次記事生成パイプラインを実際に運用してるんだ。上記の雑なプロンプトをベースにClaude Codeに叩き込んで出てきたスクリプトを、少しだけ手直しして使ってるよ。
ざっくり構成はこんな感じだね。
crawler.js: 指定されたURLリスト(RSS含む)からコンテンツを収集。PlaywrightとかcheerioをClaude Codeが選んできてくれたりするよ。processor.js: クロール結果を整形して、Claude APIに渡すプロンプトを生成。generator.js: Claude APIを呼び出して記事ドラフトを生成。storage.js: 生成された記事ドラフトをDB(うちではSQLite)に保存。scheduler.js: 上記の処理を週次で実行するスケジューラー(cronとか使ってるね)。
このスクリプトを叩けば、ソースクローリング→API呼び出し→記事ドラフト出力の流れが自動で動く。
APIコストを抑える運用術
一番気になるのがAPIコストだと思うんだけど、うちでは普段は無料枠のあるLLMプロバイダ(例えばGoogle GeminiのFlashモデルとか)を使って、生成品質を上げたいここぞという時だけClaude APIに切り替える運用をしてるんだ。
スクリプト側では、LLM_PROVIDERみたいな環境変数で使うLLMを切り替えられるように抽象化されてるよ。
// generator.js の一部(イメージ)
const getLlmClient = () => {
const provider = process.env.LLM_PROVIDER || 'gemini'; // デフォルトはGemini
if (provider === 'anthropic') {
return new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
} else if (provider === 'gemini') {
return new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
}
throw new Error('Unsupported LLM provider');
};
const client = getLlmClient();
// 以降、clientを使ってAPI呼び出し
こうしておけば、普段は安価に大量のドラフトを生成して、人間が「これはいいネタだ!」と判断したものだけ、Claude APIで高品質なドラフトに仕上げる、なんてことも可能になるんだ。
トピックバックログと重複チェック
生成された記事は、まず専用のバックログDBに溜まるようにしてる。ここで、記事のタイトルや内容のハッシュ値を使って、既存記事との重複がないかをチェック。完全に一致するものはスキップしたり、似たような内容の場合はアラートを出す仕組みを入れてるよ。これはClaude Codeが初期提案してくれたもので、かなり便利に使わせてもらってる。
キャッシュは、一度クロールしたソースや生成済みの記事ドラフトをファイルシステムに保存してるんだ。これによって、同じソースを何度もクロールしたり、同じプロンプトで何度もAPIを呼び出したりする無駄を省いて、API呼び出し回数を最小限に抑えてるよ。
つまずきポイント
APIキー設定がめんどくさい
「なんか動かない!」って思ったら、大体.envファイルにAPIキーが設定されてないか、間違ってるパターンだよ。ANTHROPIC_API_KEYとかGEMINI_API_KEYとか、正しい環境変数名で設定してるか確認してね。
生成される記事の品質がイマイチ…
これはClaude APIに渡すプロンプトの質がほぼ全てだ。最初は納得いく記事が出てこなくても、めげずにプロンプトを調整していくと、どんどん賢くなっていくよ。具体的な制約や出力形式を細かく指定するのがコツだね。
APIコストが想定より高い!
これもよくある悩みだね。
- キャッシュがうまく効いてない: キャッシュの仕組みが正しく動いてるか、期待通りにAPIコールがスキップされてるか確認してみて。
- クロール範囲が広すぎる: 無関係な情報まで大量にクロールしてると、LLMへの入力トークン数が増えてコストが上がるから、クロール対象のURLや要素を絞り込もう。
- LLMモデルの選択: 無料枠のあるモデルや、より安価なモデル(例えばClaude HaikuやGemini Flash)から試して、品質とコストのバランスを見つけるのがおすすめだよ。