飲食チェーンの本部が店舗からクレームの報告を受けたときに、過去の対応記録から似た事案を探し、対応の経緯・お詫びの範囲・再発防止策を根拠の記録付きで返す
店舗から上がったクレームの報告を本部の担当者が開くと、過去の対応記録から似た事案を探し、どう対応し、どこまでお詫びし、どんな再発防止策をとったかを記録番号付きで返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 宿泊/小売/飲食
- 対象部門
- カスタマーサポート
- 対象業務
- 問い合わせ対応/情報検索
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 品質標準化/対応スピード向上/属人化解消/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 店長が店舗報告の仕組みに、クレームの内容と店舗での対応を書いて送る
- 本部の担当者が報告を開き、区分と、思いつく言葉で過去の報告を探す
- 出てきた報告を1件ずつ開き、どうお詫びし、どう終わったかを読む
- 見つからない、または迷うときは、経験の長い担当者に聞く
- お詫びの範囲を決め、店長に指示する。必要ならお客様に電話する
- 終結のときに、再発防止策を書いて店舗に伝える
- 自動店舗報告の仕組みで事案が終結すると、本文・経過・お詫びの内容・再発防止策・区分・店舗・業態を取り出す。お客様の氏名と連絡先は取り出さない
- 自動Claude が、経過とお詫びの欄から、お詫びの種類(作り直し、返金、商品券、訪問など)と再発防止策の工程を項目として取り出す
- 人事案を終結させた担当者が、取り出された項目を確かめて確定する
- 自動本文と経過から埋め込みを作り、言葉の索引と一緒に検索基盤に登録する
- 自動本部の担当者が報告を開くと、本文の中に体調不良の申し出の言葉があるかを先に見る。当たれば品質保証の責任者へ回し、検索の結果には「品質保証へ回付」と出す
- 自動当たらなければ、言葉の検索と意味の検索を1回の問い合わせで行い、点数をそろえて上位10件にする
- 自動Claude が10件について、経緯・お詫びの種類・再発防止策を記録番号付きでまとめる
- 人担当者が結果を読み、必要なら元の記録を開き、今回のお詫びの範囲と店長への指示を決める
各工程の詳しい説明を読む
- 店長が店舗報告の仕組みに、クレームの内容と店舗での対応を書いて送る
- 本部の担当者が報告を開き、区分と、思いつく言葉で過去の報告を探す
- 出てきた報告を1件ずつ開き、どうお詫びし、どう終わったかを読む
- 見つからない、または迷うときは、経験の長い担当者に聞く
- お詫びの範囲を決め、店長に指示する。必要ならお客様に電話する
- 終結のときに、再発防止策を書いて店舗に伝える
(a)言い方の違いで探せない。 「料理が来ない」と書かれた報告で探しても、「提供遅延」と書かれた記録は出てきません。言葉を変えて何度も探し、それでも見つからなければ「前例なし」として扱います。
(b)お詫びの範囲が担当者ごとに違う。 同じ髪の毛の混入でも、作り直しで済ませた担当者と、代金を返した担当者がいます。後から同じお客様が別の店で同じことを言うと、扱いの違いが表に出ます。
(c)再発防止策が店舗をまたがない。 ある店で「盛り付けの前に帽子とネットを確かめる」と決めても、別の店で同じ事案が起きたときに、その策が引かれません。 策は報告の最後の欄に書かれていて、探す人がいないからです。
(d)返事が遅れる。 本部に電話をかけてきたお客様への折り返しが、調べている間に翌日になることがあります。
取り込み(事案が終結するたび)
- 【自動】 店舗報告の仕組みで事案が終結すると、本文・経過・お詫びの内容・再発防止策・区分・店舗・業態を取り出す。お客様の氏名と連絡先は取り出さない
- 【自動】 Claude が、経過とお詫びの欄から、お詫びの種類(作り直し、返金、商品券、訪問など)と再発防止策の工程を項目として取り出す
- 【人】 事案を終結させた担当者が、取り出された項目を確かめて確定する
- 【自動】 本文と経過から埋め込みを作り、言葉の索引と一緒に検索基盤に登録する
検索(報告を開くたび)
- 【自動】 本部の担当者が報告を開くと、本文の中に体調不良の申し出の言葉があるかを先に見る。当たれば品質保証の責任者へ回し、検索の結果には「品質保証へ回付」と出す
- 【自動】 当たらなければ、言葉の検索と意味の検索を1回の問い合わせで行い、点数をそろえて上位10件にする
- 【自動】 Claude が10件について、経緯・お詫びの種類・再発防止策を記録番号付きでまとめる
- 【人】 担当者が結果を読み、必要なら元の記録を開き、今回のお詫びの範囲と店長への指示を決める
8番目が、この設計の分かれ目です。 過去に代金を返した事案が多いことは、今回も返金すべきことを意味しません。 お客様の申し出、店舗での対応、社内の基準が違えば、お詫びの範囲も変わります。決めるのは担当者です。
5番目を検索の前に置くのは、体調不良の申し出がある事案では、品質保証の責任者が先に動く必要があるためです。
02今回想定するシステム構成
【取り込み】店舗報告の仕組み(終結) ▼【トリガー】終結の登録 AWS Lambda ── 本文・経過・お詫び・再発防止策・区分を取り出す(氏名・連絡先は除く) ▼ Claude(Amazon Bedrock)── お詫びの種類と再発防止策の工程を項目に ▼【人】終結させた担当者が確定 Amazon Titan Text Embeddings V2 ── 本文と経過の埋め込み ▼ Amazon OpenSearch Service(Sudachi の索引+k-NN の項目) 【検索】本部の担当者が報告を開く ▼ AWS Lambda ── 体調不良の申し出の言葉を照合 → 当たれば品質保証へ ▼ 当たらない Amazon OpenSearch Service ── hybrid クエリ(言葉の検索+k-NN) │ 検索パイプラインの normalization-processor で点数をそろえる ▼ Claude(Amazon Bedrock)── 検索結果のブロックで渡し、引用付きでまとめる ▼ 担当者が確認・判断 → 店長への指示
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(Sudachi、k-NN、hybrid クエリ、正規化の検索パイプライン) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed(Amazon Bedrock) |
| 生成AI | Claude(Amazon Bedrock。項目の取り出しと検索結果のまとめ) | Gemini API、OpenAI API |
| 連携 | AWS Lambda(取り込み、埋め込みの呼び出し、検索、回付の判定) | AWS Step Functions |
| 保管 | Amazon S3(記録の写しと、取り込みの記録) | ― |
| 報告 | 既存の店舗報告の仕組み | ― |
店舗報告の仕組みとお客様の連絡先の台帳には、書き込みません。 この構成が出すのは、似た事案の一覧とまとめまでです。
日本語の言葉の検索は、Sudachi のプラグインで行います。 Amazon OpenSearch Service の対応プラグインの一覧では、Sudachi Analysis が日本語向けに推奨されるものとして載っており、OpenSearch 1.3以降で使えます。kuromoji と ICU は全ドメインに入っています。同じ一覧に、Neural Search(2.9以降)と k-NN(1.0以降)も載っています。
意味の検索には、Amazon Titan Text Embeddings V2 を使います。 モデルIDは amazon.titan-embed-text-v2:0 で、入力は8,192トークンまたは5万文字まで、出力は1,024次元(512、256も選べる)です。英語向けに最適化されていますが、多言語の対応として日本語が挙がっています。言語をまたぐ問い合わせは結果が落ちるとされているので、記録も報告も日本語のまま扱います。
2つの検索を合わせるのが、hybrid クエリです。 複数のクエリの点数を1つの点数にまとめるもので、queries には最大5つのクエリを入れられます。言葉の検索と k-NN の点数は桁が違うので、検索パイプラインの正規化の処理で、そろえてから足し合わせます。
03どうやって実装するのか
処理の起点を決める
取り込みと検索で、起点が2つあります。
取り込みは、店舗報告の仕組みで事案が終結したことを起点にします。 対応中の事案を取り込まないのは、まだ決まっていないお詫びの範囲を、前例として検索結果に出さないためです。 終結を通知できない仕組みなら、毎晩、終結日で絞った一覧を取りに行きます。
過去の約1万8,000件は、別に一括で取り込みます。 このときは終結させた担当者の確認が取れないので、お詫びの種類と再発防止策に「未確認」の印を付けます。古い記録ほど、社内の基準が今と違うことがあるので、発生日も検索結果に必ず出します。
検索は、担当者が店舗報告の仕組みで報告を開き、「似た事案を探す」を押したときに動きます。 押さなくても自動で出す形にしないのは、報告の本文が書きかけのまま検索されることがあるためです。 店長が追記したら、押し直してもらいます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| クレームの記録 | 報告番号、店舗、業態、発生日時、区分、本文、対応の経過、お詫びの内容、再発防止策、終結日 | 店舗報告の仕組み |
| お詫びと再発防止策の項目 | 取り込み時に作る。お詫びの種類、渡したものの金額の帯、再発防止策の工程と対象の店舗 | 検索基盤 |
| 埋め込み | 本文と経過から作る1,024次元のベクトル | Amazon Titan Text Embeddings V2 |
| 回付の言葉の一覧 | 体調不良の申し出を表す言葉(腹痛、吐き気、下痢、発熱、じんましん、救急、病院など) | 品質保証が作る一覧 |
| 新しい報告(検索時) | 本文、区分、店舗、業態 | 店舗報告の仕組み |
質を決めるのは、お詫びの欄の書き方です。 「お詫びし、ご納得いただいた」だけでは、何を渡したのかが分かりません。取り込みのときに、お詫びの種類と金額の帯を項目にし、確定するのは担当者にします。 記録に書かれていなければ「記載なし」とし、補いません。
お客様の氏名・電話番号・住所は、最初から取り込みの対象にしません。 同じお客様からの繰り返しの申し出かどうかは、連絡先の台帳の側で、権限のある担当者が確かめます。 検索基盤には、個人を結びつける項目を持たせません。
データの取得方法を決める
報告は、店舗報告の仕組みから文字で取り出します。写真は取り込みません。 異物の写真は品質保証が別に保管しており、記録番号から元の記録を開けば見られます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 本文 | 店舗報告 | 言葉の検索と意味の検索の主な対象 |
| 対応の経過とお詫びの内容 | 店舗報告 | お詫びの項目の取り出しと、引用の本文 |
| 再発防止策 | 店舗報告 | 再発防止策の項目と、一覧での表示 |
| 区分・業態・店舗 | 店舗報告 | 絞り込みと加点 |
埋め込みは、Lambda から Amazon Bedrock を呼んで作ります。 取り込みのときは本文と経過を、検索のときは新しい報告の本文を同じモデルに通します。OpenSearch Service の側から Bedrock を呼ぶ ML コネクタもありますが、IAM のロールと、細かなアクセス制御を使う場合の ml_full_access の対応付けが要ります。最初は Lambda で作るほうが、どこで失敗したかを追いやすくなります。
索引の項目は、次のように持たせます。
| 項目 | 型 | 使いどころ |
|---|---|---|
body | text(Sudachi) | 言葉の検索。重みを大きく |
progress | text(Sudachi) | 言葉の検索。重みを小さく |
body_vector | knn_vector(1,024次元) | 意味の検索 |
category/brand/store_id | keyword | 絞り込みと加点 |
apology_type/prevention_step | keyword | 一覧での表示と集計 |
occurred_at | date | 古い記録の表示 |
AIへ渡す前に整形する
- 氏名と連絡先の除去(取り込み時) … 本文と経過の文に残ったお客様の名前・電話番号を、正規表現と、取り込み時の Claude の確認で伏せます
- 回付の言葉の照合(検索時) … 品質保証が作った一覧の言葉が本文にあれば、検索をせずに回付します
- お詫びの項目の取り出し(取り込み時) … 経過とお詫びの欄から、お詫びの種類と金額の帯を取り出し、担当者が確定します
- 長い経過の分割 … 経過が長い記録は、やり取りごとの段落に分け、段落の番号を付けます
- 埋め込みの作成 … 本文と経過を合わせた文を Titan Text Embeddings V2 に通し、1,024次元で受け取ります
- 業態の付与 … ファミリーレストランと定食店で、提供の工程が違うため、業態を必ず項目に入れます
2番目は、言葉の一覧で機械的に行います。AIに判断させません。 「お腹が痛くなった」と書かれた報告を、AIが「軽い申し出」と読んで検索に回すと、品質保証が知るのが遅れます。 一覧は広めに作り、当たりすぎるぶんは品質保証が受けて戻します。
5番目で、本文と経過を合わせるのには理由があります。 本文はお客様が何を言ったか、経過は店舗と本部が何をしたかで、似た事案として見たいのは、両方が似ているものです。ただし、経過が長い記録で埋め込みが経過に引っぱられないよう、経過は最初の段落までにします。
AIに処理させる
AIの仕事は2か所です。取り込み時の項目の取り出しと、検索結果のまとめです。
| 場面 | させること |
|---|---|
| 取り込み | 経過とお詫びの欄から、お詫びの種類、渡したものの金額の帯、お客様への連絡の方法を取り出す |
| 取り込み | 再発防止策の欄から、直した工程(受け取り、仕込み、調理、盛り付け、提供、会計、予約)と対象の店舗を取り出す |
| 検索 | 上位10件について、事案の要旨、経緯、お詫びの種類、再発防止策を記録番号付きでまとめる |
| 検索 | お詫びの種類が記録によって違うときは、記録に書かれた違いを並べる |
| させないこと | 理由 |
|---|---|
| 今回のお詫びの範囲の決定 | 決めるのは担当者。申し出と店舗の対応で変わる |
| 体調不良の申し出の重さの判断 | 品質保証の責任者が決める。検索の前に回付する |
| 異物の原因の断定 | 原因は品質保証が現物で調べる |
| お客様の評価 | 「常連の苦情客」のような書き方をしない |
| 記録に書かれていない対応の推測 | 推測された対応が前例として広まる |
1行目がいちばん外せない線です。 10件のうち7件で代金を返していると、AIは「返金が妥当です」と書きたくなります。この一文を店長に伝えると、社内の基準を通らずにお詫びの範囲が決まります。
3行目もよく起きます。 「髪の毛の混入」の事案を並べると、AIは「調理担当の帽子の着用不備が原因です」とまとめがちです。過去の原因は過去の事案のもので、今回の原因ではありません。
指示内容を固定する
取り込み時(項目の取り出し):
あなたは飲食チェーンの本部のお客様相談室で、終結したクレームの記録を整理する担当です。
対応の経過、お詫びの内容、再発防止策の欄だけを根拠にしてください。推測で埋めないでください。
【取り出す項目】
- お詫びの種類:remake(作り直し) / refund(返金) / voucher(商品券・割引券)
/ visit(訪問) / call(電話) / letter(書面) / none(なし) から、書かれたものをすべて
- 渡したものの金額の帯:〜1,000円 / 〜3,000円 / 〜10,000円 / それ以上 / 記載なし
- 再発防止策の工程:receiving / prep / cooking / plating / serving / checkout / reservation
- 再発防止策の対象:その店舗だけ / 業態の全店 / 全店 / 記載なし
【厳守事項】
- 書かれていないお詫びや策を足さないでください。書かれていなければ「記載なし」です。
- 金額は書かれた数字から帯を選んでください。計算や推定で帯を決めないでください。
- お客様の氏名、電話番号、住所が文の中に残っていたら、該当箇所を示し、項目には入れないでください。
- お客様の人柄や態度についての記述は、項目に含めないでください。
検索時(結果のまとめ):
あなたは飲食チェーンの本部で、クレームの担当者の調べものを助ける係です。
渡された検索結果だけを根拠に、過去の事案の収め方を並べてください。
【新しい報告】{report}
【過去の事案(上位10件)】検索結果として渡します
【書くこと】
1. 各事案の要旨、経緯、お詫びの種類、再発防止策(記録番号と発生日を添える)
2. お詫びの種類が事案によって違うときは、記録に書かれた違い(業態、店舗での対応、申し出の内容)
3. 同じ再発防止策が複数の事案で出ていれば、その策と記録番号
【厳守事項】
- 今回どこまでお詫びすべきかを書かないでください。
- 件数の多いお詫びの種類を、今回の対応として勧めないでください。
- 今回の事案の原因を書かないでください。過去の原因は、その事案の原因として書いてください。
- お客様の人柄や態度に触れないでください。
- 発生日が3年より前の記録には「当時の基準」と添えてください。
検索結果は、Claude の検索結果ブロックで渡します。 1件の記録を1つの search_result にし、source に報告番号、title に区分と業態と発生日、content に本文・経過・お詫び・再発防止策を別々のテキストブロックで入れます。 引用は、テキストブロックを単位に付きます。分けておけば、「お詫びの欄から引いた」のか「再発防止策の欄から引いた」のかが、引用の位置で分かります。
「件数の多いお詫びを勧めない」は、お詫びの範囲を書かせない指示とは別に書きます。 範囲だけを禁じると、「多くの事案で返金しています」という形で同じことを書きます。
出力形式を固定する
取り込み時の項目は、次の形のJSONで受け取ります。
{
"report_id": "CR-2025-011482",
"occurred_at": "2025-08-17",
"brand": "family | teishoku",
"category": "foreign_matter",
"apology_types": ["remake", "refund"],
"amount_band": "~1000 | ~3000 | ~10000 | over | none",
"contact": ["call"],
"prevention": [ { "step": "plating", "scope": "store | brand | all", "paragraph": 3 } ],
"pii_found": false,
"unconfirmed": false
}
1つ目の理由は、apology_types と amount_band で、お詫びの範囲を数えられることです。 文の中に書かれていたお詫びが項目になり、同じ区分の事案で、どの種類のお詫びが何件あったかを一覧で示せます。 担当者は、自分の判断が過去とどれだけ違うかを、決める前に知ることができます。
2つ目は、prevention の scope で、策が店舗をまたいだかを分けられることです。 その店だけで直した策と、全店に広げた策では、今回の店舗に伝える意味が違います。
3つ目は、pii_found で、記録の書き方を直す材料になることです。 店長ごとに集計すると、報告の本文にお客様の名前を書いてしまう店舗が分かります。
検索の要求は、次のように組みます。
{
"query": {
"hybrid": {
"queries": [
{ "multi_match": { "query": "{report}", "fields": ["body^3", "progress"] } },
{ "knn": { "body_vector": { "vector": [0.0], "k": 50 } } }
],
"filter": { "term": { "brand": "family" } }
}
},
"size": 10
}
filter を hybrid の段で書くと、2つのクエリの両方に効きます。 業態は必ず絞ります。提供の工程が違う業態の事案を並べても、再発防止策が当てはまらないためです。区分は絞らず、multi_match の側で加点に使います。 区分は店長によって付け方が違うからです。
検索パイプラインは、正規化の処理を1つ置きます。 正規化は min_max(既定)で各クエリの点数を0〜1にそろえ、組み合わせは arithmetic_mean(既定)で、weights に言葉 0.4、意味 0.6 を入れます。重みの合計は1.0、数はクエリの数と同じにする決まりです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 店舗報告の仕組み | 終結の通知、または毎晩の一覧の取得 | 終結した事案の本文・経過・お詫び・再発防止策を取り出す |
| 店舗報告の画面 | 「似た事案を探す」ボタンから Lambda を呼ぶ | 一覧とまとめを報告の横に表示する |
| Amazon Bedrock(Titan) | Lambda からの呼び出し | 取り込み時と検索時の埋め込み |
| Claude(Amazon Bedrock) | Lambda からの呼び出し | 項目の取り出しと、検索結果のまとめ |
| Amazon OpenSearch Service | 索引への登録と hybrid クエリ | 似た事案の検索 |
| 品質保証の受付 | 回付の登録 | 体調不良の申し出がある報告を回す |
hybrid クエリは、function_score などの包むクエリの中に入れません。 ドキュメントでは、function_score・constant_score・script_score・boosting の中に入れると実行時のエラーになることがあるとされています。新しい記録を上げたいときは、包むのではなく、occurred_at を見る並べ替えを後段で行います。
ページを送るときは、pagination_depth を指定します。 各クエリが各シャードから返す件数の上限で、from が0より大きいときには必須です。最初の画面は10件だけにし、送る操作は最大50件までにします。
人が確認する
確認は2か所です。取り込み時の担当者と、検索時の担当者です。
- 終結させた担当者が項目を確定する … お詫びの種類と金額の帯、再発防止策の工程と対象を確かめます。
pii_foundの記録は、伏せ方が正しいかも見ます - 検索時の担当者がお詫びの範囲を決める … 一覧とまとめを読み、元の記録を必要なだけ開き、社内の基準に照らして決めます
- 古い記録は今の基準で読み直す … 「当時の基準」と添えられた記録は、今の基準と違うことがあります
- 品質保証へ回った報告は、品質保証の指示を待つ … 回付の後に検索を使うのは、品質保証が求めたときだけです
1件あたり5分を目安にします。 一覧とまとめを読み、元の記録を1〜2件開き、店長への指示を書く時間です。まとめの文をそのまま店長に送る運用にはしません。
2番目で過去と違う判断をしたときは、理由を一言残します。 「今回は店舗ですでに返金済み」「お客様からの申し出は作り直しのみ」のように書いておくと、次に同じ型の事案を見た担当者が、違いの理由を読めます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 本文に体調不良の申し出の言葉がある | 検索をせずに品質保証へ回す。一覧には出さない |
| 似た事案が0件(点数が下限を下回る) | 「似た過去の事案は見つかりませんでした」と出す。近そうな事案を無理に出さない |
| お詫びの種類が事案によって割れる | 違いを並べる。どれが正しいかは書かない |
| 報告の本文が短すぎる(30字未満) | 検索せず、店長に追記を頼む文面を出す |
| アレルギーに関わる申し出 | 体調不良の言葉が無くても品質保証に写しを送る |
| SNS に書かれた事案 | 広報の担当者にも写しを送る。検索は通常どおり |
| 埋め込みの呼び出しに失敗した | 言葉の検索だけで一覧を出し、「意味の検索なし」と表示する |
| Bedrock(Claude)の呼び出しに失敗した | 一覧だけを出し、まとめは再試行を促す |
1行目と5行目が、この構成でいちばん大事な例外です。 どちらも、似た事案を探すことより、人が先に動くことが要る事案です。検索の仕組みに乗せないことで、担当者が一覧を読んでいる間に対応が遅れることを防ぎます。
7行目は、止めずに落とします。 意味の検索が止まっても、言葉の検索だけで探せていた今までと同じ状態には戻れます。どちらで出した一覧かを画面に示し、担当者が読み方を変えられるようにします。
記録を残す
- 取り込んだ記録の報告番号、終結日、取り込んだ日時、
pii_found - Claude が返した項目のJSONと、終結させた担当者が確定したときに直した項目
- 検索のたびの報告番号、使った重み、上位10件と各件の言葉と意味の点数
- Claude に渡した検索結果と、返ってきたまとめと引用
- 担当者が決めたお詫びの範囲と、過去と違う判断をした理由
- 品質保証へ回付した報告と、当たった言葉
3つ目で、点数を2つに分けて残すのは、重みを直すためです。 担当者が開いた記録が、言葉の点数で上がったものか、意味の点数で上がったものかを数えると、0.4と0.6の重みが合っているかが分かります。
04実装レベルの3段階
半自動化で、お詫びの項目と言葉の検索までは自動になります。 ただし意味の検索が無いので、「料理が来ない」と「提供遅延」のように言葉が重ならない事案を拾えません。本格構成との差はここで、本記事の想定は本格構成です。
05工数削減シミュレーション
導入後 360件 × 5分 ÷ 60 = 30 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 店舗が50店以上ある飲食チェーン・惣菜や弁当の小売チェーン・ホテルの料飲部門で、店舗から本部のお客様相談室へクレームの報告が毎日上がり、対応の記録が報告の仕組みに何年分もたまっている場合。異物の混入、提供の遅れ、接客、会計の違いのような同じ型のクレームが店舗を変えて繰り返し起き、お詫びの範囲と再発防止策を決めるのに経験の長い担当者に頼っている場合。AWS を使っており、検索基盤と生成AIを同じ環境で動かせる場合。
- 店舗が数店で、本部の担当者が過去のクレームを全件覚えていられる規模の場合。対応の記録が件名と日付だけで、経緯やお詫びの中身が文として残っていない場合(先に報告の様式を決める必要がある)。なお、体調不良の申し出や食中毒が疑われる事案の対応、お詫びの範囲の決定は担当者と品質保証の責任者が行い、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 件数の多い区分(異物の混入、提供の遅れ、接客)から、過去の終結した記録を150件選ぶ
- 最近の報告を30件選び、当時、経験の長い担当者が思い当たった前例を聞き取っておく
- 150件の本文と経過を、手元のAIサービスに貼り付けられる形にする(氏名と連絡先は伏せる)
- 30件それぞれについて、「この報告に似た事案を150件から5件選び、経緯・お詫び・再発防止策を記録番号付きで並べてください。今回のお詫びの範囲は書かないでください」と指示する
- 選ばれた事案を、経験の長い担当者の前例と突き合わせる
30件は必ず、経験の長い担当者と一緒に見てください。 言い方の違う報告から、その人の記憶と同じ前例が出てくるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者が思い当たる前例が並ぶ | 埋め込みと hybrid クエリの構築に進む |
| 言葉が同じだけの、中身の違う事案が並ぶ | 言葉の検索に偏っている。意味の検索を足す理由になる |
| まとめにお詫びの範囲や原因が混ざる | 指示の書き方で直る。構成は有効 |
2行目は失敗ではなく、言葉だけでは足りないことが30件で分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 言い方の違う報告で前例が出ない | 言葉の検索と意味の検索を hybrid クエリで合わせる |
| 2つの点数の桁が違い、片方だけで順位が決まる | 正規化の処理を検索パイプラインに置く |
weights を入れたらエラーになる | 合計を1.0にし、数をクエリの数と同じにする |
| hybrid クエリを包んだら失敗する | function_score などで包まない。並べ替えは後段で行う |
| 2ページ目からエラーになる | from が0より大きいときは pagination_depth が要る |
| 業態の違う事案が上に来る | hybrid の段の filter で業態を絞る |
| 体調不良の事案が検索に回る | 検索の前に言葉の一覧で回付する。AIに判断させない |
| まとめがお詫びの範囲を勧める | 範囲と、件数の多いお詫びを勧めることを、別々に禁じる |
| 引用がどの欄から来たか分からない | 本文・経過・お詫び・再発防止策を別のテキストブロックにする |
| 古い記録の扱いを今の基準と混ぜる | 発生日を出し、3年より前には「当時の基準」と添える |
上の2行が、この構成の失敗のほとんどです。 正規化を置かずに点数を足すと、片方の点数の桁に引っぱられ、もう片方で当たった事案が下に沈みます。
7行目は、運用の信頼を決めます。 体調不良の事案が一度でも一覧に埋もれると、品質保証は仕組みを使わなくなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: お客様からの申し出の内容、店舗と本部の対応の経過、お詫びの内容と金額、再発防止策です。氏名と連絡先は取り込みませんが、体調やアレルギー、来店の日時といった、本人に結びつきうる情報が本文に含まれます。
- 個人を結びつける項目を検索基盤に持たせない … 同じお客様かどうかは、連絡先の台帳の側で、権限のある担当者だけが確かめます
- 体調不良と食の安全の判断を仕組みに乗せない … 回付の言葉に当たった報告は、検索の前に品質保証へ回します。似た事案があるかどうかで、品質保証の動き方を変えません
- お詫びの範囲を決めない … 返すのは過去の扱いの事実までです。決めるのは担当者で、社内の基準に照らします
- お客様の評価を書かない … 「苦情の多いお客様」のような要約は、記録として残すこと自体が問題になります。指示で禁じ、抜き取りで確かめます
- 検索結果を店舗にそのまま出さない … 一覧は本部の担当者だけが見ます。店長に伝えるのは、担当者が決めた指示だけです
誤りが起きた場合のリスクは、お客様によってお詫びの範囲が違うことと、体調不良の事案への対応が遅れることの2つです。 前者は担当者の判断と理由の記録で、後者は検索の前の回付で防ぎます。
10まず何から始めるか
1週目:回付の言葉と、取り込まない項目を決める
品質保証の責任者と、体調不良の申し出を表す言葉の一覧を作ります。あわせて、氏名・連絡先を取り込まないこと、報告の本文に名前が書かれていたときの扱いを決めます。
2週目:150件の記録と30件の報告で試す
件数の多い区分の150件と、最近の30件で、似た事案を選ばせます。経験の長い担当者の思い当たる前例と合うか、言葉だけの検索で取りこぼすものがあるかを見ます。
3週目:お詫びの項目の取り出しを作る
150件を Claude に読ませ、お詫びの種類と再発防止策の項目を作ります。担当者が全件を見て、書かれていないお詫びを足していないかを確かめます。
4週目:終結のたびの取り込みを始める
新しく終結する事案から、担当者の確定付きで項目をためます。この時点では検索は Sudachi の言葉の検索だけにします。
2か月目: Titan の埋め込みを索引に足し、hybrid クエリと正規化の検索パイプラインを作ります。重みは言葉 0.4、意味 0.6 から始めます。3か月目以降: 過去の記録を一括で取り込み、引用付きのまとめを足し、開かれた記録の点数の内訳で重みを見直します。経験の長い担当者が休みの日でも、その日のうちにお詫びの範囲が決まり、ある店の再発防止策が別の店の同じ事案で引かれるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Amazon OpenSearch Service の対応プラグインの一覧で、Sudachi Analysis が日本語向けに推奨され OpenSearch 1.3以降で使えること。kuromoji と ICU が全ドメインに入っていること。Neural Search が2.9以降、k-NN が1.0以降で載っていること | Amazon OpenSearch Service: Plugins by engine version | 2026-10-06 |
hybrid クエリが複数のクエリの点数を1つにまとめること。queries が最大5つであること。filter がすべてのクエリに効くこと。pagination_depth が from が0より大きいときに必須であること。function_score などの中に入れると実行時のエラーになりうること | OpenSearch Documentation: Hybrid query | 2026-10-06 |
正規化の処理が min_max(既定)・l2・z_score、組み合わせが arithmetic_mean(既定)・geometric_mean・harmonic_mean であること。weights の合計が1.0で、数がクエリの数と同じであること。検索のクエリの段とフェッチの段の間で動くこと | OpenSearch Documentation: Normalization processor | 2026-10-06 |
Titan Text Embeddings V2 のモデルIDが amazon.titan-embed-text-v2:0 で、入力が8,192トークンまたは5万文字まで、出力が1,024(既定)・512・256次元であること。英語向けに最適化され、多言語の対応に日本語が含まれること。言語をまたぐ問い合わせは結果が落ちること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-06 |
OpenSearch Service から Amazon Bedrock・SageMaker AI への ML コネクタを作れること。IAM のロールが要ること。細かなアクセス制御を使う場合に ml_full_access の対応付けが要ること | Amazon OpenSearch Service: ML connectors for AWS services | 2026-10-06 |
検索結果ブロック(source・title・content)で自社の文書を渡すと、Claude が引用付きで回答すること。引用がテキストブロックを単位に付くこと。1回の要求の中で引用の有効・無効をそろえる必要があること | Claude Docs: Search results | 2026-10-06 |
お詫びの範囲と、体調不良の申し出や食の安全に関わる事案の対応は、社内の基準と品質保証の責任者の判断で決めてください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0514)についてのご相談はこちらから。
