$npx -y skills add kazukinagata/shinkoku --skill reading-deduction-cert控除証明書(生命保険料・地震保険料等)の画像を読み取り構造化データを返す。 他のスキルから呼び出されるほか、直接ユーザーが呼び出すことも可能。
| 1 | # 控除証明書 画像読み取り |
| 2 | |
| 3 | 控除証明書(生命保険料控除証明書、地震保険料控除証明書、社会保険料控除証明書等)の画像を読み取り、構造化データとして返すスキル。 |
| 4 | |
| 5 | ## PDF ファイルの場合 |
| 6 | |
| 7 | ファイルが PDF(`.pdf`)の場合、画像 OCR の前にテキスト抽出を試みる。 |
| 8 | |
| 9 | 1. `shinkoku pdf extract-text --file-path <path>` を実行する |
| 10 | 2. 抽出テキストに必要な情報(保険料額・証明額等)が含まれていれば、テキストから構造化データを生成する |
| 11 | 3. テキストが不十分(スキャン PDF 等)の場合は `shinkoku pdf to-image --file-path <path> --output-dir <dir>` で PNG に変換し、以下の画像読み取りフローに進む |
| 12 | |
| 13 | ## 画像読み取り方法 |
| 14 | |
| 15 | ### 推奨: デュアル検証(並列2コンテキスト) |
| 16 | |
| 17 | 精度を高めるため、同じ画像を2つの独立したコンテキストで並列に読み取り、結果を照合する。 |
| 18 | |
| 19 | 1. **2つの独立した読み取りを実行する:** |
| 20 | サブエージェントが使える環境では、2つのサブエージェントを並列で起動し、それぞれ独立に画像を読み取る。 |
| 21 | 各サブエージェントには以下の「基本ルール」と「出力フォーマット」をプロンプトとして渡し、画像ファイルパスを指定する。 |
| 22 | |
| 23 | 2. **結果照合:** 両方の読み取り結果から主要フィールド(金額等)を比較する。 |
| 24 | |
| 25 | 3. **一致の場合:** そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告する。 |
| 26 | |
| 27 | 4. **不一致の場合:** ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう: |
| 28 | - 差異のあるフィールドを明示する |
| 29 | - A を採用 / B を採用 / 手動入力 の3択を提示する |
| 30 | |
| 31 | ### フォールバック(サブエージェント非対応の場合) |
| 32 | |
| 33 | サブエージェントが利用できない環境では、以下の手順で読み取る: |
| 34 | |
| 35 | 1. 画像ファイルを直接 Read ツールで読み取る |
| 36 | 2. 以下の「基本ルール」と「出力フォーマット」に従ってデータを抽出する |
| 37 | 3. 抽出結果をユーザーに提示し、**必ず目視確認を依頼する** |
| 38 | |
| 39 | ⚠ デュアル検証が利用できないため、必ずユーザーに目視確認を依頼してください。 |
| 40 | |
| 41 | ## 基本ルール |
| 42 | |
| 43 | - 画像ファイルは Read ツールで読み取る(Claude Vision が自動的に画像を認識する) |
| 44 | - 金額は必ず int(円単位の整数)で返す。カンマや「円」は除去する |
| 45 | - 日付は YYYY-MM-DD 形式で返す |
| 46 | - 和暦は西暦に変換する(令和7年 → 2025、令和6年 → 2024、平成31年 → 2019) |
| 47 | - 読み取れないフィールドは UNKNOWN(文字列)または 0(金額)とする |
| 48 | |
| 49 | ## 対象書類 |
| 50 | |
| 51 | - 生命保険料控除証明書 |
| 52 | - 地震保険料控除証明書 |
| 53 | - 社会保険料(国民年金保険料)控除証明書 |
| 54 | - 小規模企業共済等掛金払込証明書(iDeCo含む) |
| 55 | |
| 56 | ## 出力フォーマット |
| 57 | |
| 58 | JSON オブジェクトとして返す。金額は必ず int(円単位の整数)とする。 |
| 59 | |
| 60 | ### 生命保険料控除証明書 |
| 61 | |
| 62 | ```json |
| 63 | { |
| 64 | "certificate_type": "life_insurance", |
| 65 | "policy_type": "新制度 or 旧制度", |
| 66 | "category": "一般 or 介護医療 or 個人年金", |
| 67 | "company_name": "保険会社名", |
| 68 | "policy_number": "証券番号", |
| 69 | "annual_premium": 120000, |
| 70 | "dividend": 0 |
| 71 | } |
| 72 | ``` |
| 73 | |
| 74 | ### 地震保険料控除証明書 |
| 75 | |
| 76 | ```json |
| 77 | { |
| 78 | "certificate_type": "earthquake_insurance", |
| 79 | "company_name": "保険会社名", |
| 80 | "policy_number": "証券番号", |
| 81 | "annual_premium": 50000, |
| 82 | "is_old_long_term": false |
| 83 | } |
| 84 | ``` |
| 85 | |
| 86 | ### 社会保険料控除証明書 |
| 87 | |
| 88 | ```json |
| 89 | { |
| 90 | "certificate_type": "social_insurance", |
| 91 | "insurance_type": "national_pension", |
| 92 | "annual_premium": 200000, |
| 93 | "period": "対象期間" |
| 94 | } |
| 95 | ``` |
| 96 | |
| 97 | ### 小規模企業共済等掛金払込証明書 |
| 98 | |
| 99 | ```json |
| 100 | { |
| 101 | "certificate_type": "small_business_mutual_aid", |
| 102 | "sub_type": "ideco or small_business or disability", |
| 103 | "annual_contribution": 276000 |
| 104 | } |
| 105 | ``` |
| 106 | |
| 107 | ## 抽出のポイント |
| 108 | |
| 109 | - 書類の種別(生命保険料/地震保険料/社会保険料/小規模企業共済等)を最初に判定する |
| 110 | - 生命保険料控除は新旧制度の区別と、3区分(一般/介護医療/個人年金)の分類を確認する |
| 111 | - 地震保険料控除は旧長期損害保険かどうかの区別を確認する |
| 112 | - 金額は「証明額」「申告額」が異なる場合、「申告額」を使用する |
| 113 | - 保険会社名・証券番号は確認用に抽出する |