T-CREATOR

Claude 4.5 プロンプト設計ベストプラクティス:システム指示・Few-shot・評価ループ

Claude 4.5 プロンプト設計ベストプラクティス:システム指示・Few-shot・評価ループ

Claude 4.5 を使いこなすには、効果的なプロンプト設計が不可欠です。本記事では、システム指示の書き方、Few-shot 学習の活用法、そして評価ループによる継続的な改善という 3 つの柱を中心に、実践的なベストプラクティスをご紹介します。

これらの手法を組み合わせることで、Claude 4.5 の性能を最大限に引き出し、より正確で一貫性のある出力を得られるようになるでしょう。

背景

Claude 4.5 のプロンプト設計における重要性

Claude 4.5 は、Anthropic が開発した最新の大規模言語モデルです。高度な推論能力と長文コンテキスト処理能力を持つ一方、その性能を最大限に引き出すには適切なプロンプト設計が必要になります。

プロンプトは、AI との対話における「インターフェース」です。曖昧な指示では期待通りの結果が得られず、明確で構造化された指示によって初めて高品質な出力が得られます。

以下の図は、プロンプト設計の 3 つの主要要素とその関係性を示しています。

mermaidflowchart TB
  user["ユーザー"] -->|要求| prompt["プロンプト設計"]
  prompt -->|1| system["システム指示<br/>役割・制約・形式"]
  prompt -->|2| fewshot["Few-shot 学習<br/>具体例・パターン"]
  prompt -->|3| eval["評価ループ<br/>測定・改善"]
  system -->|組み合わせ| output["Claude 4.5"]
  fewshot -->|組み合わせ| output
  eval -->|フィードバック| prompt
  output -->|結果| user

この図から、3 つの要素が相互に補完し合い、評価ループが継続的な改善を促進する構造が理解できます。

プロンプト設計の 3 つの柱

プロンプト設計を成功させるには、以下の 3 つの要素を理解し、適切に組み合わせる必要があります。

#要素役割効果
1システム指示Claude の振る舞いを定義一貫性のある応答
2Few-shot 学習具体例による学習期待する出力形式の再現
3評価ループ継続的な品質改善プロンプトの最適化

これらの要素は独立して機能するのではなく、相互に補完し合います。システム指示で基本的な振る舞いを定義し、Few-shot でパターンを示し、評価ループで継続的に改善していくのです。

課題

プロンプト設計における一般的な問題

多くの開発者が Claude 4.5 を使用する際に直面する課題があります。これらの問題を理解することで、より効果的なプロンプト設計の必要性が明確になるでしょう。

曖昧な指示による出力のばらつき

最も一般的な問題は、指示が曖昧なために出力が毎回異なってしまうことです。

typescript// ❌ 悪い例:曖昧な指示
const prompt = 'この文章を要約して';

このような指示では、要約の長さ、形式、含めるべき情報などが不明確です。

期待する形式と異なる出力

構造化されたデータを期待しているのに、自然言語で返されてしまう問題もよくあります。

typescript// ❌ 悪い例:形式指定がない
const prompt = 'ユーザー情報を抽出して';
// 期待:JSON形式
// 実際:「ユーザー名は田中太郎で、年齢は30歳です」

一貫性のない応答

同じような入力に対して、異なる応答が返されてしまうケースです。

以下の図は、不適切なプロンプト設計がもたらす問題の連鎖を示しています。

mermaidflowchart LR
  input["入力"] -->|曖昧な指示| claude["Claude 4.5"]
  claude -->|出力1| vary1["形式A<br/>要約:長文"]
  claude -->|出力2| vary2["形式B<br/>要約:箇条書き"]
  claude -->|出力3| vary3["形式C<br/>要約:JSON"]
  vary1 -.->|一貫性なし| problem["品質問題"]
  vary2 -.->|一貫性なし| problem
  vary3 -.->|一貫性なし| problem
  problem -->|後処理困難| dev["開発負荷増大"]

曖昧な指示は出力のばらつきを生み、それが品質問題と開発負荷の増大につながることがわかります。

ベストプラクティス不在による非効率

体系的なアプローチがないと、試行錯誤に多大な時間を費やしてしまいます。

#問題影響
1毎回ゼロからプロンプトを作成開発時間の浪費
2過去の知見が活かされない同じ失敗の繰り返し
3品質評価の基準がない改善の方向性が不明確
4チーム内で知識が共有されない属人化とスキル格差

これらの課題を解決するには、体系的なプロンプト設計手法の習得が必要です。

解決策

システム指示による振る舞いの定義

システム指示は、Claude 4.5 の基本的な振る舞いを定義する最も重要な要素です。役割、制約、出力形式を明確に指定することで、一貫性のある応答を得られます。

役割の明確な定義

Claude にどのような役割を担ってほしいのかを明示します。

typescript// ✅ 良い例:役割を明確に定義
const systemPrompt = `
あなたは経験豊富なテクニカルライターです。
技術文書を初心者にもわかりやすく説明することが専門です。
以下の原則を常に守ってください:

- 専門用語には必ず簡単な説明を添える
- 具体例を用いて抽象的な概念を説明する
- 段階的に難易度を上げて説明する
`;

この例では、役割(テクニカルライター)、専門性(初心者向け説明)、原則(3 つの指針)を明確に定義しています。

出力形式の厳密な指定

期待する出力形式を詳細に指定することで、後処理が容易になります。

typescript// ✅ 良い例:出力形式を詳細に指定
const systemPrompt = `
ユーザー情報を以下の JSON 形式で出力してください:

{
  "name": "文字列(フルネーム)",
  "age": "数値",
  "email": "文字列(メールアドレス形式)",
  "tags": ["文字列の配列"]
}

- JSON 以外のテキストは出力しない
- フィールドが不明な場合は null を設定
- 必ず valid な JSON として出力
`;

フォーマットの仕様、例外処理、検証ルールまで含めることで、安定した出力が得られます。

制約と境界の設定

何をすべきか、何をすべきでないかを明確にします。

typescript// ✅ 良い例:制約を明確に設定
const systemPrompt = `
以下の制約を厳守してください:

【必須事項】
- 回答は 300 文字以内に収める
- 必ず日本語で回答する
- 回答の最後に情報源を記載する

【禁止事項】
- 個人情報を含めない
- 推測や憶測で回答しない
- 不確実な情報は「不明」と明記する
`;

肯定的な指示(すべきこと)と否定的な指示(すべきでないこと)を両方含めることで、より明確な境界を設定できます。

Few-shot 学習によるパターン提示

Few-shot 学習は、具体的な入出力例を示すことで、Claude に期待するパターンを学習させる手法です。

基本的な Few-shot パターン

最もシンプルな Few-shot の形式は、入力と期待する出力のペアを複数提示することです。

typescript// ✅ 良い例:基本的な Few-shot
const fewShotPrompt = `
以下の例に従って、テキストから感情を分析してください。

例1:
入力:「今日は最高の一日でした!」
出力:{"sentiment": "positive", "score": 0.9, "reason": "強い肯定表現"}

例2:
入力:「特に何もない普通の日だった」
出力:{"sentiment": "neutral", "score": 0.5, "reason": "中立的表現"}

例3:
入力:「ひどい一日だった…」
出力:{"sentiment": "negative", "score": 0.2, "reason": "否定的表現と消沈"}

では、以下のテキストを分析してください:
`;

3 つの例で、ポジティブ、ニュートラル、ネガティブの各パターンをカバーしています。

エッジケースを含む Few-shot

通常のケースだけでなく、境界ケースや例外的なケースも含めることで、より堅牢な動作が期待できます。

typescript// ✅ 良い例:エッジケースを含む
const fewShotPrompt = `
以下の例に従って、日付文字列を正規化してください。

例1(標準形式):
入力:「2024/01/15」
出力:{"date": "2024-01-15", "valid": true}

例2(和暦):
入力:「令和6年1月15日」
出力:{"date": "2024-01-15", "valid": true}

例3(不完全な入力):
入力:「1月15日」
出力:{"date": null, "valid": false, "error": "年が指定されていません"}

例4(無効な日付):
入力:「2024/13/45」
出力:{"date": null, "valid": false, "error": "無効な月または日です"}
`;

正常系だけでなく、エラーケースの処理方法も示すことで、予期しない入力にも適切に対応できます。

段階的な Few-shot(Chain-of-Thought)

複雑な推論が必要な場合は、思考プロセスを段階的に示します。

typescript// ✅ 良い例:思考プロセスを含む Few-shot
const fewShotPrompt = `
以下の例に従って、数学の文章題を解いてください。

例:
問題:「リンゴが 5 個あります。3 個食べて、2 個もらいました。今何個ありますか?」

思考プロセス:
1. 初期状態:リンゴ 5 個
2. 変化1:3 個食べる → 5 - 3 = 2 個
3. 変化2:2 個もらう → 2 + 2 = 4 個
4. 最終状態:4 個

回答:
{
  "answer": 4,
  "unit": "個",
  "steps": [
    "初期: 5個",
    "食べた: -3個 = 2個",
    "もらった: +2個 = 4個"
  ]
}
`;

思考プロセスを明示することで、Claude がより正確な推論を行えるようになります。

以下の図は、Few-shot 学習の効果を視覚化しています。

mermaidflowchart TB
  task["タスク定義"] -->|例を提示| few["Few-shot 例"]
  few -->|例1| ex1["標準ケース"]
  few -->|例2| ex2["エッジケース"]
  few -->|例3| ex3["エラーケース"]
  ex1 -->|パターン学習| model["Claude 4.5"]
  ex2 -->|パターン学習| model
  ex3 -->|パターン学習| model
  model -->|汎化| new["新しい入力"]
  new -->|適切な処理| result["期待通りの出力"]

複数のパターンを学習することで、新しい入力に対しても適切に汎化できることがわかります。

評価ループによる継続的改善

プロンプトは一度作成して終わりではなく、継続的に評価・改善していくものです。

評価基準の設定

まず、何を持って「良いプロンプト」とするかの基準を明確にします。

typescript// ✅ 良い例:評価基準の定義
interface EvaluationCriteria {
  // 正確性:期待する出力が得られているか
  accuracy: {
    metric: '正解率';
    target: 0.95; // 95%以上
    measurement: 'テストケース100件での正解数';
  };

  // 一貫性:同じ入力に同じ出力が返るか
  consistency: {
    metric: '一貫性スコア';
    target: 0.98; // 98%以上
    measurement: '同一入力10回実行での一致率';
  };

  // 形式適合性:指定した形式通りか
  formatCompliance: {
    metric: '形式準拠率';
    target: 1.0; // 100%
    measurement: 'JSON parse成功率';
  };
}

定量的な指標を設定することで、改善効果を客観的に測定できます。

テストケースの作成

評価のための代表的なテストケースを準備します。

typescript// ✅ 良い例:包括的なテストケース
const testCases = [
  // 標準ケース(60%)
  {
    category: 'standard',
    input: '通常のユーザー登録フォーム入力',
    expectedOutput: {
      /* 期待する出力 */
    },
  },

  // エッジケース(20%)
  {
    category: 'edge',
    input: '最小/最大値の境界値',
    expectedOutput: {
      /* 期待する出力 */
    },
  },

  // エラーケース(20%)
  {
    category: 'error',
    input: '不正な形式の入力',
    expectedOutput: {
      /* エラー処理の期待値 */
    },
  },
];

標準ケース、エッジケース、エラーケースをバランスよく含めることが重要です。

評価の自動化

手動評価は時間がかかるため、自動化スクリプトを作成します。

typescript// ✅ 良い例:評価の自動化
async function evaluatePrompt(
  prompt: string,
  testCases: TestCase[]
): Promise<EvaluationResult> {
  const results = [];

  for (const testCase of testCases) {
    // Claude API を呼び出し
    const output = await callClaude(prompt, testCase.input);

    // 期待する出力と比較
    const isCorrect = compareOutputs(
      output,
      testCase.expectedOutput
    );

    results.push({
      input: testCase.input,
      expected: testCase.expectedOutput,
      actual: output,
      correct: isCorrect,
    });
  }

  // 評価指標を計算
  return calculateMetrics(results);
}
typescript// 評価指標の計算
function calculateMetrics(
  results: Result[]
): EvaluationResult {
  const total = results.length;
  const correct = results.filter((r) => r.correct).length;

  return {
    accuracy: correct / total,
    totalTests: total,
    passed: correct,
    failed: total - correct,
    details: results,
  };
}

自動化により、プロンプトを変更するたびに素早くフィードバックが得られます。

改善サイクルの実践

評価結果に基づいて、プロンプトを段階的に改善していきます。

typescript// ✅ 良い例:改善サイクル
class PromptOptimizer {
  async optimize(
    initialPrompt: string,
    testCases: TestCase[],
    targetAccuracy: number
  ): Promise<string> {
    let currentPrompt = initialPrompt;
    let iteration = 0;
    const maxIterations = 10;

    while (iteration < maxIterations) {
      // 現在のプロンプトを評価
      const evaluation = await evaluatePrompt(
        currentPrompt,
        testCases
      );

      console.log(
        `反復 ${iteration + 1}:`,
        `精度 ${evaluation.accuracy}`
      );

      // 目標達成で終了
      if (evaluation.accuracy >= targetAccuracy) {
        return currentPrompt;
      }

      // 失敗ケースを分析
      const failedCases = evaluation.details.filter(
        (r) => !r.correct
      );

      // プロンプトを改善
      currentPrompt = await improvePrompt(
        currentPrompt,
        failedCases
      );

      iteration++;
    }

    return currentPrompt;
  }
}
typescript// 失敗ケースからプロンプトを改善
async function improvePrompt(
  prompt: string,
  failedCases: Result[]
): Promise<string> {
  // 失敗パターンを分析
  const patterns = analyzeFailurePatterns(failedCases);

  // パターンに応じてプロンプトを調整
  if (patterns.includes('format_mismatch')) {
    // 形式指定を強化
    prompt +=
      '\n\n出力は必ず指定された JSON 形式に従ってください。';
  }

  if (patterns.includes('missing_edge_cases')) {
    // エッジケースの Few-shot 例を追加
    prompt +=
      '\n\n' + generateEdgeCaseExamples(failedCases);
  }

  return prompt;
}

以下の図は、評価ループによる継続的改善のプロセスを示しています。

mermaidflowchart LR
  prompt1["初期プロンプト"] -->|実行| test1["テスト実行"]
  test1 -->|測定| eval1["評価<br/>精度: 70%"]
  eval1 -->|分析| analyze["失敗パターン分析"]
  analyze -->|改善| prompt2["改善版プロンプト v2"]
  prompt2 -->|実行| test2["テスト実行"]
  test2 -->|測定| eval2["評価<br/>精度: 85%"]
  eval2 -->|分析| analyze2["失敗パターン分析"]
  analyze2 -->|改善| prompt3["改善版プロンプト v3"]
  prompt3 -->|実行| test3["テスト実行"]
  test3 -->|測定| eval3["評価<br/>精度: 96%"]
  eval3 -->|目標達成| done["完成"]

反復的な改善により、精度が段階的に向上していくプロセスが理解できます。

具体例

実践例:技術記事要約システムの構築

ここでは、技術記事を要約するシステムを構築する具体例を通じて、3 つの手法を統合的に活用する方法を見ていきましょう。

ステップ 1:システム指示の設計

まず、要約システムの基本的な振る舞いを定義します。

typescript// システム指示の定義
const SYSTEM_PROMPT = `
あなたは技術記事の要約を専門とする AI アシスタントです。

【役割】
- 技術記事の核心的な内容を抽出し、簡潔に要約する
- 技術的な正確性を保ちながら、初心者にも理解できる表現を使う

【出力形式】
以下の JSON 形式で出力してください:
{
  "title": "記事タイトル(50文字以内)",
  "summary": "要約文(200文字以内)",
  "keyPoints": ["要点1", "要点2", "要点3"],
  "targetAudience": "初級 | 中級 | 上級",
  "technologies": ["技術1", "技術2"]
}

【制約】
- summary は必ず 200 文字以内
- keyPoints は 3〜5 個
- 技術的な誤りを含めない
- JSON 以外のテキストは出力しない
`;

この定義により、出力の一貫性が確保されます。

ステップ 2:Few-shot 例の追加

次に、具体的な要約例を示して期待するパターンを学習させます。

typescript// Few-shot 例の定義
const FEW_SHOT_EXAMPLES = `
以下の例に従って要約してください。

【例1:標準的な技術記事】
入力記事:
「React 18 では、新しい concurrent rendering 機能が導入されました。
この機能により、UI の更新がより滑らかになり、ユーザー体験が向上します。
startTransition API を使用することで、優先度の低い更新を遅延させ、
重要な UI 更新を優先することができます...(以下略)」

出力:
{
  "title": "React 18 の concurrent rendering を理解する",
  "summary": "React 18 で導入された concurrent rendering は、UI 更新の優先度制御を可能にします。startTransition API により、重要な更新を優先し、ユーザー体験を向上させることができます。",
  "keyPoints": [
    "concurrent rendering が新機能として導入",
    "startTransition API で更新の優先度を制御",
    "UI の滑らかさとユーザー体験が向上"
  ],
  "targetAudience": "中級",
  "technologies": ["React", "JavaScript"]
}

【例2:初心者向け記事】
入力記事:
「Git は、プログラムのソースコードを管理するためのツールです。
変更履歴を記録し、いつでも過去の状態に戻すことができます。
複数人で開発する際にも便利で、それぞれの変更を統合できます...(以下略)」

出力:
{
  "title": "Git 入門:バージョン管理の基礎",
  "summary": "Git はソースコード管理ツールで、変更履歴の記録と過去への復元が可能です。チーム開発での変更統合にも対応し、開発効率を向上させます。",
  "keyPoints": [
    "Git はバージョン管理ツール",
    "変更履歴の記録と過去状態への復元が可能",
    "チーム開発での変更統合に対応"
  ],
  "targetAudience": "初級",
  "technologies": ["Git"]
}

【例3:高度な技術記事】
入力記事:
「Kubernetes の Custom Resource Definition (CRD) を使用すると、
Kubernetes API を拡張して独自のリソースタイプを定義できます。
Controller と組み合わせることで、宣言的な管理が可能になり...(以下略)」

出力:
{
  "title": "Kubernetes CRD による API 拡張パターン",
  "summary": "Kubernetes の CRD を使用することで、独自のリソースタイプを定義し、API を拡張できます。Controller との組み合わせにより、宣言的なリソース管理を実現します。",
  "keyPoints": [
    "CRD で独自リソースタイプを定義",
    "Kubernetes API を拡張可能",
    "Controller と組み合わせて宣言的管理を実現"
  ],
  "targetAudience": "上級",
  "technologies": ["Kubernetes", "CRD"]
}
`;

初級・中級・上級の 3 つのレベルの例を示すことで、幅広い記事に対応できます。

ステップ 3:完全なプロンプトの構築

システム指示と Few-shot 例を組み合わせて、完全なプロンプトを構築します。

typescript// 完全なプロンプトの構築
function buildPrompt(article: string): string {
  return `
${SYSTEM_PROMPT}

${FEW_SHOT_EXAMPLES}

では、以下の記事を要約してください:

${article}
  `.trim();
}
typescript// Claude API の呼び出し
async function summarizeArticle(
  article: string
): Promise<ArticleSummary> {
  const prompt = buildPrompt(article);

  const response = await anthropic.messages.create({
    model: 'claude-4.5-sonnet-20250514',
    max_tokens: 1024,
    messages: [
      {
        role: 'user',
        content: prompt,
      },
    ],
  });

  // JSON をパースして返す
  const content = response.content[0].text;
  return JSON.parse(content);
}

ステップ 4:評価基盤の構築

要約の品質を評価するテストケースと評価ロジックを作成します。

typescript// テストケースの定義
const TEST_CASES = [
  {
    id: 'test-001',
    article: `
      TypeScript 5.0 では、decorator の新しい実装が...
      (記事本文が続く)
    `,
    expected: {
      title: 'TypeScript 5.0 の decorator 実装',
      summaryLength: { min: 100, max: 200 },
      keyPointsCount: { min: 3, max: 5 },
      targetAudience: '中級',
      technologies: ['TypeScript'],
    },
  },
  // 他のテストケース...
];
typescript// 評価関数の実装
async function evaluateSummarizer(): Promise<EvaluationReport> {
  const results = [];

  for (const testCase of TEST_CASES) {
    // 要約を生成
    const summary = await summarizeArticle(
      testCase.article
    );

    // 各基準で評価
    const evaluation = {
      testId: testCase.id,
      titleMatch: evaluateTitle(
        summary.title,
        testCase.expected.title
      ),
      summaryLengthOk: isInRange(
        summary.summary.length,
        testCase.expected.summaryLength
      ),
      keyPointsCountOk: isInRange(
        summary.keyPoints.length,
        testCase.expected.keyPointsCount
      ),
      targetAudienceMatch:
        summary.targetAudience ===
        testCase.expected.targetAudience,
      technologiesMatch: arraysMatch(
        summary.technologies,
        testCase.expected.technologies
      ),
    };

    results.push(evaluation);
  }

  return generateReport(results);
}
typescript// 評価ヘルパー関数
function isInRange(
  value: number,
  range: { min: number; max: number }
): boolean {
  return value >= range.min && value <= range.max;
}

function arraysMatch(
  arr1: string[],
  arr2: string[]
): boolean {
  return arr1.every((item) => arr2.includes(item));
}

function evaluateTitle(
  actual: string,
  expected: string
): number {
  // 類似度スコアを計算(簡略版)
  const actualWords = actual.toLowerCase().split(/\s+/);
  const expectedWords = expected.toLowerCase().split(/\s+/);

  const matches = actualWords.filter((word) =>
    expectedWords.includes(word)
  ).length;

  return matches / expectedWords.length;
}

ステップ 5:評価実行と改善

実際に評価を実行し、結果に基づいてプロンプトを改善します。

typescript// 評価の実行
async function runEvaluationCycle() {
  console.log('=== 評価サイクル開始 ===\n');

  // 初回評価
  const initialReport = await evaluateSummarizer();
  console.log('初回評価結果:');
  console.log(`- 正確性: ${initialReport.accuracy * 100}%`);
  console.log(
    `- 成功: ${initialReport.passed}/${initialReport.total}`
  );

  // 失敗ケースを分析
  const failures = initialReport.results.filter(
    (r) => !r.allPassed
  );

  console.log(`\n失敗ケース: ${failures.length}件`);
  failures.forEach((f) => {
    console.log(`  - ${f.testId}:`);
    if (!f.summaryLengthOk) {
      console.log('    → 要約文の長さが範囲外');
    }
    if (!f.keyPointsCountOk) {
      console.log('    → 要点の数が不適切');
    }
  });
}

実行結果の例:

bash=== 評価サイクル開始 ===

初回評価結果:
- 正確性: 85%
- 成功: 17/20

失敗ケース: 3件
  - test-005:
    → 要約文の長さが範囲外(243文字)
  - test-012:
    → 要点の数が不適切(2個)
  - test-018:
    → 対象読者の判定が不一致

この結果に基づき、プロンプトを改善します。

typescript// 改善されたシステム指示
const IMPROVED_SYSTEM_PROMPT = `
${SYSTEM_PROMPT}

【追加の制約】
- summary は厳密に 200 文字以内(句読点含む)で終える
- keyPoints は必ず 3 個以上 5 個以内を記載
- 対象読者の判定基準:
  * 初級:基本概念の説明が中心
  * 中級:実装パターンや応用の説明
  * 上級:アーキテクチャや内部実装の詳細
`;

改善後、再度評価を実行します。

bash=== 再評価結果 ===

改善後の評価結果:
- 正確性: 95%
- 成功: 19/20

失敗ケース: 1件
  - test-018:
    → 対象読者の判定が不一致(要 Few-shot 例の追加)

さらに Few-shot 例を追加して最終調整を行います。

以下の図は、評価と改善のサイクル全体を示しています。

mermaidstateDiagram-v2
  [*] --> design: プロンプト設計
  design --> implement: システム指示 + Few-shot
  implement --> evaluate: 評価実行
  evaluate --> analyze: 結果分析

  analyze --> pass: 目標達成?
  pass --> [*]: Yes

  analyze --> improve: No
  improve --> design

  note right of evaluate
    テストケース実行
    精度測定
  end note

  note right of improve
    失敗パターン特定
    プロンプト修正
  end note

設計、実装、評価、改善の反復サイクルにより、目標精度に到達するプロセスが可視化されています。

実装の完全なコード例

最終的な実装をまとめた完全なコード例を示します。

typescript// types.ts - 型定義
interface ArticleSummary {
  title: string;
  summary: string;
  keyPoints: string[];
  targetAudience: '初級' | '中級' | '上級';
  technologies: string[];
}

interface TestCase {
  id: string;
  article: string;
  expected: {
    title: string;
    summaryLength: { min: number; max: number };
    keyPointsCount: { min: number; max: number };
    targetAudience: string;
    technologies: string[];
  };
}
typescript// prompts.ts - プロンプト定義
export const SYSTEM_PROMPT = `
あなたは技術記事の要約を専門とする AI アシスタントです。

【役割】
- 技術記事の核心的な内容を抽出し、簡潔に要約する
- 技術的な正確性を保ちながら、初心者にも理解できる表現を使う

【出力形式】
以下の JSON 形式で出力してください:
{
  "title": "記事タイトル(50文字以内)",
  "summary": "要約文(200文字以内)",
  "keyPoints": ["要点1", "要点2", "要点3"],
  "targetAudience": "初級 | 中級 | 上級",
  "technologies": ["技術1", "技術2"]
}

【制約】
- summary は厳密に 200 文字以内
- keyPoints は必ず 3〜5 個
- JSON 以外のテキストは出力しない
- 対象読者の判定基準:
  * 初級:基本概念の説明が中心
  * 中級:実装パターンや応用の説明
  * 上級:アーキテクチャや内部実装の詳細
`;

export const FEW_SHOT_EXAMPLES = `
(前述の Few-shot 例をここに記載)
`;
typescript// summarizer.ts - メイン実装
import Anthropic from '@anthropic-ai/sdk';

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

export async function summarizeArticle(
  article: string
): Promise<ArticleSummary> {
  const prompt = buildPrompt(article);

  const response = await anthropic.messages.create({
    model: 'claude-4.5-sonnet-20250514',
    max_tokens: 1024,
    messages: [
      {
        role: 'user',
        content: prompt,
      },
    ],
  });

  const content = response.content[0].text;
  return JSON.parse(content);
}

function buildPrompt(article: string): string {
  return `
${SYSTEM_PROMPT}

${FEW_SHOT_EXAMPLES}

では、以下の記事を要約してください:

${article}
  `.trim();
}
typescript// evaluator.ts - 評価実装
export async function evaluateSummarizer(
  testCases: TestCase[]
): Promise<EvaluationReport> {
  const results = [];

  for (const testCase of testCases) {
    const summary = await summarizeArticle(
      testCase.article
    );

    const evaluation = {
      testId: testCase.id,
      allPassed: true,
      details: {
        titleScore: evaluateTitle(
          summary.title,
          testCase.expected.title
        ),
        summaryLengthOk: isInRange(
          summary.summary.length,
          testCase.expected.summaryLength
        ),
        keyPointsCountOk: isInRange(
          summary.keyPoints.length,
          testCase.expected.keyPointsCount
        ),
        targetAudienceMatch:
          summary.targetAudience ===
          testCase.expected.targetAudience,
        technologiesMatch: arraysMatch(
          summary.technologies,
          testCase.expected.technologies
        ),
      },
    };

    // 全ての基準を満たしているか確認
    evaluation.allPassed = Object.values(
      evaluation.details
    ).every((v) => (typeof v === 'boolean' ? v : v > 0.7));

    results.push(evaluation);
  }

  const passed = results.filter((r) => r.allPassed).length;

  return {
    total: results.length,
    passed,
    failed: results.length - passed,
    accuracy: passed / results.length,
    results,
  };
}
typescript// main.ts - 実行スクリプト
import { evaluateSummarizer } from './evaluator';
import { TEST_CASES } from './test-cases';

async function main() {
  console.log('技術記事要約システムの評価を開始します\n');

  const report = await evaluateSummarizer(TEST_CASES);

  console.log('=== 評価結果 ===');
  console.log(`総テスト数: ${report.total}`);
  console.log(`成功: ${report.passed}`);
  console.log(`失敗: ${report.failed}`);
  console.log(
    `正確性: ${(report.accuracy * 100).toFixed(1)}%`
  );

  if (report.failed > 0) {
    console.log('\n失敗したテスト:');
    report.results
      .filter((r) => !r.allPassed)
      .forEach((r) => {
        console.log(`\n${r.testId}:`);
        Object.entries(r.details).forEach(
          ([key, value]) => {
            if (typeof value === 'boolean' && !value) {
              console.log(`  ✗ ${key}`);
            } else if (
              typeof value === 'number' &&
              value < 0.7
            ) {
              console.log(
                `  ✗ ${key}: ${value.toFixed(2)}`
              );
            }
          }
        );
      });
  }
}

main().catch(console.error);

実行方法:

bash# 依存関係のインストール
yarn add @anthropic-ai/sdk

# 環境変数の設定
export ANTHROPIC_API_KEY="your-api-key"

# 評価の実行
yarn ts-node main.ts

この実装により、システム指示、Few-shot 学習、評価ループの 3 つの手法が統合され、実用的な技術記事要約システムが完成します。

まとめ

Claude 4.5 のプロンプト設計における 3 つの重要な手法を見てきました。最後に、それぞれの要点と組み合わせ方をまとめておきましょう。

3 つの手法の要点

#手法主な目的重要なポイント
1システム指示基本的な振る舞いの定義役割・制約・形式を明確に
2Few-shot 学習パターンの具体的な提示標準・エッジ・エラーケースを含む
3評価ループ継続的な品質改善定量的な指標で測定

これらは独立した技術ではなく、相互に補完し合う関係にあります。

効果的な組み合わせ方

プロンプト設計を成功させるには、以下の順序で取り組むことをお勧めします。

フェーズ 1:基盤構築

  • システム指示で役割と制約を定義
  • 基本的な Few-shot 例を 2〜3 個作成
  • 最小限のテストケースで動作確認

フェーズ 2:精度向上

  • 失敗するケースを特定
  • エッジケースの Few-shot 例を追加
  • システム指示の制約を明確化

フェーズ 3:最適化

  • 包括的なテストケースで評価
  • 評価指標に基づいて改善
  • 目標精度に到達するまで反復

実践における注意点

プロンプト設計を実践する際は、以下の点に注意してください。

過度な複雑化を避ける

  • システム指示は必要最小限に
  • Few-shot 例は 3〜5 個程度
  • 評価指標は 3〜4 個に絞る

具体性を重視する

  • 曖昧な表現を避け、具体的に指示
  • 数値で制約を明示(「短く」ではなく「200 文字以内」)
  • 期待する出力の完全な例を示す

継続的な改善

  • 一度作って終わりにしない
  • 定期的に評価を実行
  • 新しいエッジケースが見つかったら追加

次のステップ

本記事で学んだ手法を実際のプロジェクトで活用してみましょう。

小さく始める まずは単純なタスク(テキスト分類、データ抽出など)から始めて、3 つの手法に慣れていきましょう。

評価基盤を整える 早い段階で評価の仕組みを構築しておくと、後の改善が効率的になります。

知見を蓄積する 成功したプロンプトパターンをチーム内で共有し、再利用可能なテンプレートとして整備しましょう。

Claude 4.5 は強力なツールですが、その力を引き出すのはプロンプト設計次第です。システム指示で方向性を定め、Few-shot で具体例を示し、評価ループで磨き上げていく——この 3 つの手法を習得することで、あなたのプロジェクトにおける AI 活用の質が大きく向上するでしょう。

ぜひ実践を通じて、自分なりのベストプラクティスを見つけてください。

関連リンク