社内ヘルプデスクのチケットを既知の障害・過去のチケットと突き合わせて分類し、既知事象への紐付けと回答の候補を付ける
社内ヘルプデスクに届いたチケットを、既知事象の台帳と過去のチケットに意味の近さで突き合わせ、「既知事象に該当」「過去に類似あり」「新しい事象」に分類します。該当する既知事象の番号と、回避策から写した回答の候補を付けて担当者に渡します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- IT・SaaS/教育/製造/金融
- 対象部門
- 情報システム
- 対象業務
- 分類・仕分け/問い合わせ対応
- 主な課題
- 問い合わせが多い/属人化している/情報が見つからない
- AIで行う処理
- 分類
- 主な効果
- 対応スピード向上/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者がチケットを開き、本文を読んで症状を把握する
- 似た問い合わせが過去にあったかを、チケットの検索画面でキーワードを変えながら探す
- 心当たりがあれば既知事象の台帳を開き、該当しそうなものを探す
- カテゴリ(ネットワーク・会議ツール・業務システムなど)を選び、既知事象があれば番号を書き込む
- 回避策や過去の解決方法を写して回答を書き、利用者に送る
- 該当が無ければ調査に回し、必要なら問題管理の担当へ連絡する
- 月末に、カテゴリと既知事象ごとの件数を集計して報告する
- 自動チケットが作られたことを起点に、本文から氏名と署名を除き、サービス名を正式名称にそろえる
- 自動本文を埋め込みのベクトルに変える
- 自動既知事象のインデックスと過去のチケットのインデックスを、ハイブリッド検索で引く
- 自動上位の候補とチケットの本文を Claude に渡し、区分とカテゴリと根拠を決めた形のJSONで受け取る
- 自動区分が「既知事象に該当」なら、その既知事象の回避策から回答の候補を作る
- 自動結果をチケットの「AI候補」の欄に書き込む。紐付けそのものは確定しない
- 人担当者が候補を見て、紐付けを確定するか、別の既知事象を選ぶか、外す
- 人回答の候補を直して利用者へ送る
- 自動「新しい事象」の区分で症状の近いチケットが一定数たまったら、問題管理の担当へ知らせる
- 自動月末に、確定した紐付けから既知事象ごとの件数を集計する
各工程の詳しい説明を読む
- 担当者がチケットを開き、本文を読んで症状を把握する
- 似た問い合わせが過去にあったかを、チケットの検索画面でキーワードを変えながら探す
- 心当たりがあれば既知事象の台帳を開き、該当しそうなものを探す
- カテゴリ(ネットワーク・会議ツール・業務システムなど)を選び、既知事象があれば番号を書き込む
- 回避策や過去の解決方法を写して回答を書き、利用者に送る
- 該当が無ければ調査に回し、必要なら問題管理の担当へ連絡する
- 月末に、カテゴリと既知事象ごとの件数を集計して報告する
(a)同じ事象が束ねられない。 2番目の検索は言葉の一致で探すので、「画面共有」で探すと「資料が映らない」は出てきません。 担当者が違えば探す言葉も違い、同じ既知事象に当たるはずのチケットが、半分以上は番号の付かないまま閉じられます。 月末の件数が実際より少なく出るので、恒久対策が後回しになります。
(b)分類が担当者ごとに違う。 勤怠システムの画面がVPN経由で開かないチケットを、ある担当者は「ネットワーク」、別の担当者は「業務システム」に入れます。分類の基準は文書にありますが、迷う境目までは書かれていません。
(c)回避策を知っている人が限られる。 既知事象の台帳を日頃から見ているのは、経験の長い2名です。この2名が休むと、回避策のある問い合わせにも「調査します」と返すことになります。
- 【自動】 チケットが作られたことを起点に、本文から氏名と署名を除き、サービス名を正式名称にそろえる
- 【自動】 本文を埋め込みのベクトルに変える
- 【自動】 既知事象のインデックスと過去のチケットのインデックスを、ハイブリッド検索で引く
- 【自動】 上位の候補とチケットの本文を Claude に渡し、区分とカテゴリと根拠を決めた形のJSONで受け取る
- 【自動】 区分が「既知事象に該当」なら、その既知事象の回避策から回答の候補を作る
- 【自動】 結果をチケットの「AI候補」の欄に書き込む。紐付けそのものは確定しない
- 【人】 担当者が候補を見て、紐付けを確定するか、別の既知事象を選ぶか、外す
- 【人】 回答の候補を直して利用者へ送る
- 【自動】 「新しい事象」の区分で症状の近いチケットが一定数たまったら、問題管理の担当へ知らせる
- 【自動】 月末に、確定した紐付けから既知事象ごとの件数を集計する
7番目が、この設計の分かれ目です。 AIの候補は欄に書くだけで、既知事象の件数に数えるのは、担当者が確定したものだけです。 候補をそのまま数えると、誤った紐付けが件数を押し上げ、問題管理の優先順位が検索の癖で決まってしまいます。
02今回想定するシステム構成
チケット(フォーム/メール/チャット) ▼【トリガー】ITサービス管理ツールでチケットが作られる(Webhook) AWS Lambda ├──▶ 氏名・署名の除去、サービス名の統一 ▼ Amazon Titan Text Embeddings V2(Amazon Bedrock)── 本文をベクトルに ▼ Amazon OpenSearch Service ── ハイブリッド検索 │ ① 言葉の一致(日本語の形態素解析) ② ベクトルの近さ(k-NN) │ 正規化プロセッサーでスコアを [0,1] にそろえて重み付きで統合 ├─ インデックスA 既知事象(状態が有効なもの) └─ インデックスB 過去のチケット(解決方法つき・2年分) ▼ Claude API ── 構造化出力 │ 区分(既知事象に該当/過去に類似あり/新しい事象/判断できない) │ カテゴリ、根拠にした候補の番号、回答の候補 ▼ AWS Lambda ── 番号が候補に含まれるかを確かめ、「AI候補」欄へ書き込む ▼ 【人】担当者が紐付けを確定し、回答を直して送る ▼ 月末 ── 確定した紐付けから既知事象ごとの件数を集計
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(ハイブリッド検索、正規化プロセッサー) | Azure AI Search、Vertex AI Search(Agent Search) |
| 埋め込み | Amazon Titan Text Embeddings V2(Amazon Bedrock) | OpenAI の埋め込みモデル |
| 生成AI | Claude API(区分の判定と回答の候補) | OpenAI API、Gemini API |
| 連携 | AWS Lambda(取り込み、検索の呼び出し、欄への書き込み) | AWS Step Functions |
| チケットと台帳 | 既存のITサービス管理ツール | ― |
ITサービス管理ツールは、新しく足すものではありません。 チケットの作成をWebhookで受け、結果を「AI候補」という欄に書き戻します。Webhookと書き戻しのAPIの有無は製品によって違うため、この部分は利用環境に合わせた個別の実装になります。 書き込むのは「AI候補」の欄だけで、既知事象の紐付けの欄とチケットの状態には触れません。
検索の中心は、OpenSearch のハイブリッドクエリです。 公式ドキュメントでは、複数のクエリの関連性スコアを1つのスコアにまとめるもので、各サブクエリのスコアはシャードの段階でそれぞれ計算されます。 組み合わせられるクエリ句は最大5つです。この構成では、言葉の一致と、ベクトルの近さの2つを使います。
スコアをそろえるのは、正規化プロセッサーです。 2.10で導入され、クエリとフェッチの段階の間で動き、クエリ句ごとのスコアを正規化してから統合します。 言葉の一致(BM25)とベクトルの近さ(k-NN)はスコアの尺度がまったく違うので、そのまま足すことはできません。正規化には min_max・l2・z_score、統合には arithmetic_mean(既定)・geometric_mean・harmonic_mean があり、重みは0.0〜1.0で、合計が1.0になるように、クエリの数と同じ長さで指定します。
Amazon OpenSearch Service は、3.5、3.3、3.1、2.19 などの OpenSearch のバージョンに対応したマネージドサービスです。 日本語の形態素解析は、kuromoji がすべてのドメインに入っており、Sudachi は日本語向けに推奨されたオプションのプラグインとして1.3以降で使えます。
埋め込みは、Amazon Titan Text Embeddings V2 を想定します。 モデルIDは amazon.titan-embed-text-v2:0、入力は8,192トークンまたは50,000文字まで、出力は1,024次元(既定)・512・256から選べます。英語に最適化されたモデルで、日本語は多言語対応の一覧に含まれています。 異なる言語をまたいだ検索は精度が落ちるとされているので、英語のエラーメッセージは原文のまま言葉の一致の側で拾います。
03どうやって実装するのか
処理の起点を決める
ITサービス管理ツールでチケットが作られたことを起点にします。 Webhookで AWS Lambda を呼び、1件ずつ処理します。定時のまとめ処理にはしません。 担当者がチケットを開く前に候補が付いていなければ、結局は手で探し始めてしまうからです。
もう一つの起点が、既知事象の台帳の更新です。 既知事象が登録・更新されたら、インデックスAをその1件だけ入れ直します。状態が「解決済み」に変わったものは、インデックスAの有効の印を外します。 外し忘れると、解決済みの不具合の回避策を、いまの問い合わせに返すことになります。
過去のチケットのインデックスBは、毎晩入れ直します。 前日に「解決済み」になり、解決方法の欄が埋まっているものだけを足します。解決方法が空のチケットは入れません。 引いても回答の候補にならず、上位を埋めて本当に役立つ記録を押し出すからです。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| チケットの本文 | 件名、本文、経路(フォーム/メール/チャット)、起票日時、利用者の所属 | ITサービス管理ツール |
| 既知事象 | 番号、症状、対象サービス、影響範囲、回避策、状態、登録日、回避策を利用者に伝えてよいか | 既知事象の台帳 |
| 過去のチケット | 番号、本文の要旨、カテゴリ、解決方法、紐付けた既知事象の番号、解決日 | ITサービス管理ツール |
| カテゴリの定義 | カテゴリ名、含めるもの、含めないもの、迷う境目の例 | 情報システム部の文書 |
| サービス名の対応表 | 通称と正式名称、対象サービスのコード | 情報システム部の一覧 |
質を決めるのは、既知事象の書き方です。 症状の欄に「VPN不具合」としか書かれていなければ、意味の近さで引いても当たりません。利用者が書きそうな言葉で症状を書くように、問題管理の担当と取り決めます。「接続ボタンを押すと『認証に失敗しました』と出て進まない」のように、画面の文言と操作の順で書くのが効きます。
「回避策を利用者に伝えてよいか」の項目は必ず持たせます。 回避策の中には「管理者権限で設定を変える」のように、利用者に伝えてはいけないものがあります。伝えてよくないものは、回答の候補に写しません。
カテゴリの定義に「迷う境目の例」を足すのは、第3章の(b)のためです。 「業務システムの画面がVPN経由でだけ開かないときはネットワーク」のように、担当者が迷った例を文章で残します。 AIへの指示にもこの例をそのまま渡します。
データの取得方法を決める
インデックスは2つに分けます。 引いたあとの使い方が違うからです。
| インデックス | 1件の単位 | 主な項目 | 絞り込み |
|---|---|---|---|
| A 既知事象 | 既知事象1件 | 症状(言葉と埋め込み)、回避策、状態、対象サービス | 状態が有効なもの、対象サービス |
| B 過去のチケット | チケット1件 | 本文の要旨(言葉と埋め込み)、解決方法、カテゴリ | 解決日が2年以内 |
検索は、ハイブリッドクエリに2つのサブクエリを入れて行います。 1つは本文の言葉の一致で、日本語の形態素解析を使った項目に match をかけます。もう1つは埋め込みの項目への knn です。絞り込みは、ハイブリッドクエリの filter に1つ書けば、すべてのサブクエリにかかります。 条件が複数あるときは Boolean クエリでまとめます。
{
"query": {
"hybrid": {
"queries": [
{ "match": { "symptom_text": "画面共有 ボタン 押せない 灰色" } },
{ "knn": { "symptom_vector": { "vector": [0.012, -0.031], "k": 20 } } }
],
"filter": { "bool": { "must": [
{ "term": { "status_active": true } },
{ "terms": { "service_code": ["MEET", "PC"] } }
] } }
}
}
}
スコアの統合は、検索パイプラインの正規化プロセッサーで行います。 最初は min_max と arithmetic_mean、重みは言葉の一致0.4・ベクトルの近さ0.6で始めます。重みは合計1.0で、クエリ句の数と同じ長さにする必要があります。 エラーコードの多い領域では言葉の一致の重みを上げます。
ハイブリッドクエリを function_score や constant_score の中に入れないでください。 公式ドキュメントには、こうしたラッパーの中に入れると実行時エラーになるか、正規化のパイプラインが黙って飛ばされることがあると書かれています。新しい既知事象を優先したくて登録日で点数を足したくなりますが、それは検索のあとで Lambda の側で行います。
引く件数は、インデックスAから上位5件、インデックスBから上位10件です。 ページを送る必要は無いので from は使いません。from を0より大きくするときは pagination_depth が必須になります。
AIへ渡す前に整形する
- 氏名と社員番号の除去 … 本文と署名から氏名を除き、所属だけを残します
- 署名と定型文の除去 … 「お疲れさまです」や署名の行を落とします。残すと、挨拶の言葉で近いチケットが上位に来ます
- 転送・返信の引用の除去 … メールで届いたものは、引用部分を落として最新の本文だけにします
- サービス名の統一 … 「勤怠」「キンタイ」を正式名称にそろえ、対象サービスのコードを付けます
- エラーメッセージの切り出し … 「」や英数字の並びから画面の文言を取り出し、言葉の一致の側に別に渡します
- 長さの確認 … 埋め込みの入力は8,192トークンまたは50,000文字までです。ログが貼り付けられた本文は、先頭の説明部分と、エラーの行だけに絞ります
- 重複の確認 … 同じ利用者が10分以内に同じ内容で起票したものは、先のチケットにまとめる候補にします
5番目に理由があります。 「0x80070005」や「AADSTS50076」のようなコードは、意味の近さでは近いものに寄りません。文字が一致したものだけが正解です。 本文と別に、コードだけを言葉の一致の検索語に足します。
4番目は、検索の前に絞り込みに使います。 対象サービスのコードが付けば、インデックスAの filter に入れて、別のサービスの既知事象が上位に来るのを防げます。 コードが付かなかったときは絞り込みをかけずに引きます。
AIに処理させる
させるのは、引いた候補とチケットの本文を読み比べて、4つの区分のどれに当たるかを決め、根拠にした候補の番号を返すことです。
| 区分 | 意味 | その後 |
|---|---|---|
known_issue | インデックスAのどれかと同じ事象と読める | 既知事象の番号と、回避策から写した回答の候補を付ける |
similar_ticket | 既知事象には当たらないが、インデックスBに同じ解決のしかたのものがある | 過去のチケットの番号と解決方法を付ける |
new_issue | どちらにも当たらない | 調査に回す。症状の要旨を1文で付ける |
needs_human | 本文から症状が読み取れない、または候補が2つ以上で決められない | 担当者が読む |
あわせて、カテゴリの定義からカテゴリを1つ選ばせます。 迷う境目の例を渡し、それに沿って選ばせます。
| させないこと | 理由 |
|---|---|
| 候補に無い既知事象の番号を出す | 番号は検索で引いたものの中からだけ選ばせる |
| 回避策を自分で考える | 回答の候補は、台帳の回避策と過去の解決方法の写しだけにする |
| 「伝えてよくない」回避策を回答に入れる | 管理者向けの操作が利用者に渡る |
| 紐付けを確定する | 件数に数えるのは担当者が確定したものだけ |
| 原因を断定する | 区分は症状が同じかどうかで、原因の特定ではない |
| 利用者の氏名を書く | 前処理で除いたものを、引用から戻さない |
2行目がいちばん起きやすい失敗です。 該当する既知事象が無いと、「キャッシュを削除してください」のような一般的な対処を回答に書きます。 一般的な対処が効く問い合わせもありますが、台帳に無いものを台帳の回避策のように見せることになります。
指示内容を固定する
あなたは社内ヘルプデスクで、届いたチケットを既知事象と過去のチケットに
照らして分類する担当です。渡した候補に書かれていることだけを使ってください。
【区分の選び方】
- known_issue ...... 既知事象の候補のどれかと、症状が同じと読める。
対象サービスと、画面の文言または操作の順が一致すること。
- similar_ticket ... 既知事象には当たらないが、過去のチケットの候補に
同じ症状で解決方法の書かれたものがある。
- new_issue ........ どの候補とも症状が一致しない。
- needs_human ...... 本文から症状が読み取れない。または一致する候補が
2つ以上あり、1つに決められない。
迷ったときは known_issue を選ばないでください。
【厳守事項】
- known_issue_id と ticket_ids には、渡した候補の番号だけを入れてください。
候補に無い番号を書かないでください。
- 回答の候補 reply_draft は、既知事象の「回避策」または過去のチケットの
「解決方法」の文をもとに書いてください。書かれていない手順を足さないでください。
- 既知事象の「利用者に伝えてよいか」が「不可」のものは、reply_draft に
回避策を書かず、「担当者から連絡します」とだけ書いてください。
- 原因を断定しないでください。区分は症状が同じかどうかで決めてください。
- evidence には、一致したと判断した本文の文言と、候補の文言を
そのまま書き写してください。
- カテゴリは定義の中から1つ選んでください。迷う境目の例があれば
それに従ってください。
- 利用者の氏名を書かないでください。
【カテゴリの定義と迷う境目の例】{category_rules}
【チケットの本文】{ticket_body}
【画面の文言として切り出したもの】{error_strings}
【既知事象の候補(上位5件)】{known_issue_candidates}
【過去のチケットの候補(上位10件)】{ticket_candidates}
「迷ったときは known_issue を選ばない」を書かないと、近いものを既知事象に寄せます。 候補の中にいちばん近いものがある以上、それを選ぶのが自然な読み方だからです。選ばせたいのは「いちばん近いもの」ではなく「同じもの」です。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。 output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに沿った応答が返ります。
{
"classification": "known_issue | similar_ticket | new_issue | needs_human",
"category": "",
"known_issue_id": "",
"ticket_ids": [""],
"symptom_summary": "",
"evidence": [
{ "ticket_text": "", "candidate_id": "", "candidate_text": "" }
],
"reply_draft": "",
"reason": ""
}
classification と category は enum で値を縛ります。 スキーマで使える機能のうち、enum と required が効きます。すべてのオブジェクトに additionalProperties: false を付ける必要があります。
known_issue_id は、enum にしません。 候補の番号は毎回変わるので、スキーマで縛れません。Lambda の側で、返った番号が渡した候補に含まれるかを確かめ、含まれなければ needs_human に書き換えます。
数値や文字数の制約もスキーマでは縛れません。 構造化出力では minimum・maximum のような数値の制約と、minLength・maxLength のような文字列の制約がサポートされていません。回答の候補の長さは、指示とLambdaの確認で抑えます。
JSONで受け取る理由は3つあります。 1つ目は、区分ごとに後の処理を分けられることです。known_issue なら回答の候補を欄に入れ、new_issue なら新しい事象の集計に回します。2つ目は、番号の確かめが機械でできることです。3つ目は、evidence があるので担当者の確認が速くなることで、チケットと既知事象の両方を開かなくても、どの文言で一致したかが一目で分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| ITサービス管理ツール | Webhook と API | チケット作成の通知を受け、「AI候補」の欄に書き戻す |
| Amazon Bedrock | API呼び出し | Titan Text Embeddings V2 で本文をベクトルにする |
| Amazon OpenSearch Service | 検索API | 2つのインデックスをハイブリッド検索で引く |
| Claude API | API呼び出し | 区分・カテゴリ・回答の候補を構造化出力で返す |
| 社内チャット | 通知 | 新しい事象の候補がたまったとき、問題管理の担当へ知らせる |
書き戻すのは「AI候補」の欄だけです。 既知事象の紐付けの欄、チケットの状態、担当者の割り当ては、この構成からは変えません。 紐付けの欄は担当者が「確定」を押したときに、ITサービス管理ツールの機能で埋まるようにします。
利用者への回答も送りません。 回答の候補は欄に入れるだけで、送るのは担当者です。回避策が古くなっていた場合に、誤った手順が利用者へそのまま届くのを防ぎます。
人が確認する
担当者は、チケットを開いたときに「AI候補」の欄を最初に見ます。
- 区分を確かめる …
known_issueなら、一致した文言の対を読み、同じ事象かを確かめます - 紐付けを確定するか外す … 同じなら「確定」、違えば別の既知事象を選ぶか外します
- 回答の候補を直して送る … 利用者の状況に合わせて直します。回避策の手順が今も有効かは、台帳の更新日で確かめます
new_issueとneeds_humanは通常どおり調べる … 候補が付かなかったことも記録に残ります
目標は、1,800件をならして1件2分です。 known_issue と similar_ticket で候補が正しければ1分以内で済み、new_issue と needs_human は従来どおりの調査に入ります。調査そのものの時間は、第10章の2分には含めていません。
確定・変更・外したの3つは、必ず記録に残します。 どの候補を外したかの記録は、既知事象の症状の書き方を直す材料になります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 1件のチケットに症状が2つ以上書かれている | needs_human。担当者がチケットを分ける |
| 一致する既知事象が2つ以上ある | needs_human。台帳の重複を疑い、問題管理の担当へ知らせる |
| 返った番号が候補に含まれない | Lambda で needs_human に書き換える |
| 既知事象が「解決済み」に変わった直後 | インデックスAから外れているので当たらない。過去のチケットの側で拾う |
| 回避策が「利用者に伝えてよいか:不可」 | 回答の候補を空にし、担当者からの連絡とする |
| 本文が短すぎる(「使えません」だけ) | 検索をかけず needs_human。聞き返しは担当者が行う |
| 同じ症状のチケットが短時間に急増する | 1件目の結果を使い回さず、各チケットを処理する。件数は通知で知らせる |
| 埋め込み・検索・Claude API のいずれかが応答しない | 「AI候補」の欄を空のままにし、担当者は従来どおり処理する。再試行は3回まで |
| 英語のエラーメッセージだけの本文 | 言葉の一致の重みを上げて引き直す |
7行目に注意が要ります。 大きな障害のときは、同じ症状のチケットが数十件まとめて届きます。1件目の分類をほかのチケットにも写したくなりますが、しません。 同じ時間帯でも、別の症状のチケットが混ざっているからです。
記録を残す
- チケットの番号、前処理のあとの本文、切り出した画面の文言
- 検索で引いた候補の番号とスコア(言葉の一致・ベクトルの近さ・統合後)
- Claude API に渡した指示と、返ったJSONの全文
- 担当者の操作(確定・別の既知事象を選んだ・外した)と、その日時
- 送った回答と、回答の候補との差分
- 新しい事象の候補として通知した件数と、その後の既知事象の登録
4つ目が、この仕組みを育てる記録です。 外された候補が特定の既知事象に偏っていれば、その既知事象の症状の書き方が利用者の言葉とずれています。 毎月の振り返りで、外された回数の多い既知事象から書き直します。
04実装レベルの3段階
半自動化で、①の「探す」が縮みます。 担当者が検索画面に症状を入れれば、言葉と意味の両方で候補が並びます。ただし、分類と回答の写しは担当者の作業のままです。本格構成で、候補が先に付いている状態になり、この段階が本記事の想定です。
05工数削減シミュレーション
導入後 1,800件 × 2分 ÷ 60 = 60 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 従業員が数千名規模で、社内ヘルプデスクに月1,000件を超えるチケットが届く会社。既知の障害や不具合を「既知事象」として台帳に残す運用があり、回避策が書かれている場合。同じ症状の問い合わせが何十件も別々に処理され、件数が既知事象ごとに数えられていない場合。担当者によって分類のしかたが違い、月次の集計が当てにならない場合。
- チケットが月に数百件以下で、担当者が全件を覚えていられる場合。既知事象の台帳が無く、過去のチケットにも解決方法が書かれていない場合(先に記録を整える)。チケットの大半がアカウントの発行やパスワードの再設定など、申請の受付で済むものの場合。回答をそのまま自動で返す仕組みを求めている場合(この構成は候補までで、送信は人が行います)。
07最小構成で試す方法
- 有効な既知事象80件の症状と回避策を、1つの表に書き出す
- 先月のチケットから、既知事象に紐付いたものを30件、紐付いていないものを30件選ぶ
- 手元のAIサービスの画面に、既知事象の表を貼り付ける
- チケットの本文を1件ずつ貼り、「この問い合わせは、表のどの既知事象と同じ症状ですか。同じものが無ければ『該当なし』と答えてください。近いだけのものを選ばないでください」と指示する
- 結果を、担当者が付けた紐付けと突き合わせる
80件なら、検索を使わずに表を丸ごと渡せます。 検索の仕組みを作る前に、「同じ症状かどうかを読み分けられるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者の紐付けとほぼ一致した | 検索の仕組みを作る段階に進む |
| 紐付いていなかったチケットに、正しそうな既知事象が付いた | 第3章の(a)が裏付けられた。月末の件数が少なく出ていた |
| 近いだけの既知事象を選ぶ | 指示の条件を足す。構成は有効 |
| 症状の欄が短くて当たらない | 台帳の書き方を直すのが先 |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 近いだけの既知事象に紐付く | 「同じもの」を選ばせる。 対象サービスと文言の一致を条件にし、迷えば選ばせない |
| 解決済みの既知事象の回避策が出る | 状態が変わったらインデックスAの有効の印を外す |
| エラーコードが当たらない | コードを切り出し、言葉の一致の側に別に渡す |
| スコアの足し方で順位が崩れる | 正規化プロセッサーで尺度をそろえる。重みは合計1.0 |
新しい既知事象を優先したくて function_score で包む | 正規化が黙って飛ばされることがある。 優先はLambdaで行う |
| 候補に無い番号が返る | Lambda で候補との照合を必ず行う |
| 伝えてはいけない回避策が回答に入る | 台帳に「利用者に伝えてよいか」の項目を持たせる |
| AIの候補をそのまま件数に数える | 担当者が確定したものだけを数える |
| Sudachi の辞書を直しても反映されない | 辞書の再関連付けは次のブルー/グリーンのデプロイまで反映されない。新しいインデックスに入れ直し、エイリアスで切り替える |
上の2行が、この構成の失敗のほとんどです。 どちらも「候補として出てくるが、正しくない」という形で現れ、担当者が忙しいほど見過ごされます。 指示と台帳の状態の両方で防ぎます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 社員からの問い合わせの本文(氏名・所属・端末の情報・画面の写しの説明)、既知事象の台帳(社内システムの不具合と回避策)、過去のチケットです。
- 外部へ渡す本文から氏名を除く … 埋め込みと生成AIに渡すのは前処理のあとの本文です。所属は分類に使うので残し、氏名と社員番号は除きます
- 管理者向けの回避策を利用者に渡さない … 回避策の中には、権限の変更やセキュリティ設定の一時的な緩和が含まれることがあります。台帳の「利用者に伝えてよいか」で機械的に止めます
- 既知事象の台帳は、社内の弱点の一覧でもある … どのシステムにどんな不具合があり、どう回避しているかがまとまっています。OpenSearch のドメインはVPCの中に置き、アクセスはIAMで絞ります。 Amazon OpenSearch Service はインデックス・ドキュメント・フィールド単位のセキュリティと監査ログを機能として持ちます
- 回答を自動で送らない … 回答の候補は欄に入れるだけです。送信は担当者が行います
誤りが起きた場合のリスクは、別の事象を既知事象に紐付けて件数を押し上げることと、古い回避策を利用者に伝えることの2つです。 前者は担当者の確定で、後者は台帳の状態と更新日の確認で防ぎます。
10まず何から始めるか
1週目:既知事象の台帳を書き直す
有効な既知事象80件の症状の欄を、画面の文言と操作の順で書き直します。 あわせて「利用者に伝えてよいか」の項目を足します。全件を一度にやる必要はなく、先月のチケットで件数の多かった上位20件から始めます。
2週目:60件で試す
先月のチケットから、紐付いたもの30件と紐付いていないもの30件を選び、手元のAIサービスで既知事象との読み分けを試します。近いだけのものを選んでいないかを最優先で見ます。
3週目:カテゴリの定義に境目の例を足す
担当者6名に、分類に迷ったチケットを1人5件ずつ挙げてもらい、どちらに入れるかを決めて文章で残します。 これがそのままAIへの指示になります。
4週目:検索の土台を作る
OpenSearch のドメインを作り、既知事象と過去のチケットを入れて、ハイブリッド検索と正規化プロセッサーを組みます。担当者が検索画面から引ける半自動化の状態にします。
2か月目: 担当者がどの候補を選んだかを記録し、重みを決めます。3か月目以降: チケット作成を起点に自動で引き、「AI候補」の欄に書き込みます。確定した紐付けから既知事象ごとの件数を月末に出し、外された候補の多い既知事象を書き直す運用が回り始めた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ハイブリッドクエリが複数のクエリの関連性スコアを1つにまとめ、各サブクエリのスコアをシャードで計算すること。クエリ句が最大5つであること。filter を1つ書くとすべてのサブクエリにかかること。from が0より大きいとき pagination_depth が必須なこと。function_score や constant_score に入れると実行時エラーまたは正規化のパイプラインが黙って飛ばされることがあること | OpenSearch Documentation: Hybrid query | 2026-10-06 |
| 正規化プロセッサーが2.10で導入され、クエリとフェッチの段階の間で動くこと。正規化が min_max・l2・z_score、統合が arithmetic_mean(既定)・geometric_mean・harmonic_mean であること。重みが0.0〜1.0で合計1.0、クエリの数と同じ長さであること | OpenSearch Documentation: Normalization processor | 2026-10-06 |
| Amazon OpenSearch Service がマネージドサービスで、OpenSearch 3.5・3.3・3.1・2.19などに対応すること。インデックス・ドキュメント・フィールド単位のセキュリティと監査ログを持つこと | AWS: What is Amazon OpenSearch Service? | 2026-10-06 |
| kuromoji がすべてのドメインに入っていること。Sudachi が日本語向けに推奨されたプラグインで1.3以降で使えること。Sudachi の辞書の再関連付けが次のブルー/グリーンのデプロイまで反映されず、新しいインデックスへの入れ直しとエイリアスでの切り替えが案内されていること | AWS: Plugins by engine version in Amazon OpenSearch Service | 2026-10-06 |
Titan Text Embeddings V2 のモデルIDが amazon.titan-embed-text-v2:0、入力が8,192トークンまたは50,000文字、出力が1,024(既定)・512・256次元であること。英語に最適化され、日本語が多言語対応の一覧に含まれること。言語をまたいだ検索は精度が落ちるとされること | Amazon Bedrock: Amazon Titan Text Embeddings models | 2026-10-06 |
構造化出力が output_config.format に type: "json_schema" を渡す形であること。enum・required が使え、すべてのオブジェクトに additionalProperties: false が要ること。数値の制約と文字列の長さの制約がサポートされないこと | Claude Docs: Structured outputs | 2026-10-06 |
ITサービス管理ツールのWebhookとAPIは、製品ごとに確かめてください。 本記事は特定の製品を前提にしていません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0610)についてのご相談はこちらから。
