CLAUDE LABEN
DESIGN — Claude Designが大型更新。デザインシステムの取り込み、キャンバスの直接編集、エクスポート形式の追加が入りましたCODE — Claude Designがローカルのコードベースを起点に動作し、生成した画面をClaude Codeへ受け渡して実装まで繋げられますFABLE — Mythosクラスの最新モデルFable 5が一般利用向けに調整され、Claude Code v2.1.170から使えるようになりましたFIX — ストリーム途中で接続が切れても部分応答を保持する改善が入り、長時間の自動処理でも応答が残りますSCROLL — フルスクリーン時のマウスホイール加速を無効化するwheelScrollAccelerationEnabled設定が追加されましたTIER — Claude DesignベータはPro・Max・Team・Enterpriseで利用できますDESIGN — Claude Designが大型更新。デザインシステムの取り込み、キャンバスの直接編集、エクスポート形式の追加が入りましたCODE — Claude Designがローカルのコードベースを起点に動作し、生成した画面をClaude Codeへ受け渡して実装まで繋げられますFABLE — Mythosクラスの最新モデルFable 5が一般利用向けに調整され、Claude Code v2.1.170から使えるようになりましたFIX — ストリーム途中で接続が切れても部分応答を保持する改善が入り、長時間の自動処理でも応答が残りますSCROLL — フルスクリーン時のマウスホイール加速を無効化するwheelScrollAccelerationEnabled設定が追加されましたTIER — Claude DesignベータはPro・Max・Team・Enterpriseで利用できます
記事一覧/API & SDK
API & SDK/2026-06-17上級

Claude API のドキュメント抽出が「確信を持って間違える」とき — 検証層の設計メモ

Claude API で請求書や契約書を構造化抽出するとき、最も怖いのは例外ではなく「もっともらしく間違った JSON」です。スキーマ検証・算術整合・二重抽出の一致率で誤抽出を本番前に捕まえる検証層を、TypeScript の実装とともにまとめました。

Claude API76ドキュメント処理2構造化抽出検証2TypeScript17本番運用26

プレミアム記事

請求書の自動取り込みを動かし始めて数週間、例外ログはきれいなのに経理の数字が合わない、という相談を受けたことがあります。原因はすぐに分かりました。スキャンの粗い一枚で、Claude が合計金額の桁を一つ読み違え、しかもそれを confidence: 0.96 と申告して、何の例外も投げずに通り抜けていたのです。

個人開発で複数のサービスを並行して回している私自身、当初はこの種の誤りを例外ハンドリングだけで防げると思い込んでいました。構造化抽出でいちばん怖いのは、APIが落ちることでも JSON が壊れることでもありません。例外を一切出さずに、もっともらしく間違った値が下流へ流れていくことです。JSON.parse は成功し、Zod も通り、ログは緑のまま、台帳の数字だけが静かにずれていく。この記事は、その「静かな誤り」を本番に届く前に捕まえるための検証層をどう組むか、という実装メモです。抽出パイプラインの組み立て方そのものではなく、抽出した後の「信用していいかどうか」の判定に焦点を当てます。

confidence を信号として扱わない

最初に手放すべき思い込みは、モデルが返す confidence を品質の指標として使えるという期待です。LLM の自己申告する確信度は、出力の正しさとはほとんど相関しません。読み違えた請求書ほど、迷いなく高い数字を返してくることすらあります。確信度はあくまで「モデルが自分の出力をどう自己評価したか」であって、外部の真実と照合した結果ではないからです。

ですから私は、confidence をゲートには使わず、優先度付けにだけ使う方針にしています。低い値が出たら人手レビューの列の前の方に並べる、それくらいの扱いです。合否そのものは、モデルの外側にある検証で決めます。検証の材料は三つあります。スキーマ(型として正しいか)、算術整合(数字同士のつじつまが合うか)、二重抽出の一致(別経路で抽出した結果と揃うか)。順に見ていきます。

第一段:スキーマは「形」しか守らない

Zod による検証は最初の砦ですが、守れる範囲を正しく見積もっておく必要があります。スキーマが弾けるのは「型が違う」「必須項目が欠けている」「列挙にない値が来た」といった構造の異常だけです。total が数値であることは保証できても、その数値が正しいかは何も言えません。

それでも、抽出固有の制約をスキーマに織り込むと、初段でかなりの誤りが落ちます。日付は ISO 形式に強制する、金額は非負にする、通貨は ISO 4217 の列挙に限る、といった具合です。「ありえない形」をここで全部落としておくと、後段の算術検証が本質的な誤りだけに集中できます。

// src/schema.ts
import { z } from "zod";
 
const isoDate = z
  .string()
  .regex(/^\d{4}-\d{2}-\d{2}$/, "YYYY-MM-DD 形式で抽出してください")
  .refine((s) => !Number.isNaN(Date.parse(s)), "実在する日付であること");
 
const money = z.number().finite().nonnegative();
 
export const InvoiceSchema = z.object({
  invoiceNumber: z.string().min(1).optional(),
  issueDate: isoDate.optional(),
  dueDate: isoDate.optional(),
  vendor: z.object({ name: z.string().min(1), taxId: z.string().optional() }),
  lineItems: z
    .array(
      z.object({
        description: z.string().min(1),
        quantity: z.number().positive().optional(),
        unitPrice: money.optional(),
        amount: money,
      })
    )
    .min(1, "明細が0件の請求書は抽出失敗とみなす"),
  subtotal: money.optional(),
  tax: money.optional(),
  total: money,
  currency: z.string().length(3), // ISO 4217
});
 
export type Invoice = z.infer<typeof InvoiceSchema>;

lineItems.min(1) を付けているのが地味に効きます。明細が空の請求書はまず存在しないので、0件で返ってきたら抽出が失敗していると断じてよい。スキーマを「データの正しさ」ではなく「業務上ありえない形の検出器」として設計すると、初段の網が引き締まります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
モデルの confidence をそのまま信用せず、スキーマ・算術整合・二重抽出の三段で誤抽出を機械的に捕まえる検証層の実装
請求書の小計+税=合計のような算術制約で「もっともらしい誤り」を弾くチェックサム検証と、人手レビューへ回す境界の引き方
Sonnet で一次抽出・不一致時だけ Opus で再抽出する段階設計と、プロンプトキャッシュ・バッチを併用したコスト配分の実測的な考え方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-06-17
Claude API のマルチテナント SaaS で「請求が合わない」を消す — テナント分離とコスト帰属の実装メモ
Claude API の SaaS をマルチテナント化したとき最初に壊れるのはコスト帳尻です。計測の単一窓口・原子的カウンター・Anthropic 請求との突合・テナント分離の敵対的検証まで、本番で動く TypeScript と運用判断を実装メモとしてまとめます。
API & SDK2026-05-30
Claude API の max_tokens 打ち切りを継続生成でつなぐ — 重複とコードブロック分断を防ぐ実装
長文生成が途中で切れる max_tokens 打ち切りを検出し、assistant プレフィルで続きを書かせ、つなぎ目の重複やコードフェンスの分断を防いで安全に組み立てる継続生成の実装パターンをまとめました。
API & SDK2026-05-04
Bun × Claude API で本番運用するエッジAIサービス — Node.js移行の判断軸と落とし穴を回避する実装パターン
Claude APIをBun上で本番運用するための実装ガイド。Node.jsからの移行判断軸・組み込みSQLite/WebSocketの活用・ストリーミング最適化・典型的な落とし穴の回避策まで、動作するコードと実測値で解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →