以下の環境を補強します。
AWS Bedrock(ClaudeやNova)とAPI連携して、OCRの出力を補正します。
リポジトリ
料金について
AWS Bedrockは従量課金です。Claude Haiku 4.5の場合:
- 入力: $0.80 / 1M tokens
- 出力: $4.00 / 1M tokens
目安: A4契約書1枚(約2000文字)の補正で約0.5円程度
参考: AWS Bedrock料金
モデル比較
Novaは約1/10のコスト!
Nova Liteで動作上問題ないなら金銭的にもこっちでしょうかね・・・
精度最重視ならHaiku等を使う感じで・・・
| モデル | 入力 | 出力 | A4 1枚あたり |
|---|---|---|---|
| Claude Haiku 4.5 | $0.80/1M | $4.00/1M | 約0.5円 |
| Nova Micro | $0.035/1M | $0.14/1M | 約0.02円 |
| Nova Lite | $0.06/1M | $0.24/1M | 約0.04円 |
手順
AWS Bedrockと連携する。
AWS Bedrockと連携するためのアクセスキー・シークレットアクセスキーを発行します。

キーやBedrockのモデルIDを.envファイルに書き込みます。.env.exampleからコピペします。
リージョンはus-east-1を設定しておきます。Bedrockのモデルを幅広く用意しているリージョンだからです。
# .env.example
# このファイルは git に入れる(テンプレート)
# 実際の値は .env に書く(gitignore 済み)
# LLM プロバイダ(現在は bedrock のみ対応)
LLM_PROVIDER=bedrock
# 使用モデル(Bedrock のモデル ID)
LLM_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
# AWS 認証情報(Bedrock 使用時に必須)
AWS_ACCESS_KEY_ID={アクセスキーを記載}
AWS_SECRET_ACCESS_KEY={シークレットアクセスキーを記載}
AWS_REGION=us-east-1
# NDLOCR-Lite API URL(docker-compose 内では変更不要)
# NDLOCR_URL=http://ndlocr:8080
Claudeの場合はユースケース申請をしないといけないので申請します。Novaの場合は申請せずとも使用可能です。
us-east-1リージョンに切り替えた上で、Bedrockの管理画面を開きます。Claude Haiku4.5を開きSubmit use case detailsを押下します。

CloudShellを起動して以下のように表示されれば申請が通って使用できる状態になったことを示します。
~ $ aws bedrock list-inference-profiles --region us-east-1
~中略~
{
"inferenceProfileName": "Global Anthropic Claude Haiku 4.5",
"description": "Routes requests to Anthropic Claude Haiku 4.5 globally across all supported AWS Regions.",
"createdAt": "2025-10-13T20:55:08+00:00",
"updatedAt": "2026-04-22T19:34:33.299983+00:00",
"inferenceProfileArn": "arn:aws:bedrock:us-east-1:535002847634:inference-profile/global.anthropic.claude-haiku-4-5-20251001-v1:0",
"models": [
{
"modelArn": "arn:aws:bedrock:::foundation-model/anthropic.claude-haiku-4-5-20251001-v1:0"
},
{
"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-haiku-4-5-20251001-v1:0"
}
],
"inferenceProfileId": "global.anthropic.claude-haiku-4-5-20251001-v1:0",
"status": "ACTIVE", ★ここがACTIVEになっていると申請が通った証らしい。
"type": "SYSTEM_DEFINED"
},
コンテナイメージのビルド
PS C:\Users\ohtsu\Documents\アプリ\ndlocr-lite-app> docker compose -f .\docker-compose.phase03.yml build
#38 [backend] resolving provenance for metadata file
#38 DONE 0.0s
[+] Building 3/3
✔ ndlocr-lite-app-frontend Built 0.0s
✔ ndlocr-lite-app-ndlocr Built 0.0s
✔ ndlocr-lite-app-backend Built
PS C:\Users\ohtsu\Documents\アプリ\ndlocr-lite-app> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ndlocr-lite-app-backend latest 5ab6aa6042b8 26 seconds ago 207MB
ndlocr-lite-app-frontend latest 0bb7260449bc 7 minutes ago 62.6MB
ndlocr-lite-app-ndlocr latest 9b60426f227e 4 hours ago 1.37GB
コンテナのデプロイ
PS C:\Users\ohtsu\Documents\アプリ\ndlocr-lite-app> docker compose -f docker-compose.phase03.yml up -d
[+] Running 4/4
✔ Network ndlocr-lite-app_default Created 0.0s
✔ Container ndlocr-lite-app-ndlocr-1 Healthy 6.0s
✔ Container ndlocr-lite-app-backend-1 Healthy 6.0s
✔ Container ndlocr-lite-app-frontend-1 Started 6.2s
動作確認
http://localhost:5173/にWebブラウザでアクセスします。
OCRを実行した後、文書のタイプと補正ボタンを押下できるようになっています。
タイプを選択しボタンを押下してみます。

補正結果タブと構造化JSONタブが表示されます。
それぞれAIモデルで解析した結果が表示されます。


JSONの結果サンプルを出力してみます。
{
"document_type": "契約書",
"title": "業務委託契約書",
"contract_number": null,
"date": "令和○年○月○日",
"effective_date": "令和◦年◦月◦日",
"expiry_date": "令和◦年◦月◦日",
"party_a": {
"role": "委託者(甲)",
"company": "○○○○",
"representative": null,
"address": null
},
"party_b": {
"role": "受託者(乙)",
"company": "○○○○",
"representative": null,
"address": null
},
"amount": null,
"payment_terms": "委託期間満了の翌月○日までに請求、請求書受領日の翌月○日までに支払い",
"currency": "JPY",
"governing_law": "日本法",
"jurisdiction": "〇〇地方裁判所",
"corrections": [
"第5条第1項: 「甲の代理人かのごとく」→「甲の代理人のごとく」",
"第9条: 「上現として」→「上限として」",
"第9条: 「放意」→「故意」",
"第12条第2項: 「第6条(成果及びその帰属)」→「第6条(知的財産権の帰属)」",
"第13条第1項: 「かかるこれに違反した」→「かかることに違反した」",
"第14条第1項④: 括弧の位置を修正"
]
}
Ubuntuへのデプロイ
root@ocr-dev-env:~/ndlocr-lite-app# git pull
root@ocr-dev-env:~/ndlocr-lite-app# ls -a
. .. backend docker-compose.phase01.yml docker-compose.phase02.yml docker-compose.phase03.yml docs .env.example frontend .git .gitattributes .gitignore ndlocr README.md
root@ocr-dev-env:~/ndlocr-lite-app# cp -p .env.example .env
root@ocr-dev-env:~/ndlocr-lite-app# vi .env
root@ocr-dev-env:~/ndlocr-lite-app# cat .env
# .env.example
# このファイルは git に入れる(テンプレート)
# 実際の値は .env に書く(gitignore 済み)
# LLM プロバイダ(現在は bedrock のみ対応。将来: ollama)
LLM_PROVIDER=bedrock
# 使用モデル(Bedrock のモデル ID)
# Claude 3.5以降の新モデルは "us." プレフィックスのクロスリージョン推論プロファイルIDが必要
LLM_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
# AWS 認証情報(Bedrock 使用時に必須)
AWS_ACCESS_KEY_ID={アクセスキーを記載}
AWS_SECRET_ACCESS_KEY={シークレットアクセスキーを記載}
AWS_REGION=us-east-1
# NDLOCR-Lite API URL(docker-compose 内では変更不要)
# NDLOCR_URL=http://ndlocr:8080
# docker-compose.phase02.ymlを立ち上げている場合は下げたあとにphase03を立ち上げる
root@ocr-dev-env:~/ndlocr-lite-app# docker compose -f docker-compose.phase02.yml down
root@ocr-dev-env:~/ndlocr-lite-app# docker compose -f docker-compose.phase03.yml up --build -d
root@ocr-dev-env:~/ndlocr-lite-app# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f3747dbba6a ndlocr-lite-app-frontend "/docker-entrypoint.…" 22 seconds ago Up 14 seconds 0.0.0.0:5173->80/tcp, [::]:5173->80/tcp ndlocr-lite-app-frontend-1
a77d8615eaca ndlocr-lite-app-ndlocr "uvicorn server:app …" 26 seconds ago Up 20 seconds (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp ndlocr-lite-app-ndlocr-1
1bc99e9c35d2 ndlocr-lite-app-backend "uvicorn main:app --…" 26 seconds ago Up 20 seconds (healthy) 0.0.0.0:8000->8000/tcp, [::]:8000->8000/tcp ndlocr-lite-app-backend-1
