初心者がやるClaude Codeの失敗7選と今すぐ効く対策

思ったとおりのコードや説明が出ず「なぜ動かない?」と時間を無駄にしていませんか?多くは設定や入力の“ちょっとしたミス”で起きているだけです。
Claude Codeは強力ですが、初心者が陥りやすい小さなトラップがいくつかあります。本稿では、実際に起きやすい失敗7選を、原因の見つけ方と今すぐ使える対策付きで分かりやすく解説します。設定値の見落とし、プロンプトの書き方ミス、出力の検証不足──一つずつ潰して、無駄な時間を取り戻しましょう。各項目には確認リストとすぐ試せる手順を付けるので、読むだけで改善が始められます。
そもそもどう動くのか
家で動いてたはずの再現が他の環境で全く動かない——それは「設定と文脈がバラバラ」なだけだ。
仕組みを一言で言うと、Claude Codeは「システムプロンプト + ユーザ入力 + モデル設定」の組合せで応答を生成する。システムプロンプトが振る舞いを規定し、ユーザ入力がタスクを指示し、モデル設定(温度や補完挙動など)が出力の幅を決める。設定を明示的に管理すれば同じ入力でも結果を再現できるし、ベクトルDBやエージェントとの連携も安定する。
- システムプロンプトを定義して固定する
手順: プロジェクトごとにsystem_promptをファイル化して読み込む。例:
/config set system_prompt = "You are a concise code assistant. Always cite sources in [id:xxx] format."
- ユーザ入力はテンプレート化する
手順: 入力テンプレートを使って変数だけ差し替える。例:
ユーザテンプレ: "Task: {task}\nContext:\n{retrieved_docs}\nConstraints:\n{constraints}"
- モデル設定を固定してバリアントを残す
手順: テスト用と本番用で設定を明示的に切る。例:
/config set {"temperature": 0.0, "max_tokens": 800}
- emoji補完やUI警告の挙動を把握する
手順: チームでemojiCompletionEnabledのオン/オフを統一(Changelogで追加済み)。例:
/config set {"emojiCompletionEnabled": false}
また、UIに出る警告はスクリーンショット/ログで保存する。
- ベクトルDBの文脈は挿入ルールを決める
手順: 検索結果は上位K件を明示的にプロンプト先頭へ挿入し、IDとスニペットを付す。例:
=== Retrieved (id:12345) ===
[summary]
=== End ===
{user_prompt}
- エージェントはツール仕様をSystemに列挙して固定化
手順: ツール名・入出力フォーマットをsystem_promptに書く。例:
/config set system_prompt = "Tools: search(query)->[id,score,text]; run(code)->[stdout,stderr]"
- リクエストごとに完全ログを残し差分テストする
手順: 送信前のsystem_prompt、user_input、/configの全JSONを保存。例ログスニペット:
{ "system_prompt": "...", "user_input": "...", "config": {...} }
これで再実行して差分比較ができる。
まとめ: 小さな設定のズレが再現性を壊す。まずはsystem_promptと/config(例: emojiCompletionEnabledやtemperature)をプロジェクトで固めてログを残すこと。次の一歩: まず1つのプロンプトをファイル化してチームで共有してみましょう。
①長すぎる/複雑すぎるシステムプロンプトを削る
家のPCの前にいないと作業が進まない—その多くは“長すぎるシステムプロンプト”が原因だ。
そもそもどう動くのか システムプロンプトはモデルに「役割」と「ルールの優先度」を与えるメモだ。長文で禁止事項や例を詰め込むと、重要な指示が埋もれたり矛盾してモデルが出力を迷う。だからまずは「短く明確に」して再現性を確認する。余計な例や条件は外部ドキュメントに移し、必要なら参照させる。
7選(具体手順・設定例付き)
- まず一行にする
- 例: system: "Be concise. Return only code blocks and short comments."
- 手順: 現行のsystem内容を丸ごと置換して、まずこの一行にしてテスト。
- 冗長な禁止リストを外す
- 手順: "してはいけないこと"を別ファイル policy.md に移す。
- 実行例: system を短くし、user メッセージで "See policy.md for restrictions." と参照させる。
- 明確な出力フォーマットを一行で指定
- 例: system: "Always respond in a single fenced code block with a short comment header."
- 効果: モデルがフォーマット重視で安定する。
- 設定の干渉を切る(検証済み事実あり)
- Claude Code 2.1.217 では絵文字補完が入力を変えることがある。絵文字補完を無効にするには設定で emojiCompletionEnabled を false にする。
- 例(設定JSONの一例): { "emojiCompletionEnabled": false }
- 再現性テストを自動化する
- 手順: 同じuserプロンプトを3回投げて差分を確認。curlの裸例:
curl -X POSThttps://api.example.com/chat
-H "Authorization: Bearer $API_KEY"
-d '{"messages":[{"role":"system","content":"Be concise. Return only code blocks and short comments."},{"role":"user","content":"Write a Python function to reverse a string."}] }' - 比較: 出力が安定するまでsystemを短縮する。
- ルール詳細は「テンプレートパラメータ」で渡す
- 手順: 長いルールは system ではなく user あるいは別パラメータ template_rules に入れて参照させる形に。
- 実践例: system は役割だけ、user に "Apply template_rules.v1" を追加。
- イテレーションのために変更履歴を残す
- 手順: system プロンプトを更新するたびに diff を保存(例: git commit)。戻せると効果検証がしやすい。
まとめ 長い禁止リストを削って「一行で明確に」するだけで挙動は格段に安定する。まずは system を例の一行に置き換え、同じ入力を3回流して再現性を確認してみてください。次の一歩は、その短いsystemで簡単なタスク1つを自動テストに組み込むことです。
②入力に不要な大量の例を詰め込まない
家のPCの前で「例を全部入れたのに期待通り動かない……」と固まっていませんか?
そもそもどう動くのか:few-shotで示す「例」はモデルに指示のパターンを教えるためのコンテキストであり、量を増やせば必ず精度が上がるわけではない。大量の例はノイズや矛盾を生み、コンテキスト窓を圧迫して本来の指示が効きにくくなる。まずは仕組みを理解して、例は最小限にし、必要なら外部参照で渡すのが実務的。
- まずは最小1例で試す
- 手順: まず例は1つだけに絞る。モデルに対する明示的なフォーマットを1例で示す。
- 例:
example: {input: "住所を正規化してください: 〒100-0001 東京都○○", output: "東京都千代田区..."}
- 実行: 元のプロンプトにこの1例を付けて比較する。
- A/Bで効果を測る(例あり vs 例なし)
- 手順: 同一入力で「例あり」「例なし」をそれぞれ投げ、出力の差を比較して良否を判断。
- コマンド例: prompt_with_example = base_prompt + example; prompt_without = base_prompt
- 具体例は「最短で代表的」なものを作る
- 手順: 代表ケースを1つ選び、冗長な説明は省く。フィールドのみを示す。
- 例フォーマット:
example: {input: "氏名と電話を抽出: 山田太郎 090-1234-5678", output: {"name":"山田太郎","phone":"090-1234-5678"}}
- たくさんある例はファイル化する
- 手順: 例集をJSON/CSVで保存して、プロンプトにはファイル参照だけを置く。実行時に必要な例だけ読み込む。
- 実行例: examples.json を保存→「参照ファイル examples.json から類似例を抜粋して提示してください」と記述して渡す。
- ベクトル検索で必要な分だけ注入する(RAG)
- 手順: 例をEmbeddingしてベクトルDBに入れる。クエリ時にtop-kを取得してプロンプトに追加する。
- 疑似コード:
emb = embed(query); hits = vectorDB.search(emb, top_k=3); prompt += "Retrieved examples:\n" + join(hits)
- これで常にコンテキスト窓を節約できる。
- 長い例は「要約」して渡す
- 手順: 1例が長いならまず要約して短縮。要約は「目的・入力例・期待出力」の3行に集約する。
- コマンド例: summarize(example) -> short_example
- コンテキスト窓を常に監視して削る
- 手順: 送信前に入力トークン数が多すぎないか確認。不要な説明は削除し、例は最小限化。
- 実践: プロンプト生成スクリプトに「trim_examples()」を入れて、トークン上限の余裕をチェックする。
まとめ:few-shotは強力だが「多ければ良い」は誤り。まずは最小1例で挙動を確認し、必要なら外部ファイルやベクトルDBで必要な例だけをオンデマンドで渡す運用に切り替えよう。まずは今のプロンプトを1例に減らしてA/Bテストしてみてください。
③再現可能なミニマル再現例(MRE)を渡す
家族に「動くところだけ見せて」と言われて手元でしか再現できない問題、つらいですよね。
そもそもどう動くのか:MRE(最小再現例)は「余分な要素を削ぎ落とし、バグの原因だけを残す」ための道具です。再現手順が短ければ短いほど、レビューやデバッグのコストが下がり、修正までの時間が劇的に短くなります。
- 問題を一ファイルにまとめる
- 余計なライブラリや設定を省き、実行ファイルを1つ作る。
- 例: repro.py を作り、実行コマンドを明記。
python repro.py
- 最小のコードにする(必須)
- 不要な関数やUIは削る。入力は定数化する。
- 例:
期待: 5 実際: -1# minimal repro def add(a,b): return a - b print(add(2,3))
- 実行手順を1行で書く
- 「どのコマンドで動かすか」を必ず明記する。 例: python repro.py、あるいは node repro.js
- 環境情報を添える
- OS、言語ランタイムの出力を付ける。
uname -a python -V pip freeze > requirements.txt
- 依存を固定する or 無くす
- 外部パッケージが必要なら requirements.txt と pip install -r requirements.txt を付ける。
pip install -r requirements.txt
- 再現手順と期待値/実際の出力を明示
- ログやスタックトレースを貼る。スクリーンショットは補助で、テキスト必須。 例: 実行結果のコピペを貼る(色や絵文字が邪魔ならプレーンテキストで)。
- 配布形式と注意点
- Git リポジトリなら git diff --staged で変更を示す。単体ファイルなら tar/zip を添付する。
- 注意: Claude Code のプロンプト補完が混じると説明が汚れることがあるため、不要なら emojiCompletionEnabled を無効化しておく(設定ファイル例)。
{ "emojiCompletionEnabled": false }
まとめ:MREは「1ファイル+実行コマンド+期待値/実際の出力+環境情報」でほぼ完成です。まずはrepro.pyを1つ作って実行コマンドと出力を貼ってください — それだけで早く直せます。
④設定の見落としを先にチェックする(emojiCompletionEnabledなど)
キーボードでコロンを打つたびに勝手に絵文字候補が出て作業が止まる、そんなムダな時間を減らしたい人へ。
そもそもどう動くのか
Claude Code(検証済み: 2.1.217)ではプロンプト入力に emoji shortcode のオートコンプリートが入り、":heart:" をタイプすると ❤️ に変換、または ":hea" で候補が出る仕様が追加されている。これは入力側の補完機能なので、設定のフラグで無効化できれば根本解決になる(設定名: emojiCompletionEnabled)。
- 設定フラグをまずオフにする
- 設定検索で "emojiCompletionEnabled" を探す。見つかれば false に変更。
- 設定ファイルに直接書き込めるなら例:
{ "emojiCompletionEnabled": false }
変更後はアプリを再読み込みする(Ctrl/Cmd+R またはアプリを再起動)。
- UIとユーザー設定の両方を確認する
- アプリ内のグローバル設定とワークスペース/プロファイル別設定で上書きされていないか確認。
- 設定検索で同じキーが複数箇所にないかチェック。見つけたら全て false に揃える。
- 拡張や外部ツールの干渉を切る
- ブラウザ拡張やエディタ拡張が類似補完を出していることがある。Chromeなら chrome://extensions を開いて疑わしい拡張を一時無効化して再現確認。
- キャッシュと再読み込みで“反映”確認
- 設定変更後に反映されない場合は開発者ツールからキャッシュをクリア。Chrome DevTools: Application → Clear storage → Clear site data を実行して再読み込み。
- 再現手順を作って確かめる
- 期待通り無効化されたかは具体手順で確認:プロンプト欄に ":hea" と入力して候補が出ないことを確認。出る場合は設定が上書きされている可能性あり。
- ログと警告を見る
- 変更が反映されない・警告が出る場合は DevTools の Console を開き "emoji" でフィルタ。実装側で警告が出ることが既知(changelog に Added warnings)なので、ログがヒントになる。
- 無効にできない場合のワークアラウンド(自動除去)
- 優先的に入力側でショートコードを除去する短期対策。例: JavaScript で送信前に除去するスニペット。
prompt = prompt.replace(/:[^:\s]+:/g, '');
- シェルで前処理するなら sed 例:
echo ':heart: hello :smile:' | sed -E 's/:[^:[:space:]]+://g'
まとめ
まずは設定キー emojiCompletionEnabled を探して false にするのが最短の解決。変化が見られない場合はワークスペース上書き/拡張/キャッシュ/ログを順に潰していくと原因が見つかる。まずは設定検索→false化→再読み込みの手順を試してみてください。
⑤出力フォーマットを明示してパースしやすくする
出力がパースできず処理が止まると、午前が丸ごと消える。
そもそもどう動くのか:モデルは「自然言語で書かれた出力」を返す。一方で機械処理したいなら、出力の「形式」を人間が明確に指示して、余計な説明を消してもらう必要がある。形式指定が甘いと説明文や絵文字補完などが混入し、パーサが壊れる。参考: Claude Code 2.1.217 で絵文字ショートコード補完が追加され、emojiCompletionEnabled 設定で無効化できる(必要なら切る)。
7選(即効で使える手順)
- 出力命令を厳格に書く
- プロンプトに必ず1行で宣言する例: Respond ONLY with valid JSON that matches the sample below. Do not include any extra text.
- 期待するサンプル(これを1つだけ提示):
{ "id": "user-123", "name": "Taro Yamada", "email": "[email protected]", "tags": ["lead", "trial"], "metadata": {"signup_ts": "2026-01-01T12:00:00Z"} }
- コードブロックで囲ませる
- 指定: "Place the JSON inside a
json ...code block and nothing else." - 理由: コードブロックは開発ツール側で抽出しやすい。受け取ったら jq で検査:
echo "$RESPONSE" | sed -n '/^
json/,/$/p' | sed '1d;$d' | jq .
- 固定境界を使う(パーサ対策)
- 指示例: "Wrap the JSON between lines ===BEGIN JSON=== and ===END JSON=== and nothing else."
- 抽出コマンド例: sed -n '/^===BEGIN JSON===/,/^===END JSON===/p' response.txt | sed '1d;$d' | jq .
- 失敗時の厳密なフォールバックを定義する
- 指示: "If the output cannot match the schema, respond exactly with: {"error":"schema_mismatch","details":"..."}"
- ローカル検証(Python):
import json,sys data=json.loads(open('extracted.json').read()) required=['id','name','email'] for k in required: if k not in data: print(json.dumps({"error":"schema_mismatch","details":f"missing {k}"})); sys.exit(1) print("OK")
- 型・必須キーは明示する
- プロンプトに "id: string, tags: array of strings, metadata: object" のように短く列挙する。
- これで「数値を文字列で出す」「配列を単一文字列で返す」などの迷走を減らせる。
- コードや特殊文字はエンコードして渡す
- 期待するフィールドにコードを含めるなら base64 化を指示: "Return code fields as base64 strings."
- エンコード/デコード例: echo -n 'const a=1;' | base64 echo 'Y29uc3QgYT0xOw==' | base64 --decode
- 絵文字補完や入力補助の干渉を防ぐ
- 必要なら emojiCompletionEnabled を無効化する(設定で切る): emojiCompletionEnabled: false
- さらに安全策として、コロンで始まる短縮を含める場合はバッククォートやエスケープを指示して補完を防ぐ。
まとめ: まずは「Respond ONLY with valid JSON」と上のサンプルをそのままプロンプトに入れて試そう。出力を抽出して jq や簡単な Python スクリプトで検証できれば、パース失敗で止まる事故はかなり減る。次の一歩:実際のプロンプトでサンプルを貼って1回だけ実行してみてください。
⑥ベクトルデータベース連携でやりがちな設定ミスと解決手順
家の中で「検索しても関連が出てこない!」と叫んでしまう状況、よくありますよね。
そもそもどう動くのか ベクトルDB連携は単純で「テキスト→埋め込み(embed)→DBに保存(upsert)→問い合わせ(query)で類似度を返す」という流れ。ここが破綻すると検索精度もスケーラビリティも管理性も全部死ぬ。仕組みを押さえれば直せる箇所は明確だ。
7選(やりがちなミスと即効対策)
- 埋め込み次元の不一致
- 問題: 既存インデックスと新しい埋め込みの次元が違う。
- 対策: upsert前に次元チェックを入れる。
emb = embed(text) assert len(emb) == db.index_dimension(), "dimension mismatch" db.upsert(id, emb, metadata)
- IDの重複・一貫性欠如
- 問題: 同一IDで上書きされる・追跡できない。
- 対策: UUIDか名前空間を付与。例: id = f"doc:{source}:{uuid4()}"
- バッチサイズが不適切(スループット低下/タイムアウト)
- 問題: 1件ずつ送ると遅い、巨大バッチは失敗する。
- 対策: チャンクして並列化。例: chunk_size=256で分割して upsert。
for chunk in chunks(items, 256): db.upsert_batch(chunk)
- 正規化や類似度指標のミスマッチ
- 問題: コサインを期待しているのに正規化していない。
- 対策: コサインの場合はL2正規化を必ず行う。
emb = np.array(embed(text)) emb = emb / np.linalg.norm(emb) db.upsert(id, emb, metadata)
- メタデータが空っぽでフィルタできない
- 問題: 不要な候補が混ざる。コンテキスト絞り込み不可。
- 対策: upsert時に source/type/timestamp など最低限を付与し、queryで filter を使う。
db.upsert(id, emb, metadata={'source':'manual','page':5}) matches = db.query(q_emb, top_k=5, filter={'source':'manual'})
- 最初にやるべき基本検証をしていない(埋め込み→アップサート→クエリの通しテスト)
- 手順例(必ずまずこれを実行):
embeddings = embed(text) db.upsert(id, embeddings, metadata) matches = db.query(queryEmbedding, top_k=5)- 期待値: 同一テキストでtop1が自分のドキュメントになるか確認。失敗したら埋め込み・正規化・ID・メタデータを順番にチェック。
- 評価指標を使わず主観で判断している
- 対策: 検索精度(recall@k)、スケーラビリティ(レイテンシ/スループット)、管理性(バックアップ・モニタリング・メタデータ検索)で比較する。
- 精度チェックの簡易手順: 検証用クエリ集合Qと正解セットAを用意し、各クエリでrecall@kを計算する。
- スケーラビリティ: バッチ化したupsert時間と同時nクエリ時のP95レイテンシを測る。
まとめと次の一歩 まずは上の6番の「埋め込み→アップサート→クエリ」の通し検証を1件で実行してみてください。結果をここに貼ってもらえれば、具体的にどこを直すべきか指示します。
⑦生成AIとAIエージェントの違いを把握して使い分ける
家族やチームに説明しても動かない「ちゃんと動くAI」は、実は用途の切り分けでほとんど解決する。
そもそもどう動くのか:生成AIは「その瞬間にテキストを作る」モジュールで、入力→出力が主。AIエージェントは状態(会話履歴・外部ツール呼び出し・ファイル操作)を持ち、複数ステップで意思決定と行動をする。期待する振る舞いを要件に落とし込めば、まずは単純生成でプロンプトを固め、必要になってからステートフルなエージェント化へ進めば工数とリスクが減る。
- 判定ルールを作る
- チェックリスト:①会話履歴必須か?②外部検索/実行が要るか?③一意の状態管理が必要か?
- すべてNoなら生成AIでOK。Yesが1つでもあればエージェント検討。
- まず単発プロンプトで“仕様”を固める
- 例:システム指示+入出力例を2件入れ、期待出力を厳密に書く。
- テスト手順:同じ入力で5回投げ、ばらつきが許容範囲か確認。
- 定量テストを自動化する
- Pythonで複数回投げて出力を集計する例:
import requests, json outs=[] for i in range(10): r = requests.post("YOUR_LLM_API_ENDPOINT", json={"prompt":"あなたは要約者です\n\n本文: ..."}) outs.append(r.json()["text"]) # ばらつきを確認 print(len(set(outs)), outs[:3])
- ばらつきが多ければ温度(temperature)や指示の厳密化で固定化する。
- フェイルケースと回避フローを書く
- 期待外出力→リトライ回数上限+「出力が要件を満たさない場合のフォールバック」プロンプトを準備。
- 例設定:retry=2、validation関数を実装してNGなら別テンプレで再実行。
- 会話履歴・セッション設計(ステートフル化の最小単位)
- 履歴は「直近N発言+要約メタデータ」を送る。ストレージはJSONで保存。
{"history":[{"role":"user","text":"〜"},{"role":"assistant","text":"〜"}],"summary":"重要事項: ..."}
- 履歴を無制限に送らず、要約してコンテキストサイズを制御する。
- 外部ツールが必要ならエージェントへ(LangChain等で検証)
- 最小手順:①ツール(検索、実行)を抽象化、②LLMにツール呼び出し可能なプロンプト提供、③ログと安全策をつける。
- LangChainの簡易例:
from langchain import LLM, Tool from langchain.agents import initialize_agent, AgentType llm = LLM(...) tools = [Tool(name="search", func=search_fn)] agent = initialize_agent(tools, llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION) res = agent.run("〜調べてレポートを作って")
- まずはローカルで1ツールだけで動作確認すること。
- 本番運用の監視とロールバック
- ログ(入力・出力・ツール呼び出し)を保存し、異常発生時はエージェント無効化→単一生成プロンプトに切替える運用手順を用意。UIテスト時はノイズ排除のため emoji 補完等を無効化(例: emojiCompletionEnabled をオフ)しておくとプロンプト検証がしやすい(該当設定はUIで切替可能)。
まとめ:まずは「そこまで必要か?」をチェックして単発生成でプロンプトを固め、段階的にステートフル化・エージェント化する。まずの一歩:現場のワークフロー1つを選んで、単発プロンプトで5回投げてばらつきを測ること。
まとめ
初心者が陥りがちな7つの失敗(長すぎるシステムプロンプト、曖昧な指示、過剰コンテキスト、設定ミス、最小再現例不足、検証不足、ログ未活用)と即効の対策をまとめました。近道は一度に全部直すのではなく「一つだけ直して検証を繰り返す」こと。まずはシステムプロンプトを短くし、emojiCompletionEnabled を無効にして最小再現例で出力を再確認してみてください。ログ差分を取る習慣も効果的です。
📱 関連ショート動画
この記事の内容をショート動画で解説
著者について

原田賢治
代表取締役・AI技術責任者
Mike King理論に基づくレリバンスエンジニアリング専門家。生成AI検索最適化、ChatGPT・Perplexity対応のGEO実装、企業向けAI研修を手がける。 15年以上のAI・システム開発経験を持ち、全国で企業のDX・AI活用、退職代行サービスを支援。