海外の旅行会社から届く英文のルーミングリストとバウチャーを読み取り、宿泊者名・部屋割り・食事・送迎を団体の予約データに転記して、手配書どうしの食い違いを営業へ返す
海外の旅行会社から届く英文のルーミングリストとバウチャーを読み取り、宿泊者名・部屋割り・食事・送迎を団体の予約データの形にそろえます。前の版や予約確認と照らし、部屋数・人数・食事の食い違いを営業へ返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 対象業界
- その他/宿泊
- 対象部門
- カスタマーサポート/営業
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 旅行会社からメールでルーミングリストとバウチャーが届き、団体ごとのフォルダに保存する
- 担当者がルーミングリストを開き、部屋ごとに宿泊者の姓・名・敬称を予約システムへ入力する
- 部屋の種類(シングル・ツイン・ダブル・トリプル)、エキストラベッド、子どもの有無を入力する
- 食事の条件、ベジタリアンやアレルギーなどの要望、到着便と送迎の時刻を手配表に写す
- バウチャーと予約確認書を開き、部屋数・人数・泊数・食事の条件が合っているかを見比べる
- 合わないところを旅行会社へメールで問い合わせる
- 改訂版が届いたら、前の版と見比べて変わったところを探し、予約システムと手配表を直す
- 人担当者が、届いたルーミングリストとバウチャーを団体の予約番号のフォルダに保存する
- 自動保存をきっかけに処理が動き、形式・サイズ・ページ数・本文の言語を確かめる
- 自動AWS Textract がルーミングリストの表(行・列・見出し・結合されたセル)と、バウチャーの決まった項目への答えを返す
- 自動Claude API が表の列を予約データの項目(部屋番号の枠・部屋の種類・姓・名・敬称・要望)へ並べ直す
- 自動プログラムが、前の版との差分、バウチャーとの数の照合、予約システムの枠との照合を行う
- 自動Claude API が、食い違いの一覧と、旅行会社への問い合わせの英文の下書きを作る
- 人担当者が、差分と食い違いと信頼度の低い行を確かめる
- 人担当者が予約システムへの取り込みを承認し、問い合わせを直して送る
- 自動承認された内容を予約システムの取り込み用ファイルと、部署別の手配表に書き出す
各工程の詳しい説明を読む
- 旅行会社からメールでルーミングリストとバウチャーが届き、団体ごとのフォルダに保存する
- 担当者がルーミングリストを開き、部屋ごとに宿泊者の姓・名・敬称を予約システムへ入力する
- 部屋の種類(シングル・ツイン・ダブル・トリプル)、エキストラベッド、子どもの有無を入力する
- 食事の条件、ベジタリアンやアレルギーなどの要望、到着便と送迎の時刻を手配表に写す
- バウチャーと予約確認書を開き、部屋数・人数・泊数・食事の条件が合っているかを見比べる
- 合わないところを旅行会社へメールで問い合わせる
- 改訂版が届いたら、前の版と見比べて変わったところを探し、予約システムと手配表を直す
(a)英字の氏名を打つ時間が重い。 30名の団体なら、姓と名と敬称で90個の文字列です。つづりの1文字違いは、到着の当日にフロントで名前が引けない原因になります。 姓と名の順番が旅行会社によって違うことも、入力を遅くします。
(b)改訂版のどこが変わったか分からない。 改訂版の多くは、変わったところに印を付けずに丸ごと送られてきます。同じ30行を見比べて、1人の差し替えと2部屋の組み替えを探します。 見落とすと、取り消された人の名前が部屋に残ります。
(c)数の食い違いに当日気づく。 ルーミングリストはツイン15室なのに、バウチャーはツイン14室とシングル2室。添乗員の部屋がどちらに数えられているか分からない。レストランの席数と朝食の数が、到着の夜に合わなくなります。
(d)食事の要望が手配表に落ちない。 ルーミングリストの備考欄に小さく書かれた「nut allergy」や「halal」を、表の右端まで見ずに次の行へ進んでしまうことがあります。ここは見落としたときの影響がいちばん大きい欄です。
- 【人】 担当者が、届いたルーミングリストとバウチャーを団体の予約番号のフォルダに保存する
- 【自動】 保存をきっかけに処理が動き、形式・サイズ・ページ数・本文の言語を確かめる
- 【自動】 AWS Textract がルーミングリストの表(行・列・見出し・結合されたセル)と、バウチャーの決まった項目への答えを返す
- 【自動】 Claude API が表の列を予約データの項目(部屋番号の枠・部屋の種類・姓・名・敬称・要望)へ並べ直す
- 【自動】 プログラムが、前の版との差分、バウチャーとの数の照合、予約システムの枠との照合を行う
- 【自動】 Claude API が、食い違いの一覧と、旅行会社への問い合わせの英文の下書きを作る
- 【人】 担当者が、差分と食い違いと信頼度の低い行を確かめる
- 【人】 担当者が予約システムへの取り込みを承認し、問い合わせを直して送る
- 【自動】 承認された内容を予約システムの取り込み用ファイルと、部署別の手配表に書き出す
7番目が、この設計の分かれ目です。 名前の取り込みは自動でできますが、予約システムへ入れるのは担当者が承認してからです。 読み取りの誤った名前が入ると、到着の当日にフロントが名前で引けません。
5番目をプログラムに置いているのも意図してのことです。 部屋の数や人数が合っているか、前の版から誰が替わったかは、数えれば決まることです。 AIに数えさせると、添乗員の部屋を数えたり数えなかったりします。
02今回想定するシステム構成
ルーミングリスト・バウチャー(英文のPDF・画像) ▼【トリガー】団体フォルダ(Amazon S3)への保存 AWS Lambda ── 形式・サイズ・ページ数・言語の確認 ▼ AWS Textract ├─ StartDocumentAnalysis(TABLES・FORMS)… ルーミングリストの表 └─ StartDocumentAnalysis(QUERIES)……… バウチャーの決まった項目 ▼ 完了の通知(Amazon SNS) Claude API ── 表の列を予約データの項目へ並べ直す(構造化出力) ▼ AWS Lambda ── 前の版との差分/バウチャーとの照合/予約システムの枠との照合 ▼ Claude API ── 食い違いの一覧と、旅行会社への問い合わせの下書き ▼ 【担当者が確認・承認】──▶ 予約システムの取り込み用ファイル/部署別の手配表
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis の TABLES・FORMS・QUERIES) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(列の並べ直し、食い違いの説明、問い合わせの下書き) | OpenAI API、Gemini API |
| 連携 | AWS Lambda(保存を起点に処理を動かし、差分と照合を行う) | Amazon EventBridge |
| 保管 | Amazon S3(手配書のPDFと読み取り結果、版の履歴) | 社内のファイルサーバー |
| 通知 | Amazon SNS(読み取りの完了の通知) | Amazon SQS |
予約システムと手配表は、新しく足すものではありません。 予約システムには、承認された内容を団体の取り込み用のファイルとして渡します。この構成から予約システムへ直接書き込むことはしません。取り込みの形式は予約システムによって違うため、その部分は利用環境に応じた個別の作りになります。
読み取りの土台は、AWS Textract の非同期の文書分析(StartDocumentAnalysis)です。 指定できる分析は TABLES(表)、FORMS(キーと値の組)、QUERIES(問いへの答え)、SIGNATURES、LAYOUT です。完了は Amazon SNS に通知され、結果は GetDocumentAnalysis で取ります。ジョブの識別子(JobId)の有効期間は7日です。
ルーミングリストに効くのは TABLES です。 表は TABLE のブロックとして返り、その子として CELL が RowIndex・ColumnIndex 付きで並びます。結合されたセルは MERGED_CELL として別に返り、列の見出しのセルには COLUMN_HEADER が付きます。 表の題名と表の下の注記も TABLE_TITLE・TABLE_FOOTER として取れます。1部屋に2人の名前を縦に結合して書く書式でも、どの部屋の行かを結合の情報からたどれます。
Textract は、日本語の書類を読めません。 対応は英語・フランス語・ドイツ語・イタリア語・ポルトガル語・スペイン語で、手書きは英語だけ、縦書きは非対応、問いによる取り出し(QUERIES)は英語の書類だけです。 この構成は、手配書が英文で届く旅行会社に絞っています。 中国語や韓国語で届く旅行会社の分は、別の読み取りの仕組みにするか、従来どおり人が入力します。
03どうやって実装するのか
処理の起点を決める
団体フォルダ(Amazon S3)にファイルが保存されたことを起点にします。 フォルダは予約システムの団体の予約番号ごとに作り、担当者がメールの添付をそこへ保存します。保存のたびに、その団体の手配書をすべて読み直すのではなく、新しいファイルだけを読み、前の版と比べます。
ファイル名の版の書き方は当てにしません。 「Final」「Rev.2」と付け方がばらばらだからです。版の順番は保存の日時で決め、同じ日に2つ届いたときは手配書の作成日の欄で並べます。
もう1つの起点は、毎朝の定時実行です。 到着日の7日前・3日前・前日の団体について、食い違いが解消されていない団体と、ルーミングリストがまだ届いていない団体を一覧にして担当者へ送ります。催促を忘れる失敗は、書類が届かないあいだに起きるからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| ルーミングリスト | 部屋ごとの宿泊者の姓・名・敬称、部屋の種類、ベッドの形、エキストラベッド、子ども、要望の備考。旅行会社によって国籍・生年月日・旅券番号の列がある | 団体フォルダ |
| バウチャー | バウチャー番号、旅行会社名、団体名、到着日・出発日、泊数、部屋の種類ごとの数、食事の条件、添乗員・ドライバーの部屋の扱い | 団体フォルダ |
| 到着便・送迎の連絡 | 便名、到着の時刻、空港からの送迎の有無 | 団体フォルダ(手配書の一部に書かれることが多い) |
| 前の版の読み取り結果 | 同じ団体の直前の版の、部屋と宿泊者の並び | 版の履歴(S3) |
| 予約システムの団体の枠 | 到着日・泊数、部屋の種類ごとの押さえた数、料金の条件 | 予約システムから書き出したファイル |
| 旅行会社ごとの列の対応表 | その旅行会社の書式で、どの列が姓でどの列が名か、敬称の書き方 | 自社で用意する表 |
質を決めるのは、いちばん下の表です。 「NAME」の1列に「LEE/MINHO MR」と書く書式もあれば、「Surname」「First name」「Title」を分ける書式もあります。同じ旅行会社なら書式はほぼ変わらないので、旅行会社ごとに1行ずつ対応を書いておけば、並べ直しの迷いが減ります。
旅券番号と生年月日の列は、読み取っても予約データへ入れません。 第1章のとおり、旅券の確認はチェックインのときにフロントが旅券そのもので行います。到着前の手配に要らない個人の情報を、予約データに広げないためです。
データの取得方法を決める
| 取るもの | どの機能で | 何に使うか |
|---|---|---|
| ルーミングリストの表 | TABLES(CELL、MERGED_CELL、COLUMN_HEADER) | 部屋ごとの行と、宿泊者の名前の並び |
| 表の題名と表の下の注記 | TABLES(TABLE_TITLE、TABLE_FOOTER) | 団体名・総人数・「TL=Tour Leader」などの凡例 |
| ルーミングリストの上の欄 | FORMS | 団体名、旅行会社の参照番号、到着日、作成日 |
| バウチャーの決まった項目 | QUERIES(問いと別名を決めておく) | 泊数、部屋の種類ごとの数、食事の条件、添乗員の部屋 |
| 文字ごとの信頼度 | すべてのブロックの Confidence | 人が確かめる行の選び出し |
問いは、別名(Alias)を付けて登録します。 例えば How many twin rooms are booked? に TWIN_ROOMS、What is the meal plan? に MEAL_PLAN、How many free of charge rooms are included? に FOC_ROOMS を付けます。答えは QUERY_RESULT として信頼度つきで返り、答えが見つからないときは空で返ります。 空のまま後段に渡し、「書かれていない」として扱います。
問いの数には上限があります。 非同期の処理で1ページあたり30、同期で15です。バウチャーは1〜2ページのことが多いので、問いはバウチャーにだけかけ、ルーミングリストは表として読みます。
表の種類も見ます。 TABLE のブロックには、きちんと罫線のある表か、罫線の少ない表かを示す STRUCTURED_TABLE / SEMI_STRUCTURED_TABLE が付きます。罫線の少ない表は列のずれが起きやすいので、その団体は信頼度にかかわらず担当者の確認に回します。
予約システムの団体の枠は、毎朝書き出したファイルを読みます。 照合に要るのは部屋の種類ごとの数と泊数だけです。
AIへ渡す前に整形する
- 形式の確認 … JPEG・PNG・PDF・TIFF であることを確かめます。XFA形式のPDFは扱えません。Excelのまま届いたものは、PDFに印刷して入れます
- パスワードの確認 … パスワード付きのPDFは読めません。旅行会社に解除を頼みます
- サイズとページ数の確認 … 非同期の処理で、PDFとTIFFは500MB・3,000ページまでです
- 文字の大きさの確認 … 検出できる文字の高さは15ピクセル以上で、150dpiで8ポイントに当たります。40名を1枚に詰めた表は、この下限に近づきます
- 言語の確認 … 本文が英文でないファイルは、読み取りに回さず担当者へ戻します
- 書類の種類の判別 … 1つのPDFにルーミングリストとバウチャーと旅程表がまとまって届くことがあります。ページごとに種類を分けてから、表として読むか、問いをかけるかを決めます
- 同じファイルの検知 … 中身が同じファイルが二度保存されたら、新しい版として扱いません
6番目を軽く見ないでください。 旅程表のページを表として読むと、日付と観光地の行を宿泊者の行と取り違えます。種類を先に決めてから読み方を選びます。
AIに処理させる
1回目にさせるのは、読み取った表の列を、予約データの項目へ並べ直すことです。
| 項目 | 取り出し元 | 書かれていないときの扱い |
|---|---|---|
| 部屋の行の番号 | 表の行。結合されたセルは1部屋として束ねる | 束ね方が決まらなければ ambiguous |
| 部屋の種類・ベッドの形 | 部屋の種類の列(SGL/TWN/DBL/TRP など) | not_stated。人数から推定しない |
| 姓・名・敬称 | 名前の列。旅行会社ごとの対応表に従って分ける | 分け方が決まらなければ原文のまま ambiguous |
| 添乗員・ドライバーの印 | TL、TC、Driver、FOC などの記載 | 印がなければ空 |
| 子ども・エキストラベッド | 該当する列か備考 | not_stated |
| 食事の要望 | 備考の列。ベジタリアン、ハラール、アレルギーなど | 空。書かれていない要望を足さない |
| 到着便・送迎 | 表の上下の欄か備考 | not_stated |
2回目にさせるのは、プログラムが出した差分と照合の結果を受けて、食い違いの説明と問い合わせの下書きを作ることです。 担当者向けの一覧(日本語)と、旅行会社への問い合わせ(英語)です。
| させないこと | 理由 |
|---|---|
| 名前のつづりを直す・推定する | 旅券と同じつづりかは、本人の旅券でしか確かめられない |
| 名前をカタカナにする | 読み方は分からない。予約データは英字のまま持つ |
| 部屋数・人数を数える、照合する | プログラムが数える |
| アレルギーの重さや代わりの料理を判断する | 調理の担当が旅行会社に確かめて決める |
| 旅行会社への問い合わせの送信 | 送るのは人 |
1行目がいちばん起きやすい失敗です。 「JHON」を「JOHN」に直すのは親切に見えますが、旅券のつづりが JHON なら、直した名前のほうが誤りです。 読み取りの誤りか原本どおりかは、信頼度と原本の画像で人が見ます。
指示内容を固定する
あなたはホテルの団体予約の担当として、海外の旅行会社から届いた
英文のルーミングリストを予約データへそろえる立場です。
渡すのは AWS Textract が読み取った表(行・列・見出し・結合セル)と、
この旅行会社の列の対応表です。
読み取り結果に書かれていることだけを使ってください。推測で埋めないでください。
【1回目:予約データの項目への並べ直し】
- 表の行を部屋ごとにまとめてください。結合されたセルは1部屋として扱い、
まとめ方が決まらない行は status を ambiguous にしてください。
- 名前は、列の対応表に従って surname / given_name / title に分けてください。
分け方が決まらないときは、原文の文字列を raw_name にそのまま入れ、
status を ambiguous にしてください。
- 名前のつづりを直さないでください。大文字・小文字も含めて、
読み取った文字列のまま入れてください。カタカナにしないでください。
- 部屋の種類は、書かれた略号をそのまま room_type_raw に入れ、
対応表の区分を room_type に入れてください。書かれていなければ
not_stated とし、人数から推定しないでください。
- TL、TC、Tour Leader、Driver、FOC などの印は、書かれた文字列のまま
staff_flag に入れてください。
- 備考の列にある食事の要望とアレルギーは、原文のまま remarks に写し、
dietary にはその要望の区分だけを入れてください。
書かれていない要望を足さないでください。
- 旅券番号・生年月日の列は出力に含めないでください。
- 信頼度は Textract が返した値をそのまま confidence に入れてください。
【2回目:食い違いの説明と問い合わせの下書き】
- 差分({diff})と照合の結果({match_results})だけを使ってください。
- 担当者向けの一覧は日本語で、項目ごとに「どの書類の、どの値と、
どの値が合わないか」を書いてください。どちらが正しいかは書かないでください。
- 旅行会社への問い合わせは英語で、団体名と旅行会社の参照番号を書き、
合わない値を並べて確認を求める文にしてください。
ホテルの側で値を決めたような書き方をしないでください。
「つづりを直さない」を明記しないと、よくある名前に寄せて直します。 英語の名前として不自然なつづりほど直されやすく、それは旅券のつづりであることが少なくありません。 禁じるのは直すことそのものです。
出力形式を固定する
1回目の出力は、次の形のJSONで受け取ります。
{
"group_ref": "",
"doc_version_saved_at": "",
"rooms": [
{
"row_no": 1,
"room_type_raw": "TWN",
"room_type": "twin | single | double | triple | not_stated",
"guests": [
{
"surname": "",
"given_name": "",
"title": "",
"raw_name": "",
"staff_flag": "",
"child": false,
"confidence": 0
}
],
"remarks": "",
"dietary": ["vegetarian | halal | allergy | other"],
"status": "ok | ambiguous | low_confidence"
}
],
"arrival": { "flight": "", "time": "", "transfer": "yes | no | not_stated" }
}
1つ目の理由は、差分と照合をプログラムに渡せることです。 前の版の rooms と今回の rooms を、surname と given_name の組で突き合わせ、「追加」「取り消し」「部屋の移動」「部屋の種類の変更」の4つに分けます。数の照合は次の3つで、AIはどれにも関わりません。
| 照合 | 比べるもの | 結果 |
|---|---|---|
| ルーミングリストとバウチャー | 部屋の種類ごとの数、総人数、添乗員の部屋の数 | match / mismatch |
| ルーミングリストと予約システムの枠 | 部屋の種類ごとの数、到着日・泊数 | match / over / under |
| 前の版と今回の版 | 宿泊者ごとの部屋と部屋の種類 | 追加/取り消し/移動/変更 |
2つ目は、dietary を手配表の列に直接つなげられることです。 区分ごとにレストランと調理の手配表へ行を出し、remarks の原文を必ず添えます。 区分だけを渡すと、「nut allergy」と「peanut allergy」の違いが手配表で消えます。
構造化出力では、スキーマのすべてのオブジェクトに additionalProperties: false を付けます。数値の範囲や文字列の長さの制約はスキーマで書けないため、信頼度の範囲や人数の形の確認はプログラムで行います。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 団体フォルダ(Amazon S3) | 保存のイベントで AWS Lambda を起動 | 手配書の保存を検知する |
| AWS Textract | 非同期のAPI呼び出し | 完了は Amazon SNS へ通知され、結果を取りに行く |
| Claude API | API呼び出し(2回) | 項目の並べ直しと、食い違いの説明・問い合わせの下書き |
| 予約システム | 取り込み用ファイルの書き出し(承認後) | 部屋ごとの宿泊者名と部屋の種類 |
| 部署別の手配表 | スプレッドシートへの書き込み(承認後) | 食事・要望・到着便・送迎 |
| 担当者への通知 | メールまたはチャット | 差分と食い違いの件数、確認の画面の場所 |
StartDocumentAnalysis には、同じ依頼を二度動かさないための識別子(ClientRequestToken)を付けます。 同じ識別子なら同じ JobId が返ります。JobTag には団体の予約番号と書類の種類を入れ、完了の通知からどの団体の結果かをすぐ引けるようにします。結果の出力先のバケットと、暗号化の KMS の鍵も指定できます。
予約システムへは、担当者が承認するまで何も渡しません。 旅行会社へも、自動では何も送りません。
人が確認する
担当者が見るのは、差分、mismatch と over / under、ambiguous と low_confidence の行です。
- 差分を先に見る … 追加・取り消し・移動の行を、改訂版の原本と並べて確かめます。取り消しの行は特に、本当に名前が消えているかを見ます
- 数の食い違いを見る … 添乗員の部屋がどちらに数えられているかが、いちばん多い理由です。旅行会社に聞く前に、バウチャーの FOC の欄を見ます
- 信頼度の低い名前を原本で見る … つづりは直さず、読み取りの誤りだけを直します
- 食事の要望を原文で見る …
remarksの原文と手配表の区分が合っているかを見ます - 承認して書き出す … 予約システムの取り込みと手配表への書き込みは、承認のあとに動きます
- 問い合わせを直して送る … 送るのは人です
4番目を省かないでください。 アレルギーの見落としは、工数の話ではなく宿泊客の安全の話です。 区分が付いていても原文を読みます。
目標は、80件をならして1件12分です。 それより長くかかる月は、罫線の少ない書式が増えているか、列の対応表が古くなっています。
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付き・XFA形式のPDF | 読めない。旅行会社に解除または印刷し直しを依頼 |
| 本文が英文でない | 読み取りに回さず、担当者が従来どおり入力 |
| 手書きで直しが入っている | 手書きは英語だけ読める。直しの入った行は信頼度にかかわらず担当者へ |
| 名前の列が1列で、姓と名の分け方が決まらない | ambiguous。原文のまま担当者へ。対応表に書式を足す |
| 部屋の種類が書かれていない | not_stated。人数から推定せず担当者へ |
| ルーミングリストが予約システムの枠を超える | over。枠を足すかは営業が決める。 自動で足さない |
| 同時に動かすジョブが多すぎる | 上限を超えると LimitExceededException。時間をおいて再実行 |
| JobId の期限(7日)が切れた | 依頼からやり直す |
| 到着の前日になってもルーミングリストが届かない | 毎朝の一覧で上位に出し、担当者へ通知 |
上から3行目までは、受け取り方の問題です。 旅行会社に手書きの直しではなく版を作り直して送ってもらうほうが効きます。
記録を残す
- 受け取った手配書のPDFと、保存された日時(版の順番の根拠)
- Textract が返した読み取り結果の全文と JobId
- 1回目のJSON(部屋、宿泊者、要望の原文、信頼度)
- 差分と照合の結果、そのとき照らした予約システムの枠
- 担当者が直した行と、直す前の値
- 承認した日時と、予約システムへ取り込んだファイル
- 旅行会社へ問い合わせた日時と、回答が届いた日時
- 旅行会社ごとの、
ambiguousとlow_confidenceの発生率
4つ目で「そのときの枠」を残すのは、営業が枠を後から動かすためです。 枠を足した後では過去の over が消え、経緯をたどれません。 旅券番号の列は読み取り結果の全文に残るため、出発後に消す期間を決めます。
04実装レベルの3段階
半自動化で、1件45分が25分程度になります。 名前の入力は一覧の貼り付けで済むようになりますが、差分の見比べと数の照合が手作業で残ります。本格構成で12分になり、この段階が本記事の想定です。 差が大きいのは、改訂版の見比べが、版の数だけ繰り返す作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、列の対応表が足りない書式が分かります。対応表を整えてから照合を足すほうが、空振りの問い合わせが減ります。
05工数削減シミュレーション
導入後 80件 × 12分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 海外の旅行会社(ランドオペレーターを含む)からの団体を毎月数十件受け入れるホテル・旅館。ルーミングリストやバウチャーが英文のPDFやExcelの印刷で届き、団体予約の担当者が宿泊者名と部屋割りを予約システムへ手で入力している場合。出発の直前に改訂版が何度も届き、どれが最新かを担当者が見比べている場合。
- 手配書が中国語・韓国語・タイ語など英語以外で届く場合(この構成のOCRは英語など6言語しか読めず、問いによる取り出しは英語だけです)。団体の受け入れが月に数件で、手で入力すれば足りる場合。旅行会社と予約システムのあいだでルーミングリストがデータで連携できている場合。なお、宿泊者名簿の記載と旅券の確認はチェックインのときにフロントが行うもので、この構成では代替できません。
07最小構成で試す方法
- 過去2か月の団体から10件を選ぶ(改訂版が2回以上届いた団体と、罫線の少ない書式の旅行会社を入れる)
- 10件それぞれのルーミングリストとバウチャーのPDFを用意する
- 手元のAIサービスにPDFを貼り、「部屋ごとに、部屋の種類、宿泊者の姓・名・敬称、食事の要望を表にしてください。名前のつづりは直さないでください。書かれていない項目は『記載なし』としてください」と指示する
- 出てきた表を、当時予約システムに入れた内容と見比べる
- 改訂版のある団体では、2つの版の表を並べて差分が分かるかを見る
| 出てきた内容 | 判断 |
|---|---|
| 当時の入力と同じ部屋割りと名前が出た | Textract とワークフローの連携に進む |
| 名前のつづりを直した | 指示の書き方で直る。構成は有効 |
| 結合されたセルの部屋割りが崩れた | 表の構造を使う読み取りが要る理由。構成は有効 |
最小構成では Textract を使いません。 確かめるのは、AIがつづりや部屋の種類を推定で埋めないかです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 名前のつづりを直してしまう | 指示とスキーマで禁じ、原文の raw_name を必ず残す |
| 部屋の種類を人数から推定する | not_stated のまま人へ |
| 結合されたセルで部屋割りが崩れる | MERGED_CELL から部屋の単位に束ねる |
| 罫線の少ない表で列がずれる | SEMI_STRUCTURED_TABLE の団体は全行を確認に回す |
| 添乗員の部屋で数が合わない | staff_flag とバウチャーの FOC の欄を並べて見せる |
| 改訂版の順番を取り違える | 保存の日時で並べ、同じ日は手配書の作成日を取る |
| 英語以外の手配書を読ませようとする | Textract は6言語だけ。英文以外は従来どおり人が入力 |
| 食事の要望が区分だけになる | remarks の原文を手配表に必ず添える |
| 旅券番号が予約データに入る | スキーマから外し、読み取り結果は保管の期間を決める |
| 同じファイルを二度読ませる | ClientRequestToken を付ける |
上の2行が、この構成の失敗のほとんどです。 どちらも、AIがもっともらしい値で空欄や違和感を埋めようとするところから出ています。原文を原文のまま人へ渡せるかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 宿泊者の氏名と敬称、子どもの有無、食事の要望とアレルギー、到着便、そして旅行会社によっては国籍・生年月日・旅券番号です。アレルギーは健康に関わる情報です。
- 外部へ渡す範囲を、手配に要る列に限る … 旅券番号と生年月日の列は、生成AIへ渡す前に表から外す設計にできます。Textract の読み取り結果には残るため、保管の期間を決めます
- 宿泊者名簿の代わりにしない … 日本国内に住所を有しない外国人の宿泊では、国籍と旅券番号を宿泊者名簿に記載し、旅券の呈示を求めて写しを保存することとされています。ルーミングリストの旅券番号を名簿に流用せず、チェックインのときにフロントが旅券で確かめます
- 予約システムへの取り込みを自動にしない … 承認のあとにだけ書き出します。誤った名前は、当日のチェックインの遅れとして宿泊客に返ってきます
- 旅行会社への問い合わせを自動で送らない … 食い違いのどちらが正しいかは、旅行会社にしか分かりません。ホテルの側で値を決めたような文面を送らないでください
- 読み取り結果の保管先を決める … Textract の結果は既定でサービス側に保存され、出力先のバケットと暗号化の鍵を指定できます。自社のバケットに出し、団体の出発後に消す期間を決めます
誤りが起きた場合のリスクは、部屋や食事が足りないまま団体を迎えることと、アレルギーの要望を落とすことの2つです。 前者は数の照合で、後者は原文を添えることで防ぎます。
10まず何から始めるか
1週目:列の対応表を作る
取引の多い旅行会社10社のルーミングリストを1枚ずつ集め、どの列が姓・名・敬称・部屋の種類・備考かを表にします。添乗員やドライバーの印の書き方も書き出します。
2週目:10件で試す
第8章のとおり、過去の10件で部屋割りと名前を表にさせます。つづりを直さないか、部屋の種類を推定で埋めないかを最優先で見ます。
3週目:照合の規則を決める
添乗員の部屋をバウチャーと予約システムのどちらの数に含めるか、旅行会社ごとの扱いを営業と決めます。 ここが決まらないと、照合はいつも mismatch を出します。
4週目:保存から読み取りまでをつなぐ
S3 への保存を起点に Textract を呼び、部屋と名前の一覧を書き出すところまで作ります。この時点では予約システムへの取り込みを作らず、一覧だけを見ます。
2か月目: 前の版との差分と、バウチャー・予約システムの枠との照合を足します。3か月目以降: 取り込み用ファイル、部署別の手配表、問い合わせの下書き、毎朝の一覧を足し、1件45分が何分になったかを実測します。改訂版が届いたその日に、どの部屋の誰が替わったかを担当者が言えるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 旅館業法により営業者が宿泊者名簿を備えること。宿泊者が日本国内に住所を有しない外国人であるときは国籍と旅券番号を記載すること。旅券の呈示を求め、写しを宿泊者名簿とともに保存することとされていること。宿泊者名簿と旅券の写しを電磁的記録で保存してよいとされていること | 厚生労働省: 確認の求めに対する回答の内容の公表(パスポートICリーダー装置) | 2026-10-06 |
| 対応言語が英・仏・独・伊・葡・西の6つで、問いによる取り出しは英語だけ、手書きは英語だけ、縦書き非対応であること。JPEG・PNG・PDF・TIFF に対応し XFA形式は非対応、パスワード付きPDFは不可。非同期でPDF・TIFFは500MB・3,000ページまで。問いは非同期で1ページ30・同期で15まで。文字の高さは15ピクセル以上(150dpiで8ポイント) | AWS: Set Quotas in Amazon Textract | 2026-10-06 |
TABLES/FORMS/QUERIES/SIGNATURES/LAYOUT を指定できること。完了を SNS に通知し GetDocumentAnalysis で結果を取ること。JobId の有効期間が7日であること。ClientRequestToken で同じ JobId が返ること。JobTag が完了の通知に含まれること。KMS の鍵と出力先を指定でき、既定では結果がサービス側に保存されること。同時実行の上限超過で LimitExceededException になること | AWS: StartDocumentAnalysis | 2026-10-06 |
表が TABLE と CELL(RowIndex・ColumnIndex)で返り、結合されたセルが MERGED_CELL、列の見出しが COLUMN_HEADER、題名と注記が TABLE_TITLE・TABLE_FOOTER として返ること。表に STRUCTURED_TABLE/SEMI_STRUCTURED_TABLE の種類が付くこと | AWS: Tables | 2026-10-06 |
問いへの答えが別名と信頼度つきで QUERY_RESULT として返り、答えがないときは空になること | AWS: Queries | 2026-10-06 |
構造化出力がスキーマどおりのJSONを保証し、すべてのオブジェクトに additionalProperties: false が必要で、数値の範囲と文字列の長さの制約が使えないこと | Claude Docs: Structured outputs | 2026-10-06 |
宿泊者名簿の扱いは、施設の所在地を所管する保健所の指導に従ってください。 本記事は厚生労働省の公表資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0458)についてのご相談はこちらから。
