ホテルの客室・館内で起きた事故・苦情・設備トラブルの過去の対応記録を検索し、似た事案の対応手順と補償の判断を夜間の当直者に示す
夜間に客室や館内で事故・苦情・設備トラブルが起きたとき、当直者が状況を短く入力すると、過去の対応記録から似た事案を探します。当夜の対応手順、連絡した先、補償の前例とそれを決めた人を、根拠の記録付きで並べて返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 宿泊/飲食
- 対象部門
- カスタマーサポート
- 対象業務
- 情報検索/記録・議事録作成
- 主な課題
- 判断に時間がかかる/引き継ぎができていない/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/対応スピード向上/属人化解消
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- お客さまからフロントへ電話が入る、または館内の巡回で事案に気づく
- 当直者が現場へ行き、状況を確かめる。けががあれば救護と通報を優先する
- 共有フォルダの事故報告書や夜間の日報を開き、似た事案が無いかを探す
- 見つからなければ、勤続の長い社員や支配人に電話で聞くか、翌朝まで待つ
- お客さまに当夜の対応(部屋の移動、清掃、修理の手配)を説明する
- 夜間の日報に経過を書き、事故報告書の様式に記入する
- 翌朝、支配人とフロントに申し送る
- 人お客さまからの連絡や巡回で事案に気づき、現場で状況を確かめる。けががあれば救護と通報を先に行う
- 人当直者が、フロントの端末かタブレットで状況を短く入力する(場所、何が起きたか、お客さまの訴え)
- 自動入力から似た事案を、言葉の一致と意味の近さの両方で検索する
- 自動検索の結果と社内の補償基準を、生成AIが「当夜の対応手順」「連絡した先」「補償の前例と決裁者」に分けて並べる
- 人当直者が前例を読み、当夜の対応とお客さまへの伝え方を決める
- 自動当直者が入力した経過から、夜間の日報と事故報告書の下書き、翌朝への申し送りの下書きを作る
- 人当直者が下書きを直して確定し、翌朝、支配人とフロントに申し送る
各工程の詳しい説明を読む
- お客さまからフロントへ電話が入る、または館内の巡回で事案に気づく
- 当直者が現場へ行き、状況を確かめる。けががあれば救護と通報を優先する
- 共有フォルダの事故報告書や夜間の日報を開き、似た事案が無いかを探す
- 見つからなければ、勤続の長い社員や支配人に電話で聞くか、翌朝まで待つ
- お客さまに当夜の対応(部屋の移動、清掃、修理の手配)を説明する
- 夜間の日報に経過を書き、事故報告書の様式に記入する
- 翌朝、支配人とフロントに申し送る
(a)夜間に前例を確かめられない。 事故報告書は館ごと・年ごとのフォルダに分かれ、名前で検索しても当たりません。探しているあいだ、お客さまを待たせることになります。
(b)補償の約束が当直者ごとに違う。 ある当直者は宿泊料の一部の返金を口にし、別の当直者は「翌朝担当から連絡します」とだけ伝える。同じような事案で、お客さまへの対応が当直者によって変わります。
(c)申し送りが要点を欠く。 夜間の日報は経過を時刻順に書いたもので、翌朝に決める必要のあること(補償の判断、修理の業者への連絡、保険会社への連絡)が埋もれます。
(d)同じトラブルが繰り返される。 同じ客室で同じ設備のトラブルが何度も起きていても、夜間の当直者はそれを知らないまま、その夜だけの対応で終えます。
- 【人】 お客さまからの連絡や巡回で事案に気づき、現場で状況を確かめる。けががあれば救護と通報を先に行う
- 【人】 当直者が、フロントの端末かタブレットで状況を短く入力する(場所、何が起きたか、お客さまの訴え)
- 【自動】 入力から似た事案を、言葉の一致と意味の近さの両方で検索する
- 【自動】 検索の結果と社内の補償基準を、生成AIが「当夜の対応手順」「連絡した先」「補償の前例と決裁者」に分けて並べる
- 【人】 当直者が前例を読み、当夜の対応とお客さまへの伝え方を決める
- 【自動】 当直者が入力した経過から、夜間の日報と事故報告書の下書き、翌朝への申し送りの下書きを作る
- 【人】 当直者が下書きを直して確定し、翌朝、支配人とフロントに申し送る
1番目を検索より先に置いているのが、この設計の前提です。 けがや火災・漏水の拡大のおそれがある場面では、検索を待たずに救護・通報・止水を行います。 検索は、その後の対応と説明を決めるためのものです。
5番目で決めるのは当直者です。 検索の結果は前例を並べるだけで、補償を約束してよいかは、社内の補償基準と当直者の権限で決まります。
02今回想定するシステム構成
過去の対応記録(事故報告書・夜間の日報・お客さまとのメール)+ 社内の補償基準 ▼ 取り込み(事案ごとにまとめ、お客さまの氏名を仮名に置き換える) Amazon Titan Text Embeddings V2 ── 事案ごとにベクトルを作る ▼ Amazon OpenSearch Service(Sudachi で日本語を分かち書き、ベクトルと全文の両方を持つ) ▲ │【トリガー】当直者がフロントの端末から状況を入力 AWS Lambda ── 入力を受け、検索を呼ぶ ▼ hybrid クエリ(言葉の一致+意味の近さ)+ 正規化の処理 │ 館・場所の種類・事案の種類で絞り込み ▼ Claude API ── 似た事案を観点ごとに並べる │ ① 当夜の対応手順 ② 連絡した先 ③ 補償の前例と決裁者 ④ 翌朝に問題になったこと ▼ 【当直者が前例を読み、当夜の対応を決める】 ▼ 夜間の日報・事故報告書・申し送りの下書き → 当直者が確定
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(hybrid クエリ、normalization-processor、Sudachi) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed、OpenAI の埋め込みモデル |
| 生成AI | Claude API(前例の整理と、日報・申し送りの下書き) | Gemini API、OpenAI API |
| 連携 | AWS Lambda(取り込み、検索の呼び出し、下書きの保存) | AWS Step Functions |
| 保管 | Amazon S3(対応記録の原本、検索と下書きの記録) | ― |
予約・客室管理の仕組みは、そのまま使います。 この構成が持つのは、過去の対応記録と社内の補償基準の写しだけです。最初の準備は、3館の事故報告書・夜間の日報・メールを、1つの事案を1つの記録としてまとめ直すことです。同じ事案が日報とメールに分かれていると、検索の結果に同じ事案が2度出ます。
検索基盤に Amazon OpenSearch Service を選ぶのは、日本語の分かち書きとベクトル検索を同じ所で扱えるからです。 公式の一覧では、Sudachi の分析プラグインが日本語に推奨とされ、OpenSearch 1.3 以上で使えます。ニューラル検索(Neural Search)は 2.9 以上、k-NN は 1.0 以上です。
この題材で効くのは、hybrid クエリです。 夜間の当直者の入力は「302 浴室 転倒 頭」のように短く、言葉が足りません。言葉の一致だけでは「浴槽で足を滑らせた」と書かれた過去の記録に当たらず、意味の近さだけでは「浴室」と「大浴場」の違いを取り違えます。最大5つの検索の点数を正規化して1つの順位にまとめる hybrid クエリで、両方を並べます。
03どうやって実装するのか
処理の起点を決める
当直者がフロントの端末かタブレットで状況を入力し、検索を押したときに動かします。 夜間の事案は予告なく起きるので、定時の一括処理にはしません。 入力の画面は、場所(客室番号・大浴場・駐車場など)と事案の種類(けが・設備・苦情・紛失・破損)を選び、状況を一言で書くだけにします。長い文章を書かせると、入力に時間がかかってお客さまを待たせます。
検索の結果を見て当夜の対応を終えた後、当直者が経過を入力すると、日報・事故報告書・申し送りの下書きを作る2回目の処理が動きます。
過去の対応記録の取り込みは、これとは別に動かします。毎朝、前夜までに確定した事故報告書と日報をS3の取り込みフォルダに置いたことを起点に、事案ごとのまとめ、仮名への置き換え、ベクトルの作成、索引への登録を行います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 当直者の入力 | 館、場所、事案の種類、状況の一言 | フロントの端末の入力の画面 |
| 過去の対応記録 | 発生日時、館、場所、事案の種類、経過、当夜の対応、連絡した先、補償の内容、決裁者、その後の経過 | 事故報告書・夜間の日報・メールをまとめ直したもの |
| 社内の補償基準 | 事案の種類ごとに、当直者が約束してよい範囲と、支配人の判断が要る範囲 | 宿泊部が定めた基準 |
| 連絡先の一覧 | 設備の業者、保険会社、近くの夜間診療の窓口、館の責任者 | 宿泊部が持つ一覧 |
質を決めるのは、過去の対応記録の「決裁者」と「その後の経過」の欄です。 決裁者が無ければ、補償の前例が誰の判断だったのかを示せません。その後の経過が無ければ、翌朝に何が問題になったかを申し送りに書けません。 古い記録では空欄が多いため、取り込みのときに空欄のまま残し、空欄であることを検索の結果に出します。
データの取得方法を決める
取り込みでは、1つの事案を1つの記録にまとめ、次の項目を持たせます。
| 持つ項目 | 中身 | 何に使うか |
|---|---|---|
summary_text | 場所・事案の種類・経過・対応をまとめた本文 | Sudachi で分かち書きした言葉の一致の検索 |
embedding | 本文から作ったベクトル(1,024次元) | 意味の近さの検索 |
hotel / location_type / incident_type | 館、場所の種類、事案の種類 | 絞り込み |
actions | 当夜の対応手順(時刻順) | 当直者に示す手順 |
contacts | 連絡した先 | 当直者に示す連絡先 |
compensation / approver | 補償の内容、決裁者 | 補償の前例と、それが誰の判断だったか |
aftermath | その後の経過(翌朝以降に問題になったこと) | 申し送りに書く項目 |
guest_alias | お客さまの仮名 | 同じお客さまの事案のまとめ |
ベクトルは Amazon Titan Text Embeddings V2 で作ります。入力は最大8,192トークン・50,000文字で、出力は既定で1,024次元です。公式は、長い文書を段落や節のような論理的な単位に分けることを勧めています。 1つの事案の経過が長いものは、本文を「状況」と「対応」に分けて別のベクトルにします。日本語は多言語対応の言語の一覧に含まれています。
社内の補償基準は、対応記録とは別の索引に置きます。 前例の検索の結果に基準が混ざると、基準の文が「似た事案」として並び、前例と基準の区別がつかなくなります。 補償基準は事案の種類で引き、検索の結果とは別の欄に出します。
検索の絞り込みは、hybrid クエリの filter で行います。filter はすべての検索に同じように効くため、館・場所の種類・事案の種類の条件は1つの bool クエリにまとめます。点数の正規化は normalization-processor を使い、既定の min_max と arithmetic_mean から始めます。当直者の入力は短いので、意味の近さの重みを最初から少し重くします。 重み(weights)は合計が1.0になるように決めます。
検索の形は、おおむね次のとおりです(値は例)。
{
"query": {
"hybrid": {
"queries": [
{ "match": { "summary_text": "客室 浴室 転倒 頭" } },
{ "knn": { "embedding": { "vector": [0.021, -0.008], "k": 30 } } }
],
"filter": {
"bool": {
"filter": [
{ "term": { "location_type": "客室" } },
{ "term": { "incident_type": "けが" } }
]
}
}
}
},
"size": 5
}
館の絞り込みは、最初は入れません。 3館で設備も客層も違いますが、浴室での転倒のような事案は館をまたいで参考になります。結果に館の名前を出し、当直者が自分の館の前例かどうかを見分けられるようにします。 館ごとの設備のトラブル(特定の型の給湯器など)を探すときだけ、館で絞ります。
AIへ渡す前に整形する
- お客さまの氏名を仮名に置き換える … 取り込みのときに、氏名・電話番号・メールアドレスを仮名に置き換えます
- けがや体調の記述を分ける … 病院名・診断の内容など体調に関わる記述は、別の項目に分けて検索の本文から外します
- 同じ事案をまとめる … 日報とメールと事故報告書で、館・客室・日時が同じものを1つの事案にまとめます
- 事案の種類を付け直す … 古い記録の分類の名前がばらばらなら、今の分類に読み替えます
- 当直者の入力の客室番号を場所の種類に変える … 「302」は「客室」、「B1」は「駐車場」のように、館ごとの対応表で変えます
- 補償基準の版を確かめる … 基準を改めたら、古い版を索引から外し、新しい版だけを引くようにします
1番目と2番目を省かないでください。 夜間の検索の結果は、フロントの画面に出ます。ほかのお客さまの氏名や、けがの内容が画面に出る設計にしてはいけません。 仮名で検索しても、前例として必要な情報は失われません。
AIに処理させる
させるのは、検索で見つかった事案を、決まった観点ごとに並べて書き出すことだけです。
| 観点 | 何を書くか | 書かれていないときの扱い |
|---|---|---|
| 当夜の対応手順 | 過去の事案で当直者がとった対応を、順に | not_recorded |
| 連絡した先 | 業者・保険会社・館の責任者など | not_recorded |
| 補償の前例 | 補償の内容と、決裁者 | 決裁者が無ければ approver_unknown |
| 翌朝に問題になったこと | その後の経過から、申し送りで落としやすいこと | not_recorded |
| 社内の補償基準 | 当直者が約束してよい範囲(基準の索引から引いた文) | 基準が無い種類なら no_rule |
補償の前例には、必ず決裁者と事情を並べさせます。 「宿泊料の半額を返金」だけが当直者の目に入ると、それが当直者の権限で約束できることのように見えてしまいます。
| させないこと | 理由 |
|---|---|
| 補償をするか・いくらかの判断 | 補償の可否と金額は社内の基準と責任者が決める |
| 自社に責任があるかの判断 | 責任の有無は、調べたうえで責任者と保険会社が判断する |
| けがの程度や受診の要否の判断 | 医療の判断は人と医療機関が行う |
| 宿泊を拒むかの判断 | 旅館業法の定める事由に当たるかを、当直者と責任者が客観的な事実から判断する |
| 検索結果に無い前例の補足 | 「一般的には」のような書き方は、根拠の無い対応を勧めることになる |
1行目がいちばん起きやすい失敗です。 前例に返金の事案が並ぶと、AIは「今回も同様に宿泊料の一部返金が考えられます」とまとめがちです。その一文が、当直者の口からお客さまへの約束として出ていきます。 前例は前例として並べさせ、勧めの形で書かせません。
4行目は法律の定めに関わります。 旅館業法第5条は、営業者は定められた事由に当たる場合を除いて宿泊を拒んではならないとし、宿泊を拒む場合には、該当するかどうかを客観的な事実に基づいて判断し、求めに応じて理由を丁寧に説明できるようにするものとしています。過剰な要求を繰り返すお客さまの事案でも、AIはその判断に踏み込ませません。
指示内容を固定する
あなたはホテルの夜間の当直者を手伝う係です。
渡された【当直者の入力】【検索で見つかった事案】【社内の補償基準】だけを見て、
似た事案を観点ごとに並べてください。推測で埋めないでください。
【並べる観点】
1. actions ....... 当夜の対応手順(過去の事案で当直者がとった対応を順に)
2. contacts ...... 連絡した先
3. compensation .. 補償の内容と、それを決めた人(決裁者)
4. aftermath ..... 翌朝以降に問題になったこと
5. rule .......... 社内の補償基準のうち、この事案の種類に当てはまる文(そのまま写す)
【厳守事項】
- 事案ごとに、記録の番号(case_id)を必ず付けてください。
- 記録に書かれていない観点は "not_recorded" としてください。
- 補償の前例には、必ず決裁者(approver)を書いてください。
決裁者が記録に無ければ "approver_unknown" としてください。
- 今回、補償をすべきか、いくら補償すべきかを書かないでください。
「今回も同様に」「〜が考えられます」のような勧めの書き方をしないでください。
- 自社に責任があるかどうかを書かないでください。
- けがの程度や、受診が必要かどうかを書かないでください。
- 宿泊を断るべきかどうかを書かないでください。
- 検索で見つかった事案に無い対応を書き足さないでください。
- お客さまの氏名や体調の内容を書かないでください。仮名と事案の番号だけを使ってください。
- 社内の補償基準は、言い換えずにそのまま写してください。
【当直者の入力】{night_input}
【検索で見つかった事案】{cases}
【社内の補償基準】{rules}
「勧めの書き方をしない」に具体的な言い回しを2つ挙げているのには理由があります。 「判断しないでください」とだけ書くと、AIは判断の言葉を避けつつ「〜が考えられます」と書いて、実質的に勧めの文を作ります。 禁じる言い回しを名指しします。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に type: "json_schema" とスキーマを指定)を使い、形の崩れた応答を当直者の画面に出さないようにします。
{
"query_id": "",
"rule": { "text": "", "status": "found | no_rule" },
"cases": [
{
"case_id": "",
"hotel": "",
"occurred_at": "",
"similarity_note": "",
"actions": ["", ""],
"contacts": [""],
"compensation": { "content": "", "approver": "", "status": "recorded | not_recorded | approver_unknown" },
"aftermath": ""
}
],
"handover_items": [""]
}
1つ目の理由は、補償の前例と補償基準を別の欄に置けることです。 当直者の画面では、rule を上に、cases の補償の前例をその下に出します。約束してよい範囲が先に目に入る並びにします。
2つ目は、case_id で原本に戻れることです。 当直者は気になった前例を、その番号で事故報告書の原本から開けます。検索の結果が原本と違っていれば、原本を正とします。
3つ目は、handover_items を申し送りの下書きに使えることです。 似た事案の aftermath から、翌朝に決める必要のあることを拾って並べます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| フロントの端末の入力の画面 | 社内のWeb画面から AWS Lambda を呼ぶ | 当直者の入力を受け、結果を返す |
| Amazon Bedrock | API呼び出し | 入力と事案のベクトルを作る |
| Amazon OpenSearch Service | hybrid クエリと検索パイプライン | 似た事案と補償基準を探す |
| Claude API | API呼び出し | 観点ごとの整理と、日報・申し送りの下書き |
| Amazon S3 | 保存 | 対応記録の原本、検索と下書きの記録 |
| 予約・客室管理の仕組み | 書き込まない | 客室の移動などは当直者が既存の手順で行う |
予約・客室管理の仕組みへは書き込みません。 部屋の移動や返金の処理は、当直者が既存の手順で行います。検索の結果から直接、返金や割引が処理される経路を作りません。
OpenSearch の権限は、細かいアクセス制御で絞ります。 細かいアクセス制御(fine-grained access control)は、索引・文書・項目の単位で見せる範囲を決められ、特定の項目を消さずに匿名化する項目のマスキングも使えます。当直者の役割には、仮名と体調の項目を見せない設定にします。有効にするには、HTTPS・保存データの暗号化・ノード間の暗号化が要り、一度有効にすると無効に戻せません。
人が確認する
当直者は、検索の結果をすべて読みます。 結果は1回の検索で5件ほどに絞って出すので、全件を読めます。
- 補償基準(
rule)を先に読む … 当直者が約束してよい範囲を確かめます - 前例の決裁者を見る … 支配人の判断だった補償を、当直者が約束しないようにします
- 当夜の対応手順と連絡先を、今夜の状況に合わせて選ぶ … 前例の手順をそのまま使わず、現場の状況と照らします
- 日報・事故報告書・申し送りの下書きを直して確定する … 下書きは当直者の入力から作るので、事実と違うところは当直者が直します
- 翌朝、支配人が前例と当夜の対応を見比べる … 前例と違う対応をした理由を、申し送りで確かめます
2番目を省かないでください。 決裁者が支配人だった前例を当直者が約束すると、翌朝、支配人がその約束を覆すか、基準を超えた補償を追認するかの二択になります。 どちらもお客さまとの関係を損ねます。
例外に対処する
| 起きること | 対応 |
|---|---|
| けが・火災・漏水の拡大のおそれ | 検索を使わず、救護・通報・止水を先に行う |
| 検索結果が0件 | 「前例なし」と返し、補償基準と連絡先の一覧だけを出す |
| 前例の決裁者が記録に無い | approver_unknown として出し、当直者には約束させない |
| 補償基準に当てはまる種類が無い | no_rule として出し、補償は翌朝の判断に回す |
| 同じお客さまの過去の事案が見つかる | 仮名で並べ、過去の経緯を申し送りに入れる |
| 過剰な要求が繰り返される事案 | 前例と基準を出すだけにし、宿泊を拒むかは責任者が判断する |
| 生成AIが応答しない | 検索の結果だけを一覧で出し、観点の整理を省く |
| 検索基盤が応答しない | 紙の夜間の対応の手引きと連絡先の一覧で対応する |
上から1行目が、この構成のいちばん大事な例外です。 検索は、命と建物を守る行動の後に使うものです。入力の画面の最初に「救護・通報が要る場合は先に行う」の表示を出し、検索のボタンより上に置きます。
記録を残す
- 当直者の入力と、検索の日時・館
- hybrid クエリの結果(事案ごとの点数と順位)と、そのときの重み
- 生成AIの整理の結果(
rule、cases、handover_items) - 当直者が実際にとった対応と、お客さまに伝えた内容
- 日報・事故報告書・申し送りの下書きと、当直者が確定した版
- 翌朝の支配人の判断と、前例と違う対応をした理由
4つ目と最後の行は、次の事案の検索の対象になります。 確定した事故報告書を毎朝取り込むので、今夜の対応が、次の夜の当直者の前例になります。 決裁者とその後の経過の欄を空けたまま確定させないことが、検索の質を保つ条件です。
04実装レベルの3段階
最小構成では、夜間には使えません。 貼る事案を人が選ぶので、確かめるための段階です。 半自動化で、1件25分が16分程度になります。 言葉の一致の検索で多くの前例が出ますが、短い入力では当たりにくく、記録の書き方は手作業のままです。本格構成で10分になり、この段階が本記事の想定です。 差が大きいのは、短い入力でも意味の近い前例が出ることと、日報と申し送りの下書きが出ることの2つです。 段階を飛ばさないでください。 半自動化を1か月使うと、当直者がどんな言葉で入力するかが分かります。その言葉を Sudachi の辞書と入力の画面の選択肢に反映してから本格構成に進むほうが、検索の当たり方が安定します。
05工数削減シミュレーション
導入後 120件 × 10分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 客室数の多いホテルや複数の館を持つホテル・旅館で、夜間は少人数の当直者が客室・館内の事故・苦情・設備トラブルに対応しており、過去の対応記録が日報・事故報告書・メールに分かれて数年分たまっている場合。夜間に「前に同じことがあったときどうしたか」を確かめられず、翌朝の支配人の判断を待つか、当直者の判断で補償を約束してしまうことがある場合。AWS を使っており、検索基盤と生成AIを同じ環境で動かせる場合。
- 客室数が少なく、夜間も支配人や経験の長い社員が常に館内にいる場合。過去の対応記録がほとんど残っておらず、検索の対象になる記録が無い場合。なお、けが人の救護、警察や消防への通報、宿泊を拒むかの判断、補償の可否と金額の決定は、当直者と支配人・責任者が行うもので、この構成では代替できません。救急の場面では検索より先に通報と救護を行います。
07最小構成で試す方法
- 過去1年の事故報告書から、よく起きる種類(設備・騒音・けが・破損)の事案を各10件、計40件選ぶ
- その40件を、場所・事案の種類・経過・対応・補償・決裁者・その後の経過の形にまとめ直す
- 最近の事案を5件選び、その状況を一言で書き、まとめ直した40件とあわせて手元のAIサービスに貼る
- 「似た事案を観点ごとに並べてください。補償をすべきかは書かないでください」と指示する
- 出てきた前例を、実際にその5件を担当した当直者に見てもらう
40件のまとめ直しは必ずやってください。 検索基盤を組む前に、「決裁者とその後の経過の欄が、過去の記録から埋められるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当した当直者が「これがあれば早かった」と言う前例が出た | 検索基盤を組み、記録の取り込みに進む |
| 「今回も返金が考えられます」と勧めの文を書いた | 指示の書き方で直る。構成は有効 |
| 決裁者とその後の経過がほとんど埋まらない | 記録の様式の見直しが先。 事故報告書に欄を足す |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| AIが「今回も返金が考えられます」と書く | 勧めの言い回しを名指しで禁じる |
| 支配人の判断だった補償を当直者が約束する | 決裁者を必ず並べ、補償基準を前例より上に出す |
| 補償基準の文が「似た事案」に混ざる | 基準を別の索引に置く |
| 短い入力で前例が当たらない | 意味の近さの重みを上げ、入力の画面に選択肢を足す |
| ほかのお客さまの氏名や体調が画面に出る | 取り込みで仮名に置き換え、項目のマスキングで見せない |
| 同じ事案が日報とメールで2度出る | 取り込みで館・客室・日時が同じものをまとめる |
| 救護より先に検索を始める | 入力の画面の最初に救護・通報の表示を置く |
| hybrid クエリを別のクエリで包む | 最上位に置かないと、正規化が効かないことがある |
上の2行が、この構成の失敗のほとんどです。 どちらも「前例」が「指示」に化ける誤りです。補償の約束は、一度口にすると取り消しにくいものです。
下から1行目は、公式の注意に沿っています。 hybrid クエリは最上位のクエリとして使う必要があり、function_score などで包むと、実行時のエラーになるか、正規化のパイプラインが黙って飛ばされることがあるとされています。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客さまの氏名・連絡先・宿泊の情報、けがや体調に関する記述、補償の内容と金額、そして従業員の対応の記録です。体調に関する記述は、とくに慎重な扱いが要る情報です。
- お客さまの氏名と体調の記述を、検索の本文と生成AIに渡さない … 取り込みのときに仮名に置き換え、体調の記述は別の項目に分けます
- 細かいアクセス制御で見せる範囲を絞る … 当直者の役割には、仮名と体調の項目を見せません
- 補償の判断をAIに置かない … 前例は前例として示し、約束してよい範囲は社内の補償基準で決めます
- 宿泊を拒む判断をAIに置かない … 旅館業法第5条は、宿泊を拒む場合に客観的な事実に基づいて判断し、理由を丁寧に説明できるようにするものとしています。判断は当直者と責任者が行います
- 検索の記録を外へ出さない … どの客室で、いつ、何が起きたかの記録は、お客さまの滞在の記録そのものです
- 救護・通報を検索の後に置かない … 入力の画面の設計で、検索より先に行う行動を示します
誤りが起きた場合のリスクは、権限を超えた補償を約束することと、ほかのお客さまの情報が画面に出ることの2つです。 前者は決裁者と補償基準の並べ方で、後者は仮名への置き換えと項目のマスキングで守ります。
10まず何から始めるか
1週目:事故報告書の様式に2つの欄を足す
事故報告書に「決裁者」と「その後の経過(翌朝以降に問題になったこと)」の欄を足し、今夜から記入を始めます。過去の記録を埋めるより先に、新しい記録を検索に使える形で残し始めます。
2週目:40件で試す
過去1年の事故報告書から40件をまとめ直し、最近の5件で似た事案を並べさせます。勧めの文を書いていないか、決裁者を落としていないかを最優先で見ます。
3週目:補償基準を文にする
事案の種類ごとに、当直者が約束してよい範囲と、支配人の判断が要る範囲を文に整えます。基準が無い種類があれば、この時点で宿泊部の責任者と決めます。
4週目:言葉の一致の検索を作る
Amazon OpenSearch Service に Sudachi を関連付け、まとめ直した事案と補償基準をそれぞれ別の索引に入れ、言葉の一致の検索を試します。当直者が使う短い言葉で当たるかを見ます。
2か月目: 意味の近さの検索を足して hybrid クエリにし、仮名への置き換えと細かいアクセス制御を組み込みます。3か月目以降: 日報・事故報告書・申し送りの下書きを足し、1件25分が何分になったかを実測します。新しい事故報告書の決裁者とその後の経過の欄が毎回埋まり、6名の当直者が同じ前例を引けるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 旅館業法第5条が、営業者は特定感染症の患者等であるとき、違法行為等のおそれがあるとき、負担が過重で他の宿泊者へのサービスの提供を著しく阻害するおそれのある要求として厚生労働省令で定めるものを繰り返したとき等を除いて宿泊を拒んではならないとし、宿泊を拒む場合には客観的な事実に基づいて判断し、求めに応じて理由を丁寧に説明できるようにするものとしていること | e-Gov 法令API: 旅館業法 | 2026-10-08 |
| Sudachi の分析プラグインが日本語に推奨とされ OpenSearch 1.3 以上で使えること。Neural Search が 2.9 以上、k-NN が 1.0 以上 | AWS: Plugins by engine version in Amazon OpenSearch Service | 2026-10-08 |
| 細かいアクセス制御が索引・文書・項目の単位の制御と項目のマスキングを提供すること。HTTPS・保存データの暗号化・ノード間の暗号化が必要で、有効にした後は無効にできないこと | AWS: Fine-grained access control in Amazon OpenSearch Service | 2026-10-08 |
hybrid クエリが最大5つの検索を組み合わせ、検索パイプラインで点数をまとめること。filter がすべての検索に効くこと。最上位のクエリとして使う必要があり、function_score などで包むとエラーになるか正規化が飛ばされうること | OpenSearch Documentation: Hybrid query | 2026-10-08 |
正規化の手法(min_max が既定ほか)と組み合わせの手法(arithmetic_mean が既定ほか)。weights の合計が1.0であること | OpenSearch Documentation: Normalization processor | 2026-10-08 |
| Titan Text Embeddings V2 の入力が最大8,192トークン・50,000文字、出力が既定1,024次元であること。長い文書は論理的な単位に分けることが勧められていること。多言語対応の一覧に日本語が含まれること | AWS: Amazon Titan Text Embeddings models | 2026-10-08 |
構造化出力を output_config.format(type: "json_schema")で指定すること | Claude: Structured outputs | 2026-10-08 |
補償の可否と金額、宿泊を拒むかの判断は、社内の基準と責任者の判断で行ってください。 本記事は公開仕様と旅館業法の条文で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1072)についてのご相談はこちらから。
