2026年1月11日の開発日記
今日はtax-assistantのレシートバリデーション機能を大幅に改善した。サブエージェントがOCR結果と違う値を返す「ハルシネーション」問題を解決するため、3段階の信頼性評価フローを実装。また、Claude Codeの設定をユーザーレベルとプロジェクトレベルに分離する作業も完了した。
今日やったこと
1. レシートバリデーションの3段階信頼性評価(tax-assistant)
サブエージェントがDBのOCR結果(2024/02/21)を「10月10日」と誤読するハルシネーション問題が発生。これを解決するため、責務を分離した3段階フローを実装した。
Step 1: 画像読み取り(サブエージェント)
- OCR結果を渡さずに画像だけを読み取らせる
- 読み取り結果をDBに保存(
ai_readingカラムを追加)
Step 2: 機械的比較(メインエージェント)
- DBのOCR結果とAI読み取り結果をJaccard係数で比較
- 不一致があればフラグを立てる
Step 3: 再判定(サブエージェント)
- 不一致があった場合のみ、画像を再度確認して判定
この設計により、メインエージェントの負荷を軽減しつつ、ハルシネーションを検出できるようになった。53件のレシートを処理してテスト完了。
2. OCR Checker UIの改善(tax-assistant)
- AI判定スコア表示: 各フィールドの横にAIアイコンとスコア(100%等)を表示
- 承認ボタンの整理: フィールドごとではなく、レシート単位で1つの「修正を承認」ボタンに統合
- 自動スクロール: ファイル一覧で選択した項目が画面中央に来るように改善
- 不要表示の削除: 「コメントなし」の表示を削除(自明なため)
3. Claude Code設定のユーザーレベル/プロジェクトレベル分離
ジャンクションで.claudeを共有する構成だと、/import-receiptsのようなプロジェクト固有コマンドが他プロジェクトにも見えてしまう問題があった。これを解決するため分離を実施。
~/.claude/: 全プロジェクト共通のスキル・コマンド{project}/.claude/: プロジェクト固有のスキル・コマンド
~/.claudeを独立したgitリポジトリ(dotclaude)として管理。古いコマンド3個(blog, daily_review, gemini-search)を削除し、.gitignoreでシステムファイルを除外する設定も追加した。
詳細: Claude Codeの.claude設定をユーザーレベルとプロジェクトレベルに分離する
4. デザイン原則の再帰的レビュー
UIデザイン原則49個・294項目のデータ品質を検証。原則自身を評価基準として使う「再帰的レビュー」を実施し、98項目のtitleフィールドに残っていた「Bad: 」「Good: 」プレフィックスを削除した。
詳細: デザイン原則の再帰的レビュー:49原則・294項目の品質検証
5. OGPプレビューコンポーネントの改善
デザイン原則のOGPプレビュー画面で事例が区別しにくい問題を修正。
- 事例番号バッジ(01, 02, 03)をカード左上に追加
- 番号バッジをグレー系に変更(タイトルの青と差別化)
- 各comparison間にマージンを追加
今日の学び
- ハルシネーション対策は責務分離が有効: サブエージェントにOCR結果を渡さず、後で機械的に比較することで誤読を検出できる
- DB中心設計でコマンド長を抑制: サブエージェントの結果をDBに保存し、メインエージェントはDB参照だけで比較を行えば、長大な配列をコマンドに埋め込まなくて済む
- スキル定義は最後まで読む: 冒頭だけ読んで自分で実装を始めると、既に定義されているフローを無視してしまう