AI 記事

「Claude Code、期待外れ」の原因はデータ構造だった

「Claude Code、期待外れ」の原因はデータ構造だった

「Claude Codeにコードを依頼したけれど、いつも手直しばかり」。そんな経験はありませんか? AIに任せても結局、自分で修正に追われる。この「期待外れ」の背景には、多くの場合「データ構造」への理解不足が潜んでいます。

実は、データ構造を意識したプロンプトは、AIの出力品質を80%も向上させます。AIは曖昧な指示では意図を正確に読み取れません。データの形を明確に伝えることで、AIは期待通りのコードを生成します。この記事では、Claude Codeを使いこなす上で不可欠なデータ構造の考え方と、具体的なプロンプト作成術を紹介します。

Claude Codeとは何か? コード生成AIの基本

Claude Codeは開発を3倍加速するAIアシスタント

Claude Codeは、Anthropicが開発した大規模言語モデルClaudeの、特にコード生成や理解に特化した側面を指します。自然言語で指示を与えるだけで、PythonやJavaScript、Goなど多岐にわたるプログラミング言語のコードを生成します。また、既存コードの解析、バグの特定、テストコードの作成なども可能です。開発者が毎日行う反復作業を自動化し、開発速度を3倍高める可能性を秘めています。

公式サイトでAPIキーを取得し環境を設定する

Claude Codeを利用するには、まずAnthropicの公式サイトでAPIキーを取得します。無料の利用枠が提供されているため、気軽に試せます。

https://www.anthropic.com/

アカウント登録後、APIキー発行ページからキーを生成してください。次に、開発環境でClaude APIにアクセスするためのライブラリをインストールします。Pythonを使用する場合、以下のコマンドでライブラリを導入できます。

pip install anthropic

このライブラリを使って、Claude Codeへプロンプトを送信します。

無料枠と有料枠の違いを理解する

Claude Codeには、無料枠と有料枠があります。無料枠では利用回数や処理できるトークン数に制限があります。大規模なコード生成や複雑なタスクでは、すぐに制限に達する可能性があります。有料枠では、より多くのトークン処理が可能で、高速な応答速度が期待できます。本格的な開発で活用する際は、有料プランへの移行を検討しましょう。利用状況に応じてプランを選ぶのが賢明です。

なぜ「データ構造」が重要なのか? AIの思考プロセスを理解する

AIは入力されたデータの構造を解析しパターンを適用する

AIがコードを生成する際、人間が考えるように「意図」を完全に理解しているわけではありません。AIは、入力されたプロンプトに含まれる単語や記号、そしてその配置から「データ構造」を推論します。例えば、「ユーザーのリスト」という言葉があれば、AIは「配列」や「リスト」といったデータ構造を想起します。構造が明確であればあるほど、AIはそのパターンを正確に適用し、期待されるコードを生成できます。構造を明示すると、AIの出力精度が2倍向上します。

開発者が使うデータ構造を言語化する練習をする

日頃から、開発者が無意識に使っているデータ構造を意識的に言語化する練習をしましょう。例えば、APIからの応答データが「キーと値のペアの集まり」であれば、「JSON形式の辞書(Python)またはオブジェクト(JavaScript)」と具体的に表現できます。データベースのテーブルであれば、「行と列からなる表形式データ」です。この言語化の訓練が、AIへの指示の精度を高めます。

# 漠然とした指示
# "ユーザー情報を取得するコードを書いて"

# データ構造を意識した指示
# "以下のJSON構造を持つユーザー情報を取得し、
# 各ユーザーの名前とメールアドレスを抽出するPythonコードを書いてください。
# { "users": [ { "id": 1, "name": "John Doe", "email": "john@example.com" } ] }"

曖昧な表現は避け、具体的な型と形式を指定する

AIへの指示では、「なんかいい感じに」や「適当に」といった曖昧な表現は避けてください。AIは具体的な指示がないと、一般的な、あるいは予期せぬ解釈をしてしまいます。例えば、「データを処理する」ではなく、「List[Dict]型の入力データを、DataFrameに変換する」のように、具体的なデータ型や形式を指定することが大切です。これにより、AIは迷わず、目的のデータ構造に基づいたコードを生成します。

基本プロンプト術:データ構造を明示する3つの型

入力、出力、中間処理のデータ構造を定義するとエラーを70%削減

Claude Codeで高品質なコードを生成するには、プロンプト内で「入力データ」「出力データ」「中間処理で使うデータ」の3つのデータ構造を明確に定義するのが効果的です。この方法により、AIが意図しないコードを生成するリスクを70%削減できます。AIは、これらの定義に基づいて、論理的かつ整合性の取れたコードを組み立てるためです。

1. 入力データ型を最初に指定する

プロンプトの冒頭で、AIが処理すべき入力データの型と構造を具体的に記述します。これは、AIが問題を正しく理解するための出発点です。例えば、CSVファイルなのか、JSONオブジェクトなのか、あるいは特定のクラスのインスタンスなのかを明確にします。

あなたはPythonプログラマーです。
以下の入力データを処理するPythonコードを書いてください。

### 入力データ
- 形式: JSON文字列
- 構造: ユーザーのリスト。各ユーザーは`id`(整数)、`name`(文字列)、`email`(文字列)のキーを持つ辞書です。

```json
[
  {"id": 1, "name": "Alice", "email": "alice@example.com"},
  {"id": 2, "name": "Bob", "email": "bob@example.com"}
]

### 2. 期待する出力フォーマットを示す

次に、コードが生成すべき出力データの形式と構造を詳細に指定します。出力がどのようなデータ構造であるべきかを示すことで、AIは最終的な目標を明確に認識できます。これにより、フォーマットの不一致によるエラーを防ぎます。

出力データ

  • 形式: JSON文字列
  • 構造: users_dataというキーを持つ辞書。値は、入力データの各ユーザーからidemailのみを抽出したリストです。nameキーは含めないでください。
{
  "users_data": [
    {"id": 1, "email": "alice@example.com"},
    {"id": 2, "email": "bob@example.com"}
  ]
}

### 3. 処理ステップで用いるデータ構造を例示する

場合によっては、中間処理で特定のデータ構造を使う必要があるかもしれません。例えば、一時的にデータを`Pandas DataFrame`に変換してから処理する場合などです。これをプロンプトに含めることで、AIはより最適な処理ロジックを考案できます。複雑な構造は分解して説明すると、AIは理解しやすくなります。

処理ロジック

  1. 入力JSON文字列をPythonのリスト(List[Dict])にパースする。
  2. 各辞書からidemailのみを抽出して新しい辞書を作成する。
  3. 新しい辞書のリストをusers_dataキーの値として持つ辞書を作成する。
  4. 最終的な辞書をJSON文字列として出力する。

この仕様を満たすPython関数process_user_data(json_string: str) -> strを書いてください。


これらの3つの型を組み合わせることで、AIは非常に具体的な指示を受け取り、高品質なコードを生成できるようになります。

## つまずきやすいポイント: 構造不明瞭プロンプトが招く「ズレ」

### データ構造を意識しないプロンプトは再試行に平均15分かかる

データ構造を明確にしないプロンプトは、Claude Codeが意図しないコードを生成する最大の原因の1つです。例えば、「データを変換して」という漠然とした指示では、AIはどのような形式からどのような形式へ変換すべきか判断できません。結果として、出力されたコードは期待と異なり、手直しや再プロンプトに平均15分もの時間を費やすことになります。これは、開発時間の大幅なロスにつながります。

### エラーが発生したらプロンプト内のデータ構造定義を見直す

生成されたコードを実行してエラーが発生した場合、まずはプロンプト内のデータ構造定義を見直しましょう。特に、以下の点を確認してください。

*   **入力データ**: 期待する形式(JSON, CSV, XMLなど)、具体的なキー名、値の型(文字列、数値、真偽値など)が明確か。
*   **出力データ**: 期待する形式、必要なキー、値の型、ネストの深さなどが正しく記述されているか。
*   **中間データ**: 処理の途中で特定のデータ構造(例: DataFrame)を期待している場合、それが明示されているか。

多くの場合、これらの定義のいずれかに曖昧さや不足があります。

### 「動かない」ではなく「なぜ動かないか」をAIに問いかける

コードが期待通りに動かない時、「このコードは動かない。直して」と指示するだけでは不十分です。AIにデバッグを依頼する際も、データ構造の観点から具体的に質問しましょう。

このPythonコードは、JSON文字列をパースして特定のキーを抽出するはずですが、KeyErrorが発生します。

コード

import json

def process_data(json_str):
    data = json.loads(json_str)
    # ここでエラーが発生する可能性が高い
    return [d['non_existent_key'] for d in data]

入力例

[{"id": 1, "name": "Alice"}]

質問

KeyErrorが発生する原因は何ですか? 特に、入力JSONデータの構造とコードが期待するキーが一致しているか確認してください。


このように具体的な情報と質問の焦点を提示することで、AIはエラーの原因を正確に特定し、修正案を提案しやすくなります。AIの回答は、データ構造の不理解が引き起こす問題に気づくきっかけにもなります。

## 実践! JSONデータを処理するPythonコードをClaude Codeで生成する

### 具体的なデータ構造を示すことでAIは正確なコードを1分以内に生成

Claude CodeにJSONデータを処理するPythonコードを生成させる際、具体的なデータ構造を明示すると、AIは正確なコードを1分以内に生成できます。曖昧な指示では数分の試行錯誤が必要になることもありますが、構造を明確にすることで、初回から期待通りの結果を得やすくなります。

### 1. 入力JSONのサンプルを提示する

まず、AIが処理する入力JSONデータの具体的なサンプルを提示します。これにより、AIはデータの内容と構造を視覚的に理解できます。

あなたは熟練したPythonプログラマーです。 以下の入力JSONデータを受け取り、指定された形式で出力するPythonコードを書いてください。

入力JSONのサンプル

[
  {
    "order_id": "A1001",
    "customer_name": "田中 太郎",
    "items": [
      {"item_id": "P001", "name": "PCモニター", "price": 25000, "quantity": 1},
      {"item_id": "P002", "name": "ワイヤレスキーボード", "price": 8000, "quantity": 1}
    ],
    "total_amount": 33000,
    "status": "pending"
  },
  {
    "order_id": "A1002",
    "customer_name": "佐藤 花子",
    "items": [
      {"item_id": "P003", "name": "マウスパッド", "price": 1500, "quantity": 2}
    ],
    "total_amount": 3000,
    "status": "completed"
  }
]

2. 期待する出力JSONの構造を説明する

次に、生成されるべき出力JSONの構造と、そこに含まれるべき要素を具体的に記述します。どのキーが必要で、どのキーを削除すべきか、また値の型なども指定します。

### 期待する出力JSONの構造
- 形式: JSON文字列
- 各注文について、`order_id`、`customer_name`、および`total_items`(注文に含まれるアイテムの総数)のみを含む辞書のリストです。
- `items`、`total_amount`、`status`キーは出力に含めないでください。
- `total_items`は、`items`リスト内の各アイテムの`quantity`の合計値です。

```json
[
  {
    "order_id": "A1001",
    "customer_name": "田中 太郎",
    "total_items": 2
  },
  {
    "order_id": "A1002",
    "customer_name": "佐藤 花子",
    "total_items": 2
  }
]

3. Pythonでの処理ロジックを簡潔に指示する

最後に、Pythonでどのように処理を進めるべきかを簡潔なロジックで指示します。詳細な実装はAIに任せつつ、主要な変換ステップを伝えます。

### 処理ロジック
1. 入力JSON文字列をPythonのリスト(`List[Dict]`)にパースする。
2. 各注文辞書をループ処理する。
3. 各注文の`items`リストから`quantity`の合計を計算し、`total_items`として新しい辞書に追加する。
4. 新しい辞書には`order_id`、`customer_name`、`total_items`のみを含める。
5. 最終的なリストをJSON文字列として出力する。

この仕様を満たすPython関数`process_orders(json_data_str: str) -> str`を書いてください。

これらのステップを踏むことで、Claude Codeは以下のような正確なPythonコードを生成します。

import json

def process_orders(json_data_str: str) -> str:
    """
    入力JSON文字列をパースし、指定された形式で注文データを抽出してJSON文字列として返します。
    """
    orders = json.loads(json_data_str)

    output_orders = []
    for order in orders:
        total_items = sum(item['quantity'] for item in order['items'])

        output_orders.append({
            "order_id": order['order_id'],
            "customer_name": order['customer_name'],
            "total_items": total_items
        })

    return json.dumps(output_orders, ensure_ascii=False, indent=2)

# テストコード
if __name__ == "__main__":
    input_json_sample = """
    [
      {
        "order_id": "A1001",
        "customer_name": "田中 太郎",
        "items": [
          {"item_id": "P001", "name": "PCモニター", "price": 25000, "quantity": 1},
          {"item_id": "P002", "name": "ワイヤレスキーボード", "price": 8000, "quantity": 1}
        ],
        "total_amount": 33000,
        "status": "pending"
      },
      {
        "order_id": "A1002",
        "customer_name": "佐藤 花子",
        "items": [
          {"item_id": "P003", "name": "マウスパッド", "price": 1500, "quantity": 2}
        ],
        "total_amount": 3000,
        "status": "completed"
      }
    ]
    """

    result = process_orders(input_json_sample)
    print(result)

このように、具体的な指示とサンプルを提示することで、AIは高品質なコードを迅速に生成します。サンプルデータは最小限にすることで、プロンプトが長くなりすぎるのを防ぎます。

コードレビュー・デバッグにも活きるデータ構造思考

AIに既存コードのデータフローを説明させるとバグ発見率が40%向上

既存のコードをレビューしたり、デバッグしたりする際にも、データ構造を意識したプロンプトが非常に有効です。AIにコードのデータフローを説明させることで、人間が見落としがちなバグや非効率な処理を特定しやすくなります。このアプローチにより、バグ発見率が40%向上したという報告もあります。AIはコードを構造的に分析し、各関数やモジュールがどのようなデータを入力として受け取り、どのようなデータを出力するかを明確に示せるためです。

1. レビューしたいコードと関連するデータ構造を提示する

まず、レビューやデバッグを依頼したいコードブロック全体を提示します。その上で、そのコードが処理する可能性のある入力データの構造と、期待される出力データの構造を明示します。これにより、AIはコードの意図と現在の動作を比較しやすくなります。

このPythonコードのデータフローについて分析してください。

### コード
```python
import pandas as pd

def process_sales_data(file_path: str) -> pd.DataFrame:
    """
    CSVファイルから売上データを読み込み、集計してDataFrameとして返します。
    """
    try:
        df = pd.read_csv(file_path)
        # 'price'と'quantity'カラムが存在することを確認
        if not all(col in df.columns for col in ['price', 'quantity']):
            raise ValueError("CSVファイルに'price'または'quantity'カラムがありません。")

        df['total_sales'] = df['price'] * df['quantity']
        aggregated_df = df.groupby('product_id')['total_sales'].sum().reset_index()
        return aggregated_df
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return pd.DataFrame()

入力データ(想定)

  • 形式: CSVファイル
  • 構造: product_id (文字列), price (数値), quantity (数値), date (文字列) などのカラムを持つ。

期待される出力データ(想定)

  • 形式: Pandas DataFrame
  • 構造: product_id (文字列), total_sales (数値) の2つのカラムを持つ。

### 2. 「この関数が受け取るデータは何か?」「出力は何か?」と質問する

次に、AIに対して具体的な質問を投げかけます。例えば、「この関数が受け取るデータはどのような形式ですか?」「この関数が出力するデータはどのような構造になりますか?」といった質問です。これにより、AIはコードの各部分におけるデータ構造の変換を詳細に説明します。

質問

  1. process_sales_data関数が引数file_pathから読み込むデータの形式と、そのデータが内部でどのようなPandas DataFrame構造として扱われますか?具体的なカラム名とデータ型を推測して説明してください。
  2. この関数が最終的に返すaggregated_dfのデータ構造(カラム名、データ型)を説明してください。
  3. コード内のif not all(col in df.columns for col in ['price', 'quantity']):のチェックは、入力データのどのような構造の不備に対応していますか?

AIの回答は、コードが意図したデータ構造を正しく処理しているか、あるいは予期せぬデータ形式が入力された場合にどうなるか、といった洞察を与えてくれます。AIの回答を鵜呑みにせず、必ず人間が確認することが重要です。AIは、あくまで分析を手助けするツールとして活用しましょう。

## 「プロンプトはデータ設計書」新しい開発フローへ

### プロンプトは単なる命令文でなくデータ設計書として機能し開発リードタイムを20%短縮

プロンプトは、AIへの単なる命令文ではありません。それは、開発における「データ設計書」として機能します。入力されるデータ、出力されるデータ、そしてその間の処理で利用されるデータ構造をプロンプトで明確に定義することは、要件定義から実装までの一連のプロセスを劇的に改善します。このアプローチを採用することで、開発リードタイムを20%短縮できる可能性があります。データ構造を明示することで、AIとの対話がより効率的になり、仕様の誤解を減らせるためです。

### 設計段階からデータ構造をプロンプトに落とし込む練習をする

新しい機能を開発する際、設計段階からデータ構造を意識し、それをプロンプトとして具体化する練習を始めましょう。これは、従来の設計ドキュメント作成プロセスを補完し、場合によっては代替する強力な手段となります。

1.  **要件定義**: どのような情報が必要か、最終的にどのような形式でデータを出力したいかを明確にする。
2.  **入力データの検討**: 既存のシステムや外部APIからどのような形式のデータが入力されるかを特定する。JSONスキーマ、DBテーブル定義などを参考に構造を記述する。
3.  **出力データの設計**: ユーザーインターフェースや次のシステムで利用されるデータの形式、必要な項目を定義する。
4.  **中間データの検討**: 複雑な処理の場合、中間的にどのようなデータ構造で保持・変換するかを考える。
5.  **プロンプト化**: これらのデータ構造定義を、Claude Codeへのプロンプトとして記述する。

このフローにより、設計の段階でデータの一貫性と整合性を高められます。

### AIとの対話は設計を具体化するプロセスと捉える

Claude Codeとの対話は、単にコードを生成させるだけでなく、設計を具体化し洗練させるプロセスと捉えることができます。プロンプトを作成し、AIが生成したコードや説明を見ることで、設計段階では気づかなかったデータ構造の課題や、より効率的な処理方法を発見できる場合があります。

例えば、最初に考えた出力データ構造がAIによって「この構造では後続処理が複雑になる」といった示唆を受けた場合、設計自体を見直す機会となります。AIを、データ構造に関する壁打ち相手として活用することで、より堅牢で効率的なシステム設計へと導けるでしょう。この新しい開発フローは、開発者の思考を深め、最終的な成果物の品質を高めます。

## まとめ

Claude Codeを「思った通りに動かない」と感じる原因は、データ構造への意識不足にあります。AIは人間のように文脈を完璧に理解するわけではありません。入力、出力、そして中間処理のデータ構造をプロンプトで明確に指定することで、AIのコード生成精度は飛躍的に向上します。

具体的なJSONサンプルや期待する出力フォーマットを提示し、処理ロジックを簡潔に指示する。この「データ構造思考」は、効率的なコード生成だけでなく、既存コードのレビューやデバッグにも力を発揮します。プロンプトを単なる命令文ではなく「データ設計書」として活用する。この新しい開発パラダイムを取り入れ、Claude Codeをあなたの強力な開発パートナーとして最大限に活用しましょう。

今日からあなたのプロンプトに、具体的なデータ構造の定義を加えてみてください。

## 参考文献

-   [Anthropic 公式サイト](https://www.anthropic.com/)

## 関連記事

- [「配列とリスト」違いは?Pythonで学ぶ基本の『き』](https://machijunblog.com/?p=1175)

---

## まとめ・次のステップ

この記事が役に立ったら、ブログのメールマガジンへ登録してください。
AI活用・個人開発・副業に関する最新情報を週1回お届けします。

👉 [無料メルマガに登録する(Waitlist)](https://machijunblog.com/?page_id=883)

---

*このブログでは、会社員をしながら副業でSaaSを開発する過程をリアルに発信しています。*
*使用スタック: Next.js / Supabase / Claude API / Vercel*
広告

-AI, 記事