広告の掲載の誤り・表記の誤り・配信の設定ミスが起きたときに、過去の事故報告から似た事故を探し、広告主への対応と効いた対策を根拠付きで返す
広告の掲載事故が起きたときに、事故の状況を入れると、過去の事故報告から似た事故を探し、当時の広告主への対応と効いた再発防止策を報告書番号付きで返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/小売/広告
- 対象部門
- マーケティング/営業
- 対象業務
- 情報検索/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/対応スピード向上/属人化解消/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 広告主・媒体社・運用の担当のいずれかから事故の第一報が入り、営業が事故の一覧に1行を入れる
- 配信を止める・差し替えるといった応急の対応を、運用の担当と媒体社に頼む
- 営業が、事故の一覧を事故の種類と媒体で絞り、似た事故を目で探す
- 当たりを付けた事故報告を共有フォルダから開き、当時の広告主への対応と補償を読む
- 見つからなければ、古参の営業や品質管理室に「前に似たことがあったか」をチャットで聞く
- 前例を踏まえて、広告主への報告の文面と補償の案を作り、上長に相談する
- 自動品質管理室が事故報告を確定すると、状況・原因・広告主への対応・対策の節に分け、事故番号・発生日・事故の種類・媒体の区分・広告の形式を付けて検索基盤に登録する
- 自動状況と原因の節について、意味のベクトルを作って同じ文書に持たせる
- 自動再発防止策の効果を確かめた記録が登録されると、該当する事故の対策の節に、確認日と結果(再発なし/再発あり/運用をやめた)を付け足す
- 人営業が、新しい事故の状況(何が、どの媒体で、どれだけの期間、どう出てしまったか)と、分かっている範囲の原因を画面に入れる
- 自動言葉の検索と意味の検索を同時に動かし、順位で混ぜ、事故番号ごとに1件にまとめて上位を出す。同じ事故の「広告主への対応」と「対策」の節を添える
- 自動Claude が、似た事故ごとに、当時の状況・原因・広告主への対応・対策・効果の確認結果を、報告書番号と節付きで並べる
- 人営業が並んだ事故を読み、前例に使うものを選び、必要なら事故報告の原本とメールを開く
- 人営業が上長と相談して、広告主への報告の文面と補償の案を決める
各工程の詳しい説明を読む
- 広告主・媒体社・運用の担当のいずれかから事故の第一報が入り、営業が事故の一覧に1行を入れる
- 配信を止める・差し替えるといった応急の対応を、運用の担当と媒体社に頼む
- 営業が、事故の一覧を事故の種類と媒体で絞り、似た事故を目で探す
- 当たりを付けた事故報告を共有フォルダから開き、当時の広告主への対応と補償を読む
- 見つからなければ、古参の営業や品質管理室に「前に似たことがあったか」をチャットで聞く
- 前例を踏まえて、広告主への報告の文面と補償の案を作り、上長に相談する
(a)事故の種類で絞ると、似た事故が落ちる。 3番目で「表記の誤り」で絞ると、同じ原因(校了後の差し替えの確認漏れ)で起きた「入稿の誤り」が出てきません。 種類は第一報を受けた人が付けたもので、同じ起き方の事故が別の種類に入っています。
(b)呼び方が部署と媒体で違う。 「配信地域」「ジオ」「エリア指定」、「掲載面」「配信先」「プレースメント」。別の部署の呼び方で書かれた事故は、言葉で探しても当たりません。
(c)広告主への対応が、報告書の後ろのほうに埋もれている。 4番目で開いた事故報告は、状況と原因が前半を占め、広告主に何を伝え、何を補償し、どう受け止められたかは最後の数行です。それがメールにしか残っていない事故もあります。
(d)前例が人に付いている。 5番目で答えてくれるのは、その広告主を長く担当した営業です。異動すると、その広告主との事故の前例がまとめて消えます。 補償の線引きが担当ごとにぶれる原因も、ここにあります。
取り込み(事故報告と効果の記録が確定するたび)
- 【自動】 品質管理室が事故報告を確定すると、状況・原因・広告主への対応・対策の節に分け、事故番号・発生日・事故の種類・媒体の区分・広告の形式を付けて検索基盤に登録する
- 【自動】 状況と原因の節について、意味のベクトルを作って同じ文書に持たせる
- 【自動】 再発防止策の効果を確かめた記録が登録されると、該当する事故の対策の節に、確認日と結果(再発なし/再発あり/運用をやめた)を付け足す
新しい事故を調べるとき
- 【人】 営業が、新しい事故の状況(何が、どの媒体で、どれだけの期間、どう出てしまったか)と、分かっている範囲の原因を画面に入れる
- 【自動】 言葉の検索と意味の検索を同時に動かし、順位で混ぜ、事故番号ごとに1件にまとめて上位を出す。同じ事故の「広告主への対応」と「対策」の節を添える
- 【自動】 Claude が、似た事故ごとに、当時の状況・原因・広告主への対応・対策・効果の確認結果を、報告書番号と節付きで並べる
- 【人】 営業が並んだ事故を読み、前例に使うものを選び、必要なら事故報告の原本とメールを開く
- 【人】 営業が上長と相談して、広告主への報告の文面と補償の案を決める
5番目で「広告主への対応」の節を必ず添えるのが、この設計の分かれ目です。 似ている理由で当たるのは状況や原因の節で、営業が読みたい対応の節は、検索の点数ではほとんど上に来ません。 当たった事故の番号から、対応の節を引き寄せて並べます。
8番目を人に残しているのも、意図してのことです。 同じ事故でも、広告主との取引の長さや、事故が売上に響いた度合いで、お詫びと補償の重さは変わります。前例は判断の材料で、補償を決めるのは営業の責任者です。
02今回想定するシステム構成
【取り込み】事故報告の確定/効果の確認の記録の登録 ▼【トリガー】確定・登録のたび AWS Lambda ── 節に分け、事故番号・発生日・種類・媒体の区分・形式を付ける ├─ Amazon Titan Text Embeddings V2(Amazon Bedrock)── 状況と原因の文のベクトル ▼ Amazon OpenSearch Service(事故の索引。Sudachi+k-NN) 【調べるとき】営業が新しい事故の状況を入れる ▼ Amazon OpenSearch Service ├─ hybrid:言葉の検索(Sudachi)+意味の検索(k-NN) ├─ filter:確定済みの事故報告、過去5年 ├─ 検索パイプライン:score-ranker-processor(RRF) ├─ collapse:事故番号ごとに1件 └─ 2回目の検索:上位の事故番号の対応と対策の節 ▼ Claude(Amazon Bedrock)── 検索結果のブロックで渡し、引用付きで並べる ▼ 画面(似た事故・広告主への対応・対策・効果の確認結果・報告書番号)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(hybrid、score-ranker-processor、collapse、Sudachi) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed、OpenAI の埋め込みモデル |
| 生成AI | Claude(Amazon Bedrock。似た事故を引用付きで並べる) | Gemini API、OpenAI API |
| 連携 | AWS Lambda(取り込み、効果の記録の付け足し、検索の呼び出し) | AWS Step Functions |
| 保管 | Amazon S3(事故報告の原本と、検索の記録) | ― |
| 台帳 | 既存の事故の一覧と共有フォルダ | ― |
事故の一覧と共有フォルダには、書き込みません。 事故の受付、媒体社との調整、報告書の確定は、これまでどおり品質管理室の手順で行います。この構成は、確定した事故報告と効果の記録を取り込み、似た事故として引けるようにするだけです。
言葉と意味の組み合わせは、hybrid クエリで行います。 公式のドキュメントでは、hybrid クエリは複数のクエリの点数を1つにまとめるもので、文書はどれか1つのクエリに当たれば返り、まとめ方は検索パイプラインで決めます。クエリは最大5つまでで、全部のクエリにかかる絞り込みを filter に1つ書けます。
混ぜ方には、score-ranker-processor を使います。 OpenSearch 2.19 で入った処理で、各クエリの結果の順位の逆数を足し合わせる RRF で並べます。公式の説明どおり、クエリごとの点数の尺度をそろえる必要がありません。 rank_constant は1〜10000で既定は60、weights でクエリごとの重みも付けられます。
事故番号ごとのまとめは collapse で行います。 OpenSearch 3.1 で hybrid クエリに対応し、keyword か数値の項目でまとめ、まとまりごとに点数のいちばん高い文書を返します。 Amazon OpenSearch Service が対応するのは 3.5、3.3、3.1 などなので、新しく作るドメインは 3.1 以上にします。
03どうやって実装するのか
処理の起点を決める
取り込みと検索で、起点が2つあります。
取り込みは、品質管理室が事故報告を確定したときです。 確定済みのフォルダにファイルが置かれたことを検知して動かします。第一報の段階の下書きは取り込みません。 原因の推測や話す前の補償の案が、前例として返るのを防ぎます。
効果の確認の記録は、登録されるたびに付け足します。 再発防止策を始めてから3か月ほどたったところで、品質管理室が「再発なし」「再発あり」「運用をやめた」を記入します。その記入を起点に、該当する事故の対策の節を更新します。 事故報告そのものは取り込み直しません。
検索は、営業が新しい事故を調べ始めたときに動きます。 第一報は「バナーが違う」程度の書き方が多く、似た事故の精度が出ません。 応急の対応を頼んだあと、営業が状況を3〜4行で書き直してから検索します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 事故報告 | 事故番号、発生日、事故の種類、媒体の区分(予約型/運用型)、広告の形式(ディスプレイ・動画・検索・SNS・紙面)、状況の文、原因の文、広告主への対応の文、再発防止策の文 | 共有フォルダの確定済みの場所 |
| 事故の一覧 | 事故番号、広告主の業種、影響した期間、誤って出た回数や費用の規模の区分 | 事故の一覧 |
| 効果の確認の記録 | 事故番号、対策の番号、確認日、結果(再発なし/再発あり/運用をやめた)、所見 | 品質管理室の記録 |
| 探す内容(検索時) | 新しい事故の状況、媒体の区分、広告の形式、分かっている範囲の原因 | 営業の入力 |
質を決めるのは、事故報告の「広告主への対応」が節として書かれているかです。 何を、いつ、誰から伝え、何を補償し(再掲載、配信の延長、請求の減額、無償の追加の出稿)、広告主がどう受け止めたか。この節が無い報告書は、検索で当たっても営業が知りたいことが返りません。
広告主の社名は索引に持たせず、業種だけを持たせます。 別の広告主の事故が社名付きで画面に出ることを避けます。
データの取得方法を決める
取り込みは Word の事故報告から文字を取り出し、見出しで節に分けます。 年によって違う見出し(「顧客対応」「お詫びと補償」)は対応表で同じ節に寄せます。
索引の項目は、次のように持たせます。 1件の文書は「事故1件の1つの節」です。
| 項目 | 型 | 使いどころ |
|---|---|---|
incident_id | keyword | 事故番号。collapse でまとめる単位 |
section | keyword(situation、cause、response、measure) | 節の区別。2回目の検索で対応と対策を引く |
text | text(Sudachi) | 言葉の検索 |
text_vector | knn_vector(1,024次元) | 意味の検索。状況と原因の節だけに持たせる |
occurred_on | date | 過去5年の絞り込み |
incident_type/buy_type/ad_format/client_industry | keyword | 画面での絞り込みと、答えに添える属性 |
measures | object(番号、文、確認日、結果) | 効いた対策の表示 |
finalized | boolean | 確定済みだけに絞る |
意味のベクトルは、Amazon Titan Text Embeddings V2 で作ります。 公式のドキュメントでは、入力は最大8,192トークンまたは50,000文字、出力は1,024(既定)、512、256次元から選べ、日本語を含む多言語に対応するとされています。検索では文書を節のような単位に分けることが推奨されているので、節ごとに作ります。
AIへ渡す前に整形する
- 節に分ける … 状況・原因・広告主への対応・対策の見出しで分けます。年ごとに違う見出しは対応表で寄せます
- 社名と人名を外す … 広告主の社名、広告主の担当者名、媒体社の担当者名を「広告主」「先方の担当」のような記号に置き換えます
- 呼び方の揺れを記録する … 「配信地域/ジオ/エリア指定」「掲載面/配信先/プレースメント」のような呼び方を一覧にし、言葉の検索の同義語にします
- 金額を区分にする … 補償の金額は、そのままではなく「請求の1割未満」「1割以上」のような区分に置き換えます
- 対策の番号を確かめる … 対策が「①校了後の差し替えは2名で確認」のように番号付きかを確かめ、無いものは品質管理室に戻します
- ベクトルを作る … 状況の節と原因の節だけについて、Titan Text Embeddings V2 でベクトルを作ります
4番目を軽く見ないでください。 金額がそのまま出ると、出稿の規模が違うのに金額を前例として写します。 見るべきは補償の種類と重さです。
6番目で対応と対策の節にベクトルを持たせないのは、 対応の文がどの事故でも似た言い回しになり、起き方の違う事故が言い回しの近さだけで上がってくるためです。
AIに処理させる
AIの仕事は、検索で出た似た事故を、決まった項目で引用付きで並べることだけです。 似た事故を探すのも、事故ごとにまとめるのも、対応の節を添えるのも検索基盤で行います。
| させること | 中身 |
|---|---|
| 似た事故ごとの要約 | 当時の状況と原因を、報告書の文を引いて並べる |
| 広告主への対応の書き出し | 何を、いつ伝え、どの種類の補償をし、広告主がどう受け止めたかを、報告書の文のまま |
| 似ている点・違う点 | 媒体の区分、広告の形式、事故の起き方、影響した期間のどこが同じで、どこが違うか |
| 効果の確認結果の添付 | 対策ごとに「再発なし」「再発あり」「運用をやめた」「効果未確認」を記録のまま |
| させないこと | 理由 |
|---|---|
| 補償の内容・金額の提案 | 決めるのは営業の責任者。取引の事情で変わる |
| 責任の所在の判断 | 自社・媒体社・制作・広告主のどこにあるかは、契約と事実の確認で決める |
| 広告主への文面の作成 | この構成は前例の整理まで。文面は営業が書く |
| 対策が効いたかの判断 | 確認の記録が無ければ「効果未確認」 |
| 検索結果に無い事故の補足 | 一般的な広告の知識で事故例を足さない |
1行目と2行目が、いちばん外せない線です。 前例を並べたAIに案を書かせると、いちばん重い補償の前例に寄せがちで、伝われば取り消せない約束になります。
「違う点」を必ず書かせるのも同じ理由です。 予約型の紙面の事故と運用型のSNSの事故では、止めるまでの時間も、媒体社の関わり方も違います。似ている点だけを読むと、条件の違う前例の補償をそのまま持ち出します。
指示内容を固定する
あなたは広告会社の品質管理室で、新しい掲載事故の検討のために過去の似た事故を整理する係です。
渡された検索結果だけを根拠にしてください。一般的な広告の知識で補わないでください。
【新しい事故】
媒体の区分:{buy_type} 広告の形式:{ad_format} 事故の種類:{incident_type}
状況:{situation}
分かっている範囲の原因:{known_cause}
【検索結果】
事故番号ごとに、状況(situation)、原因(cause)、広告主への対応(response)、
対策(measure)の節と、対策ごとの効果の確認結果が渡されます。
【事故ごとに書くこと】
1. 事故番号、発生日、媒体の区分、広告の形式、事故の種類、広告主の業種
2. 当時の状況と原因(報告書の文を引用)
3. 当時の広告主への対応(伝えた内容、補償の種類、広告主の受け止め。報告書の文を引用)
4. 新しい事故と似ている点
5. 新しい事故と違う点(媒体の区分、形式、影響した期間、止めるまでの時間)
6. 対策ごとの効果の確認結果を記録のまま
(再発なし/再発あり/運用をやめた。記録が無ければ「効果未確認」)
【厳守事項】
- 補償の内容や金額を提案しないでください。「今回も〜すべき」と書かないでください。
- 責任が誰にあるかを書かないでください。報告書に書かれていても、
「報告書には〜と記載」と引用の形で書いてください。
- 広告主への対応の節が無い事故は、「対応の記載なし」と書いてください。
他の事故の対応で補わないでください。
- 効果の確認結果が無い対策を「有効」と書かないでください。「効果未確認」と書いてください。
- 違う点が見つからないときも「違う点:記載から判断できない」と書き、空欄にしないでください。
- 似ていないと判断した事故は、「似ている点が少ない」と書いて最後に回してください。
「引用の形で書く」を入れるのは、 当時の報告書の「媒体社側の設定ミス」という判断を、AIが地の文で書くと今回にも当てはまる事実のように読めるためです。
検索結果は、Claude の検索結果ブロックで渡します。 1つの節を1つの search_result にし、source に「事故番号/節」、title に発生日と事故の種類、content に節の本文を入れます。公式の説明では、検索結果ブロックは Claude API、Amazon Bedrock、Google Cloud で使え、引用は content の中のテキストブロック単位です。対応の節は「伝えた内容」「補償」「受け止め」の3ブロックに分けて渡します。
出力形式を固定する
検索パイプラインは、次のように作ります。
PUT /_search/pipeline/incident-rrf
{
"description": "掲載事故の言葉と意味の検索を順位で混ぜる",
"phase_results_processors": [
{ "score-ranker-processor": {
"combination": {
"technique": "rrf",
"rank_constant": 60,
"parameters": { "weights": [0.5, 0.5] }
}
} }
]
}
検索の要求は、次のように組みます。
GET /ad-incidents/_search?search_pipeline=incident-rrf
{
"size": 8,
"query": {
"hybrid": {
"filter": { "bool": { "filter": [
{ "term": { "finalized": true } },
{ "terms": { "section": ["situation", "cause"] } },
{ "range": { "occurred_on": { "gte": "now-5y/d" } } }
] } },
"queries": [
{ "match": { "text": "配信地域 設定 漏れ 全国 配信 期間" } },
{ "knn": { "text_vector": { "vector": [0.021, -0.008], "k": 40 } } }
]
}
},
"collapse": { "field": "incident_id" }
}
上位の事故番号が決まったら、2回目の検索で対応と対策の節を取ります。
GET /ad-incidents/_search
{
"size": 40,
"query": { "bool": { "filter": [
{ "terms": { "incident_id": ["AI-2024-0213", "AI-2023-1107"] } },
{ "terms": { "section": ["response", "measure"] } }
] } }
}
filter で状況と原因の節だけを当てているのが要点です。 似ている理由は起き方で決め、対応と対策の節は2回目の検索で事故番号から引きます。1回目の検索に対応の節を混ぜると、「お詫びに伺った」のような似た言い回しで起き方の違う事故が上がります。 2回の検索は Lambda から続けて投げ、画面には1つの結果として返します。vector の中身は、Lambda が Titan で作った1,024個の数値です。
最初の重みは0.5ずつにし、 第8章の試しで古参の営業が選んだ事故がどちらの検索で上に来るかを数えてから動かします。
画面に返す形は、次のJSONです。
{
"query_incident": { "buy_type": "運用型", "ad_format": "SNS", "incident_type": "配信の設定ミス" },
"similar": [
{ "incident_id": "AI-2024-0213", "occurred_on": "2024-02-13",
"buy_type": "運用型", "ad_format": "ディスプレイ", "client_industry": "不動産",
"situation": "", "cause": "",
"response": { "told": "", "compensation_type": "配信の延長", "client_reaction": "" },
"same_points": "", "different_points": "",
"measures": [
{ "no": 1, "text": "", "result": "再発なし", "checked_on": "2024-05-20" },
{ "no": 2, "text": "", "result": "効果未確認", "checked_on": null }
],
"citations": ["AI-2024-0213/response"] }
],
"not_found": false
}
1つ目の理由は、response を3つに分けると、補償の種類だけを横に並べて前例の幅を見られることです。 金額は入れません。
2つ目は、measures の result を固定の値で返させることで、画面で色分けできることです。 効いた記録のある対策が先に目に入ります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ(確定済みの場所) | ファイルの配置を検知 | 確定した事故報告を取り込む |
| 効果の確認の記録 | 登録を毎日確認 | 対策ごとの結果を付け足す |
| 事故の一覧 | 事故番号で読み取り | 広告主の業種、影響した期間を添える |
| Amazon Bedrock(Titan) | Lambda からの呼び出し | 状況と原因の文のベクトルを作る |
| Amazon OpenSearch Service | 索引への登録と検索 | hybrid・RRF・collapse で似た事故を返す |
| Claude(Amazon Bedrock) | Lambda からの呼び出し | 引用付きで似た事故を並べる |
| 画面 | 営業と品質管理室が使う | 検索の入力と結果の表示 |
広告主へのメールや報告の書式には、何も書き込みません。 営業は結果を読み、自分で文面を書きます。画面から広告主へ直接送る経路は作りません。
人が確認する
この構成の確認は、必須です。 出てくるのは前例の材料で、広告主への説明と補償は人が決めます。
- 並んだ事故が本当に似ているかを見る … 似ている点と違う点を読み、前例に使う事故を選びます。点数の順に上から使うことはしません
- 原本とメールを開いて確かめる … 前例に使う事故は、事故報告の原本と当時のメールを開き、引用された対応が実際にそうだったかを確かめます
- 補償の種類を上長と決める … 前例の補償は「同じ種類の事故で、ここまで出したことがある」という幅として使います
- 使わなかった事故を記録する … 上位に出たのに使わなかった事故と、その理由(媒体の区分が違う、影響の期間が違う)を一言残します
1件あたり15分を目安にします。 原本とメールを開くのは選んだ1〜2件です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 似た事故が1件も出ない | 「前例は見つかりませんでした」と出し、入力した状況を記録する。近いものを無理に出さない |
| 上位がすべて同じ事故 | collapse が効いていない。事故番号の項目が keyword かを確かめる |
返る事故の数が size より少ない | 既定では上位 size 件の重複を除くため。異なるまとまりを size まで返す設定を有効にする |
| 対応の節が無い事故 | 「対応の記載なし」と出す。他の事故の対応で埋めない |
| 効果の確認の記録が無い | 全対策を「効果未確認」として返す |
| 2回目の検索で対応の節が返らない | その事故は「対応の記載なし」とする。1回目の結果は捨てない |
| Bedrock の呼び出しに失敗した | 検索結果の事故番号・状況・対応の文をそのまま表示する |
3行目は公式のドキュメントに書かれた動きで、 index.neural_search.hybrid_collapse_distinct_groups_enabled を有効にすると、size 件までの異なるまとまりを返せます。
記録を残す
- 取り込んだ事故報告の事故番号・節・確定日と、取り込んだ日時
- 効果の確認の記録から付け足した結果と、付け足した日時
- 検索の入力と、返した事故番号と順位
- Claude に渡した検索結果と、返ってきた答えと引用
- 営業が前例に使った事故と、使わなかった事故とその理由
- 「前例は見つかりませんでした」になった検索
5つ目と6つ目は、重みと同義語を直す材料です。 3か月分たまったところで、使われた事故がどちらの検索で上位に来ていたかを数えます。
04実装レベルの3段階
半自動化で、①の探す時間は大きく減ります。 ただし言葉の検索だけでは、部署ごとの呼び方の違いで落ちる事故が残り、対応の節を探して読み比べる作業は人が行います。 本格構成で1件15分になり、この段階が本記事の想定です。
05工数削減シミュレーション
導入後 40件 × 15分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 運用型広告と予約型広告の両方を扱い、入稿の誤り・価格や日付の表記の誤り・配信の地域や期間の設定ミスといった掲載事故が月に数十件起きる広告会社やインハウスの広告部門で、事故報告と広告主への対応の記録が数年分たまっているのに、新しい事故のたびに「前に同じことがあったか」を営業の古参に聞いて回っている場合。お詫びの範囲や補償(再掲載・配信の延長・請求の減額)を決めるのに、前例を探す時間がかかっている場合。AWS を使っており、検索基盤と生成AIを同じ環境で動かせる場合。
- 掲載事故が年に数件で、担当が全件を覚えていられる場合。事故の記録がチャットの流れの中にしか無く、報告書の形になっていない場合(先に事故報告の書式をそろえる必要がある)。事故の第一報を受け付けて媒体社や制作へ連絡を回す作業そのものを減らしたい場合。なお、補償の内容と広告主への説明、責任の所在の判断は営業の責任者と法務が行い、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 過去2年の事故から、古参の営業と品質管理室が「この2件は同じ起き方だ」と分かっている組を10組選んでもらう
- その20件の事故報告と、近い時期の別の事故報告30件を集める(合わせて50件。社名は伏せる)
- 手元のAIサービスに50件を貼り、10組の片方の状況だけを入れて「似た事故を3件、当時の広告主への対応と、似ている点・違う点を添えて挙げてください。報告書に無いことは書かないでください。補償を提案しないでください」と指示する
- 組のもう片方が3件に入ったかを数える
- 入らなかった組について、何が違って見落とされたかを書き出す
| 出てきた内容 | 判断 |
|---|---|
| 10組のうち多くで、組の片方が3件に入る | 索引とハイブリッド検索の構築に進む |
| 入るが、補償を提案する、責任の所在を断定する | 指示の書き方で直る。構成は有効 |
| 事故報告に広告主への対応が書かれておらず、前例として読めない | 事故報告の書式が先。 検索の問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 事故の種類で絞って、似た事故が落ちる | 種類は絞り込みに使わない。 確定済み・節・期間だけを filter に入れる |
| 言葉と意味の点数の尺度が合わない | 点数ではなく順位で混ぜる RRF にする |
| 同じ事故の節が上位を占める | collapse で事故番号ごとにまとめる |
| 対応の節が検索で上に来ない | 似ている理由は状況と原因に限り、対応と対策は事故番号で2回目に引く |
| 対応の文の言い回しが似ていて、違う事故が上がる | 対応と対策の節にはベクトルを持たせない |
| 補償の金額を前例として写す | 金額は区分に置き換えて索引に入れる |
| AIが補償を提案する | 「提案しない」を指示し、出力に提案の項目を作らない |
| 社名が画面に出る | 取り込みで記号に置き換え、業種だけを持たせる |
| 部署ごとの略称で当たらない | 同義語の一覧を作り、言葉の検索に入れる |
上の4行は、探すことと返すことを同じ検索で済ませようとすると起きます。 探すのは状況と原因、返すのは対応と対策、と分けます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 事故の状況と原因、広告主への対応と補償の種類、広告主の業種、そして事故報告の原本に書かれた広告主の社名と担当者名、補償の金額です。広告主との契約で、取引の内容を他に出さない取り決めがあることが一般的です。
- 社名と金額を索引に入れない … 取り込みで記号と区分に置き換えます。別の広告主の営業が、他社の補償の金額を前例として見る状態を作りません
- 見られる範囲を役割で分ける … OpenSearch の細かなアクセス制御を使えば、局ごとに自局の事故と全社共通の事故だけを見せる分け方ができます。有効にしたあとは無効にできないので、ドメインを作るときに決めます
- AIの出力を広告主へ直接出さない … 出力は社内の検討の材料です。引用の中に当時の社内の評価が含まれることがあります
- 前例を約束の根拠にしない … 「前回はこうした」は社内の目安です。広告主への説明では、今回の事故の事実と今回の対応だけを伝えます
誤りが起きた場合のリスクは、条件の違う前例の補償をそのまま持ち出すことと、効かなかった対策をもう一度打つことの2つです。 前者は「違う点」と金額の区分化で、後者は効果の確認結果を記録のまま返すことで防ぎます。
10まず何から始めるか
1週目:事故報告の書式を確かめる
過去2年の事故報告を20件開き、状況・原因・広告主への対応・対策が節に分かれているか、対応の節に補償の種類と広告主の受け止めが書かれているかを数えます。
2週目:10組で試す
古参の営業と品質管理室に「同じ起き方だ」と分かっている事故の組を10組選んでもらい、手元のAIサービスで似た事故を挙げさせます。組の片方が上位に入るか、補償を提案していないかを最優先で見ます。
3週目:同義語の一覧と書式を直す
2週目で見落とされた組から、部署ごとの呼び方の違いを拾い、同義語の一覧にします。あわせて、事故報告の書式に「広告主への対応」の節と、伝えた内容・補償の種類・受け止めの3つの欄を足します。
4週目:節に分けて取り込み、言葉の検索で出す
過去2年分の事故報告を節に分けて取り込み、言葉の検索と collapse で事故番号ごとの一覧を出します。営業が新しい事故のたびにこの一覧を使い始めます。
2か月目: 意味の検索を足して RRF で混ぜ、2回目の検索で対応と対策の節を添えます。使われた事故がどちらの検索で上位に来たかを数えて重みを決めます。3か月目以降: 効果の確認結果の付け足しと引用付きの整理を足し、過去5年分に広げます。新しい事故のたびに古参の営業へ「前に似たことがあったか」と聞く場面が無くなり、補償の種類の幅を前例で確かめてから広告主に連絡するようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Amazon OpenSearch Service が OpenSearch 3.5、3.3、3.1 などのバージョンに対応していること | Amazon OpenSearch Service: What is Amazon OpenSearch Service? | 2026-10-08 |
| 対応プラグインの一覧で、Sudachi Analysis が日本語向けに推奨され、Neural Search と k-NN が含まれること | Amazon OpenSearch Service: Plugins by engine version | 2026-10-08 |
hybrid クエリが複数のクエリの点数を検索パイプラインで1つにまとめ、文書はどれか1つのクエリに当たれば返ること。クエリは最大5つ、filter で全クエリに絞り込みをかけられること | OpenSearch Documentation: Hybrid query | 2026-10-08 |
score-ranker-processor が 2.19 で入り、RRF で順位の逆数を足し合わせるため点数の尺度をそろえる必要がないこと。rank_constant が1〜10000で既定60、weights が0.0〜1.0で合計1.0であること | OpenSearch Documentation: Score ranker processor | 2026-10-08 |
hybrid クエリの collapse が 3.1 で入り keyword か数値の項目でまとめること。既定では上位 size 件の重複を除き、異なるまとまりを返す設定があること | OpenSearch Documentation: Collapsing hybrid query results | 2026-10-08 |
| Titan Text Embeddings V2 の入力が最大8,192トークンまたは50,000文字、出力が1,024(既定)・512・256次元で、英語に最適化され日本語を含む多言語に対応すること。検索では文書を節などに分けることが推奨されること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-08 |
検索結果ブロック(source・title・content)で引用付きの答えが返り、Claude API、Amazon Bedrock、Google Cloud で使えること。中身は文字だけで、引用はテキストブロック単位、引用の設定は1回の要求で全部そろえる必要があること | Claude Docs: Search results | 2026-10-08 |
補償の内容と広告主への説明、責任の所在の判断は、自社の営業の責任者と法務、広告主との契約に従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1037)についてのご相談はこちらから。
