英文の団体宿泊契約書を読み取り、室数・料金・減室(アトリション)の条件・取消の期限を予約台帳に転記して、期限の前に営業担当へ知らせる
海外の旅行会社から届く英文の団体宿泊契約書を読み取り、泊ごとの室数と料金、減室(アトリション)の条件、取消料の段階、各種の期限を予約台帳に転記します。期限が近づいた団体は、その前に営業担当へ知らせます。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- その他/宿泊
- 対象部門
- 営業
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 抽出
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 旅行会社から署名済みの契約書がメールで届き、営業担当が案件フォルダに保存する
- 室数と料金の表を見て、泊ごと・部屋タイプごとの室数を予約台帳の団体ブロックに入力する
- 本文を読み、デポジット、ルーミングリスト、返却期限、減室の許容幅、取消料の段階、無料の部屋(添乗員用など)の条件を拾う
- 到着日から逆算して各期限の日付を出し、共有カレンダーに手で入れる
- 見積書の控えと見比べ、料金や室数が提示した内容と違わないかを見る
- 改定版が届いたら、前の版と見比べて台帳とカレンダーを直す
- 人署名済みの契約書を、ファイル名に団体番号を付けて受付フォルダに保存する
- 自動保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 自動OCRが全文、表、キーと値、質問への答え、署名の位置と、それぞれの信頼度を返す
- 自動生成AIが、泊ごとの室数と料金、減室の条件、取消料の段階、期限を原文のまま取り出す
- 自動プログラムが、期限を到着日から日付に換算し、予約台帳と見積書の値と照合する。改定版なら前の版との差分を出す
- 自動予約台帳への登録案と、期限の一覧、食い違いの一覧を出す
- 人営業担当が、印の付いた項目と期限の一覧を契約書の画像と見比べて確かめ、台帳に登録する
- 自動毎朝、台帳の期限を数え、7日前と前日に営業担当へ知らせる
各工程の詳しい説明を読む
- 旅行会社から署名済みの契約書がメールで届き、営業担当が案件フォルダに保存する
- 室数と料金の表を見て、泊ごと・部屋タイプごとの室数を予約台帳の団体ブロックに入力する
- 本文を読み、デポジット、ルーミングリスト、返却期限、減室の許容幅、取消料の段階、無料の部屋(添乗員用など)の条件を拾う
- 到着日から逆算して各期限の日付を出し、共有カレンダーに手で入れる
- 見積書の控えと見比べ、料金や室数が提示した内容と違わないかを見る
- 改定版が届いたら、前の版と見比べて台帳とカレンダーを直す
(a)期限の登録が漏れる。 4番の逆算は、到着日を数え間違えたり、期限を1つ入れ忘れたりします。カレンダーに無い期限は、無いのと同じです。 返却期限を過ぎてから気づいた部屋は、空いたまま当日を迎えます。
(b)泊ごとの室数の転記が重い。 7泊・3タイプの団体なら21個の数字があり、到着日と出発日の前後で室数が変わる団体ほど写し間違えます。
(c)改定版の差分が追えない。 改定版は全文で届くため、どこが変わったかは人が見比べるしかありません。室数が減ったのに台帳が元のまま、という状態が残ります。
(d)取消料の段階が台帳に残らない。 取消料の表は契約書の中にしか無く、取り消しの連絡が来た日に契約書を探して読み直すことになります。どの版の表が有効なのかも、その場で調べることになります。
(e)読み方が担当者で違う。 「21 days prior to arrival」を到着日を含めて数えるか、減室の幅を泊ごとに見るか団体全体で見るか。担当者ごとに数え方が違い、同じ旅行会社に違う説明をしてしまうことがあります。
- 【人】 署名済みの契約書を、ファイル名に団体番号を付けて受付フォルダに保存する
- 【自動】 保存をきっかけに処理が動き、形式・ページ数・パスワードの有無を確かめる
- 【自動】 OCRが全文、表、キーと値、質問への答え、署名の位置と、それぞれの信頼度を返す
- 【自動】 生成AIが、泊ごとの室数と料金、減室の条件、取消料の段階、期限を原文のまま取り出す
- 【自動】 プログラムが、期限を到着日から日付に換算し、予約台帳と見積書の値と照合する。改定版なら前の版との差分を出す
- 【自動】 予約台帳への登録案と、期限の一覧、食い違いの一覧を出す
- 【人】 営業担当が、印の付いた項目と期限の一覧を契約書の画像と見比べて確かめ、台帳に登録する
- 【自動】 毎朝、台帳の期限を数え、7日前と前日に営業担当へ知らせる
7番目が、この設計の分かれ目です。 人が契約書を読み直すのではなく、印の付いた項目と期限の一覧だけを画像と見比べます。
8番目をAIに置かないのも意図してのことです。 期限の通知は、台帳の日付と規則だけでできる仕事です。AIは契約書に何が書かれているかを答え、いつ知らせるかはプログラムが決めます。到着日が改定で動いても、プログラムなら全部の期限を同じ規則で数え直せます。
02今回想定するシステム構成
英文の団体宿泊契約書・改定版(旅行会社からのPDF) ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・ページ数・パスワードの確認 ▼ AWS Textract(StartDocumentAnalysis:TABLES/FORMS/QUERIES/LAYOUT/SIGNATURES) │ 全文、表のセル、キーと値、質問への答え、署名の位置、信頼度 ▼ Claude API ── 室数・料金・条件・期限を原文のまま取り出す │ ① 泊ごとの室数と料金 ② 減室の条件 ③ 取消料の段階 │ ④ デポジットと支払 ⑤ 提出物と期限 ⑥ 無料の部屋の条件 ▼ Python ── 期限の日付への換算、予約台帳・見積書との照合、改定版の差分 ▼ 台帳の登録案 + 期限の一覧 + 食い違いの一覧(match / mismatch / needs_human) ▼ 【営業担当が確認して台帳に登録】── 毎朝、期限の7日前と前日に通知
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis/GetDocumentAnalysis) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(項目の取り出しと、旅行会社への確認文の下書き) | OpenAI API、Gemini API |
| 差異計算 | Python(期限の換算、台帳・見積書との照合、改定版の差分) | 宿泊管理の仕組みの照合機能 |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | Amazon EventBridge |
| 保管 | Amazon S3(契約書、読み取り結果、登録の版) | 社内のファイルサーバー |
予約台帳と見積書は、新しく足すものではありません。 最初の準備は、予約台帳の団体ブロックに「契約の版」「返却期限」「減室の見直し日」「取消料の段階」の欄を足すことです。
OCRに AWS Textract を選ぶのは、契約書が英文だからです。 公式の上限の表で、対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語とされ、日本語や中国語は読めません。 質問による読み取りも英語の文書だけです。
この題材で効くのは、表の読み取り(TABLES)です。 泊ごとの室数の表は、セルごとに行と列の番号、列見出しかどうか、信頼度が返ります。公式の手引きでは、表全体や行・列をまるごと質問で取ることはできないとされています。 室数と料金は表として取り、質問は契約番号や到着日のような1つの値に使います。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)にPDFが保存されたことを起点にします。 契約書は旅行会社の都合で不定期に届き、改定版は到着の直前にも届くため、1日1回の定時実行にはしません。 到着の数週間前に届いた改定版で室数が減っていれば、その日のうちに返却の判断をしたいからです。
保存するのは営業担当で、ファイル名の先頭に団体番号を付けます。 団体番号が無いファイルは、照合の相手を決められないので処理を始める前に止めます。旅行会社からのメールを自動で保存する形にしないのは、署名前の案や見積の往復が混ざり、どれが最後の版か機械では決められないからです。
S3 への保存を AWS Lambda が受け、StartDocumentAnalysis を呼びます。ClientRequestToken に団体番号とファイルのハッシュから作った値を入れ、同じファイルを二度読まないようにします。 完了は Amazon SNS に届き、SUCCEEDED を確かめてから結果を取り、すぐ S3 に保存します(JobId は7日間だけ有効です)。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 契約書のPDF | 旅行会社名、団体名、契約番号、全文。保存した日時と版 | 受付フォルダ(S3) |
| 読み取り結果 | 全文、表のセル、キーと値、質問への答え、署名の位置、信頼度 | AWS Textract |
| 予約台帳の団体ブロック | 団体番号、到着日・出発日、泊ごと・タイプごとの押さえた室数 | 宿泊管理の仕組み |
| 見積書の控え | 提示した料金、室数、条件 | 案件フォルダ |
| これまでの版 | 同じ団体の前の版の読み取り結果と、確定した登録内容 | S3 の保管領域 |
| 部屋タイプの対応表 | 契約書に書かれうる部屋タイプの英語名と、台帳のタイプの対応 | 営業が用意する一覧 |
質を決めるのは、いちばん下の対応表です。 旅行会社は「Twin」「Standard Twin」「TWN」と書き方がばらばらで、対応表が無いと、正しい室数でも別のタイプとして食い違いが出ます。
データの取得方法を決める
読み取りは StartDocumentAnalysis に FeatureTypes として TABLES、FORMS、QUERIES、LAYOUT、SIGNATURES を指定して行います。全文の行と単語は、指定した機能にかかわらず返ります。
| 取るもの | どの機能で | 何に使うか |
|---|---|---|
| 表のセル | TABLES | 泊ごと・タイプごとの室数と料金、取消料の段階の表 |
| キーと値 | FORMS | 「Arrival」「Group Name」のように見出しと値が並ぶ項目 |
| 段落・見出し | LAYOUT | 「Attrition」「Cancellation」などの見出しで本文の条件を区切る |
| 質問への答え | QUERIES | 契約番号、到着日、出発日、旅行会社名 |
| 署名の位置 | SIGNATURES | 旅行会社の署名欄に署名らしきものがあるか |
表は、セルの行と列の番号で組み立て直します。 公式の説明では、セルは CELL として行の番号・列の番号・信頼度を持ち、列見出しのセルには COLUMN_HEADER が付きます。結合されたセルは MERGED_CELL として別に返ります。日付が結合セルの見出しになっている表は、結合セルを先に展開してから泊ごとの行にします。
見出しの構造は LAYOUT で取ります。 見出しは LAYOUT_SECTION_HEADER、本文は LAYOUT_TEXT として、上から下・左から右の読む順で返ります。「Attrition」の見出しから次の見出しまでを、減室の条件の原文として切り出します。
質問は、手引きに沿って文書の言葉で、何の日付かを特定して聞きます。
| 別名 | 質問の例 |
|---|---|
CONTRACT_NO | What is the contract number? |
ARRIVAL | What is the arrival date of the group? |
DEPARTURE | What is the departure date of the group? |
AGENT | What is the name of the travel agency? |
ページの指定が無いと質問は1ページ目しか見ないので、Pages に ["*"] を入れます。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、PDF、TIFF であることを確かめます。XFA形式のPDFは扱えないため、印刷し直してPDFにします
- パスワードの確認 … PDFはパスワードで保護されていてはいけません。保護されたものは旅行会社に解除したものを頼みます
- 文字の大きさの確認 … 文字の高さが15ピクセルを下回ると検出されません。ファックスや写真で届いた署名ページは、読めない項目が出やすいので印を付けます
- 言語の確認 … 英語以外の文が含まれていれば質問を外し、表とキーと値と全文で読みます
- 版の確認 … 同じ団体番号の前の版があるかを調べ、あれば改定版として扱います
AIに処理させる
させるのは、室数・料金・条件・期限を原文のまま取り出し、期限を「何の期限か」と「到着日から何日前か」に分けることだけです。
| 取り出す項目 | 中身 | 取り出せないときの扱い |
|---|---|---|
| 泊ごとの室数と料金 | 日付、部屋タイプ、室数、1室1泊の料金、通貨、税とサービス料の扱い | セルが読めなければ unreadable |
| 減室の条件 | 減らしても違約金のかからない幅、見直し日、超えた場合の扱い | 書かれていなければ not_found |
| 取消料の段階 | 何日前から何日前までに、何の何%か | 表と本文で違えば ambiguous |
| デポジットと支払 | 金額や割合、期限、支払方法 | 書かれていなければ not_found |
| 提出物と期限 | ルーミングリスト、返却期限(カットオフ)、最終の人数 | 書かれていなければ not_found |
| 無料の部屋の条件 | 何室ごとに何室が無料か(添乗員用など) | 書かれていなければ not_found |
期限の分け方が、いちばん手間を減らすところです。 「Cut-off date: 21 days prior to arrival」なら、種類は cutoff、基準は arrival、日数は21と分け、原文を添えます。 日付で書かれている期限は、その日付を写すだけにします。
| させないこと | 理由 |
|---|---|
| 期限の日付への換算 | 到着日が変われば日付も変わる。プログラムが毎日数え直す |
| 取消料や違約金の金額の計算 | 段階と割合を写すだけ。金額は人が請求するときに決める |
| 書かれていない条件の補完 | 「団体では通常」で埋めると、契約に無い条件を作る |
| 請求するか・免除するかの判断 | 取引先との関係を踏まえて営業の責任者が決める |
| 台帳との一致・不一致の判定 | 照合は台帳の値を使い、プログラムが行う |
1行目と3行目が、いちばん起きやすい失敗です。 減室の条件が書かれていない契約書を渡すと、AIは業界の通念らしき割合で埋めます。その数字は契約書のどこにも無く、請求の根拠になりません。
取消料の段階は、表と本文の両方に書かれていることがあります。 表では「30-15 days: 50%」、本文では「within 21 days」のように食い違う契約書もあります。どちらかに寄せず、両方を写して ambiguous にします。 どちらが有効かは、契約の優先順位の条項を読んだ人が決めます。
指示内容を固定する
あなたはホテルの団体営業の担当として、英文の団体宿泊契約書を読み、
予約台帳に登録するための項目を取り出します。
OCRが返した読み取り結果だけを見てください。推測で埋めないでください。
【取り出す項目】
1. 泊ごと・部屋タイプごとの室数と1室1泊の料金(通貨、税とサービス料の扱い)
2. 減室(attrition)の条件
3. 取消料の段階
4. デポジットと支払の条件
5. 提出物と期限(ルーミングリスト、返却期限、最終の人数)
6. 無料の部屋の条件
【status の選び方】
- ok ......... 値が読み取れており、その項目として解釈できる
- not_found .. その項目が書かれていない
- unreadable . 文字は検出されているが信頼度が低く、値として確定できない
- ambiguous .. 候補が複数あり、1つに決められない(表と本文が食い違う場合も含む)
迷ったときに ok を選ばないでください。
【厳守事項】
- original には、契約書の英文をそのまま写してください。言い換えないでください。
- 日本語の説明は note_ja にだけ書いてください。
- 期限は、種類(deadline_type)、基準(arrival / signing / date)、日数に分けてください。
日付への換算はしないでください。日付で書かれていれば、その文字列を写してください。
- 取消料や違約金の金額を計算しないでください。割合と対象を写してください。
- 書かれていない条件を補わないでください。「通常は」「業界では」で埋めないでください。
- 室数と料金は、表のセルの値を写してください。合計や平均を計算しないでください。
- 部屋タイプの名前は、契約書の書き方のまま写してください。
- 請求するべきか、免除するべきかは書かないでください。
- 英語以外の文が含まれていれば、language_note にその旨を書いてください。
【読み取り結果】{textract_result}
【見出しごとに区切った原文】{sections}
【組み立て直した表】{tables}
「日付への換算をしない」は、書かないと必ず破られます。 到着日と「21 days prior」が並んでいれば、AIは親切に日付を出します。改定版で到着日が1日ずれても、その日付は直りません。
「部屋タイプの名前を書き方のまま写す」も同じ理由です。 AIが「Standard Twin」を台帳のタイプ名に寄せると、対応表で照合する意味がなくなります。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に json_schema)で形を守らせます。
{
"contract_no": "",
"room_block": [
{ "night": "", "room_type_text": "", "rooms": 0, "rate": "", "currency": "",
"tax_service_text": "", "status": "ok | unreadable | ambiguous" }
],
"deadlines": [
{ "deadline_type": "deposit | rooming_list | cutoff | attrition_review | final_numbers | other",
"basis": "arrival | signing | date", "days": 0, "date_text": "",
"original": "", "status": "ok | not_found | ambiguous" }
],
"cancellation_tiers": [ { "from_days": 0, "to_days": 0, "charge_text": "", "original": "" } ],
"attrition": { "allowance_text": "", "review_text": "", "original": "", "status": "" },
"comp_rooms": { "original": "", "status": "" },
"agent_signature_detected": "yes | no",
"language_note": ""
}
1つ目の理由は、期限を毎日数え直せることです。 プログラムは basis と days と台帳の到着日から日付を出し、到着日が変わった改定版でも、全部の期限が自動で動きます。
2つ目は、照合の結果を別の層に置けることです。
| 照合の結果 | 意味 |
|---|---|
match | 契約書の室数・料金が、予約台帳と見積書に一致する |
mismatch | 一致しない(泊ごとの室数、料金、日程など) |
needs_human | unreadable または ambiguous を含み、照合できない |
改定版は前の版と項目ごとに比べ、変わった泊と期限に印を付けます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(S3) | イベントで AWS Lambda を起動 | 保存を検知し、読み取りを始める |
| AWS Textract | API呼び出し(非同期) | 全文・表・キーと値・質問・署名を返す |
| Claude API | API呼び出し | 項目の取り出しと期限の分解 |
| 予約台帳 | 読み取り(照合)と、人が確定した後の登録 | 団体ブロックの室数と到着日を引く |
| 営業担当への通知 | メールまたはチャット | 食い違いの一覧と、期限の7日前・前日の知らせ |
予約台帳へは、人が確定するまで書き込みません。 室数が違うと出ても、台帳の側が正しい(旅行会社が古い版に署名した)こともあるからです。通知には、期限の種類、日付、原文、団体の担当者を載せ、契約書を開かなくても次の手が分かるようにします。
人が確認する
人が確かめるのは、印の付いた項目と、期限の一覧です。 match の泊は一覧で流し見ます。
needs_humanを先に見る … 読めなかったセルと、表と本文が食い違う条件です。画像を開いて値を確定します- 期限の一覧を原文と見比べる … 種類と日数の分け方が正しいか、「prior to arrival」と「after signing」を取り違えていないかを見ます
mismatchの扱いを決める … 台帳を直すか、旅行会社に確かめるかを決めます。確認文の下書きは直してから送ります- 署名の印を見る … 旅行会社の署名が検出されないものは、署名済みの版が届いているかを確かめます
- 確定して台帳に登録する … 確定したものだけが、毎朝の期限の通知の対象になります
2番目を省かないでください。 期限の基準を取り違えると、通知そのものが誤った日に届きます。 誤った通知は、通知が無いより危険です。担当者は通知を信じて、カレンダーを見なくなるからです。
目標は、90件をならして1件10分です。 改定版で変わった泊だけを見るもの、新規で全部の期限を見るものが混ざります。15分を超える件が続く旅行会社は、書式そのものを相談する材料にします。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付きのPDF | PDFはパスワードで保護できない。旅行会社に解除したものを頼む |
| 写真やファックスの署名ページ | 文字の高さ15ピクセルが下限。読めない項目は unreadable で人へ |
| 表の日付が結合セルで泊の行と合わない | 結合セルを展開し直し、合わなければ needs_human |
| 部屋タイプが対応表に無い | 照合を止め、営業に対応表への追加を頼む |
| 同じ団体の版の順番が分からない | 署名日と保存日時で並べ、決められなければ人へ |
| 契約書の到着日が予約台帳と違う | 期限の換算を止める。どちらの到着日で数えるかを人が決めるまで通知しない |
| 取消料の表と本文が食い違う | 両方を写して ambiguous。優先順位の条項を人が読む |
| 署名欄が空のまま届いた | 台帳には仮で登録し、署名済みの版を旅行会社に頼む |
| 英語以外の契約書 | 質問を外して読む。手書きの書き込みは英語しか読めない |
処理が FAILED または PARTIAL_SUCCESS | 受付フォルダに残して担当へ |
上から3行目までが大半を占めます。 どれも契約書の作り方の問題で、旅行会社に自社の書式で署名してもらう取り決めがいちばん効きます。
記録を残す
- 元の契約書のPDFと、保存した日時・版
- AWS Textract の結果のJSON全文と
JobId - Claude API の出力(
room_block、deadlines、cancellation_tiers) - 照合に使った台帳の値と、照合の結果
- 期限の換算に使った到着日と規則、通知を送った日時と相手
- 人が値を直した記録と、確定した版・確定した人
5つ目を残すのは、取消料を請求するときの根拠になるためです。 どの版のどの条件で、いつ知らせたかが分かれば、旅行会社との話が早く済みます。
04実装レベルの3段階
最小構成は、確かめるための段階です。 件数はさばけません。 半自動化で、①の表の転記と②の拾い出しの大半が無くなります。 期限のカレンダーへの登録と改定版の見比べは残り、本格構成でそれらも自動になります。この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化で1か月回すと、どの旅行会社の書式で表の組み立てが崩れるかが分かります。そこを直さないまま照合を足すと、mismatch が書式の崩れで埋まり、本当の食い違いが一覧の中に埋もれます。
05工数削減シミュレーション
導入後 90件 × 10分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外の旅行会社からの団体(ツアー・インセンティブ・会議の参加者)を毎月数十件受け、英文の団体宿泊契約書を営業担当が読んで予約台帳とカレンダーに手で写しているホテル・ホテルチェーンの営業部門。部屋の返却期限(カットオフ)や減室の見直し日を過ぎてから気づき、空室のまま売り損じた、または取れるはずの取消料を請求し損ねたことがある場合。
- 団体の契約が日本語や中国語・韓国語で交わされることが中心の場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めず、質問による読み取りは英語の文書だけです)。団体の受け入れが月に数件で、営業担当が1人で把握できる場合。なお、取消料や減室の違約金を請求するか、免除や条件の緩和に応じるかは、取引先との関係を踏まえて営業の責任者が決めるもので、この構成では代替できません。
07最小構成で試す方法
- 過去3か月の団体の契約書から10件を選ぶ(うち数件は、返却期限を過ぎてから気づいたものや改定の多かったものを入れる)
- その10件について、予約台帳の室数と、カレンダーに入れた期限を集める
- 契約書のPDFを、手元のAIサービスの画面に1件ずつ貼り付ける
- 「この契約書から、泊ごと・部屋タイプごとの室数と料金、減室の条件、取消料の段階、デポジット、ルーミングリストと返却の期限を取り出してください。期限は『到着日の何日前』のまま書き、日付に直さないでください。書かれていない項目は『記載なし』としてください」と指示する
- 出てきた結果を、台帳とカレンダーと突き合わせる
10件は必ずやってください。 ワークフローを組む前に、「泊ごとの表と期限を、書かれたとおりに取り出せるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| カレンダーに無かった期限が出た | 登録漏れが見つかった。OCRとの連携に進む |
| 減室の幅を通念で埋めた | 指示の書き方で直る。構成は有効 |
| 結合セルの表で泊がずれる | 表の組み立て直しが先。 OCRの表の結果で確かめる |
1行目は失敗ではなく、いまの登録のどこが漏れていたのかが分かったということです。
3行目が出たら、AIの画面ではなくOCRの表の結果を先に見てください。 泊の日付が結合セルの見出しに入っている書式は、画面に貼り付けただけでは崩れ方が分かりません。どの旅行会社の書式が崩れるかを、この10件で拾っておきます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが期限を日付に換算して書く | 換算を禁じる。 種類・基準・日数に分けさせ、プログラムが数える |
| 減室の幅を業界の通念で埋める | 書かれていなければ not_found。埋めた数字は請求の根拠にならない |
| 表全体を質問で取ろうとする | 表全体や行・列は質問で取れない。TABLES のセルで組み立てる |
| 結合セルの日付で泊がずれる | MERGED_CELL を展開してから行にする |
| 質問が2ページ目以降を見ない | ページの指定が無いと1ページ目だけ。**Pages に ["*"] を入れる** |
| 部屋タイプの書き方の違いで食い違いが出る | 対応表を用意し、AIにはタイプ名を書き方のまま写させる |
| 改定版のどこが変わったか分からない | 版ごとに保存し、項目ごとに比べて印を付ける |
| 期限の基準を取り違える | 原文を添えて、確認で基準だけは必ず見る |
| 到着日を含めて数えるかで1日ずれる | 数え方を規則として1つに決め、プログラムに書く |
| 署名前の案を最後の版として読む | 保存は人が行い、署名の検出が無いものに印を付ける |
| 通知が多すぎて読まれなくなる | 7日前と前日だけにし、確定した団体だけを通知する |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIが「親切に」埋めた結果、契約書に無い日付や数字が台帳に入るという同じ形をしています。
下の3行は、運用に入ってから効いてきます。 とくに通知の多さは、始めて1か月で問題になります。通知が読まれなくなれば、期限の登録が自動になっても期限は逃します。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 旅行会社の名称と担当者、団体名、日程、室数、契約の料金と取消の条件です。ルーミングリストのような宿泊者の個人情報は、この構成の入力に含めません。
- 外部へ渡す範囲を、項目の取り出しに要るものに限る … 生成AIに渡すのは読み取り結果と見出しごとの原文です。見積書の料金や他の団体の情報は照合のプログラムの側で使い、生成AIへは渡しません
- AWS の保存先を自社の管理下に置く … 結果は
OutputConfigで自社のバケットに出し、KMSKeyIdで自社の鍵で暗号化できます - 契約書に個人の名簿が添付されていたら分ける … 名簿のページは読み取りの対象から外し、宿泊者の情報は従来の経路で扱います
- 旅行会社への連絡を自動で送らない … 出すのは確認文の下書きまでです
- この構成は、取消料や違約金を請求するかを判断しません … 判断するのは営業の責任者です。この構成が出すのは、契約書に何が書かれていたかと、いつが期限かという事実だけです
- 契約書と読み取り結果の保存期間を決める … 取消料の請求に使う可能性がある間は残し、団体の出発から一定の期間が過ぎたら消す手順を先に決めます
誤りが起きた場合のリスクは、期限を逃すことと、契約に無い条件で請求することの2つです。 前者は通知の誤りで起き、後者はAIが埋めた数字で起きます。どちらも、原文を写させ、日付と金額をAIに作らせないことで守ります。
10まず何から始めるか
1週目:予約台帳に欄を足す
団体ブロックに、契約の版、返却期限、減室の見直し日、取消料の段階の欄を足します。到着が3か月以内の団体から埋めます。
2週目:10件で試す
過去3か月の契約書から10件を選び、手元のAIサービスに貼り付けて室数と期限を取り出させます。カレンダーに入っていなかった期限が出るかを最優先で見ます。
3週目:期限の規則と対応表を決める
期限の何日前に誰へ知らせるかを、営業の責任者と決めます。 到着日を含めて数えるか、土日や祝日に当たったときに前へずらすかも、ここで1つに決めます。担当者ごとの数え方の違いは、この週で無くします。 あわせて部屋タイプの対応表を作ります。
4週目:受付フォルダから読み取りまでをつなぐ
S3、Lambda、Textract、SNS をつなぎ、表の組み立てと期限の一覧を出すところまで作ります。この時点では照合を足しません。
2か月目: 台帳と見積書との照合、毎朝の期限の通知を足します。3か月目以降: 改定版の差分を足し、1件30分が何分になったかを実測します。返却期限を過ぎてから気づく団体が出なくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| XFA形式のPDFの非対応。パスワード付きPDFの非対応。非同期でPDF500MB・3,000ページまで。対応言語が英・仏・独・伊・葡・西で、質問は英語だけ、手書きは英語のみ。文字の最小の高さが15ピクセル | AWS: Set Quotas in Amazon Textract | 2026-10-08 |
FeatureTypes(TABLES/FORMS/QUERIES/SIGNATURES/LAYOUT)。全文の行と単語は指定にかかわらず返ること。ClientRequestToken、Amazon SNS への完了通知と SUCCEEDED の確認、OutputConfig と KMSKeyId。JobId が7日間だけ有効なこと | AWS: StartDocumentAnalysis | 2026-10-08 |
表のセルが CELL として行・列の番号と信頼度を持ち、列見出しに COLUMN_HEADER が付くこと。結合セルが MERGED_CELL として返ること | AWS: Tables | 2026-10-08 |
表全体や行・列を質問で取ることはできないこと。文書の言葉を使い、日付が複数あるときは特定して聞くこと。ページの指定が無いと ["1"] になること | AWS: Best Practices for Queries | 2026-10-08 |
見出しが LAYOUT_SECTION_HEADER、本文が LAYOUT_TEXT などとして、上から下・左から右の読む順で返ること | AWS: Layout Response Objects | 2026-10-08 |
構造化出力を output_config.format に json_schema を指定して受け取れること | Claude Docs: Structured outputs | 2026-10-08 |
取消料や減室の違約金を請求するか、免除や緩和に応じるかは、営業の責任者が取引先との関係を踏まえて決めるものです。 本記事は製品の公開仕様で確認できた範囲と、契約書の読み取りと期限の通知までを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1030)についてのご相談はこちらから。
