自動車整備工場で、客が訴える異音・警告灯・振動の症状から過去の整備記録と修理事例を探し、原因の候補と点検の順番を根拠付きで返す
客が訴える「走り出しにキュルキュル鳴る」「エンジンの警告灯が点いた」といった症状から、自社の過去の整備記録と修理事例を探します。同じ型式・近い走行距離で何が原因だったかを件数で並べ、点検の順番の案を事例番号付きで整備士に渡します。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- その他/小売/物流
- 対象部門
- 生産
- 対象業務
- 情報検索/比較検討
- 主な課題
- 判断に時間がかかる/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 判断支援/属人化解消/検索時間短縮
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- フロントが客から症状を聞き、受付のメモに書く(いつ、どんなときに、どこから、どんな音か)
- 整備士が受付のメモを読み、故障診断機をつないで故障コードを読む
- 整備管理のシステムで、同じ車の過去の整備記録を開く
- 同じ型式の似た症状の記録を探す。システムの検索は車両と作業の名前でしか引けないため、思い当たる作業名で何度か検索する
- 修理事例のノートを表計算で開き、型式と言葉で絞り込む
- 見つからなければ、工場長かベテランに聞く
- 点検の順番を決め、作業指示に書いて点検に入る
- 人フロントが受付のメモを書く。音の種類・出る条件・場所は選択肢から選び、客の言葉は自由記述に残す
- 人整備士が故障診断機で故障コードを読み、整備管理のシステムの作業指示に入れる
- 自動作業指示の「症状の検索」のボタンで、受付のメモと故障コード、車両の型式・走行距離が送られる
- 自動Claude API が、受付のメモから症状の区分(音の種類、出る条件、部位の手がかり)を取り出す
- 自動OpenSearch で、同じ型式 → 同じ車種の系統 → 同じエンジン型式の順に絞って、近い事例を探す
- 自動同じ絞り込みで、原因の区分ごとの件数を集計する
- 自動Claude API が、上位の事例の要点と、件数と点検にかかる時間から組んだ点検の順番の案を、事例番号付きで並べる
- 人整備士が事例と案を読み、車を見て点検の順番を決める
- 人原因が分かったら、作業の記録に原因の区分と短い説明を入れる(選択肢から選ぶ)
- 自動記録が確定したら、事例として索引に足す
各工程の詳しい説明を読む
- フロントが客から症状を聞き、受付のメモに書く(いつ、どんなときに、どこから、どんな音か)
- 整備士が受付のメモを読み、故障診断機をつないで故障コードを読む
- 整備管理のシステムで、同じ車の過去の整備記録を開く
- 同じ型式の似た症状の記録を探す。システムの検索は車両と作業の名前でしか引けないため、思い当たる作業名で何度か検索する
- 修理事例のノートを表計算で開き、型式と言葉で絞り込む
- 見つからなければ、工場長かベテランに聞く
- 点検の順番を決め、作業指示に書いて点検に入る
(a)客の言葉で探しても見つからない。 受付のメモは「ブレーキを踏むとゴーという音」ですが、記録は「ローター偏摩耗」「パッド残量少」と原因や作業の言葉で書かれています。4番目と5番目で、整備士は症状から思い当たる原因の言葉を自分で考えて探しています。 考えつかない原因の記録には、たどり着きません。
(b)探せる人が限られる。 ノートの絞り込みは、何を探せばよいかが分かっている人にしか使えません。若手の整備士は6番目に飛び、工場長が手を止めて答えます。 工場長が休みの日は、若手が教科書どおりの順番で点検を始めます。
(c)点検の順番が人によって違う。 同じ型式の同じ症状でも、ある整備士はベルトから、別の整備士はプーリーから見ます。当たりの多いところから見る人と、見慣れたところから見る人では、原因に着くまでの時間が違い、客への連絡の時刻も変わります。
(d)見つけた原因が次に残らない。 ノートに書くのはベテランだけで、若手が見つけた原因はどこにも残りません。
- 【人】 フロントが受付のメモを書く。音の種類・出る条件・場所は選択肢から選び、客の言葉は自由記述に残す
- 【人】 整備士が故障診断機で故障コードを読み、整備管理のシステムの作業指示に入れる
- 【自動】 作業指示の「症状の検索」のボタンで、受付のメモと故障コード、車両の型式・走行距離が送られる
- 【自動】 Claude API が、受付のメモから症状の区分(音の種類、出る条件、部位の手がかり)を取り出す
- 【自動】 OpenSearch で、同じ型式 → 同じ車種の系統 → 同じエンジン型式の順に絞って、近い事例を探す
- 【自動】 同じ絞り込みで、原因の区分ごとの件数を集計する
- 【自動】 Claude API が、上位の事例の要点と、件数と点検にかかる時間から組んだ点検の順番の案を、事例番号付きで並べる
- 【人】 整備士が事例と案を読み、車を見て点検の順番を決める
- 【人】 原因が分かったら、作業の記録に原因の区分と短い説明を入れる(選択肢から選ぶ)
- 【自動】 記録が確定したら、事例として索引に足す
8番目が、この設計の分かれ目です。 オイルのにじみ、前回の修理の跡、後付けの部品は、車を見た整備士にしか分かりません。
9番目を選択肢にするのも、意図してのことです。 原因を自由に書いてもらうと、次の検索で集計できません。原因の区分を選び、説明は1行だけ書く形にすると、若手が見つけた原因も次の件数に入ります。
02今回想定するシステム構成
受付のメモ・故障コード・車両の型式と走行距離(整備管理のシステム) ▼【トリガー】作業指示の「症状の検索」のボタン AWS Lambda ▼ Claude API ── 受付のメモから症状の区分を取り出す(構造化出力) ▼ Amazon Bedrock(Titan Text Embeddings V2)── 症状の文の埋め込み ▼ Amazon OpenSearch Service(kuromoji で日本語を解析) ├── ハイブリッド検索(型式 → 車種の系統 → エンジン型式の3段で絞る) └── terms 集計で、原因の区分ごとの件数 ▼ 上位の事例(症状・原因・直し方・点検にかかった時間) ▼ Claude API ── 事例の要点と点検の順番の案(事例番号付き) ▼ 作業指示の画面 ──【人】整備士が順番を決める ── 原因の記録 ── 索引へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(ハイブリッドクエリ、normalization-processor、terms 集計) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | Cohere Embed、OpenAI の埋め込みモデル |
| 生成AI | Claude API(症状の区分の取り出しと、事例の要点・点検の順番の案) | Azure OpenAI(Microsoft Foundry)、OpenAI API |
| 連携 | AWS Lambda(整備管理のシステムからの呼び出し、記録の取り込み) | AWS Step Functions |
| 保管 | Amazon S3(索引に入れる前の記録の書き出し) | 社内のファイルサーバー |
整備管理のシステムには、この構成から書き込みません。 作業指示の画面から呼ばれて結果を返すだけで、原因の記録は整備士がいつもの画面で入れます。
日本語の解析は、すべてのドメインに入っている Japanese(kuromoji)Analysis を使います。 AWS の一覧では任意で足す Sudachi も日本語に「推奨」とされており、部品名の辞書を足したくなったら切り替えを検討します。 Sudachi の辞書の差し替えはすぐには反映されないとされています。
点数の合わせ方は、normalization-processor の min_max と、重みを付けた算術平均にします。 単語の一致の点数と、意味の近さの点数は尺度が違うので、それぞれを0から1にそろえてから合わせます。この題材では、部品名と症状の区分の言葉の一致が効くので、単語の一致の側を重くします。 重みは合計が1になるように指定します。
埋め込みの Titan Text Embeddings V2 は英語に最適化され、日本語はプレビューの対応です。 どこまで効くかは自社の記録で最初に確かめます。
03どうやって実装するのか
処理の起点を決める
整備士が作業指示の画面で「症状の検索」のボタンを押したときに動かします。 受付の時点で自動で動かさないのは、故障コードが診断機をつないでから分かるからです。
ボタンは何度でも押せるようにします。 点検の途中で「左前から音がする」と分かったら、追記してもう一度押します。
もう1つの起点は、作業の完了です。 整備士が原因の区分を選んで作業の記録を確定したら、その記録を事例として索引に足します。足すのは原因の区分が選ばれた記録だけです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 受付のメモ | 客の言葉、音の種類・出る条件・場所の選択肢、いつから、頻度 | 整備管理のシステム |
| 故障コード | 診断機で読んだコードと、現在か過去かの区分 | 作業指示(整備士が入力) |
| 車両 | 車名、型式、エンジン型式、駆動方式、年式、走行距離 | 整備管理のシステム |
| 過去の事例 | 事例番号、型式、車種の系統、エンジン型式、走行距離、症状、故障コード、原因の区分、直し方、点検にかかった時間、日付 | 事例の索引 |
| 車種の系統の表 | 型式ごとに、同じ車台・同じ部品を使う系統 | 整備課で作る表 |
| 言葉の対応表 | 客の言い方と整備の言い方、原因の区分の一覧 | 整備課とフロントで作る表 |
質を決めるのは、いちばん下の2つです。 系統の表が無ければ、同じ型式の事例が少ないときに探しに行く先がありません。
同じ車の過去の整備記録も別に引きます。 「前回、ベルトの交換をすすめたが見送り」と書かれていれば、点検の順番の最初に置く材料になります。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 近い事例 | 事例の索引 | ハイブリッドクエリ(症状の match + 埋め込みの knn)、型式・系統・エンジン型式で filter、上位10件 |
| 原因の区分ごとの件数 | 事例の索引 | 同じ filter と症状の区分で絞った通常の検索で size 0、terms 集計 |
| 同じ車の過去の記録 | 整備管理のシステム | 車両の番号で直近5回の入庫 |
検索パイプラインと検索の形は、次のようになります。
PUT /_search/pipeline/symptom-hybrid
{
"phase_results_processors": [
{ "normalization-processor": {
"normalization": { "technique": "min_max" },
"combination": { "technique": "arithmetic_mean",
"parameters": { "weights": [0.6, 0.4] } } } }
]
}
POST /repair-cases/_search?search_pipeline=symptom-hybrid
{
"size": 10,
"_source": ["case_id", "model_code", "platform", "engine_code", "mileage_km",
"symptom", "dtc", "cause_category", "fix", "inspect_minutes",
"repaired_on"],
"query": {
"hybrid": {
"queries": [
{ "match": { "symptom": "冷間始動 走り出し 前方 キュルキュル 数秒で止む" } },
{ "knn": { "symptom_vector": { "vector": [0.0], "k": 30 } } }
],
"filter": {
"bool": {
"filter": [
{ "term": { "platform": "P-07" } },
{ "term": { "symptom_category": "noise_squeal" } },
{ "range": { "mileage_km": { "gte": 30000, "lte": 90000 } } }
]
}
}
}
}
}
filter は1つの検索の形で書き、複数の条件は bool にまとめます。 ハイブリッドクエリは検索の最上位に置くもので、function_score などの中に入れるとエラーか正規化が飛ばされることがあるとされています。新しい事例を上にしたくても、点数の関数で包まず、表示の段で並べ替えます。
3段の絞り込みは、まず model_code(上の例は2段目の platform)で検索し、上位が3件に満たなければ広げて検索し直します。 どの段の結果かを match_level として画面に渡します。min_max では、結果が1件しか無い検索ではその1件が1.0になるので、match_level と件数を一緒に表示します。
原因の区分ごとの件数は、ハイブリッドクエリとは別の通常の検索で数えます。
POST /repair-cases/_search
{
"size": 0,
"query": { "bool": { "filter": [
{ "term": { "platform": "P-07" } },
{ "term": { "symptom_category": "noise_squeal" } },
{ "term": { "condition": "cold_start" } }
] } },
"aggs": {
"by_cause": {
"terms": { "field": "cause_category", "size": 10, "missing": "unrecorded" },
"aggs": { "avg_minutes": { "avg": { "field": "inspect_minutes" } } }
}
}
}
集計を別の検索にするのは、母数を「絞り込みに当たる全件」にするためです。 terms 集計の対象は keyword などの項目で、size の既定は10です。missing を指定すると、原因の区分が入っていない記録を1つの区分にまとめて数えられます。
AIへ渡す前に整形する
- 修理事例のノートの取り込み … 約1,800件の行を事例の項目にそろえます。原因が欠けた行は
unrecordedにします - 整備記録からの事例の起こし … 直近3年の症状の入庫のうち、原因が書かれたものだけを整備士が区分を付けて起こします
- 言葉のそろえ … 「ベルト鳴き」「Vベルト異音」を
belt_squealのように原因の区分に、「キュルキュル」「キーキー」をnoise_squealのように症状の区分にします。そろえられないものはotherにして原文を残します - 車種の系統の付与 … 車種の系統の表から、すべての事例に
platformを付けます - 故障コードの正規化 … 大文字にそろえ、現在のコードか過去のコードかを分けて持ちます
- 症状の文と埋め込み … 症状の区分・出る条件・場所・客の言葉をつないだ150字程度の文を作り、Titan Text Embeddings V2 で埋め込みます
事例の1件は、次のような形にします。集計と絞り込みに使う項目は keyword にし、症状と直し方の文だけを kuromoji で解析する text にします。
{
"case_id": "RC-2025-0612",
"model_code": "XYZ-A10",
"platform": "P-07",
"engine_code": "E-1.5A",
"mileage_km": 62000,
"symptom_category": "noise_squeal",
"condition": "cold_start",
"location_hint": "engine_front",
"symptom": "朝いちばんの始動から走り出しまでキュルキュル鳴り、数秒で止む。雨の日に強い",
"dtc": [],
"cause_category": "belt_tensioner",
"fix": "オートテンショナー交換、ベルト同時交換",
"inspect_minutes": 20,
"repaired_on": "2025-11-08",
"source": "notebook"
}
3番目が、件数の質を決めます。 そろえないまま数えると、同じ原因が「ベルト鳴き」「Vベルト」「補機ベルト」に割れ、どれも件数が少なく見えます。 当てはまらない言い方だけを生成AIで区分の候補に当て、整備士が確かめます。
AIに処理させる
させるのは2つです。受付のメモから検索に使う症状の区分を取り出すことと、検索の結果から事例の要点と点検の順番の案を並べることです。
| させること | 中身 |
|---|---|
| 症状の区分の取り出し | 音・警告灯・振動などの種類、出る条件(冷間・加速・旋回・制動・速度帯)、場所の手がかり、いつから、頻度 |
| 事例の要点 | 上位の事例ごとに、症状・原因・直し方を1〜2文で |
| 点検の順番の案 | 集計の件数と平均の点検時間から、見る順番を事例番号付きで並べる |
| 確かめる質問 | 受付のメモで欠けている条件(どの速度で、曲がるときか)を、客に聞く質問として挙げる |
| させないこと | 理由 |
|---|---|
| 原因の決定 | 車を見た整備士が決める |
| 件数の集計 | 検索基盤の集計で数える |
| 事例に無い原因の推測 | 一般的な知識で原因を足すと、記録と推測の区別が消える |
| 安全に走れるかの判断 | 客への説明は整備士が行う |
3行目がいちばん起きやすい失敗です。 生成AIは「ウォーターポンプの可能性もあります」と書けますが、それは自社の記録ではなく一般論です。
点検の順番の案は、件数だけで並べません。 件数が多くても点検に1時間かかる原因より、5分で確かめられる原因を先に見るほうが早く着くことがあります。件数と平均の点検時間を両方渡し、並べる決まりをプロンプトに書きます。
指示内容を固定する
あなたは自動車整備工場の整備課で、症状の訴えで入庫した車について、
自社の過去の修理事例を整理し、点検の順番の案を作る立場です。
原因を決めないでください。決めるのは車を見た整備士です。
【やること】
1. 検索で見つかった事例を読み、事例ごとに症状・原因・直し方を1〜2文でまとめてください。
2. 集計の結果(原因の区分ごとの件数と平均の点検時間)を使い、
点検の順番の案を作ってください。並べ方の決まり:
- 件数が多く、平均の点検時間が短いものを先にする
- 件数が同じくらいなら、点検時間が短いものを先にする
- 同じ車の過去の記録で「見送り」になった項目があれば、最初に置く
各項目に、並べた理由を1行と、根拠の事例番号(case_id)を付けてください。
3. 受付のメモで欠けている条件を、客に確かめる質問として最大3つ挙げてください。
【厳守事項】
- 件数を自分で数えないでください。集計の結果の数字だけを使ってください。
- 検索結果に無い事例番号を書かないでください。
- 事例に無い原因を、一般的な知識から足さないでください。
- match_level が platform や engine の事例は、同じ型式の事例ではないことを必ず書いてください。
- cause_category が unrecorded の件数は、原因の記録が無い件数として書いてください。
- 「安全です」「走行に問題ありません」など、車の状態を判断する表現を書かないでください。
- 故障コードがある場合、コードが一致する事例とそうでない事例を分けて書いてください。
【受付のメモと故障コード】{intake}
【車両】{vehicle}
【同じ車の過去の記録】{history}
【検索結果(上位の事例と match_level)】{cases}
【集計(原因の区分ごとの件数と平均の点検時間)】{aggregations}
「事例に無い原因を足さない」を明記しないと、一般論が混ざります。 整備士は画面の候補を自社で見つかったものと読むので、記録の上ではいちばん少ない原因から点検を始めることになります。 match_level の一文も同じで、同じエンジンでもベルトの取り回しが違う車があります。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。 output_config.format に JSON スキーマを渡します。
{
"symptom": {
"category": "noise_squeal | noise_knock | noise_grind | warning_light | vibration | other",
"condition": [],
"location_hint": "",
"since": "",
"frequency": ""
},
"cases": [
{ "case_id": "RC-2025-0612", "match_level": "model | platform | engine",
"dtc_match": true, "summary": "" }
],
"inspection_order": [
{ "step": 1, "cause_category": "", "count": 0, "avg_minutes": 0,
"reason": "", "evidence_cases": [] }
],
"questions_for_customer": [],
"unrecorded_count": 0
}
1つ目の理由は、evidence_cases と cases の事例番号を照らせることです。 検索結果に無い番号が evidence_cases に入っていたら、その行は表示しません。
2つ目は、count と avg_minutes を集計の結果と照らせることです。 AIが書いた件数が集計の数字と違えば、その行は集計の数字で表示し直します。 構造化出力は数値の最小・最大の制約に対応していないため、件数の範囲の確かめはプログラムの側で行います。 応答が refusal や max_tokens で終わったときは、スキーマに合わないことがあるので受け付けずにやり直します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 整備管理のシステム | 作業指示の画面のボタンから Lambda を呼ぶ | 受付のメモ、故障コード、車両、同じ車の過去の記録 |
| Claude API | Messages API の構造化出力 | 症状の区分の取り出し、事例の要点と点検の順番の案 |
| Amazon Bedrock | Titan Text Embeddings V2 の呼び出し | 症状の文の埋め込み |
| Amazon OpenSearch Service | 検索パイプラインを指定した _search、集計 | 近い事例と原因の区分ごとの件数 |
| 作業指示の画面 | 結果の表示 | 事例、点検の順番の案、客への質問 |
| 事例の索引 | 作業の確定の通知で Lambda が取り込む | 原因の区分が選ばれた記録 |
外部の呼び出しに対応していない整備管理のシステムでは、別の検索画面から始めます。
人が確認する
match_levelとdtc_matchを見る … 同じ型式・同じ故障コードの事例が上にあるかを確かめます- 根拠の事例を1〜2件開く … 症状の書き方が目の前の車と同じかを読みます
- 車を見て順番を決める … にじみ、前回の修理の跡、後付けの部品など、記録に無いものを見ます
- 原因を記録する … 原因の区分を選び、説明を1行書きます。案と違う原因だったときこそ必ず記録します
4番目を省かないでください。 案と違う原因の記録が、次の同じ症状の件数を変えます。案どおりの原因ばかりが記録されると、件数は今の傾向を強めるだけになります。
目標は、240件をならして1件10分です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 型式・系統・エンジン型式のどの段でも事例が無い | 「近い事例なし」と出し、症状の区分だけで全車種の件数を参考に出す |
| 受付のメモが短すぎて区分が取れない | 区分を other にし、questions_for_customer だけを表示する |
| 車種の系統の表に型式が無い | 型式の次はエンジン型式の段に進み、系統の未整備を一覧に出す |
| 故障コードが事例のどれとも一致しない | コードの一致を外して検索し、「コードの一致なし」と表示する |
構造化出力が refusal や max_tokens で終わる | 受け付けず再実行。2回続けば検索結果と集計だけを表示 |
| OpenSearch か Bedrock が応答しない | 「検索できません」と表示し、従来どおりノートを開く |
1行目と3行目が、始めて数か月はいちばん多く出ます。 AIの問題ではなく、事例と表が足りないことの表れです。
記録を残す
- 受付のメモ、故障コード、型式と走行距離、取り出した症状の区分
- 検索の条件(
filter、match_level、重み)と、上位の事例番号と点数 - 集計の結果と、
unrecordedの件数 - Claude API の出力と、指示の版
- 整備士が決めた点検の順番と、実際に見つかった原因の区分
最後の行が、この仕組みを育てます。 案の1番目で原因が見つかった割合を毎月数えると、系統の表か言葉の対応表を見直すべき型式が分かります。
04実装レベルの3段階
最小構成では、件数が数えられません。 貼り付けた範囲の行を生成AIが読むだけなので、母数が分からず、系統を広げることもできません。 確かめるための段階です。 半自動化で、1件25分が15分程度になります。 検索と件数は画面で出ますが、受付のメモを区分に直す作業と、件数から順番を考える作業が整備士に残ります。本格構成で10分になり、この段階が本記事の想定です。 差が大きいのは、客の言葉を整備の言葉に置き換える作業を、毎回整備士が頭の中でしていたからです。 段階を飛ばさないでください。 半自動化の画面を2か月使うと、事例が少ない型式と unrecorded が多い原因が先に分かります。
05工数削減シミュレーション
導入後 240件 × 10分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 車検・点検に加えて故障の修理を受けている整備工場やディーラーの工場、運送会社の自社の整備部門で、症状の訴えでの入庫が月に百件を超える場合。過去の整備記録が整備管理のシステムに残っているが、「前に同じ音の車があった」を探せるのがベテランの整備士だけになっている場合。AWS を使える担当か委託先がいる場合。
- 入庫の大半が車検と定期点検で、症状の訴えで入る車が月に数台の工場。整備記録が紙の伝票だけで、作業の内容と原因が書かれていない場合(先に記録の書き方をそろえるところから始めます)。特定の車種だけを扱い、メーカーの診断の仕組みで原因が絞れる専業の工場。なお、故障の原因の特定、修理の方法と見積の決定、保安基準に適合するかの判断は、この構成では代替できません。過去の記録を探して示すまでです。
07最小構成で試す方法
- 修理事例のノートから、入庫の多い車種の系統を3つ選ぶ
- 各系統について、直近の症状の入庫を10件ずつ選ぶ(原因が意外だったものを必ず含める)
- ノートの該当する系統の行(数十〜百行程度)を表計算から書き出し、手元のAIサービスに貼り付ける
- 1件ずつ受付のメモを貼り、「このノートの中から近い事例を探し、原因ごとの件数と点検の順番の案を事例番号付きで出してください。ノートに無い原因は書かないでください」と指示する
- 出てきた順番を、その車を担当した整備士が実際に見た順番と、見つかった原因と比べる
30件は必ずやってください。 検索基盤を作る前に、「ノートの記録で、症状から原因の候補が絞れるのか」を確かめます。 ノートの行を貼るときは、氏名・登録番号の列を外してください。
| 出てきた内容 | 判断 |
|---|---|
| 実際の原因が順番の上位3つに入る | 検索基盤に進む。 記録に手がかりがある |
| ノートに無い原因を書いた | 指示の書き方で直る。構成は有効 |
| 客の言葉とノートの言葉が合わず事例が出ない | 言葉の対応表が先。 区分をそろえてから取り込む |
3行目が出ることは珍しくありません。 失敗ではなく、ベテランが頭の中で言葉を置き換えていたことが分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 客の言葉で探して事例が出ない | 受付のメモを区分に直してから探す。言葉の対応表を育てる |
| 同じ原因が別の言い方で割れて件数が少なく見える | 原因の区分を決め、取り込みの段でそろえる |
| 一般論の原因が案に混ざる | 「事例に無い原因を書かない」を指示に明記し、事例番号で照らす |
| 系統まで広げた事例を同じ型式と読む | match_level を必ず表示し、指示にも書く |
| 1件しかない段の点数が高く見える | min_max の性質。件数と段を一緒に表示する |
| 集計の件数を上位10件から作らせる | 通常の検索の terms 集計で数え、その数字だけを渡す |
| 原因が書かれていない記録が多い | missing で unrecorded にまとめて数え、画面に出す |
| 日本語の埋め込みが思ったほど効かない | Titan V2 の日本語はプレビュー。単語の一致の側を重くし、自社の記録で確かめる |
| 原因の記録が続かない | 選択肢から選ぶ形にし、案と違ったときだけ説明を書く |
| 件数を客への説明に使う | 件数は工場の記録の数。説明は車を見て分かったことで行う |
上の3行が、この構成の失敗のほとんどです。 どれも「言葉がそろっていない」か「記録と推測が混ざる」かで起きます。
下の2行は、運用が始まってから効いてきます。 件数を客に見せると、「この部品が7割」が「7割の確率で壊れている」に聞こえます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 受付のメモ(客の言葉)、車両の型式・走行距離・故障コード、過去の整備記録と修理事例です。整備管理のシステムには、客の氏名・連絡先・車両の登録番号も入っています。
- 索引に個人の情報を入れない … 氏名・電話番号・住所・車両の登録番号は、事例の索引にも埋め込みにも入れません。事例番号から整備管理のシステムに戻れれば足ります
- 受付のメモの自由記述を確かめてから渡す … 客の言葉の欄に、氏名や勤め先が書かれることがあります。取り込みの段で電話番号や登録番号の形の文字列を伏せ、生成AIに渡すのは症状の部分だけにします
- 原因を決めさせない … この構成が出すのは過去の記録と点検の順番の案までです。原因の特定、修理の方法、見積は整備士が決めます。 検査の合否や、保安基準に適合するかの判断にも使いません
- 件数を確率として説明しない … 工場の記録の偏り(よく来る車種、記録を書く整備士)がそのまま件数に出ます。客への説明に件数や順番の案を使わないことを、フロントとも決めておきます
- 索引の閲覧を工場の中に限る … 修理事例は工場の技術の蓄積です。検索画面は社員の認証の中に置き、メーカーの技術情報を入れるときはその利用条件を確かめます
誤りが起きた場合のリスクは、案の順番に引っぱられて本当の原因を見落とすことと、一般論を自社の事例と読んでしまうことの2つです。 前者は整備士が車を見る工程で、後者は事例番号の照らし合わせで防ぎます。
10まず何から始めるか
1週目:言葉の対応表と原因の区分を作る
工場長とベテラン2名に、よく来る症状の客の言い方と、整備記録での書き方を挙げてもらいます。原因の区分は30前後から始めます。 細かくしすぎると、1つあたりの件数が少なくなります。
2週目:30件で試す
入庫の多い3つの系統で各10件を選び、ノートの行を手元のAIサービスに貼って、近い事例と順番の案を出させます。実際に見た順番と、見つかった原因と並べて見ます。
3週目:車種の系統の表を作る
入庫の多い型式から、同じ車台・エンジン・足回りの部品を使う系統を、ベテランに聞いて表にします。全型式をそろえる必要はありません。
4週目:索引を作る
修理事例のノートを区分にそろえて OpenSearch に入れ、検索画面から型式と症状の区分で探せるところまで作ります。この時点では点検の順番の案を出さず、事例と件数だけを見ます。
2か月目: 受付のメモからの区分の取り出しと、3段の絞り込みを足し、作業指示の画面から呼べるようにします。原因の記録の選択肢を作業の確定に組み込みます。3か月目以降: 点検の順番の案を足し、案の1番目で原因が見つかった割合を毎月数えます。外れの多い型式の系統の表と言葉の対応表を直し、若手の整備士が工場長に聞かずに点検に入れる件数が増えた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Japanese(kuromoji)Analysis がすべてのドメインに含まれること。Sudachi が日本語に推奨される任意のプラグインで、辞書の差し替えがすぐには反映されないこと | AWS: Plugins by engine version | 2026-10-14 |
ハイブリッドクエリの検索が最大5つで、filter は1つの検索の形で書き複数の条件は bool にまとめること。検索の最上位に置くもので、function_score などの中に入れるとエラーか正規化が飛ばされることがあること | OpenSearch: Hybrid query | 2026-10-14 |
正規化の既定が min_max、合わせ方の既定が arithmetic_mean で、weights の合計が1.0であること。結果が1件の検索ではその文書が1.0になること | OpenSearch: Normalization processor | 2026-10-14 |
terms 集計の対象が keyword などの項目で、size の既定が10、missing で項目が無い文書を1つの区分に入れられること | OpenSearch: Terms aggregation | 2026-10-14 |
| Titan Text Embeddings V2 の入力が8,192トークン・50,000字まで、出力が1,024(既定)・512・256次元であること。英語に最適化され、日本語を含む100を超える言語の対応がプレビューであること | AWS: Amazon Titan Text Embeddings models | 2026-10-14 |
output_config.format に JSON スキーマを渡すとスキーマに合う JSON が返ること。数値の minimum・maximum などの制約に対応しないこと。refusal・max_tokens で終わるとスキーマに合わないことがあること | Claude Docs: Structured outputs | 2026-10-14 |
故障の原因の特定、修理の方法と見積、検査の判断は、整備士と工場の責任者が行ってください。 本記事は公開されている製品の仕様で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1534)についてのご相談はこちらから。
