Media > AI活用ユースケース > カスタマーサポート > SaaS 企業のサポートが、新しい問い合わせに近い回答の定型文(マクロ)と解決済みのチケットを OpenSearch のハイブリッド検索で探し、書き換える点を添えて担当に示す

SaaS 企業のサポートが、新しい問い合わせに近い回答の定型文(マクロ)と解決済みのチケットを OpenSearch のハイブリッド検索で探し、書き換える点を添えて担当に示す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

新しい問い合わせに近い回答の定型文(マクロ)と、同じ定型文で解決した過去のチケットを探します。定型文の候補ごとに、問い合わせに合わせて書き換える点と、定型文が答えていない点をチケットの内部メモに並べます。

サマリー
生成AI
Azure OpenAI Service/ChatGPT/Claude
AIサービス
Azure AI/Google Vertex AI/OpenSearch
対象業界
EC/IT・SaaS
対象部門
カスタマーサポート
対象業務
問い合わせ対応/情報検索
主な課題
問い合わせが多い/属人化している/情報が見つからない
AIで行う処理
検索(RAG)
主な効果
品質標準化/対応スピード向上/教育コスト削減
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
RAG・個別開発(大)
人間の確認
条件付き
現在工数
240h/月
AI導入後
80h/月
想定削減
67%
年間削減
1,920h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 担当がチケットを開き、問い合わせの文を読む
  2. 定型文の一覧を機能名やキーワードで検索する
  3. 見つからなければ、解決済みのチケットを似た言葉で検索し、過去の返信を読む
  4. 過去の返信に近い定型文を探し直す
  5. 定型文を当て、問い合わせに合わせて名前・機能・手順の部分を書き換える
  6. 定型文が答えていない質問があれば、手順書を見て書き足す
  7. 返信を送る
導入後(After)
  1. 自動毎晩、定型文の一覧と、前の日に解決したチケットを取り込み、埋め込みの値を付けて索引に入れる
  2. 自動解決済みのチケットの最後の公開の返信を、定型文の索引に当てて、もとになった定型文の候補を付ける
  3. 自動5分ごとに新しいチケットを取り込み、問い合わせの文から個人の情報を伏せる
  4. 自動OpenSearch のハイブリッド検索が、定型文と解決済みのチケットを、語の一致と意味の近さで引く
  5. 自動生成AIが、定型文の候補ごとに、書き換える点と定型文が答えていない点を書く
  6. 自動Lambda が候補をチケットの内部メモに書く
  7. 人担当が内部メモを見て、Zendesk の画面で定型文を選んで当て、書き換えて返信を仕上げる
  8. 人候補が合わなかったら、内部メモの「合わなかった」の印を付ける
各工程の詳しい説明を読む
  1. 担当がチケットを開き、問い合わせの文を読む
  2. 定型文の一覧を機能名やキーワードで検索する
  3. 見つからなければ、解決済みのチケットを似た言葉で検索し、過去の返信を読む
  4. 過去の返信に近い定型文を探し直す
  5. 定型文を当て、問い合わせに合わせて名前・機能・手順の部分を書き換える
  6. 定型文が答えていない質問があれば、手順書を見て書き足す
  7. 返信を送る

(a)言い方が違うと引けない。 2番目で、客の言い方のまま検索すると、定型文の名前の語と一致しません。「戻される」で引いても「ログイン」の定型文は出ません。

(b)過去のチケットから当てる遠回り。 3番目と4番目で、過去の返信を読み、それがどの定型文をもとにしたかを推し量ります。返信は担当が書き換えているので、元の定型文がすぐには分かりません。

(c)答え漏れ。 問い合わせに質問が2つあると、定型文が答えているのは1つだけのことがあります。急ぐと、もう1つに答えないまま送ります。

(d)担当による差。 同じ問い合わせに、担当によって別の定型文が当たります。古い定型文を使い続ける担当もいます。

  1. 【自動】 毎晩、定型文の一覧と、前の日に解決したチケットを取り込み、埋め込みの値を付けて索引に入れる
  2. 【自動】 解決済みのチケットの最後の公開の返信を、定型文の索引に当てて、もとになった定型文の候補を付ける
  3. 【自動】 5分ごとに新しいチケットを取り込み、問い合わせの文から個人の情報を伏せる
  4. 【自動】 OpenSearch のハイブリッド検索が、定型文と解決済みのチケットを、語の一致と意味の近さで引く
  5. 【自動】 生成AIが、定型文の候補ごとに、書き換える点と定型文が答えていない点を書く
  6. 【自動】 Lambda が候補をチケットの内部メモに書く
  7. 【人】 担当が内部メモを見て、Zendesk の画面で定型文を選んで当て、書き換えて返信を仕上げる
  8. 【人】 候補が合わなかったら、内部メモの「合わなかった」の印を付ける

2番目が、過去のチケットを生かす工夫です。 解決済みのチケットには、どの定型文をもとに返信したかが残っていないことがあります。最後の返信の文で定型文の索引を引き、近い定型文を「もとになった候補」として持たせます。 新しい問い合わせが過去のチケットに当たれば、そのチケットの定型文が候補に加わります。

7番目で定型文を当てるのは担当です。 公式のドキュメントでは、Zendesk のマクロは担当がチケットに手で当てるものとされています。この構成からチケットに定型文を当てたり、返信を送ったりはしません。

02今回想定するシステム構成

構成図
Zendesk(定型文・チケット・コメント)
   ▼【トリガー】毎晩の取り込み/5分ごとの新しいチケットの取り込み
AWS Lambda ── 定型文とチケットを取り出し、個人の情報を伏せる
   ├──▶ Cohere Embed Multilingual(Amazon Bedrock)── 埋め込みの値
   ▼
Amazon OpenSearch Service
   │   定型文の索引:番号・名前・本文(kuromoji)・埋め込み・機能・プラン・有効か
   │   チケットの索引:問い合わせの文・最後の返信・埋め込み・もとになった定型文の候補
   │   検索のパイプライン:normalization-processor(min_max、重み)
   ▼
AWS Lambda
   ├──▶ OpenSearch ── ハイブリッド検索(語の一致+k-NN)
   ├──▶ Claude(Amazon Bedrock)── 書き換える点と答えていない点
   ├──▶ Zendesk ── 定型文を当てた後のチケットの見え方を取る(チケットは変えない)
   ▼
Zendesk のチケットの内部メモ ──【人】定型文を選んで当て、返信を仕上げる
役割想定する製品代替候補
検索基盤Amazon OpenSearch Service(hybrid、normalization-processor、k-NN、kuromoji)Azure AI Search、Vertex AI Search(Agent Search)
埋め込みCohere Embed Multilingual(Amazon Bedrock)Amazon Titan Text Embeddings V2
生成AIClaude(Amazon Bedrock の Converse API、構造化出力)Azure OpenAI(Microsoft Foundry)、OpenAI API
連携AWS Lambda(取り込み、伏せ字、検索の呼び出し、内部メモの書き込み)AWS Step Functions
保管Amazon S3(取り込みの写し、候補と担当の印の記録)社内のファイルサーバー

Zendesk の定型文は、この構成から書き換えません。 書き込むのはチケットの内部メモだけです。

埋め込みには、Bedrock の Cohere Embed Multilingual を使います。 AWS の公式のモデルの説明では、100を超える言語に対応する多言語の埋め込みのモデルで、モデルの ID は cohere.embed-multilingual-v3、文脈の長さは512トークン、東京リージョンでも使えるとされています。日本語の個別の対応は明記されていないので、自社のチケットで試してから決めます。 AWS Marketplace を通じて請求される他社のモデルであることも、契約の確認に入れます。

03どうやって実装するのか

Step1

処理の起点を決める

起点は3つあります。毎晩の定型文と解決済みのチケットの取り込み、5分ごとの新しいチケットの取り込み、担当の「合わなかった」の印です。

新しいチケットは、Zendesk の増分の書き出し(Incremental Ticket Export)で5分ごとに取ります。公式のドキュメントでは、増分の書き出しは1分あたり10回まで呼べ、直近の1分のデータは返さないとされています。問い合わせが届いてから内部メモが付くまで、数分の遅れがあることを担当に伝えます。

取ったチケットの問い合わせの文は、チケットのコメントの一覧で取ります。公式のドキュメントでは、コメントの一覧は1ページ最大100件で、コメントごとに plain_body(文字だけの本文)と、公開か内部メモかを表す public を持つとされています。問い合わせの文は最初の公開のコメントの plain_body から取ります。

定型文は、毎晩、定型文の一覧(List Macros)で取ります。公式のドキュメントでは1ページ最大100件で、only_viewable を true にするとチケットに当てられる定型文だけに絞れるとされています。active が false の定型文は、索引に残したまま検索から外します。

Step2

入力データを集める

データ中身取得元
新しい問い合わせチケットの番号、件名、最初の公開のコメントの本文、契約のプラン、問い合わせの経路Zendesk
定型文番号、名前、本文(コメントに入る文)、有効か、カテゴリ、使われた回数(直近30日)Zendesk の定型文の一覧
解決済みのチケット件名、最初の問い合わせ、最後の公開の返信、解決の日、満足度の評価Zendesk
機能とプランの表機能名の言い換え(「2FA」「二段階認証」「ワンタイムパスワード」)、プランごとに使える機能サポートの担当で作る表

質を決めるのは、定型文の中身です。 古い手順の定型文が有効のまま残っていると、検索はそれも正しく見つけます。 取り込みのときに、最終の更新から1年を超えた定型文を一覧にして、定型文の担当に見直しを頼みます。

定型文の使われた回数は、候補の並びの参考に出します。 公式のドキュメントでは、定型文の一覧に直近1時間・24時間・7日・30日の使われた回数を合わせて取る指定(sideload)があり、Support Professional か Suite Growth 以上のプランで使えるとされています。

Step3

データの取得方法を決める

取るものどこからどう取るか
語の一致する定型文定型文の索引match(body・title。kuromoji)
意味の近い定型文定型文の索引knn(body_vector)
似た解決済みのチケットチケットの索引同じハイブリッド検索を question_vector と question に
有効な定型文とプランの絞り込み両方の索引ハイブリッド検索の filter
当てた後のチケットの見え方ZendeskShow Ticket After Changes

ハイブリッド検索は、検索のパイプラインで点数をそろえてから合わせます。 公式のドキュメントでは、hybrid は複数の問い合わせの点数を1つにまとめるもので、問い合わせは最大5つ、点数は検索のパイプラインで合わせるとされています。normalization-processor は、語の検索とベクトルの検索の点数の尺度が違うため、合わせる前にそろえるものとされ、そろえ方の既定は min_max、合わせ方の既定は arithmetic_mean、weights で問い合わせごとの重みを合計1で決められます。

PUT /_search/pipeline/macro-hybrid
{
  "phase_results_processors": [ { "normalization-processor": {
    "normalization": { "technique": "min_max" },
    "combination": { "technique": "arithmetic_mean",
      "parameters": { "weights": [0.4, 0.6] } } } } ]
}

GET /macros/_search?search_pipeline=macro-hybrid
{
  "size": 5,
  "_source": ["macro_id", "title", "category", "updated_at", "usage_30d"],
  "query": { "hybrid": {
    "filter": { "bool": { "filter": [
      { "term": { "active": true } },
      { "terms": { "plans": ["standard"] } } ] } },
    "queries": [
      { "match": { "body": "二段階認証のコードが届かずログインできない" } },
      { "knn": { "body_vector": { "vector": [0.012, -0.031], "k": 20 } } } ] } }
}

hybrid を function_score の中に入れません。 公式のドキュメントでは、hybrid は検索の最上位に置くもので、function_score などの包む問い合わせの中に入れると実行時のエラーになるか、そろえる処理が黙って飛ばされることがあるとされています。使われた回数で点数を上げたくなりますが、点数には混ぜず、画面に回数を並べるだけにします。

min_max の性質を知っておきます。 公式のドキュメントでは、問い合わせごとに、返った結果の中の最小と最大で0〜1にそろえ、最も点の高い文書が必ず1.0になるとされています。どの候補も遠い問い合わせでも、一番上は1.0になります。 点数の高さで「合っている」と判断しないで、語の一致とベクトルの両方に当たったか、片方だけかを候補に出します。

埋め込みの値は、取り込みのときと検索のときで input_type を分けます。 AWS の公式ページでは、Cohere Embed の input_type は、ベクトルの索引に入れる文書には search_document、検索の問い合わせには search_query を使うとされています。

Step4

AIへ渡す前に整形する

  1. 個人の情報を伏せる … 問い合わせと返信の文から、メールアドレス・電話番号・人の名前・契約の番号を、Lambda の規則で [メール] などに置き換えます
  2. 署名と引用を外す … メールの署名と、前の返信の引用を外します
  3. 長さをそろえる … 埋め込みは1件512トークンまでなので、問い合わせは件名と最初の段落を、返信は最初の段落と手順の部分を埋め込みます
  4. 機能名をそろえる … 機能とプランの表で、「2FA」「二段階認証」を同じ語にして語の検索の項目に足します
  5. 定型文の本文を取り出す … 定型文の actions のうち、コメントに入る文を本文にします
  6. もとになった定型文の候補を付ける … 解決済みのチケットの最後の返信で定型文の索引を引き、上位の定型文の番号を source_macros に持たせます

3番目で truncate を NONE にします。 AWS の公式ページでは、Cohere Embed の truncate は既定が END で、長すぎる入力は末尾を捨てて埋め込み、NONE にすると長すぎる入力でエラーを返すとされています。黙って切られると、問い合わせの肝心の部分が埋め込みに入らないまま検索されます。 エラーになった文は、短くしてから入れ直します。

6番目の候補は「推した」ものです。 返信は担当が書き換えているので、もとの定型文と一致するとは限りません。画面には「過去のチケットの返信に近い定型文」と出し、「このチケットで使われた定型文」とは書きません。

Step5

AIに処理させる

AIの仕事は1つです。 検索が返した定型文の候補ごとに、問い合わせに合わせて書き換える点と、定型文が答えていない点を書くことです。

させることさせないこと
定型文の中で、問い合わせに合わせて変える部分(機能名・プラン・手順の画面名)を挙げる定型文の候補を検索の結果の外から足すこと
問い合わせにあって定型文が答えていない質問を、問い合わせの文のまま挙げる返信の文を書き上げること
候補ごとに、語の一致とベクトルのどちらで当たったかを写す返金・料金の例外・障害の原因・今後の予定を答えること
確かめる点(客のプラン・権限など)をまとめるどの候補が正しいかを決めること

返信の文を書き上げさせないのが、この構成でいちばん大事な線です。 定型文は、会社として確かめた言い方と手順が入った文です。AIが書き直した文は、その確かめを通っていません。 担当が定型文を当て、書き換える点に沿って直せば、確かめた文から外れずに済みます。

会社としての判断を答えさせないのも同じ理由です。 返金や料金の例外、障害の原因は、定型文に書かれていても、問い合わせごとに担当や上の担当が決めます。答えていない点にこれらが入っていたら、「担当の判断が必要」と書かせます。

Step6

指示内容を固定する

あなたはクラウドサービスのサポートで、担当が回答の定型文を選ぶのを助ける立場です。
【候補】は検索が返した定型文です。【問い合わせ】は客の文で、個人の情報は伏せてあります。

【書くこと(候補ごと)】
- macro_id: 候補の番号。【候補】の番号をそのまま写す
- edits: 問い合わせに合わせて変える部分。定型文の中の文を「」で写し、何に変えるかを
  問い合わせの文から書く。問い合わせに書かれていなければ「確かめる」と書く
- unanswered: 問い合わせにあって、この定型文が答えていない質問。問い合わせの文のまま写す
- needs_decision: unanswered のうち、返金・料金の例外・障害の原因・今後の予定に関わるもの

【厳守事項】
- 【候補】に無い定型文を挙げないでください。
- 返信の文を書かないでください。edits は変える部分の指摘だけにしてください。
- 返金・料金の例外・障害の原因・今後の予定について、答えを書かないでください。
- 候補の順位を変えないでください。どれが正しいかも書かないでください。
- 客のプランや権限が問い合わせに書かれていなければ、推し量らずに「確かめる」と書いてください。

【問い合わせ】{question}
【候補】{macros}
【似た解決済みのチケット】{tickets}

「定型文の中の文を「」で写す」を書くのは、照合のためです。 写した文が定型文の本文に無ければ、AIが定型文を言い換えたか、別の定型文と混ぜたかのどちらかです。Lambda が本文と照らし、無い文の指摘は内部メモから外します。

Step7

出力形式を固定する

Bedrock の Converse API の outputConfig.textFormat に JSON スキーマを渡し、次の形で受け取ります。

{
  "ticket_id": 0,
  "candidates": [
    { "macro_id": 0, "matched_by": "both | keyword | vector",
      "edits": [ { "quote": "", "change_to": "" } ],
      "unanswered": [""], "needs_decision": [""] } ],
  "similar_tickets": [ { "ticket_id": 0, "source_macros": [0] } ],
  "to_confirm": [""]
}

AWS の公式ページでは、Converse API の outputConfig.textFormat に JSON スキーマを渡すと応答がスキーマに沿い、enum が使えるとされています。すべての object に additionalProperties: false が要り、任意の項目は全体で12個までです。 matched_by は enum で縛り、Lambda が検索の結果から入れた値と照らします。

1つ目の理由は、macro_id と quote を照合できることです。 macro_id が検索の結果に無いとき、quote が定型文の本文に無いときは、その候補か指摘を外します。

2つ目は、内部メモを決まった形で書けることです。 内部メモは次の形にします。

【定型文の候補】(自動。返信の前に担当が確かめてください)
1. ログイン_二段階認証_コード未着(#1234)/語と意味の両方で一致/直近30日 86回
   書き換え:「管理画面の[セキュリティ]」→ 問い合わせはスマホのアプリから
   答えていない点:「機種を変えた場合はどうなるか」
2. ……
【似た解決済みのチケット】#98765(返信に近い定型文:#1234)
【担当の判断が必要】なし

内部メモは public を false にしたコメントとして書きます。 公式のドキュメントでは、コメントの public が false のものは内部メモです。客に見えるコメントとして書かないことを、Lambda の書き込みの処理で固定します。

Step8

システムへ連携する

つなぎ先方式内容
Zendesk の定型文の一覧毎晩の取得(読み取りのみ)定型文の本文と使われた回数
Zendesk のチケット増分の書き出しとコメントの一覧(読み取り)新しい問い合わせと解決済みのチケット
Zendesk の定型文の見え方Show Ticket After Changes(チケットは変えない)当てた後の件名・状態・コメント
Amazon BedrockCohere Embed/Converse API(Claude)埋め込みと、書き換える点の指摘
Amazon OpenSearch ServiceLambda からの登録・検索定型文とチケットの索引、検索のパイプライン
Zendesk のチケットの内部メモチケットの更新(public: false)候補の一覧

定型文を当てた後の見え方は、チケットを変えずに取れます。 公式のドキュメントでは、Show Ticket After Changes は定型文を当てた後のチケットの全体を返し、実際にはチケットを変えないとされています。定型文が状態や担当のグループも変える場合は、その変更を内部メモに書き添えます。 担当が当てたときに、思わぬ変更に気づけます。

Step9

人が確認する

  1. 候補を見る … 内部メモの候補から定型文を選びます。合うものが無ければ、いつもどおり探します
  2. 書き換える点を見る … 指摘に沿って、定型文を当てた後の文を直します
  3. 答えていない点を見る … 手順書で答えを足すか、上の担当に回します
  4. 担当の判断が必要な点を回す … 返金・料金の例外・障害の原因は、決まった担当に回します
  5. 印を付ける … 候補が合わなかったら「合わなかった」の印を付けます

3番目を省かないでください。 定型文は1つの質問に答える文で、問い合わせの2つ目の質問は、定型文を当てただけでは答えられていません。

Step10

例外に対処する

起きること対応
候補が語の一致だけ・ベクトルだけ内部メモに「片方のみ一致」と出す
合う定型文が無い「候補なし」と書き、似た解決済みのチケットだけを出す
問い合わせが長く埋め込みでエラー件名と最初の段落に短くして入れ直す
増分の書き出しの回数の上限Retry-After の値を待って取り直す
無効になった定型文が候補に出るactive の絞り込みを確かめる。取り込みの日付を確かめる
AIの quote が本文に無いその指摘を外す。全部外れたら候補の番号だけを出す
構造化出力が返らない検索の候補の番号と名前だけを内部メモに書く

1行目の「片方のみ一致」は、見落としの多い候補です。 ベクトルだけで当たった候補は、言い方は近いが別の機能の定型文であることがあります。

Step11

記録を残す

  • チケットごとの、伏せ字にした問い合わせの文、検索の条件、候補と点数と当たった道
  • AIの出力と、照合で外した指摘
  • 内部メモに書いた内容と書いた時刻
  • 担当が選んだ定型文と「合わなかった」の印
  • 検索のパイプラインの重みと、機能とプランの表を見直した日と担当

4つ目が、重みと定型文の見直しの材料です。 「合わなかった」が多い問い合わせの種類は、定型文が足りないか、古いかのどちらかです。

04実装レベルの3段階

最小構成:手元のAIサービスに定型文の一覧と問い合わせを渡し、近い定型文を挙げさせる / 候補の見当付け
半自動化:上記+OpenSearch に定型文とチケットの索引を作り、担当が画面で検索する / 定型文の検索
本格構成:上記+新しいチケットの取り込み、書き換える点と答えていない点、内部メモへの書き込み / 問い合わせから候補の内部メモまで

半自動化で、1件6分が4分程度になります。 定型文を探す時間は減りますが、担当が検索を投げる手間と、書き換える点を探す作業が残ります。本格構成で2分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化を1か月使うと、ベクトルだけで当たる候補が合っているか、重みをどうするかが分かります。重みを決めてから内部メモに書く段階に進みます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
12 名
月間件数
2,400 件
1件あたり現在時間
6 分
1件あたり導入後時間
2 分
現在  2,400件 × 6分 ÷ 60 = 240 時間/月
導入後 2,400件 × 2分 ÷ 60 = 80 時間/月
月間削減時間
160h
削減率
67%
年間削減時間
1,920h
年間金額換算(時間単価3,000円)
576万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. Zendesk などのヘルプデスクの仕組みで問い合わせを受け、回答の定型文(マクロ)が数百件にふくらんでいて、どの定型文を使えばよいかを探すのに時間がかかっている SaaS・EC の会社。同じ内容の問い合わせが言い方を変えて何度も届き、ベテランは定型文の名前で覚えているが、新しい担当は過去のチケットを開いて探している場合。解決済みのチケットが何万件もたまっている場合。AWS を使える担当か委託先がいる場合。
向いていない
  1. 定型文が数十件で、担当が全部を覚えている場合。問い合わせのほとんどが個別の調査(障害の切り分け、契約ごとの設定の確認)で、定型文で答えられるものが少ない場合。定型文の中身が古く、直す担当がいない場合(先に定型文を整えます)。なお、返信の文面を確定させること、返金・契約・障害の原因など会社としての判断を答えることは、この構成では代替できません。近い定型文とチケットを探し、書き換える点を示すまでです。

07最小構成で試す方法

  1. 先月の解決済みのチケットから50件を選ぶ(ベテランが答えたものと、新しい担当が答えたものを混ぜる)
  2. それぞれについて、ベテランに「どの定型文を当てるか」を書き出してもらう
  3. 定型文の一覧を書き出し、50件の問い合わせの文(個人の情報を伏せたもの)と一緒に手元のAIサービスに渡す
  4. 「この問い合わせに近い定型文を、一覧の中から3つまで番号で挙げてください。一覧に無いものを挙げず、返信の文を書かないでください」と指示する
  5. ベテランの答えと、AIの挙げた番号を突き合わせる

5番目で一致が少なければ、定型文の名前と中身の整理が先です。

出てきた内容判断
ベテランの定型文が3つの中に入ったOpenSearch の索引に進む
返信の文を書いた・一覧に無いものを挙げた指示の書き方で直る。構成は有効
似た定型文が多すぎて決まらない定型文の整理が先

08実装時につまずきやすいポイント

問題対策
点数を上げようと function_score に入れるhybrid は最上位に置く。包むとエラーか、そろえる処理が黙って飛ぶ
一番上の候補の点数が必ず高く見えるmin_max では最も点の高い文書が1.0になる。当たった道を出す
長い問い合わせの末尾が埋め込みに入らないtruncate の既定は END。NONE にして短くしてから入れる
文書と問い合わせで同じ input_type を使う文書は search_document、問い合わせは search_query
内部メモが客に見えるpublic: false を書き込みの処理で固定する
古い定型文が候補に出るactive で絞り、更新から1年を超えた定型文を見直す
AIが返信の文を書く書かせない。quote を本文と照合する

上の4行は、検索がきれいに動いているように見えて起きる失敗です。 第8章の50件で、ベテランの定型文が候補に入るかを必ず見てください。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 客からの問い合わせ(名前・メールアドレス・契約の情報・利用の状況)、解決済みのチケット、定型文です。

  1. 個人の情報を伏せてから渡す … 埋め込みにも Claude にも、伏せ字にした文だけを渡します。索引にも、伏せ字にした文だけを入れます
  2. 他社のモデルの契約を確かめる … Cohere Embed は AWS Marketplace を通じて請求される他社のモデルです。データの扱いの条件を、契約の確認に入れます
  3. 内部メモだけに書く … 客に見えるコメントとして書かないことを、処理で固定します
  4. 返信を送らせない … 定型文を当てるのも送るのも担当です
  5. 会社としての判断を答えさせない … 返金・料金の例外・障害の原因・今後の予定は、決まった担当が答えます
  6. 索引への接続を限る … OpenSearch には Lambda だけが接続できるようにします。チケットの索引には契約企業をまたいだ問い合わせが入るので、担当の画面から索引を直接引かせません

誤りが起きた場合のリスクは、合わない定型文が当たって誤った手順を伝えること、客に内部メモが見えること、個人の情報が外へ渡ることの3つです。 当たった道の表示と担当の確認、public: false の固定、伏せ字で防ぎます。

10まず何から始めるか

1週目:定型文を見る

定型文の一覧を書き出し、似た名前の定型文と、更新から1年を超えた定型文を数えます。定型文の担当と、まとめるものと無効にするものを決めます。

2週目:50件で試す

第8章のとおり、先月の50件でベテランの定型文が候補に入るかを見ます。返信の文を書いていないか、一覧に無いものを挙げていないかを最優先で見ます。

3週目:伏せ字の規則と機能の表を作る

伏せ字の規則と、機能名とプランの表を作ります。埋め込みを自社のチケットで試し、日本語の言い方の違いで近い定型文が出るかを確かめます。

4週目:索引を作る

OpenSearch に定型文とチケットの索引と検索のパイプラインを作り、担当が画面で検索できるようにします。この時点では、内部メモには書きません。

2か月目: 新しいチケットの取り込み、書き換える点と答えていない点、内部メモへの書き込みを足します。3か月目以降: 「合わなかった」の印の数、候補なしの数、新しい担当の1件あたりの時間を毎月数えます。新しい担当が、内部メモの候補からベテランと同じ定型文を選び、答え漏れなく返信を仕上げられた時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-29/最終更新:2026-10-29
確認した内容情報源確認日
hybrid が複数の問い合わせの点数を検索のパイプラインで1つにまとめ、問い合わせが最大5つであること。filter で全体を絞れること。最上位に置くもので、function_score などに入れると実行時のエラーになるか、そろえる処理が黙って飛ばされることがあることOpenSearch: Hybrid query2026-10-29
normalization-processor が尺度の違う点数をそろえてから合わせること。既定が min_max と arithmetic_mean で、min_max では最も点の高い文書が1.0になること。weights が問い合わせの数と同じ数で合計1であることOpenSearch: Normalization processor2026-10-29
knn の問い合わせで vector と k(1〜10,000)を指定して近いベクトルを引けることOpenSearch: k-NN query2026-10-29
Cohere Embed の input_type で、索引に入れる文書に search_document、問い合わせに search_query を使うこと。1件512トークン(約2,048文字)までで、1回96件まで。truncate の既定が END で、NONE だと長すぎる入力でエラーになることAWS: Cohere Embed v3(Amazon Bedrock)2026-10-29
Embed Multilingual が100を超える言語に対応する多言語の埋め込みのモデルで、モデルの ID が cohere.embed-multilingual-v3、文脈の長さが512トークン、東京リージョンで使え、AWS Marketplace を通じて請求される他社のモデルであることAWS: Embed Multilingual(モデルの説明)2026-10-29
マクロが担当によってチケットに手で当てられるものであること。定型文の一覧が1ページ最大100件で、only_viewable で当てられるものに絞れること。直近30日などの使われた回数の取得が Support Professional か Suite Growth 以上で使えること。Show Ticket After Changes が当てた後のチケットを返し、実際にはチケットを変えないことZendesk: Macros2026-10-29
増分の書き出しが1分あたり10回まで呼べ、直近の1分のデータを返さないことZendesk: Incremental Exports2026-10-29
コメントの一覧が1ページ最大100件で、plain_body が文字だけの本文、public が false のコメントが内部メモであることZendesk: Ticket Comments2026-10-29
Converse API の outputConfig.textFormat で JSON スキーマに沿った出力が得られ、enum が使えること。additionalProperties: false が要ること。任意の項目が12個までであることAWS: Structured outputs(Amazon Bedrock)2026-10-29

返信の内容、返金・料金の例外・障害の原因などの会社としての判断は、サポートの担当と自社の決まりに沿って行ってください。 本記事は上記の資料で確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-2253)についてのご相談はこちらから。

AI活用について相談する
目次