1. 導入
これまで、RenderとAnthropic API(Claude)を組み合わせた「PDFからExcelへの自動変換ツール」の基本構築を進めてきました。しかし、システムを実運用に乗せるにあたり、避けて通れないのが「運用コスト」と「予期せぬエラー」の問題です。今回は、AIを活用したアプリにおけるインフラとAPIのコスト構造の違いを整理しつつ、複雑な帳票を読み込ませた際に発生したシステムクラッシュの解決策(AI特有の出力ブレを防ぐ防御的設計)について解説します。
2. サーバー費用とAI(API)費用の分離と圧倒的な費用対効果
クラウド上でAIアプリを運用する際、初心者が混同しやすいのが「サーバー稼働費」と「AIの頭脳を使うためのAPI利用費」の違いです。 当プロジェクトでは、Webアプリケーションを動かす基盤(Render)は無料プランを採用しています。一定時間アクセスがないとスリープ状態になり、次回起動時に数十秒の待機時間が発生するデメリットはありますが、ランニングコストはゼロです。
一方、AnthropicのVision API利用料は完全な従量課金制です。実際にテストを繰り返した結果、PDF1ページの解析にかかるコストはわずか約0.01ドル(約1.5円)であることが判明しました。これまで担当者が手作業で数値を入力し、ダブルチェックを行っていた時間と人件費を考慮すれば、1枚数円で「瞬時に、かつノーミスで」データ化できるAIツールの費用対効果は圧倒的です。本格運用時にはRenderを有料プラン(月額約7ドル〜)に引き上げ、スリープを解消するだけで、極めて安価かつ快適な社内システムが完成します。
3. AI特有のエラー:「JSONの文字列化」と防御的パース処理
コスト面クリアの喜んだのも束の間、実務に近い複雑な帳票(レベル2のPDF)をテストしたところ、システムがエラーで停止する事態が発生しました。 ログを解析した結果、原因は AttributeError: ‘str’ object has no attribute ‘get’ というプログラムの例外処理でした。これは、システム側が「AIから綺麗な辞書型データ(JSON)が返ってくる」と期待していたのに対し、AIが回答の一部をただの「文字列」として返してしまったために起きたエラーです。
高度な言語モデルは賢い反面、時に人間のように「気を利かせて」指定された厳格なデータ形式を崩してしまうことがあります。この「AIの気まぐれ」を制御するため、以下の2段構えの対策を実装しました。
根本対策(厳格なスキーマ指定): APIへのリクエスト時に strict: true と additionalProperties: false を指定し、型崩れ自体をAPIの仕様レベルで強制的にブロックする。
防御的パース処理: それでも想定外の文字列が返ってきた場合に備え、データを都度 json.loads() で再解釈し、isinstance() を用いた厳密な型チェックを実施。解釈不能な箇所はシステムを落とさずに安全にスキップするロジック(_coerce_json)を構築。
4. まとめ
AIを組み込んだシステム開発では、従来の「決められた通りに動くプログラム」の常識が通用しない場面が多々あります。AIのレスポンス揺れを前提とした「防御的な設計(フェイルセーフ)」を組み込むことが、実業務に耐えうる堅牢なアプリを作るための絶対条件です。今回得たスキーマ定義とエラーハンドリングの知見は、プロジェクトの根幹ルールとして CLAUDE.md(AI開発アシスタント向けのルールブック)に明記し、今後の機能追加における品質低下を防ぐ体制を整えました。
【編集後記】 AIの「賢すぎるが故の暴走」は、生成AIアプリ開発の醍醐味でもあり、最大の壁でもあります。従来のシステム開発では「入力ミスをするユーザー」を想定してエラーチェックを行いますが、AI開発では「出力ミスをするAI」を想定しなければなりません。このパラダイムシフトを乗り越えたことで、エンジニアとしての設計思想が一段階引き上げられたように感じます。次回は、現場からの要望が非常に強かった「スマホ写真からの直接データ化」に向けた拡張についてお届けします。