荷崩れ・破損・誤配送の事故が起きたときに、過去の事故報告と原因分析から似た事故を探し、原因と効いた対策を根拠の報告書付きで返す
新しい物流事故の状況を入れると、過去の事故報告と原因分析・再発防止策の記録から似た事故を探し、当時の原因と打った対策、その対策が効いたかの確認結果を、報告書番号付きで返します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/商社/小売/物流/製造
- 対象部門
- 品質管理/物流
- 対象業務
- 情報検索/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/品質標準化/属人化解消/検索時間短縮
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- センターから事故の第一報が届き、事故台帳に1行が入る
- 品質管理の担当が、事故台帳を事故の区分・荷主・センターで絞り、似た事故を目で探す
- 当たりを付けた事故の原因分析の報告書を、共有フォルダから1件ずつ開いて読む
- 見つからなければ、ベテランのセンター長や品質管理の先輩に「前に似たことがあったか」を聞く
- 似た事故の原因と対策を読み比べ、その対策がいまも続いているか、効いたかを確かめる
- 検討の資料に、似た事故の番号と原因・対策を書き写す
- 自動原因分析の報告書が承認されると、事故の状況・原因・対策の節に分け、事故番号・発生日・センター・工程・荷物の種類・事故の区分を付けて検索基盤に登録する
- 自動状況と原因の文から意味のベクトルを作り、同じ節に持たせる
- 自動再発防止策の効果の確認表が登録されると、該当する事故の対策に、確認日と結果(再発なし/再発あり/中止)を付け足す
- 人品質管理の担当が、新しい事故の状況(何を、どの工程で、どうなったか)と、分かっている範囲の原因を入れる
- 自動言葉の検索と意味の検索を同時に動かし、点数をそろえて足し合わせ、事故番号ごとに1件にまとめて上位を出す
- 自動Claude が、似た事故ごとに、当時の状況・原因・対策・効果の確認結果を、報告書番号と節付きで並べる
- 人担当が並んだ事故を読み、検討に使うものを選び、必要なら報告書の原本を開く
- 人選んだ事故の番号を検討の資料に貼り、原因と再発防止策を決める
各工程の詳しい説明を読む
- センターから事故の第一報が届き、事故台帳に1行が入る
- 品質管理の担当が、事故台帳を事故の区分・荷主・センターで絞り、似た事故を目で探す
- 当たりを付けた事故の原因分析の報告書を、共有フォルダから1件ずつ開いて読む
- 見つからなければ、ベテランのセンター長や品質管理の先輩に「前に似たことがあったか」を聞く
- 似た事故の原因と対策を読み比べ、その対策がいまも続いているか、効いたかを確かめる
- 検討の資料に、似た事故の番号と原因・対策を書き写す
(a)区分で絞ると、似た事故が落ちる。 2番目で事故台帳を「荷崩れ」で絞ると、同じ積み付けの問題で起きた「破損」が出てきません。 区分は第一報を受けた人が付けたもので、同じ起き方の事故が別の区分に入っていることはよくあります。
(b)呼び方が拠点ごとに違う。 「ストレッチフィルム」「ラップ」、「カゴ車」「ロールボックスパレット」。別の拠点の呼び方で書かれた事故は、言葉で検索しても当たりません。
(c)ベテランの記憶に頼っている。 4番目で答えてくれる人は、拠点ごとに1〜2人です。その人が異動や退職でいなくなると、似た事故の多くは二度と見つからなくなります。 新しい拠点の担当ほど、過去の事故を知りません。
(d)対策が効いたのかが分からない。 5番目で、当時の報告書に書かれた対策を読んでも、それが効いたのか、途中でやめたのかは報告書に書かれていません。 効果の確認表は別のファイルにあり、付いていない事故もあります。効かなかった対策をもう一度打つことが起きます。
取り込み(報告書と効果の確認表が確定するたび)
- 【自動】 原因分析の報告書が承認されると、事故の状況・原因・対策の節に分け、事故番号・発生日・センター・工程・荷物の種類・事故の区分を付けて検索基盤に登録する
- 【自動】 状況と原因の文から意味のベクトルを作り、同じ節に持たせる
- 【自動】 再発防止策の効果の確認表が登録されると、該当する事故の対策に、確認日と結果(再発なし/再発あり/中止)を付け足す
新しい事故を調べるとき
- 【人】 品質管理の担当が、新しい事故の状況(何を、どの工程で、どうなったか)と、分かっている範囲の原因を入れる
- 【自動】 言葉の検索と意味の検索を同時に動かし、点数をそろえて足し合わせ、事故番号ごとに1件にまとめて上位を出す
- 【自動】 Claude が、似た事故ごとに、当時の状況・原因・対策・効果の確認結果を、報告書番号と節付きで並べる
- 【人】 担当が並んだ事故を読み、検討に使うものを選び、必要なら報告書の原本を開く
- 【人】 選んだ事故の番号を検討の資料に貼り、原因と再発防止策を決める
5番目で、事故番号ごとに1件にまとめるのが、この設計の分かれ目です。 報告書は節に分けて登録するので、何もしないと同じ事故の「状況」と「原因」の節が上位を並んで占めます。 担当が見たいのは事故の数であり、節の数ではありません。
7番目と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:承認済みの報告書、過去6年 ├─ 検索パイプライン:normalization-processor(min_max+重み付きの平均) └─ collapse:事故番号ごとに1件 ▼ Claude(Amazon Bedrock)── 検索結果のブロックで渡し、引用付きで並べる ▼ 画面と検討の資料(似た事故・原因・対策・効果の確認結果・報告書番号)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(hybrid、normalization-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つ書けます。
点数をそろえるのは、normalization-processor です。 言葉の検索(BM25)と意味の検索(k-NN)は点数の尺度が違うため、そのまま足すと片方が勝ちます。 このプロセッサは、クエリごとに点数を正規化してから組み合わせます。既定は min_max と arithmetic_mean で、weights でクエリごとの重みを決められます。 重みは0.0〜1.0で、合計を1.0にします。
事故番号ごとのまとめは、hybrid クエリの collapse で行います。 OpenSearch 3.1 で入った機能で、keyword か数値の項目でまとめ、まとまりごとに点数のいちばん高い文書だけを返します。 Amazon OpenSearch Service は 3.5、3.3、3.1 に対応しているので、新しく作るドメインはこのいずれかにします。
03どうやって実装するのか
処理の起点を決める
取り込みと検索で、起点が2つあります。
取り込みは、原因分析の報告書が承認されたときです。 共有フォルダの承認済みの場所にファイルが置かれたことを検知して動かします。承認前の下書きは取り込みません。 原因が確定していない報告書が検索に混ざると、仮の原因が「過去の事故の原因」として返ります。
効果の確認表は、登録されるたびに付け足します。 再発防止策を打ってから一定の期間(たとえば3か月)が過ぎたところで、品質管理の担当が「再発なし」「再発あり」「中止」を記入します。その記入を起点に、該当する事故の対策の項目を更新します。 報告書そのものは取り込み直しません。
検索は、品質管理の担当が新しい事故を調べ始めたときに動きます。 事故台帳に新しい事故が入った時点で自動で検索することもできますが、第一報の段階では状況の書き方が粗く、似た事故の精度が出ません。 担当が状況を整理してから、画面で検索を始める形にします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 原因分析の報告書 | 事故番号、発生日、センター、工程(入荷・保管・ピッキング・梱包・積込・輸送・配達)、荷物の種類、荷姿、事故の区分、状況の文、なぜなぜ分析の文、再発防止策の文 | 共有フォルダの承認済みの場所 |
| 事故台帳 | 事故番号、荷主の区分、被害の数量、車両の種類、天候の欄 | 事故台帳 |
| 効果の確認表 | 事故番号、対策の番号、確認日、結果(再発なし/再発あり/中止)、所見 | 効果の確認表 |
| 探す内容(検索時) | 新しい事故の状況、工程、荷物の種類、分かっている範囲の原因 | 品質管理の担当の入力 |
質を決めるのは、報告書の「状況」と「原因」が節として分かれて書かれているかです。 なぜなぜ分析の書式で書かれた報告書なら、状況・1回目のなぜ・2回目のなぜ……と分かれています。分かれていない報告書は、取り込みで状況と原因を切り分けられず、意味の検索が状況の近さだけで当たることになります。
効果の確認表は、対策の番号で報告書と結びつけます。 報告書の対策が「①フィルムの巻き数を3周から5周に」「②上段の重量物の禁止」のように番号で書かれていれば、確認表の結果を対策ごとに付けられます。番号が無い報告書では、どの対策が効いたかを分けられません。
データの取得方法を決める
報告書は Word で作られ、承認時に PDF にしています。取り込みは、元の Word から文字を取り出し、見出しで節に分けます。 PDF しか残っていない古い報告書は、文字が取り出せるものだけを対象にし、スキャンした画像だけのものは後回しにします。
索引の項目は、次のように持たせます。 1件の文書は「事故1件の1つの節」です。
| 項目 | 型 | 使いどころ |
|---|---|---|
incident_id | keyword | 事故番号。collapse でまとめる単位 |
section | keyword(situation、cause、measure) | 状況・原因・対策の区別 |
text | text(Sudachi) | 言葉の検索 |
text_vector | knn_vector(1,024次元) | 意味の検索 |
occurred_on | date | 過去6年の絞り込み、新しい順の表示 |
center/process/cargo_type/category | keyword | 画面での絞り込みと、答えに添える属性 |
measures | object(番号、文、確認日、結果) | 効いた対策の表示 |
approved | boolean | 承認済みだけに絞る |
意味のベクトルは、Amazon Titan Text Embeddings V2 で作ります。 公式のドキュメントでは、入力は最大8,192トークンまたは50,000文字、出力のベクトルは1,024(既定)、512、256次元から選べます。対応言語は英語で、100以上の言語がプレビューとされているので、日本語の報告書で使う前に、手元の事故で近さが出るかを必ず確かめます。
AIへ渡す前に整形する
- 節に分ける … 報告書を、状況・原因・対策の見出しで分けます。なぜなぜ分析の段は、原因の節にまとめます
- 個人名を外す … ドライバーや作業者の氏名を、「ドライバーA」「作業者B」のような役割の記号に置き換えます
- 呼び方の揺れを記録する … 拠点ごとの呼び方(ラップ/ストレッチフィルム、カゴ車/ロールボックスパレット)を一覧にし、言葉の検索の同義語として使います
- 荷物の種類をそろえる … 荷主ごとの商品名ではなく、「飲料ケース」「大型家電」「小型段ボール」「温度管理品」のような共通の区分に付け直します
- 対策の番号を確かめる … 対策が番号付きで書かれているかを確かめ、無いものは取り込みで印を付けて品質管理に戻します
- ベクトルを作る … 状況の節と原因の節について、Titan Text Embeddings V2 でベクトルを作ります
2番目を軽く見ないでください。 事故の報告書には、ドライバーの氏名と、その人が以前にも事故を起こしたかが書かれていることがあります。検索の目的は起き方の近さで、人を探すことではありません。 氏名を残すと、似た事故の一覧が「同じ人の事故の一覧」として読まれます。
AIに処理させる
AIの仕事は、検索で出た似た事故を、決まった項目で引用付きで並べることだけです。 似た事故を探すのも、事故ごとにまとめるのも検索基盤で行います。
| させること | 中身 |
|---|---|
| 似た事故ごとの要約 | 当時の状況、原因、対策を、報告書の文を引いて1件ずつ並べる |
| 似ている点の書き出し | 新しい事故と、工程・荷物・起き方のどこが同じかを書く |
| 違う点の書き出し | 工程・荷物・環境のどこが違うかを書く |
| 効果の確認結果の添付 | 対策ごとに「再発なし」「再発あり」「中止」「効果未確認」を記録のまま添える |
| させないこと | 理由 |
|---|---|
| 新しい事故の原因の断定 | 原因は現場の確認で決める。似た事故の原因は候補にすぎない |
| 対策が効いたかの判断 | 確認の記録が無ければ「効果未確認」。推測で「有効」と書かない |
| 新しい再発防止策の提案 | 決めるのは品質管理とセンター長 |
| 検索結果に無い事故の補足 | 一般的な物流の知識で事故例を足さない |
| 人への評価 | ドライバーや作業者の良し悪しを書かない |
2行目が、いちばん外せない線です。 報告書の対策の欄には「フィルムの巻き数を増やした」と書かれていて、その後の再発が無ければ、AIは「この対策は有効でした」と書きがちです。再発が無かったのは、荷主が変わったからかもしれません。 効いたかどうかは、効果の確認表に人が書いた結果だけを根拠にします。
3つ目の「違う点」を必ず書かせるのも、同じ理由です。 似ている点だけを並べると、担当は当時の対策をそのまま写したくなります。温度管理品と常温品、自社の車両と委託の車両の違いで、同じ対策が効かないことがあります。
指示内容を固定する
あなたは物流会社の品質管理部で、新しい事故の検討のために過去の似た事故を整理する係です。
渡された検索結果だけを根拠にしてください。一般的な物流の知識で補わないでください。
【新しい事故】
工程:{process} 荷物の種類:{cargo_type} 区分:{category}
状況:{situation}
分かっている範囲の原因:{known_cause}
【検索結果】
事故番号ごとに、状況(situation)、原因(cause)、対策(measure)の節と、
対策ごとの効果の確認結果が渡されます。
【事故ごとに書くこと】
1. 事故番号、発生日、センター、工程、荷物の種類、区分
2. 当時の状況(報告書の文を引用)
3. 当時の原因(報告書の文を引用)
4. 新しい事故と似ている点(工程・荷物・起き方のどこが同じか)
5. 新しい事故と違う点(工程・荷物・車両・環境のどこが違うか)
6. 対策ごとの効果の確認結果を、記録のまま
(再発なし/再発あり/中止。記録が無ければ「効果未確認」)
【厳守事項】
- 効果の確認結果が無い対策を「有効」「効果あり」と書かないでください。
必ず「効果未確認」と書いてください。
- 新しい事故の原因を断定しないでください。
「当時の原因は〜だった」と過去形で書き、新しい事故に当てはめないでください。
- 新しい再発防止策を提案しないでください。
- 違う点が見つからないときも「違う点:記載から判断できない」と書き、空欄にしないでください。
- ドライバーや作業者の評価を書かないでください。
- 似ていないと判断した事故は、「似ている点が少ない」と書いて最後に回してください。
「効果未確認」を2か所に書いているのは、空欄にさせないためです。 確認の記録が無い対策について何も指示しないと、AIは対策の文だけを並べ、読む人は「並んでいる=効いた対策」と受け取ります。 記録が無いことを、文字として画面に出します。
検索結果は、Claude の検索結果ブロックで渡します。 1つの節を1つの search_result にし、source に事故番号と節、title に発生日とセンターと区分、content に節の本文を入れます。公式の説明では、引用付きの答えが返り、検索結果ブロックは Claude API、Amazon Bedrock、Google Cloud で使えます。 中に入れられるのは文字だけで、写真は渡せません。 報告書の写真は、原本へのリンクで画面に出します。
出力形式を固定する
検索パイプラインは、次のように作ります。
PUT /_search/pipeline/incident-hybrid
{
"phase_results_processors": [
{ "normalization-processor": {
"normalization": { "technique": "min_max" },
"combination": {
"technique": "arithmetic_mean",
"parameters": { "weights": [0.4, 0.6] }
}
} }
]
}
検索の要求は、次のように組みます。
GET /incidents/_search?search_pipeline=incident-hybrid
{
"size": 10,
"query": {
"hybrid": {
"filter": { "bool": { "filter": [
{ "term": { "approved": true } },
{ "range": { "occurred_on": { "gte": "now-6y/d" } } }
] } },
"queries": [
{ "match": { "text": "ストレッチフィルム 巻き数 カーブ 上段 崩れ" } },
{ "knn": { "text_vector": { "vector": [0.012, -0.034], "k": 50 } } }
]
}
},
"collapse": { "field": "incident_id" }
}
重みを言葉0.4・意味0.6にしているのは、呼び方の揺れを意味の検索で拾うためです。 ただし、最初からこの値に決める必要はありません。第8章の試しで、ベテランが選んだ事故がどちらの検索で上に来るかを見て決めます。 vector の中身は、Lambda が Titan で作った1,024個の数値です。
画面に返す形は、次のJSONです。
{
"query_incident": { "process": "積込", "cargo_type": "飲料ケース", "category": "荷崩れ" },
"similar": [
{ "incident_id": "INC-2023-0418", "occurred_on": "2023-04-18", "center": "埼玉第2",
"process": "積込", "category": "破損",
"situation": "", "cause": "",
"same_points": "", "different_points": "",
"measures": [
{ "no": 1, "text": "", "result": "再発なし", "checked_on": "2023-07-20" },
{ "no": 2, "text": "", "result": "効果未確認", "checked_on": null }
],
"citations": ["INC-2023-0418/cause"] }
],
"not_found": false
}
1つ目の理由は、measures の result を画面で色分けできることです。 「再発なし」「再発あり」「中止」「効果未確認」を固定の値で返させるので、担当は文章を読む前に、効いた記録のある対策がどれかを一目で分けられます。
2つ目は、same_points と different_points を別の項目にできることです。 1つの文章にすると似ている点ばかりが長くなります。項目を分ければ、違う点が空かどうかを画面の側で確かめられます。
3つ目は、not_found で「似た事故が無い」を区別できることです。 本当に前例が無いのか、言葉の揺れで当たらなかったのかを、後から品質管理が見直す材料になります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ(承認済みの場所) | ファイルの配置を検知 | 承認された報告書を取り込む |
| 効果の確認表 | 登録を毎日確認 | 対策ごとの結果を付け足す |
| 事故台帳 | 事故番号で読み取り | 荷主の区分、車両の種類を添える |
| Amazon Bedrock(Titan) | Lambda からの呼び出し | 状況と原因の文のベクトルを作る |
| Amazon OpenSearch Service | 索引への登録と検索 | hybrid と collapse で似た事故を返す |
| Claude(Amazon Bedrock) | Lambda からの呼び出し | 引用付きで似た事故を並べる |
| 画面 | 品質管理の担当が使う | 検索の入力と結果の表示、検討の資料への貼り付け |
荷主名は、索引に入れません。 荷主の区分(食品、家電、通販など)だけを持たせます。似た事故を探すのに荷主名は要らず、別の荷主の事故が画面に荷主名付きで出ることを避けます。
人が確認する
この構成の確認は、必須です。 出てくるのは検討の材料で、原因と対策は人が決めます。
- 並んだ事故が本当に似ているかを見る … 似ている点と違う点を読み、検討に使う事故を選びます。点数の順に上から使うことはしません
- 原本を開いて確かめる … 検討の資料に使う事故は、報告書の原本と写真を開きます。引用された文が、原本の該当する節にあることを確かめます
- 効果の確認結果を確かめる … 「再発なし」の対策を新しい事故に使うときは、確認表の所見も読みます。 荷主の変更や工程の変更で再発しなくなっただけのこともあります
- 使わなかった事故を記録する … 上位に出たのに使わなかった事故と、その理由(工程が違う、荷物が違う)を一言残します
1件あたり15分を目安にします。 似た事故が5件出れば、1件3分で似ている点と違う点を読み、原本を開くのは選んだ1〜2件です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 似た事故が1件も出ない | 「似た事故は見つかりませんでした」と出し、入力した状況を記録する。近いものを無理に出さない |
| 上位がすべて同じ事故の別の節 | collapse が効いていない。事故番号の項目の型(keyword)を確かめる |
返る事故の数が size より少ない | 既定では上位 size 件の重複を除くため。まとまりの数を size までそろえる設定を有効にする |
| 対策に番号が無い報告書 | 効果の確認結果を対策ごとに付けられない。「対策の番号なし」と出し、確認表の所見を全文で添える |
| 効果の確認表が付いていない | 全対策を「効果未確認」として返す |
| 報告書の原因の節が空 | 状況の節だけで当たった印を付け、「原因の記載なし」と出す |
| Bedrock の呼び出しに失敗した | 検索結果の事故番号・状況・原因の文をそのまま表示する |
3行目は、公式のドキュメントに書かれた動きです。 hybrid クエリで collapse を使うと、既定では上位 size 件の文書の重複を除くため、同じ事故の節が上位に多いと返る事故の数が減ります。index.neural_search.hybrid_collapse_distinct_groups_enabled を有効にすると、size 件までの異なるまとまりを返せます。
記録を残す
- 取り込んだ報告書の事故番号・節・承認日と、取り込んだ日時
- 効果の確認表から付け足した結果と、付け足した日時
- 検索の入力(状況、工程、荷物の種類、区分)と、返した事故番号と点数
- Claude に渡した検索結果と、返ってきた答えと引用
- 担当が使った事故と、使わなかった事故とその理由
- 「似た事故は見つかりませんでした」になった検索
5つ目は、重みと同義語を直す材料です。 3か月分たまったところで、使われた事故が言葉の検索と意味の検索のどちらで上位に来ていたかを数え、重みを見直します。
04実装レベルの3段階
半自動化で、①の探す時間は大きく減ります。 ただし言葉の検索だけでは、拠点ごとの呼び方の違いで落ちる事故が残り、読み比べと効果の確認表を探す作業は人が行います。 本格構成で1件15分になり、この段階が本記事の想定です。
05工数削減シミュレーション
導入後 60件 × 15分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の物流センターと配送の拠点を持ち、荷崩れ・破損・誤配送・誤出荷の事故が月に数十件起きる3PL・運送会社・小売や通販の物流部門で、事故報告と原因分析・再発防止策の記録が数年分たまっているのに、新しい事故のたびに似た事故を探すのがベテランの記憶頼みになっている場合。再発防止策を打ったあとに、効いたかどうかを確かめた記録が残っている場合。AWS を使っており、検索基盤と生成AIを同じ環境で動かせる場合。
- 事故が年に数件で、担当者が全件を覚えていられる場合。事故の記録が報告の1行だけで、原因分析や再発防止策が残っていない場合(先に記録の形をそろえる必要がある)。事故報告を台帳に入れる作業そのものを減らしたい場合(UC-0501 の構成が先)。なお、事故の原因の特定と再発防止策の決定、荷主への説明は品質管理の担当とセンター長が行い、この構成はそれを代わりに行いません。
07最小構成で試す方法
- 過去1年の事故から、ベテランが「この2件は同じ起き方だ」と分かっている組を10組選んでもらう
- その20件の報告書と、近い時期の別の事故の報告書30件を集める(合わせて50件)
- 手元のAIサービスに50件の報告書を貼り、10組の片方の状況だけを入れて「似た事故を3件、似ている点と違う点を添えて挙げてください。報告書に無いことは書かないでください」と指示する
- ベテランの組のもう片方が3件に入ったかを数える
- 入らなかった組について、何が違って見落とされたかを書き出す
| 出てきた内容 | 判断 |
|---|---|
| 10組のうち多くで、組の片方が3件に入る | 索引とハイブリッド検索の構築に進む |
| 入るが、違う点が書かれない、対策を「有効」と書く | 指示の書き方で直る。構成は有効 |
| 報告書の状況と原因が分かれておらず、似た理由が説明できない | 報告書の書式が先。 検索の問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 事故の区分で絞って、似た事故が落ちる | 区分は絞り込みに使わない。 承認済みと期間だけを filter に入れる |
| 言葉の検索か意味の検索の片方が勝つ | normalization-processor で点数をそろえ、weights で重みを決める |
| 同じ事故の節が上位を占める | collapse で事故番号ごとにまとめる |
| 返る事故の数が足りない | 異なるまとまりを size 件まで返す設定を有効にする |
| 新しい事故ほど上に出したいのに、hybrid を包めない | hybrid は最上位のクエリ。 新しさは画面の並べ替えで扱う |
| 原因の集計が事故の件数と合わない | 集計は collapse の前の結果で行われる。節の数を数えている |
| 日本語の近さが出ない | Titan V2 の英語以外はプレビュー。手元の事故で確かめ、代替の埋め込みも比べる |
| 拠点ごとの略称で当たらない | 同義語の一覧を作り、言葉の検索に入れる |
| 対策を「有効」と書く | 効果の確認表の結果だけを根拠にし、無ければ「効果未確認」と指示する |
| 氏名が検索結果に出る | 取り込みで役割の記号に置き換える |
5行目と6行目は、公式のドキュメントに書かれた制約です。 hybrid クエリは function_score などの中に入れられず、collapse と併用した集計はまとめる前の結果で行われます。件数の集計は、事故台帳の側で行います。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 事故の状況と原因、再発防止策、センターと車両の情報、そして報告書に書かれたドライバーや作業者の氏名です。荷主との契約で、事故の内容を第三者に出さない取り決めがあることもあります。
- 氏名を索引に入れない … 取り込みで役割の記号に置き換えます。似た事故の一覧が、人の事故歴の一覧として使われることを防ぎます
- 荷主名を索引に入れない … 荷主の区分だけを持たせ、別の荷主の事故が荷主名付きで画面に出ないようにします
- 見られる範囲を役割で分ける … 細かなアクセス制御を使えば、センターの担当には自センターと全社共通の事故だけ、本社の品質管理には全件、という分け方ができます。有効にしたあとは無効にできないので、ドメインを作るときに決めます
- 似た事故を原因の根拠にしない … 似た事故の原因は候補です。荷主への報告書には、現場で確かめた原因を書きます
誤りが起きた場合のリスクは、似ていない事故の対策をそのまま写すことと、効かなかった対策を効いたものとして打つことの2つです。 前者は「違う点」を必ず書かせること、後者は効果の確認結果を記録のまま返すことで防ぎます。どちらも、判断を人に残す設計で守ります。
10まず何から始めるか
1週目:報告書の書式を確かめる
過去1年の原因分析の報告書を20件開き、状況・原因・対策が節に分かれているか、対策に番号があるか、効果の確認表が付いているかを数えます。
2週目:10組で試す
ベテランに「同じ起き方だ」と分かっている事故の組を10組選んでもらい、手元のAIサービスで似た事故を挙げさせます。組の片方が上位に入るか、対策を「有効」と書いていないかを最優先で見ます。
3週目:同義語の一覧を作る
2週目で見落とされた組から、拠点ごとの呼び方の違いを拾い、同義語の一覧にします。ベテランのセンター長に1時間もらい、よく使う略称を書き出してもらいます。
4週目:節に分けて取り込み、言葉の検索で出す
過去1年分の報告書を節に分けて取り込み、言葉の検索と collapse で事故番号ごとの一覧を出します。品質管理の担当が、新しい事故のたびにこの一覧を使い始めます。
2か月目: 意味の検索を足してハイブリッドにし、使われた事故がどちらの検索で上位に来たかを数えて重みを決めます。3か月目以降: 効果の確認表の付け足しと引用付きの整理を足し、過去6年分に広げます。新しい事故の検討で、ベテランに「前に似たことがあったか」と聞く場面が無くなり、効果の確認の記録が付いた対策から先に検討されるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Amazon OpenSearch Service が OpenSearch 3.5、3.3、3.1 などのバージョンに対応していること | Amazon OpenSearch Service: What is Amazon OpenSearch Service? | 2026-10-07 |
| 対応プラグインの一覧で、Sudachi Analysis が日本語向けに推奨され、Neural Search が含まれること | Amazon OpenSearch Service: Plugins by engine version | 2026-10-07 |
hybrid クエリが複数のクエリの点数を検索パイプラインで1つにまとめ、クエリは最大5つ、filter で全クエリに絞り込みをかけられること。最上位のクエリとして使う前提で、function_score などの中に入れられないこと | OpenSearch Documentation: Hybrid query | 2026-10-07 |
normalization-processor がクエリごとに点数を正規化して組み合わせ、既定が min_max と arithmetic_mean であること。weights が0.0〜1.0で合計1.0、クエリの数と同じ数であること | OpenSearch Documentation: Normalization processor | 2026-10-07 |
hybrid クエリの collapse が 3.1 で入り、keyword か数値の項目でまとめること。既定では上位 size 件の重複を除くこと、異なるまとまりを返す設定があること、集計がまとめる前の結果で行われること | OpenSearch Documentation: Collapsing hybrid query results | 2026-10-07 |
| Titan Text Embeddings V2 の入力が最大8,192トークンまたは50,000文字、出力が1,024(既定)・512・256次元、言語が英語で100以上の言語がプレビューであること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-07 |
| 細かなアクセス制御で、文書レベル・項目レベルのセキュリティを役割ごとに設定できること。有効にしたあと無効にできないこと | Amazon OpenSearch Service: Fine-grained access control | 2026-10-07 |
検索結果ブロック(source・title・content)で引用付きの答えが返ること。Claude API、Amazon Bedrock、Google Cloud で使え、中身は文字だけであること | Claude Docs: Search results | 2026-10-07 |
事故の原因の特定と再発防止策の決定、荷主への報告は、自社の品質管理の手順と荷主との取り決めに従ってください。 本記事は公開仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0726)についてのご相談はこちらから。
