ClaudeをOCRとしてkintoneと繋いでみる

ちょっと今更感がありますが、AnthropicのClaudeがOCRとして優秀だと聞いたので、ASTERIA、kintoneと繋いで試してみました。

最近、電子帳簿保存法とかで、電子データを保存する時、検索できるように金額を入れろとか日付を入れろとか面倒ですよね。
領収書をキントーンにアップロードすると、日付とか、金額とか、内容とかを自動的に入力してくれるようにならないかとASTERIAでやってみました。

概要図は下記です。

kintoneには、日付、金額、取引先、内容と添付ファイルが付けらるアプリを作っておきます。

ASTERIA キントーン連携フロー概略

フローの概要は下記です。

  1.  領収書データを、kintoneにアップロードする
  2. アップロードされたらkintoneからASTERIAにWebhookを使って通知する。
  3. ASTERIAは添付ファイルをkintoneから取得する。
  4. 添付ファイルをClaudeのAPIで文書とプロンプトを入力して、日付や金額の項目を取得してもらう。
  5. Claudeから帰ってきた回答から日付や金額の部分を取得して、kintoneに連携して書き込む

ASTERIAで構築すると比較的簡単な内容だとは思うんですが、
やっぱりポイントは、Claudeのプロンプトですが。
日付、金額(税込)、取引先、内容を分割して回答してくれて、且つ、ASTERIAで処理しやすいようにClaudeが出力してくれるようにプロンプトを作るところでしょうか

こんなプロンプトにして各項目を分けてくれるように依頼しました


この領収証の内容を下記項目に分けて教えてください。
また、それぞれの内容は鍵カッコ”「」”でくくってください

■項目
日付
金額
領収者
内容(50文字以内)


カッコで括ることで対象を取得しやすいようにしてみました。
一応、回答としてはこんな感じで出力されました



領収証の内容を項目ごとに分けて説明いたします:

■日付
「2025年04月22日」

■金額
「840円」

■領収者
「株式会社ジョイ(モノポケット楽天市場店)」

■内容(50文字以内)
「CR123 東芝リチウム電池(カメラ用)2個入りパックと送料」


最近、楽天で買った電池の領収書をアップした結果です。
内容は長いとみにくいので50文字以内にしてもらいました。
この内容をそれぞれ取得して、カッコ内だけキントーンに書き込む感じです

さて、実際のASTERIAフローですが、3つに分けました。

  1. Webhookを受けるフロー
  2. kintoneの添付ファイルを取得し、Claudeの解析結果をkintoneに書き込むフロー(本メインフロー)
  3. Claudeに解析を依頼するフロー

最初のWebhookを受けるフローはWebhookでキントーンから呼び出されたあと、取得したJSONを②のフローに渡して非同期で起動して、HTTPレスポンスを返すだけです。

Webhookフロー

ファイルに書いてるのは、JSONを見たかったんでデバッグ用です

キントーンのフローは、添付ファイルはJSONに含まれないので、キントーンから添付ファイルをダウンロードして、文書解析フローを呼び出し、戻ってきたテキストから各項目を抽出して、キントーンに書き戻します。

キントーンフロー

最後にClaude解析を依頼するフローです。通常のRestApiコンポーネントを使いますが、ちょっと依頼するJSONがASTERIAでは一回でつくれないので、ちょっと工夫してます
AnthropicのAPI仕様の詳細は別のブログを参照してください

Claude呼び出しフロー

ClaudeAPIで添付ファイルとプロンプトを同時に送る場合は、JSONのcontentタグを配列にする必要があり、且つ、プロンプトと添付ファイルはタグが少し違うので、一旦ストリームで2行のレコードを食って配列にすることにしました。※細かくは添付ファイルのフローを見てください

 リクエストのJSONのイメージは下記です。

{
   "model": モデル名,
    "max_tokens": 最大トークン数,
    "messages": [{
        "role": ロール,
        "content": [{
            "type": "document",
            "source": {
                "type": "base64",
                "media_type": "application/pdf", <=とりあえずPDF
                "data": Base64でエンコードした添付ファイル
            }
        },
        {
            "type": "text",
            "text": プロンプト
        }]
    }]

戻り値のJSONは省略しますが、JSONの中に回答の文章が入ってきます

あとは文章を各項目に切り分けて、kintoneに登録するだけです。

キントーンのあぷりの詳細は省略しますが、アップした結果は下記です。

ASTERIAのフローとしては、半日くらいでつくれる簡単なものですが、初心者がつまずきそうなのは、JSONで配列をつくるところでしょうか。
実運用するためには、日付の形式とか、ちゃんと領収証の発行日をとってくれるとか、Claudeがずっと同じ形式で返してくれるか?とか問題はいろいろあるとは思いますが、
なんとなくはできそうなかってレベルですね。

こういうプロンプトの作り方でもっといいやり方があるよ!という方がいたら教えて欲しいです

ASTERIA、キントーン、LLM連携については、時間があったらもう少し試してみようと思います。
こう言うのはできないのか?とかリクエストがあれば、お問い合わせページなどからいただければトライしてみます。