Claude + Geminiを組み合わせて記事を量産する設計 (Wheel公開)
メディアサイトを月60本ペースで自動更新するLLM分業設計の実装

メディアサイトを運営して記事を量産する場合、Claude と Gemini のどちらを使うかは大きな判断ポイントです。ただし私の結論は「両方を分業させる」です。ai-pick.tech と saas-diary.com で運用している記事量産パイプラインは、Gemini Flash と Claude を役割分担させて、月コスト数百円で月60本の高品質な記事を生成しています。この記事ではその設計と実コードを公開します。
分業の核 — どちらが何に強いか
2026年5月時点の両者の特性を、実プロジェクトで使い比べた結果はこうです。
| タスク | Gemini 2.5 Flash | Claude Haiku 4.5 | 推奨 |
|---|---|---|---|
| 本文の量産 (2,000-3,000字) | 高速・低コスト・品質中 | 速度中・コスト中・品質高 | Gemini Flash |
| 記事の構成設計 (h2見出し) | テンプレ的になりがち | 論理性が高い | Claude Haiku |
| AI臭排除・文体改善 | 苦手 (副詞が頻発) | 得意 (日本語の自然さ高) | Claude Haiku |
| ファクトチェック | 幻覚あり | 制約遵守が高い | Claude Haiku |
| 翻訳 (en/pt/es) | 高速・低コスト | 品質微妙に上 | Gemini Flash |
| 料金 (per 1M tokens) | $0.10 / $0.40 | $1 / $5 | — |
この特性を踏まえた分業ルールが「構成は Claude、本文は Gemini、最終チェックは Claude」です。本文の文字数が多いタスクは Gemini に任せてコストを抑え、品質判定や論理構造の必要な部分だけ Claude に任せる構成です。
パイプラインの全体像
記事1本を生成する流れはこうなります。各ステップは独立したスクリプトに分けており、エラー時の再実行が容易です。
- トピック選定: topics.json から未生成のスラグを選ぶ (Node.js スクリプト)
- 構成生成: Claude Haiku で h2見出し5個 + 各h2の概要を生成 (約 5円/本)
- 本文生成: Gemini Flash で構成に従って本文 2,500-3,500字を生成 (約 0.5円/本)
- 品質チェック: Claude Haiku で AI臭ワード検出 + 構造化データ整合性 (約 2円/本)
- HTML 化: site-html-builder.mjs で記事ページ生成 (LLM 不要)
- FTPS デプロイ: WING にアップロード (LLM 不要)
1記事あたり LLM コストは約 7-8円、月60本で約 500円です。これに対して、本文を Claude Sonnet 4.6 単独で生成すると 1記事あたり約 9円、月60本で約 540円。分業のほうが品質が高く、コストもほぼ同じです。
構成生成スクリプト (Claude Haiku)
// scripts/generate-structure.mjs
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
export async function generateStructure(topic) {
const prompt = `以下のトピックで技術記事の構成を作ってください。
【トピック】${topic.title}
【ターゲット】${topic.target}
【キーワード】${topic.keyword}
h2見出しを5個、各見出しの下に書くべき内容の概要 (50-80字) を返してください。
JSON形式: { "sections": [{ "h2": "...", "description": "..." }, ...] }`;
const response = await client.messages.create({
model: 'claude-haiku-4-5',
max_tokens: 1500,
messages: [{ role: 'user', content: prompt }]
});
return JSON.parse(response.content[0].text);
}
本文生成スクリプト (Gemini Flash)
// scripts/generate-body.mjs
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
export async function generateBody(topic, structure) {
const sectionsText = structure.sections
.map((s, i) => `## ${i+1}. ${s.h2}\n → ${s.description}`)
.join('\n\n');
const prompt = `以下の構成に従って、2,500-3,500字の技術記事本文をHTMLで書いてください。
【タイトル】${topic.title}
【構成】
${sectionsText}
【制約】
- 各h2見出しの直後に200-400字の段落、その後コード例 or 表 or 箇条書きを配置
- AI臭ワード禁止: 大きく, 想像以上に, 明確に, , 新しい, 理想の
- 体験談スニペット 2箇所以上、具体数値 5個以上
- 出力はHTML、,
, , , - , ,
, ,
のみ使用可`;
const response = await ai.models.generateContent({
model: 'gemini-2.5-flash',
contents: [{ role: 'user', parts: [{ text: prompt }] }],
config: { temperature: 0.75, maxOutputTokens: 8192 }
});
return response.text;
}
品質チェックスクリプト (Claude Haiku)
生成された本文に対して、AI臭ワードと構造化データ整合性をスキャンするフェーズです。検出されたら自動修正、または再生成のフラグを立てます。
const AI_SMELL = ['大きく', '想像以上に', '明確に', '', '新しい', '理想の'];
export async function checkQuality(html) {
// ローカルで簡易スキャン
const localIssues = [];
for (const word of AI_SMELL) {
const count = (html.match(new RegExp(word, 'g')) || []).length;
if (count > 0) localIssues.push(`${word}: ${count}件`);
}
// Claude で深いチェック (論理整合性、文体)
const response = await client.messages.create({
model: 'claude-haiku-4-5',
max_tokens: 800,
messages: [{
role: 'user',
content: `以下の記事本文について、AI生成感が強い部分を最大5箇所指摘してください。なければ「OK」と答えてください。\n\n${html}`
}]
});
return {
localIssues,
claudeReview: response.content[0].text,
canPublish: localIssues.length === 0 && !response.content[0].text.includes('修正必要')
};
}
運用面 — Windowsタスクで完全自動
このパイプラインを毎日10:00と18:00にWindowsタスクで自動実行することで、ai-pick.tech は毎日2記事が自動公開されます。1日の電力的にはほぼ無視できる範囲、Geminiの無料枠 (1,500 RPD) に収まる構成です。
実装の他の細部は 自動化レシピカテゴリ、AIワークフロー全般は AIワークフローカテゴリ にまとめています。