🔄

Claude Codeエージェント実践 Day 12|フィードバックで精度を上げる — ナレッジ蓄積の実践

に公開

TL;DR

  • Day 11 で見つけた3つの問題(日付ハードコード、考察混入、スコープ逸脱)に対してフィードバックし、ナレッジを修正した
  • 修正後の再テストで、日付・考察の問題は改善を確認。一方で「レポート再利用時にルール違反SQLが混入する」という新たな問題も見つかった
  • 蓄積したナレッジを「スキル候補」と「一般」に仕分ける記録方法を導入した。これが Day 13 の昇格チェックの材料になる

GitHub: akira-cloudjob-public/agent-scaffold-factory


今日やること

Day 11 でエージェントに売上分析を依頼した。結果は概ね良好だったが、3つの気になる点が見つかった。今日はそれらに対してフィードバックを行い、改善されるかを確認する。

部下育成に例えるなら、Day 11 は「初めての仕事をやらせた日」。今日は「レビューして指摘する日」にあたる。

このサイクルを1周回すのが今日のゴール。加えて、蓄積したナレッジを将来の Skills 化に備えて仕分ける方法も整える。


Day 11 で見つけた3つの問題

問題1: 日付がハードコードされる

「先月の売上を地域別に見たい」と依頼したら、生成されたSQLはこうだった。

WHERE date >= '2026-01-01' AND date < '2026-02-01'

結果は正しい。ただし、このSQLを来月実行すると「2026年1月」のデータが返ってくる。「先月」は今日の日付から相対的に決まるはずなので、正しくはこう書くべき。

WHERE date >= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)
  AND date < DATE_TRUNC(CURRENT_DATE(), MONTH)

ここは少し驚いた。初回テスト時には CURRENT_DATE() を使っていたのに、本番テストではハードコードに変わっていた。LLM の出力は非決定的なので、同じ依頼でも毎回同じSQLが返るとは限らない。ルールとして明文化しないと安定しないということ。

問題2: 考察が混じっている

カテゴリ別粗利益の分析レポートに、こんな記述が入っていた。

「売上拡大できれば利益への貢献度が最も高い」
「バンドル戦略で粗利改善の余地あり」

分析担当に求めたいのは ファクトの整理 であって、ビジネス上の提案ではない。「Software の粗利率は81.3%で最も高い」はファクト。「だから売上を伸ばすべき」は考察。判断は人間がするものなので、エージェントの出力にはファクトだけを求めたい。

問題3: レポートを勝手に統合した

Day 11 の分析結果を report_v2.md に出力するよう依頼した。すると、エージェントは依頼していない行動を取った。

  1. ディレクトリ内の report.md(v1)を自分で見つけて読み込んだ
  2. 「v2 だから v1 の改良版だろう」と独自に解釈した
  3. v1 の内容(地域別・カテゴリ別)を v2 に統合した

結果、v1 に含まれていたハードコード日付の SQL がそのまま v2 に混入した。せっかく問題1のルールを追加したのに、ルール適用前の旧データを検証なしで引き継いだことになる。

「なぜ v1 を読んだのか?」とエージェントに聞いたところ、回答はこうだった。

ディレクトリの存在確認で ls を実行した際に report.md が目に入り、「v2 = v1 の改良版だろう」と勝手に解釈して読みに行きました。ファイル名から意味を推測し、確認せずに行動しました。

依頼は「今回の2つの分析結果を出力して」であって、v1 との統合は頼んでいない。確認ファースト の原則に反している。


フィードバック: ナレッジを修正する

3つの問題に対して、それぞれナレッジファイルを修正した。

修正1: CURRENT_DATE() ルールの追加

bigquery.md の「SQL 方言・注意点」セクションに以下を追加。

- 「先月」「直近3ヶ月」など相対的な期間指定は CURRENT_DATE() を使う(ハードコードしない)
  - 先月: WHERE date >= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)
         AND date < DATE_TRUNC(CURRENT_DATE(), MONTH)
  - 特定月を指定された場合のみ明示的な日付を使う

修正2: レポートはファクトのみ

query.md の出力形式を修正。

Before: サマリー(3行以内)+ 考察
After:  サマリー(3行以内)+ ファクトの整理。データから読み取れる事実を説明する。
        考察・推測・提案は入れない

修正3(問題3への対処)

問題3はナレッジファイルの修正では解決しない。これはエージェントの「行動パターン」の問題であり、スコープの逸脱。対処は2つ考えられる。

対処 方法 効果
CLAUDE.md に原則を追記 「依頼の範囲を超えた行動はしない」 汎用的だが効果は不確実
依頼を明確にする 「v1 は無視して新規作成して」 確実だが毎回の手間

今回は後者で対処した。ルールを増やすよりも、依頼を具体的にするほうが確実に効く。エージェントのルール遵守は完璧ではないので、重要な依頼ほど指示を明確にする方針で進める。


再テスト: 修正は効いたか

ナレッジを修正した状態で、新しい分析を2本依頼した。

テスト1: 顧客セグメント別の売上

依頼: 「顧客セグメント別の先月の売上を見たい」

結果:

  • SQL: CURRENT_DATE() を正しく使用 → 改善
  • JOIN: sales × customers を自分で判断 → OK
  • レポート: ファクトのみ、考察なし → 改善
SELECT c.segment, SUM(s.amount) AS total_amount,
  SUM(s.quantity) AS total_quantity,
  COUNT(DISTINCT s.customer_id) AS customer_count
FROM analytics.sales s
JOIN analytics.customers c ON s.customer_id = c.customer_id
WHERE s.date >= DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH), MONTH)
  AND s.date < DATE_TRUNC(CURRENT_DATE(), MONTH)
GROUP BY c.segment ORDER BY total_amount DESC
セグメント 売上金額 構成比 顧客数 客単価
SMB 16,980,000円 58.1% 23社 738,261円
Enterprise 8,830,000円 30.2% 6社 1,471,667円
Individual 3,410,000円 11.7% 11名 310,000円

テスト2: 直近3ヶ月の月次推移

依頼: 「直近3ヶ月の月次売上推移を見たい」

結果:

  • SQL: DATE_TRUNC(DATE_SUB(CURRENT_DATE(), INTERVAL 3 MONTH), MONTH)改善
  • レポート: ファクトのみ → 改善
  • 追加: 前月比を自主計算、ASCIIチャートを生成 → 依頼外だが有用
売上金額 前月比 数量 顧客数
2025-11 34,440,000円 256 37
2025-12 42,420,000円 +23.2% 287 43
2026-01 29,220,000円 -31.1% 175 40

フィードバック効果のまとめ

問題 修正前(Day 11) 修正後(Day 12)
日付ハードコード '2026-01-01' CURRENT_DATE()
考察混入 「バンドル戦略で〜」 ファクトのみ
v1 統合 依頼を明確化して回避

2つのルール修正はどちらも効いた。ナレッジに書いたことは、次の実行から反映される。これが Commands 期のフィードバックサイクルの基本形になる。


ナレッジの記録方法を整える

ここまでの検証で、ナレッジが増えてきた。Day 11 で5件、Day 12 でさらに追加。このまま何でもナレッジに放り込むと、将来 Skills に昇格させるときに仕分けが大変になる。

スキル候補ナレッジと一般ナレッジ

ナレッジには2種類ある。

分類 性質 Skills 化
スキル候補 再現性のある判断・手順 対象 SQLルール、出力形式、解釈パターン
一般 背景情報・一回限りの記録 対象外 環境トラブル、調査メモ

見分け方は「この知識がないと、エージェントが同じ業務を自律的にこなせるか?」で判定する。

  • いいえ → スキル候補ナレッジ(タグ付けして記録)
  • はい → 一般ナレッジ(lessons/ に記録)

タグで仕分ける

スキル候補ナレッジにはタグを付ける。タグは将来スキル化される単位に対応する。

[analytics.sales] = 売上分析スキルの候補

このタグが付いたナレッジだけを抽出すれば、そのままスキルの定義ファイルに使える。

今日の知見を仕分ける

Day 11-12 で得た知見を、この2分類で整理してみる。

スキル候補ナレッジ [analytics.sales]:

知見 内容 確認状態
相対期間ルール 「先月」は CURRENT_DATE() を使う 再テストで確認済み
レポート形式 ファクトのみ。考察・推測・提案は入れない 再テストで確認済み
セグメント別パターン customers テーブルとの JOIN で集計 動作確認済み
月次推移パターン FORMAT_DATE + INTERVAL N MONTH 動作確認済み

一般ナレッジ(タグなし):

知見 内容 理由
v1 統合問題 ファイル名から意図を推測し確認なしで行動 一回限りの事象、環境依存
ASCII チャート生成 時系列データに棒グラフを自主追加 挙動の記録、ルール化不要

スキル候補ナレッジは再現性がある。「先月の売上を見たい」と言われるたびに CURRENT_DATE() は必要になるし、レポートはいつもファクトのみであってほしい。一方、v1 統合の問題は特定の状況で起きた一回限りの事象で、スキルに含めるものではない。


Commands 期の「指導」パターン

今日の検証で、Commands 期のフィードバックサイクルが見えてきた。

このサイクルで重要なのは ④ と ⑥ だと感じた。

④ ナレッジを修正する — 口頭で「次からこうして」と言っても LLM は覚えていない。ナレッジファイルに書くから、次の実行で反映される。部下育成でいえば「マニュアルを更新する」に相当する。口頭指導だけでは属人化するのと同じ構造。

⑥ 記録する — 修正して終わりではなく、スキル候補かどうかを仕分けて記録する。このひと手間が、将来の Skills 化をスムーズにする。実務でも、OJT の記録を残さないと昇格評価ができないのと同じ。


まとめ

  • Day 11 の3つの問題にフィードバックし、ナレッジを修正した
  • 再テストで2つのルール修正の効果を確認。ナレッジに書けば次から反映される
  • 「レポート再利用で旧SQLが混入する」という新たな問題も見つけた — 依頼の明確化で対処
  • ナレッジを「スキル候補」と「一般」に仕分ける記録方法を導入した
  • このフィードバックサイクルが Commands 期の日常業務になる

正直、1件の分析依頼に対してこれだけフィードバックが発生するのは手間がかかる。ただ、これは部下育成の初期段階と同じで、最初に手間をかけるからこそ後が楽になるはず。スキル候補の仕分け方もまだ試行錯誤中で、もっと良い基準があるかもしれない。Day 13 では、ここまでに蓄積したナレッジで「もう任せていいか」を判定する。


検証環境

項目
OS Windows 11 Pro
シェル Git Bash (MINGW64)
IDE Cursor + Claude Code
BigQuery 個人検証用プロジェクト / analytics データセット
検証日 2026-02-12

参考資料: エージェントが出力した売上分析レポート(report_v2.md)

フィードバック反映後にエージェントが出力したレポートの全文(※ 分析対象はサンプルデータ)。「ファクト」セクションに考察が含まれていないこと、SQLが CURRENT_DATE() を使っていることを確認できる。

エグゼクティブサマリー

  • 1月売上: 2,922万円 / 粗利益: 1,555万円(粗利率 53.2%)
  • 月次推移: 12月 4,242万円をピークに、1月は前月比 -31.1% と大幅減
  • 顧客セグメント: SMB が売上の58.1%を占め最大。Enterprise は客単価147万円で最も高い

直近3ヶ月 月次売上推移

売上金額 前月比 数量 顧客数
2025-11 34,440,000円 256 37
2025-12 42,420,000円 +23.2% 287 43
2026-01 29,220,000円 -31.1% 175 40

ファクト: 12月が売上・数量・顧客数すべてで最大。1月は12月比で売上 -31.1%、数量 -39.0%。顧客数は40社を維持(-7.0%)。

顧客セグメント別売上(2026年1月)

セグメント 売上金額 構成比 顧客数 客単価
SMB 16,980,000円 58.1% 23社 738,261円
Enterprise 8,830,000円 30.2% 6社 1,471,667円
Individual 3,410,000円 11.7% 11名 310,000円

ファクト: SMB が顧客数・数量・売上すべてで最大。Enterprise は6社で30.2%、客単価はSMBの約2倍。

地域別売上(2026年1月)

地域 売上高 構成比 顧客数 客単価
関東 15,450,000円 52.9% 17 908,824円
関西 7,440,000円 25.5% 12 620,000円
九州 6,330,000円 21.7% 11 575,455円

ファクト: 関東が売上の52.9%、客単価も約91万円で最高。関西と九州は売上規模が近いが、関西の客単価が約4.5万円上回る。

カテゴリ別売上高・粗利益(2026年1月)

カテゴリ 売上高 粗利益 粗利率 数量
Service 12,710,000円 7,660,000円 60.3% 55
Software 7,550,000円 6,140,000円 81.3% 61
Hardware 8,960,000円 1,745,000円 19.5% 59

ファクト: Software は粗利率81.3%で最高。Service は粗利額で最大(766万円)。Hardware は売上規模はあるが粗利率19.5%。

参考資料: ナレッジログ(knowledge-log.md)

Day 11〜12 で蓄積したナレッジの記録。タグ付き([analytics.sales])がスキル昇格候補、タグなしが一般ナレッジ。

スキル候補ナレッジ

[analytics.sales] 相対期間は CURRENT_DATE() を使う

  • 状況: 「先月の売上を地域別に」と依頼したら WHERE date >= '2026-01-01' とハードコードされた
  • 判断: 「先月」「直近3ヶ月」など相対的な期間指定は CURRENT_DATE() を使う
  • 確認: ルール追加後の再テストで2回とも CURRENT_DATE() が使われた

[analytics.sales] レポートはファクトのみ、考察不要

  • 状況: カテゴリ別粗利益のレポートに「バンドル戦略で粗利改善の余地あり」等の考察が混入
  • 判断: 分析レポートにはファクトの整理のみ記載する。考察・推測・提案は入れない
  • 確認: ルール修正後の再テストで考察なしのレポートが出力された

[analytics.sales] 地域別売上パターン

  • 判断: sales テーブルの region でグループ化。JOINなしで完結

[analytics.sales] カテゴリ別粗利益パターン

  • 判断: sales × products を JOIN し、SUM(amount) - SUM(cost × quantity) で粗利益を計算

[analytics.sales] 顧客セグメント別売上パターン

  • 判断: sales × customers を JOIN し、segment でグループ化

[analytics.sales] 月次売上推移パターン

  • 判断: FORMAT_DATE で月単位に変換、INTERVAL N MONTH で期間指定

一般ナレッジ

レポート再利用時のルール適用漏れ

  • report_v2.md の出力を依頼したら、v1 を勝手に読んで統合。v1 のハードコード日付 SQL がそのまま混入
  • 対処: 依頼を明確にする(「v1 は無視して新規作成して」)

ASCII チャートの自主生成

  • 月次推移の分析で、依頼していない ASCII 棒グラフを自主的に生成。有用だが指示外

次回: Day 13 では、Commands 期に蓄積されたナレッジで昇格チェックを実施します。「もう任せていいか?」を判定して、Sales Skill にパッケージする — Commands から Skills への転換点です。


シリーズを追いかける

Discussion