Claude Codeのサブエージェントで請求書2,000件/日を自動処理する構成を解説
TL;DR
- Claude Codeのサブエージェント(副エージェント)機能を活用し、1日2,000件の請求書を自動処理する構成が公開された
- メインエージェントが指示を出し、複数のサブエージェントが並列で請求書を読み取り・分類・データ出力まで担う設計
- 処理の信頼性を上げるために、エラー処理・検証ステップをエージェントごとに組み込むのがポイント
変更内容の詳細
サブエージェントとは何か
Claude Codeでは、1つのメインエージェント(主な指示を出す役割)が、複数のサブエージェント(個別の作業を担う役割)を呼び出して並列に処理させる構成を組むことができます。これにより、単一のAIプロセスでは時間がかかる大量の繰り返し作業を、複数の処理に分割して効率よくこなせるようになります。
dev.toに投稿された事例(@automate-archit)では、この仕組みを請求書処理に応用し、1日あたり2,000件の請求書を自動で読み取り・分類・出力する構成を実現したとされています。
全体の構成
紹介されている構成は大きく3つの役割に分かれています。
1. オーケストレーター(指揮役)エージェント
メインエージェントは「オーケストレーター」として機能します。受け取った請求書のリストを確認し、各サブエージェントに処理を割り振ります。並列処理の管理や、エラーが起きたときの再試行(リトライ)指示もここで行います。
2. 請求書読み取りサブエージェント
各請求書ファイル(PDF・画像など)を受け取り、金額・日付・取引先名・品目などの構造化データを抽出します。Claude Codeの自然言語理解能力を活かし、フォーマットが異なる請求書にも対応できる点が特徴です。
3. 検証・出力サブエージェント
抽出されたデータの整合性チェック(金額の合計が合っているか、必須フィールドが埋まっているかなど)を行い、最終的にCSVやJSONなど指定の形式で出力します。
コード構成の例
投稿で紹介されている構成をもとにした、エージェント呼び出しのイメージは以下の通りです。
# メインエージェントからサブエージェントを呼び出すイメージ
import anthropic
client = anthropic.Anthropic()
def process_invoice(invoice_path: str) -> dict:
"""1件の請求書を処理するサブエージェント相当の関数"""
with open(invoice_path, "rb") as f:
content = f.read()
message = client.messages.create(
model="claude-opus-4-5", # ※使用モデルはソースに明記なし。環境に合わせて変更してください
max_tokens=1024,
messages=[
{
"role": "user",
"content": f"以下の請求書データから、取引先名・日付・金額・品目を抽出してJSONで返してください。\n\n{content.decode('utf-8', errors='replace')}"
}
]
)
return message.content[0].text
# オーケストレーター側: 複数ファイルを順番に(または並列に)処理
invoice_files = ["invoice_001.txt", "invoice_002.txt"] # 実際はリスト全体を渡す
results = [process_invoice(f) for f in invoice_files]
※上記コードはソースの構成説明をもとにした参考例です。実際のサブエージェント並列化にはスレッド処理やキュー管理の追加が必要になる場合があります(一般的な実装として)。
1日2,000件を実現するための工夫
投稿によれば、大量処理を安定させるために以下の点が重視されています。
- バッチ(まとめ処理)サイズの調整: 一度に投げる請求書数を適切に区切ることで、APIのレート制限(1分間あたりの呼び出し上限)に引っかかりにくくする
- エラー時の自動リトライ: 読み取りに失敗した請求書は、オーケストレーターが検知して再処理キューに戻す
- 出力の検証ステップを必ず挟む: AIが抽出したデータをそのまま使うのではなく、必須フィールドの有無や数値の妥当性を確認するステップを自動で入れる
既存ユーザーへの影響と対応
APIコストへの注意
1日2,000件の処理となると、Anthropic APIの利用コストが積み上がります。特に大きなファイルや長い請求書テキストを1件ずつ送る場合、トークン数(AIが読み取る文字数の単位)が多くなるため、処理前にテキストの前処理(不要な空白や記号の除去)を行うことでコストを抑えられる可能性があります。
レート制限への対応
Anthropic APIにはプランごとに呼び出し回数・トークン数の上限があります。大量処理を行う場合は、公式ドキュメントでレート制限を確認し、必要に応じてEnterprise(大企業向け)プランへの移行や、上限引き上げ申請を検討することになるでしょう(※プラン詳細は公式サイトで要確認)。
データの取り扱いに注意
請求書には取引先名・金額・振込先など機密性の高い情報が含まれます。Claude APIに送信する前に、自社のデータ管理ポリシーや取引先との契約内容を確認することが大切です。
試し方(手順)
前提
- Python 3.9以上がインストールされていること
- Anthropic APIキーを取得済みであること
手順
# 1. Anthropicライブラリをインストール
pip install anthropic
# 2. APIキーを環境変数に設定
export ANTHROPIC_API_KEY="your_api_key_here"
# 3. 最小限の動作確認スクリプト
import anthropic
client = anthropic.Anthropic()
sample_invoice_text = """
請求書
取引先: 株式会社サンプル
日付: 2026-04-20
品目: Webシステム開発費
金額: 500,000円
"""
message = client.messages.create(
model="claude-opus-4-5", # ※モデル名はソースに明記なし。利用可能なモデルに置き換えてください
max_tokens=512,
messages=[
{
"role": "user",
"content": f"以下の請求書から情報を抽出し、JSONで返してください。\n{sample_invoice_text}"
}
]
)
print(message.content[0].text)
# 4. 実行
python invoice_agent.py
出力例(AIの返答):
{
"取引先": "株式会社サンプル",
"日付": "2026-04-20",
"品目": "Webシステム開発費",
"金額": 500000
}
小規模なテストで動作を確認してから、バッチ処理へ拡張していくのが安全です。
関連リンク
- I Built a Claude Code Sub-Agent That Processes 2,000 Invoices a Day — Here’s the Exact Setup(英語)
- Anthropic API 公式ドキュメント(英語)