海外の旅行会社から届く英文の宿泊バウチャーを読み取り、予約番号・宿泊者・泊数・食事条件・支払区分を予約システムと突き合わせて、食い違いをフロントへ回す
海外の旅行会社から届く英文の宿泊バウチャーを読み取り、予約番号・宿泊者・泊数・食事条件・支払区分を予約システムの登録内容と突き合わせます。食い違いのある予約だけを、到着の前にフロントと予約課へ回します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- その他/宿泊
- 対象部門
- 営業
- 対象業務
- 内容確認・チェック/比較検討
- 主な課題
- 人手が足りない/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 共有メールボックスに届いたバウチャーのPDFを開く
- 予約番号か客の名前で、予約システムの予約を探す
- 宿泊者の名前、到着日と出発日、泊数、部屋の種類と数、人数を見比べる
- 食事条件と支払区分を読み、予約システムの登録と見比べる
- 食い違いがあれば、旅行会社に問い合わせるか、予約を直す
- バウチャーを予約に紐付けて保存する
- 到着の前日に、バウチャーの無い予約を探して旅行会社に催促する
- 自動共有メールボックスに届いたバウチャーの添付が、受付フォルダに保存される
- 自動保存をきっかけに処理が動き、形式・ページ数を確かめる
- 自動OCRがバウチャーを読み、キーと値、表、質問への答え、信頼度を返す
- 自動予約番号・宿泊者・日程・部屋・人数・食事条件・支払区分を予約システムの項目にそろえる
- 自動3種類の予約番号と名前で、予約システムの予約を探す
- 自動プログラムが登録内容と比べ、項目ごとに `match` / `mismatch` / `unclear` を付ける
- 自動一致したものはバウチャーを予約に紐付ける。食い違いのあるものは予約課の一覧に入る
- 人予約課の職員が、食い違いのある予約だけを画像と見比べ、旅行会社に問い合わせるか予約を直す
- 自動到着の前日の朝、バウチャーの無い予約と、食い違いが解けていない予約をフロントへ回す
各工程の詳しい説明を読む
- 共有メールボックスに届いたバウチャーのPDFを開く
- 予約番号か客の名前で、予約システムの予約を探す
- 宿泊者の名前、到着日と出発日、泊数、部屋の種類と数、人数を見比べる
- 食事条件と支払区分を読み、予約システムの登録と見比べる
- 食い違いがあれば、旅行会社に問い合わせるか、予約を直す
- バウチャーを予約に紐付けて保存する
- 到着の前日に、バウチャーの無い予約を探して旅行会社に催促する
(a)支払区分の読み違えがチェックアウトで見つかる。 Prepaid とあるのに予約システムでは客から受け取る設定のまま、あるいはその逆。チェックアウトの場で客に請求してから「旅行会社に払っている」と言われることがあります。
(b)見る場所が決まらない。 予約番号が3種類あります。旅行会社の予約番号、ホールセラーの予約番号、ホテルの確認番号。どれが書いてあるかはバウチャーごとに違い、予約を探すところで時間がかかります。
(c)名前の並びと綴りが違う。 姓と名の順序、ミドルネームの有無、同行者の名前が1人分しか書いていない。同じ客かどうかを判断するのに迷います。
(d)到着の前日に催促が集中する。 バウチャーの無い予約を探すのは到着の前日の作業で、夕方の忙しい時間帯に重なると、催促が翌日に回ります。
(e)変更のたびに届く新しい版を見落とす。 泊数の延長や同行者の追加があると、旅行会社は同じ予約のバウチャーを出し直します。古い版で見比べて「一致」としたまま、新しい版の変更が予約システムに入っていないことがあります。
- 【自動】 共有メールボックスに届いたバウチャーの添付が、受付フォルダに保存される
- 【自動】 保存をきっかけに処理が動き、形式・ページ数を確かめる
- 【自動】 OCRがバウチャーを読み、キーと値、表、質問への答え、信頼度を返す
- 【自動】 予約番号・宿泊者・日程・部屋・人数・食事条件・支払区分を予約システムの項目にそろえる
- 【自動】 3種類の予約番号と名前で、予約システムの予約を探す
- 【自動】 プログラムが登録内容と比べ、項目ごとに
match/mismatch/unclearを付ける - 【自動】 一致したものはバウチャーを予約に紐付ける。食い違いのあるものは予約課の一覧に入る
- 【人】 予約課の職員が、食い違いのある予約だけを画像と見比べ、旅行会社に問い合わせるか予約を直す
- 【自動】 到着の前日の朝、バウチャーの無い予約と、食い違いが解けていない予約をフロントへ回す
8番目が、この設計の分かれ目です。 職員は600件すべてを開くのではなく、食い違いのある予約だけを開きます。 すべての項目が一致した予約は、バウチャーが紐付いたことを一覧で確かめるだけです。
9番目で、フロントへ回すものを絞ります。 フロントが見るのは「この客は支払区分に食い違いがある」「バウチャーがまだ無い」という短い一覧で、チェックインの前に何を確かめればよいかが分かります。
02今回想定するシステム構成
旅行会社からの英文のバウチャー(メールのPDF) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数の確認 ▼ AWS Textract(AnalyzeDocument:FORMS/TABLES/QUERIES。複数ページは StartDocumentAnalysis) │ キーと値、部屋の表、質問への答え、信頼度 ▼ Claude API ── 予約システムの項目にそろえる │ ① 予約番号3種 ② 宿泊者 ③ 日程と部屋 ④ 食事条件 ⑤ 支払区分 ▼ Python ── 予約システムの予約を探し、項目ごとに比べる ▼ 判定(match / mismatch / unclear / not_found) ▼ 【予約課が食い違いのある予約だけを確認】 ├──▶ 旅行会社への問い合わせ(英文の下書き) └──▶ 到着前日の一覧をフロントへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(AnalyzeDocument/StartDocumentAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(項目の整形、食事条件と支払区分の原文の抜き出し、問い合わせ文の下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(予約の検索と、登録内容との比較) | 予約システムの照合の機能 |
| 連携 | AWS Lambda(保存の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(バウチャー、読み取り結果、比較の結果) | 社内のファイルサーバー |
共有メールボックスから受付フォルダへ添付を移す部分は、使っているメールの仕組みに合わせた個別の実装になります。 転送のルールで専用の受信先へ送るか、定時にメールボックスを読みにいくかを、情報システムの担当と決めます。
予約システムと契約条件の一覧は、新しく足すものではありません。 最初の準備は、旅行会社ごとの食事条件の略語と自社の食事プランの対応表と、支払区分の言い回しの一覧を作ることです。
OCRに AWS Textract を選ぶのは、バウチャーが英文だからです。 公式の上限の表で、対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語とされ、日本語は読めません。 欧州の旅行会社のフランス語やスペイン語のバウチャーも読めます。
バウチャーは1ページのものがほとんどなので、同期の AnalyzeDocument で読みます。 同期の処理はJPEG、PNG、PDF、TIFFで10MB、PDFとTIFFは1ページまでです。2ページ以上のバウチャーだけ、非同期の StartDocumentAnalysis に回します。 同期なら呼び出しの応答で結果が返るので、完了の通知を待つ仕組みが要りません。
質問(Queries)は英語の文書でしか使えず、同期の処理では1ページ15件までです。 バウチャーの項目はこれに収まります。フランス語やスペイン語のバウチャーでは質問を外し、キーと値と表と全文で読みます。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にバウチャーが保存されたことを起点にします。 予約課の共有メールボックスに、旅行会社のドメインから届いたメールの添付を受付フォルダへ保存する仕組みを置きます。保存の通知で AWS Lambda が動きます。
届いた時点で1件ずつ処理します。 バウチャーは予約の確定後に届くので、到着の数日前に食い違いが分かれば、旅行会社に問い合わせる時間が残ります。 前日にまとめて処理すると、旅行会社の営業時間が終わっていて問い合わせが間に合いません。
もう1つの起点は、毎朝の定時の処理です。 翌日に到着する予約のうち、バウチャーが紐付いていないものと、食い違いが解けていないものを一覧にしてフロントへ回します。催促の作業が、前日の夕方から当日の朝へ移ります。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| バウチャー | PDFまたは画像。予約番号、宿泊者、日程、部屋、人数、食事条件、支払区分 | 受付フォルダ(Amazon S3) |
| 読み取り結果 | キーと値、表とセル、質問への答え、全文、それぞれの信頼度 | AWS Textract |
| 予約の登録内容 | 予約番号3種、宿泊者名、到着日と出発日、部屋の種類と数、人数、食事プラン、支払区分 | 予約システム |
| 対応表 | 旅行会社ごとの食事条件の略語と自社の食事プラン、支払区分の言い回しと自社の区分 | 予約課で用意する表 |
質を決めるのは、対応表です。 同じ HB でも、旅行会社によって朝夕食か朝昼食かが違うことがあります。対応表に無い略語や言い回しは unclear にして人に見せ、確かめたら表に足します。
データの取得方法を決める
読み取りは AnalyzeDocument に S3 の場所(Document の S3Object)と FeatureTypes を渡します。同期の処理なので、応答にそのまま結果のブロックが入っています。
| 指定するもの | 値 | 理由 |
|---|---|---|
FeatureTypes | FORMS、TABLES、QUERIES(英語のとき) | 見出しのキーと値、部屋の表、文章で書かれた支払区分 |
QueriesConfig | 質問の文と Alias の組 | 答えを予約システムの項目名で受け取る |
HumanLoopConfig | 指定しない | 人の確認は自社の一覧で行う |
Alias | 質問の文 |
|---|---|
AGENT_REF | What is the agent's booking reference number? |
HOTEL_CONF | What is the hotel confirmation number? |
LEAD_GUEST | What is the lead guest's name? |
CHECK_IN | What is the check-in date? |
CHECK_OUT | What is the check-out date? |
ROOM_TYPE | What is the room type? |
MEAL_PLAN | What is the meal plan or board basis? |
PAYMENT | Who pays for the accommodation? |
EXTRAS | Who pays for extras? |
HumanLoopConfig を指定しないのは、人の確認を AWS の外の仕組みで行うためです。 公式のAPIの説明でも、この設定が使う Amazon Augmented AI は2026年7月に保守の段階に入り新規の利用者を受け付けていない、とされています。食い違いの一覧は、予約課の画面に出します。
質問の答えが見つからなければ空のまま返ります。 支払区分の答えが空なら、全文から prepaid、bill to、direct を含む行を探し、それでも無ければ missing にします。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、PDF、TIFF であることを確かめます。HTMLのメール本文だけで届いたバウチャーはPDFにします
- ページ数とサイズの確認 … 1ページ・10MBに収まれば同期、収まらなければ非同期に回します
- パスワードの確認 … PDFはパスワードで保護されていてはいけないとされています。旅行会社に保護の無いものを頼みます
- 解像度の確認 … 文字の高さは最小15ピクセルで、150 DPIで8ポイントの文字に相当します。客がスマートフォンで見せた画面の写真は、ここで下回ることがあります
- 旅行会社の特定 … 送信元のメールアドレスから旅行会社を引き、対応表を選びます
- 重複の確認 … 同じ予約番号のバウチャーが既に紐付いていれば、新しい版として扱います
4番目に当たったものは、読み取りを試さずに旅行会社へPDFを頼みます。 画面を撮った写真は文字が小さく、読めた部分だけで比べると、読めなかった項目の食い違いを見落とします。
6番目は、旅行会社が変更のたびにバウチャーを出し直すために要ります。 泊数の変更や同行者の追加で、同じ予約に2枚目、3枚目が届きます。最新の版で比べ、前の版との差も一覧に出します。
AIに処理させる
させるのは、読み取り結果を予約システムの項目にそろえ、食事条件と支払区分の原文を抜き出すことです。 比較と判定はさせません。
| 項目 | 取り出し方 | 判断できないときの扱い |
|---|---|---|
| 予約番号 | 旅行会社・ホールセラー・ホテルの3種を区別して取り出す | 区別がつかなければ reference_unknown に入れる |
| 宿泊者 | 書かれた順のまま、姓と名を分けずに原文で | 分けられるときだけ姓と名を添える |
| 日程 | 到着日・出発日・泊数を原文と解釈した値で | 日と月の順序が決まらなければ ambiguous |
| 部屋と人数 | 部屋の種類・数・大人と子どもの人数 | 表の行ごとに分ける |
| 食事条件 | 原文の略語と、書類の中の定義があればその文 | 略語だけなら原文のまま |
| 支払区分 | 宿泊代と追加料金のそれぞれについて、原文の文 | 書かれていなければ missing |
支払区分は、宿泊代と追加料金を分けて持ちます。 Room and breakfast prepaid. Extras paid direct. なら、宿泊代は旅行会社、追加料金は客です。1つの値にまとめると、どちらの請求で食い違ったのかが分かりません。
日付は、月の名前が書かれている(12 Nov 2026)か、年・月・日の順の数字か、日か月の一方が13以上のときだけ解釈します。 バウチャーは到着日と出発日の2つが並ぶので、泊数と照らせば順序が決まることも多いのですが、その推論はプログラムの側で行います。
| させないこと | 理由 |
|---|---|
| 予約システムとの比較の結論 | 比較はプログラム。差の扱いは予約課の規則 |
| 食事条件の略語の読み替え | 旅行会社ごとに意味が違う。対応表で突き合わせる |
| 支払区分の推測 | 「旅行会社経由だから前払いだろう」と埋めると、請求を誤る |
| 料金の計算、請求額の確定 | 契約条件の解釈は予約課 |
| 宿泊者の名前の綴りの修正 | 別人を同じ人にしてしまう |
3行目がいちばん起きやすい失敗です。 支払区分が書かれていないバウチャーを渡すと、旅行会社経由という文脈から Prepaid と書きます。書かれていないことは「書かれていない」として、旅行会社に問い合わせる項目にします。
指示内容を固定する
あなたはホテルの予約課で、海外の旅行会社から届いた英文の宿泊バウチャーを
予約システムの項目にそろえる担当です。
OCRの読み取り結果だけを使ってください。推測で埋めないでください。
【取り出す項目】
references(agent_ref、wholesaler_ref、hotel_conf)、guests、
check_in、check_out、nights、rooms(room_type、count、adults、children)、
meal_plan、payment(room_raw、extras_raw)、issue_date。
各項目に raw(読んだ文字列そのまま)、status、source を入れてください。
【status の選び方】
- ok ......... 値が読み取れ、その項目として解釈できる
- missing .... 書かれていない。質問の答えが空の場合も missing
- ambiguous .. 読み方が複数ある
- unreadable . 文字は検出されているが信頼度が低い
迷ったときに ok を選ばないでください。
【予約番号の扱い】
- 3種類の番号を区別できるときだけ、それぞれに入れてください。
- 区別がつかない番号は reference_unknown に入れてください。
【食事条件と支払区分の扱い】
- meal_plan は略語を読み替えず、raw に原文を入れてください。
書類の中に略語の定義があれば definition_raw に写してください。
- payment は宿泊代(room_raw)と追加料金(extras_raw)を分け、原文の文を写してください。
- 支払区分が書かれていなければ missing にしてください。
旅行会社経由であることから前払いと推測しないでください。
【日付の扱い】
- raw に原文を入れ、月の名前がある、年・月・日の順である、日または月の
一方が13以上である、のどれかのときだけ value に YYYY-MM-DD を入れてください。
【厳守事項】
- 予約システムと合っているか、請求をどうするかを書かないでください。
- 宿泊者の名前の綴りを直さないでください。
- バウチャーでない書類と判断した場合は document_type を other としてください。
- inquiry_draft には、missing と ambiguous の項目について旅行会社に確かめる
英文の文案を、簡潔に書いてください。
【読み取り結果】{textract_result}
【旅行会社】{agent_name}
「旅行会社経由であることから前払いと推測しない」を明記しないと、推測します。 実際に前払いの予約が多いので、推測はたいてい当たります。外れた1件が、チェックアウトで客に請求しそこねる1件です。
出力形式を固定する
Claude API の構造化出力(output_config.format に json_schema を指定)で、次の形のJSONを受け取ります。
{
"file": "",
"agent": "",
"references": { "agent_ref": "", "wholesaler_ref": "", "hotel_conf": "", "reference_unknown": [] },
"guests": [ { "raw": "", "status": "" } ],
"check_in": { "raw": "", "value": "", "status": "" },
"check_out": { "raw": "", "value": "", "status": "" },
"rooms": [ { "room_type_raw": "", "count": 0, "adults": 0, "children": 0 } ],
"meal_plan": { "raw": "HB", "definition_raw": "", "status": "" },
"payment": { "room_raw": "", "extras_raw": "", "status": "" },
"inquiry_draft": ""
}
1つ目の理由は、比較をプログラムの側に置けることです。 Python が予約番号3種と名前で予約を探し、項目ごとに次の印を付けます。
| 印 | 付ける条件 |
|---|---|
match | 予約が見つかり、日程・部屋・人数・食事・支払区分がすべて一致 |
mismatch | どれかが登録と違う。支払区分の違いは赤い印 |
unclear | 対応表に無い略語・言い回し、ambiguous の日付 |
not_found | 予約番号でも名前でも予約が見つからない |
2つ目は、支払区分を宿泊代と追加料金に分けて比べられることです。 予約システムの支払区分も2つに分かれていれば、どちらで食い違ったのかがフロントにそのまま伝わります。
3つ目は、inquiry_draft で問い合わせが速くなることです。 旅行会社への問い合わせは英文で、項目が決まっています。下書きを直して送るだけになります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有メールボックス | 添付の保存 | 旅行会社からのバウチャーを受付フォルダへ |
| AWS Textract | API呼び出し(同期/非同期) | バウチャーを読む |
| Claude API | API呼び出し | 項目の整形と問い合わせ文の下書き |
| 予約システム | 読み取り(予約の検索) | 予約番号と名前で予約を引く |
| 予約システム | 書き込み(バウチャーの紐付けと確認の印) | 一致したものだけ紐付ける |
| フロントの一覧 | 毎朝の出力 | 翌日到着の要確認の予約 |
予約システムへの書き込みは、バウチャーの紐付けと確認の印だけです。 日程や支払区分の値は書き換えません。食い違いを直すのは職員で、旅行会社に確かめてからです。
予約システムにAPIが無い場合は、毎朝の予約の出力ファイルで代えます。 到着予定の予約を出力し、受付フォルダの隣に置いて Python が読みます。その日のうちに入った予約とは照らせないので、not_found は翌朝にもう一度比べ直します。
人が確認する
予約課の職員が開くのは、mismatch、unclear、not_found の予約です。 match の予約は、紐付いたことを一覧で確かめるだけにします。
- 支払区分の
mismatchを先に見る … 画像で原文を確かめ、契約条件の一覧と照らします not_foundを片付ける … 予約の登録漏れか、別のホテル宛てのバウチャーかを確かめますunclearを対応表に足すか決める … 新しい略語や言い回しは、確かめてから表に足します- 旅行会社に問い合わせる … 下書きを直して送ります。送信は職員が行います
フロントは、到着前日の一覧を見てチェックインに臨みます。 支払区分に食い違いが残っている客には、チェックインの時点で「宿泊代は旅行会社にお支払い済みですか」と確かめることができ、チェックアウトの場で揉めずに済みます。
match の予約を開かない設計を、条件付きの確認にしている理由はここにあります。 全項目が一致したものまで開くと、5分が2分になりません。ただし毎月、match の予約から20件を抜き出して画像と見比べ、比較の規則に漏れがないかを確かめます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 6言語に入らないバウチャー(中国語など) | 読み取りに回さず、予約課の手作業の列へ |
| フランス語・スペイン語のバウチャー | 質問を外し、キーと値と表と全文で読む |
| 2ページ以上・10MB超 | 非同期の StartDocumentAnalysis に回す |
| パスワードで保護されたPDF | 読めない。旅行会社に保護の無いものを頼む |
| 1枚に複数の部屋・複数の予約 | 表の行ごとに分け、予約ごとに比べる |
| 別のホテル宛てのバウチャー | not_found。旅行会社に知らせる |
| 同じ予約の新しい版 | 最新の版で比べ、前の版との差を一覧に出す |
| 読み取りの呼び出しが失敗する | 受付フォルダに残し、再試行。紐付けは成功時だけ |
下から3行目は、思ったより起きます。 系列のホテルや近隣の同じ名前のホテルのバウチャーが、間違って届くことがあります。not_found を放置せず旅行会社に知らせると、到着した客が別のホテルに予約していた、という場面を前もって防げます。
記録を残す
- 元のバウチャーと、受け取った日時、送信元、旅行会社
- AWS Textract が返したJSONの全文と、使った質問の一覧
- Claude API が返したJSONと、Python の比較の結果
- そのとき使った対応表の版
- 職員が印を覆した記録 … どの項目を、どちらに変えたか
- 旅行会社への問い合わせと回答、予約の修正の記録
対応表の版を残すのは、旅行会社の略語が変わることがあるためです。 契約の更新で食事プランの名前が変わると、過去の判定の意味が変わります。
04実装レベルの3段階
本記事の想定は半自動化です。 読み取りと比較と紐付けが自動になり、職員は食い違いのある予約だけを確かめます。1件5分が2分になるのはこの段階です。 本格構成で足すのは、旅行会社の側の管理です。 支払区分の食い違いが多い旅行会社を集計し、契約の見直しのときに示す材料にします。 段階を飛ばさないでください。 半自動化を1〜2か月回すと、unclear の多い旅行会社と、対応表に無い言い回しが先に分かります。そこで対応表を育ててから自動の紐付けを広げるほうが、誤った紐付けが減ります。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 訪日の個人旅行の客が多い都市部や観光地のホテル・旅館で、海外の旅行会社やホールセラー経由の予約に英文のバウチャーが付き、予約課やフロントの職員が予約システムの画面と1枚ずつ見比べている場合。食事付きか素泊まりか、宿泊代を旅行会社に請求するのか客から受け取るのかの食い違いが、チェックインやチェックアウトの場で見つかっている場合。複数の旅行会社と取引があり、バウチャーの書式がばらばらな場合。
- バウチャーが中国語・韓国語・タイ語などで届く場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めず、手書きは英語のみです)。団体のルーミングリストの転記が中心の場合(UC-0458 の構成が向きます)。旅行会社経由の予約が月に数十件で、目で見て足りる場合。なお、旅行会社への請求の可否、料金の取り決めの解釈、客への説明は予約課とフロントが行うもので、この構成では代替できません。
07最小構成で試す方法
- 先月のバウチャーから30枚を選ぶ(支払区分が文章で書かれたもの、
HBなどの略語のもの、予約番号が3種類あるものを必ず入れる) - 客の名前と予約番号を一部伏せたコピーを作る
- 手元の生成AIの画面に1枚ずつ貼り付け、「予約番号、宿泊者、到着日と出発日、部屋、人数、食事条件、支払区分を取り出してください。食事条件の略語は読み替えずにそのまま書き、支払区分は宿泊代と追加料金を分けて原文で書いてください。書かれていない項目は『記載なし』としてください」と指示する
- 出てきた結果を予約システムの登録と見比べる
30枚は必ずやってください。 仕組みを組む前に、支払区分を推測で埋めないかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 支払区分を原文のまま取り出した | OCRのAPIと比較の処理に進む |
| 書かれていない支払区分を「前払い」とした | 指示の書き方で直る。直るまで先に進まない |
| 略語を勝手に読み替えた | 指示で直る。対応表を先に作る |
2行目が出たら、30枚のうち支払区分が書かれていないバウチャーが何枚あったかも数えてください。 その割合が、本番で旅行会社に問い合わせる件数の目安になります。多い旅行会社には、書式そのものに支払区分の欄を入れてもらう相談を先に始めます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 書かれていない支払区分を「前払い」で埋める | 推測を禁じ、missing を旅行会社への問い合わせ項目にする |
| 宿泊代と追加料金の支払区分を1つにまとめる | 2つに分けて持ち、予約システムの側も2つにする |
HB などの略語を勝手に読み替える | 原文を残し、旅行会社ごとの対応表で突き合わせる |
| 予約番号の種類を取り違える | 3種を区別し、区別できないものは reference_unknown |
| 名前の並びで予約が見つからない | 姓と名の順を入れ替えた検索も試し、それでも無ければ人へ |
| 新しい版のバウチャーを見落とす | 同じ予約番号は版として扱い、差を出す |
| 別のホテル宛てのバウチャーを放置する | not_found を旅行会社に知らせる |
match の予約を一度も見直さない | 毎月20件を抜き出して画像と見比べる |
| 客がスマートフォンで見せた画面が読めない | 旅行会社からPDFを送ってもらう。その場では職員が目で確かめる |
| 同行者の名前が1人分しか書かれていない | 人数で比べ、名前の不足は mismatch にせず注記にとどめる |
上の2行が、この構成の失敗のほとんどです。 どちらも支払区分の扱いで、誤るとチェックアウトの場で客と向き合うことになります。 原文を残し、分けて持ち、推測させない、の3つを守ります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 宿泊者の名前、到着日と出発日、部屋と人数、旅行会社との予約番号、そして支払区分と、旅行会社との取引の条件です。
- 外部へ渡す範囲を限る … 生成AIに渡すのはバウチャーの読み取り結果だけで、予約システムの予約データや旅行会社との契約の料金は渡しません。 比較は社内の Python で行います
- 予約の値を自動で書き換えない … 書き込むのはバウチャーの紐付けと確認の印だけで、日程や支払区分を直すのは職員です
- 問い合わせを自動で送らない … 旅行会社への問い合わせは下書きまでで、取引先との関係に関わる連絡は職員が送ります
- バウチャーの保存期間を決める … 宿泊者の名前を含む書類なので、会計の締めに要る期間を過ぎたら消します
- 客が見せた画面の写真の扱いを決める … 受付の端末で撮った写真も同じ受付フォルダに入れ、職員の私物の端末に残さないようにします
- 受付フォルダへの保存を旅行会社のドメインに限る … 共有メールボックスには営業のメールや迷惑メールも届きます。登録した旅行会社の送信元からの添付だけを保存し、それ以外は読み取りに回しません
誤りが起きた場合のリスクは、支払区分を誤って客や旅行会社に請求することです。 多くは推測で埋めることから起きるので、書かれていないものは書かれていないとして扱う設計を崩さないでください。
10まず何から始めるか
1週目:対応表を作る
取引の多い上位10社について、食事条件の略語と自社の食事プラン、支払区分の言い回しと自社の区分の対応表を作ります。職員の頭の中にある読み替えを、表に出す作業です。
2週目:30枚で試す
先月のバウチャーから30枚を選び、手元の生成AIの画面で項目を取り出させます。書かれていない支払区分を推測で埋めないかを最優先で見ます。
3週目:予約システムから予約を引く経路を決める
APIで引けるか、毎朝の出力ファイルで照らすかを決めます。予約システムの支払区分が宿泊代と追加料金に分かれているかも確かめます。
4週目:受付フォルダから比較までをつなぐ
S3、Lambda、Textract、Claude API、Python の比較をつなぎ、食い違いの一覧を出すところまで作ります。この時点では自動の紐付けをせず、一覧だけを見ます。
2か月目: 一致したものの自動の紐付けと、フロント向けの毎朝の一覧を足します。3か月目以降: 問い合わせ文の下書きを足し、1件5分が何分になったかを実測します。支払区分の食い違いがチェックアウトの前にすべて見つかる状態になった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 対応する形式がJPEG、PNG、PDF、TIFFであること。同期は10MB、PDFとTIFFは1ページまでであること。PDFはパスワードで保護できないこと。質問は同期で1ページ15件、非同期で30件までであること。対応言語が英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、質問の検出は英語の文書だけであること。文字の最小の高さが15ピクセル(150 DPIで8ポイント相当)であること | AWS: Set Quotas in Amazon Textract | 2026-10-07 |
AnalyzeDocument が同期の処理であること。Document に S3 のオブジェクトかバイト列を渡すこと。FeatureTypes(TABLES/FORMS/QUERIES/SIGNATURES/LAYOUT)と QueriesConfig。HumanLoopConfig が使う Amazon Augmented AI が2026年7月に保守の段階に入り、新規の利用者を受け付けていないこと | AWS: AnalyzeDocument | 2026-10-07 |
| 非同期の StartDocumentAnalysis が S3 の文書を読み、完了を Amazon SNS に通知すること | AWS: StartDocumentAnalysis | 2026-10-07 |
| 質問の応答が QUERY と QUERY_RESULT のブロックで返り、別名(Alias)と信頼度を持つこと。答えが見つからなければ空のまま返ること | AWS: Queries | 2026-10-07 |
構造化出力を output_config.format に json_schema を指定して受け取れること | Claude Docs: Structured outputs | 2026-10-07 |
旅行会社への請求、料金の取り決めの解釈、客への説明は、予約課とフロントが行うものです。 本記事はバウチャーの読み取りと予約システムとの突き合わせまでを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0677)についてのご相談はこちらから。
