SaaS 企業のサポートが、新しい問い合わせに近い回答の定型文(マクロ)と解決済みのチケットを OpenSearch のハイブリッド検索で探し、書き換える点を添えて担当に示す
新しい問い合わせに近い回答の定型文(マクロ)と、同じ定型文で解決した過去のチケットを探します。定型文の候補ごとに、問い合わせに合わせて書き換える点と、定型文が答えていない点をチケットの内部メモに並べます。
- 生成AI
- Azure OpenAI Service/ChatGPT/Claude
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- EC/IT・SaaS
- 対象部門
- カスタマーサポート
- 対象業務
- 問い合わせ対応/情報検索
- 主な課題
- 問い合わせが多い/属人化している/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 品質標準化/対応スピード向上/教育コスト削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当がチケットを開き、問い合わせの文を読む
- 定型文の一覧を機能名やキーワードで検索する
- 見つからなければ、解決済みのチケットを似た言葉で検索し、過去の返信を読む
- 過去の返信に近い定型文を探し直す
- 定型文を当て、問い合わせに合わせて名前・機能・手順の部分を書き換える
- 定型文が答えていない質問があれば、手順書を見て書き足す
- 返信を送る
- 自動毎晩、定型文の一覧と、前の日に解決したチケットを取り込み、埋め込みの値を付けて索引に入れる
- 自動解決済みのチケットの最後の公開の返信を、定型文の索引に当てて、もとになった定型文の候補を付ける
- 自動5分ごとに新しいチケットを取り込み、問い合わせの文から個人の情報を伏せる
- 自動OpenSearch のハイブリッド検索が、定型文と解決済みのチケットを、語の一致と意味の近さで引く
- 自動生成AIが、定型文の候補ごとに、書き換える点と定型文が答えていない点を書く
- 自動Lambda が候補をチケットの内部メモに書く
- 人担当が内部メモを見て、Zendesk の画面で定型文を選んで当て、書き換えて返信を仕上げる
- 人候補が合わなかったら、内部メモの「合わなかった」の印を付ける
各工程の詳しい説明を読む
- 担当がチケットを開き、問い合わせの文を読む
- 定型文の一覧を機能名やキーワードで検索する
- 見つからなければ、解決済みのチケットを似た言葉で検索し、過去の返信を読む
- 過去の返信に近い定型文を探し直す
- 定型文を当て、問い合わせに合わせて名前・機能・手順の部分を書き換える
- 定型文が答えていない質問があれば、手順書を見て書き足す
- 返信を送る
(a)言い方が違うと引けない。 2番目で、客の言い方のまま検索すると、定型文の名前の語と一致しません。「戻される」で引いても「ログイン」の定型文は出ません。
(b)過去のチケットから当てる遠回り。 3番目と4番目で、過去の返信を読み、それがどの定型文をもとにしたかを推し量ります。返信は担当が書き換えているので、元の定型文がすぐには分かりません。
(c)答え漏れ。 問い合わせに質問が2つあると、定型文が答えているのは1つだけのことがあります。急ぐと、もう1つに答えないまま送ります。
(d)担当による差。 同じ問い合わせに、担当によって別の定型文が当たります。古い定型文を使い続ける担当もいます。
- 【自動】 毎晩、定型文の一覧と、前の日に解決したチケットを取り込み、埋め込みの値を付けて索引に入れる
- 【自動】 解決済みのチケットの最後の公開の返信を、定型文の索引に当てて、もとになった定型文の候補を付ける
- 【自動】 5分ごとに新しいチケットを取り込み、問い合わせの文から個人の情報を伏せる
- 【自動】 OpenSearch のハイブリッド検索が、定型文と解決済みのチケットを、語の一致と意味の近さで引く
- 【自動】 生成AIが、定型文の候補ごとに、書き換える点と定型文が答えていない点を書く
- 【自動】 Lambda が候補をチケットの内部メモに書く
- 【人】 担当が内部メモを見て、Zendesk の画面で定型文を選んで当て、書き換えて返信を仕上げる
- 【人】 候補が合わなかったら、内部メモの「合わなかった」の印を付ける
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 |
| 生成AI | Claude(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どうやって実装するのか
処理の起点を決める
起点は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 の定型文は、索引に残したまま検索から外します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 新しい問い合わせ | チケットの番号、件名、最初の公開のコメントの本文、契約のプラン、問い合わせの経路 | Zendesk |
| 定型文 | 番号、名前、本文(コメントに入る文)、有効か、カテゴリ、使われた回数(直近30日) | Zendesk の定型文の一覧 |
| 解決済みのチケット | 件名、最初の問い合わせ、最後の公開の返信、解決の日、満足度の評価 | Zendesk |
| 機能とプランの表 | 機能名の言い換え(「2FA」「二段階認証」「ワンタイムパスワード」)、プランごとに使える機能 | サポートの担当で作る表 |
質を決めるのは、定型文の中身です。 古い手順の定型文が有効のまま残っていると、検索はそれも正しく見つけます。 取り込みのときに、最終の更新から1年を超えた定型文を一覧にして、定型文の担当に見直しを頼みます。
定型文の使われた回数は、候補の並びの参考に出します。 公式のドキュメントでは、定型文の一覧に直近1時間・24時間・7日・30日の使われた回数を合わせて取る指定(sideload)があり、Support Professional か Suite Growth 以上のプランで使えるとされています。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 語の一致する定型文 | 定型文の索引 | match(body・title。kuromoji) |
| 意味の近い定型文 | 定型文の索引 | knn(body_vector) |
| 似た解決済みのチケット | チケットの索引 | 同じハイブリッド検索を question_vector と question に |
| 有効な定型文とプランの絞り込み | 両方の索引 | ハイブリッド検索の filter |
| 当てた後のチケットの見え方 | Zendesk | Show 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 を使うとされています。
AIへ渡す前に整形する
- 個人の情報を伏せる … 問い合わせと返信の文から、メールアドレス・電話番号・人の名前・契約の番号を、Lambda の規則で
[メール]などに置き換えます - 署名と引用を外す … メールの署名と、前の返信の引用を外します
- 長さをそろえる … 埋め込みは1件512トークンまでなので、問い合わせは件名と最初の段落を、返信は最初の段落と手順の部分を埋め込みます
- 機能名をそろえる … 機能とプランの表で、「2FA」「二段階認証」を同じ語にして語の検索の項目に足します
- 定型文の本文を取り出す … 定型文の
actionsのうち、コメントに入る文を本文にします - もとになった定型文の候補を付ける … 解決済みのチケットの最後の返信で定型文の索引を引き、上位の定型文の番号を
source_macrosに持たせます
3番目で truncate を NONE にします。 AWS の公式ページでは、Cohere Embed の truncate は既定が END で、長すぎる入力は末尾を捨てて埋め込み、NONE にすると長すぎる入力でエラーを返すとされています。黙って切られると、問い合わせの肝心の部分が埋め込みに入らないまま検索されます。 エラーになった文は、短くしてから入れ直します。
6番目の候補は「推した」ものです。 返信は担当が書き換えているので、もとの定型文と一致するとは限りません。画面には「過去のチケットの返信に近い定型文」と出し、「このチケットで使われた定型文」とは書きません。
AIに処理させる
AIの仕事は1つです。 検索が返した定型文の候補ごとに、問い合わせに合わせて書き換える点と、定型文が答えていない点を書くことです。
| させること | させないこと |
|---|---|
| 定型文の中で、問い合わせに合わせて変える部分(機能名・プラン・手順の画面名)を挙げる | 定型文の候補を検索の結果の外から足すこと |
| 問い合わせにあって定型文が答えていない質問を、問い合わせの文のまま挙げる | 返信の文を書き上げること |
| 候補ごとに、語の一致とベクトルのどちらで当たったかを写す | 返金・料金の例外・障害の原因・今後の予定を答えること |
| 確かめる点(客のプラン・権限など)をまとめる | どの候補が正しいかを決めること |
返信の文を書き上げさせないのが、この構成でいちばん大事な線です。 定型文は、会社として確かめた言い方と手順が入った文です。AIが書き直した文は、その確かめを通っていません。 担当が定型文を当て、書き換える点に沿って直せば、確かめた文から外れずに済みます。
会社としての判断を答えさせないのも同じ理由です。 返金や料金の例外、障害の原因は、定型文に書かれていても、問い合わせごとに担当や上の担当が決めます。答えていない点にこれらが入っていたら、「担当の判断が必要」と書かせます。
指示内容を固定する
あなたはクラウドサービスのサポートで、担当が回答の定型文を選ぶのを助ける立場です。
【候補】は検索が返した定型文です。【問い合わせ】は客の文で、個人の情報は伏せてあります。
【書くこと(候補ごと)】
- macro_id: 候補の番号。【候補】の番号をそのまま写す
- edits: 問い合わせに合わせて変える部分。定型文の中の文を「」で写し、何に変えるかを
問い合わせの文から書く。問い合わせに書かれていなければ「確かめる」と書く
- unanswered: 問い合わせにあって、この定型文が答えていない質問。問い合わせの文のまま写す
- needs_decision: unanswered のうち、返金・料金の例外・障害の原因・今後の予定に関わるもの
【厳守事項】
- 【候補】に無い定型文を挙げないでください。
- 返信の文を書かないでください。edits は変える部分の指摘だけにしてください。
- 返金・料金の例外・障害の原因・今後の予定について、答えを書かないでください。
- 候補の順位を変えないでください。どれが正しいかも書かないでください。
- 客のプランや権限が問い合わせに書かれていなければ、推し量らずに「確かめる」と書いてください。
【問い合わせ】{question}
【候補】{macros}
【似た解決済みのチケット】{tickets}
「定型文の中の文を「」で写す」を書くのは、照合のためです。 写した文が定型文の本文に無ければ、AIが定型文を言い換えたか、別の定型文と混ぜたかのどちらかです。Lambda が本文と照らし、無い文の指摘は内部メモから外します。
出力形式を固定する
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 の書き込みの処理で固定します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Zendesk の定型文の一覧 | 毎晩の取得(読み取りのみ) | 定型文の本文と使われた回数 |
| Zendesk のチケット | 増分の書き出しとコメントの一覧(読み取り) | 新しい問い合わせと解決済みのチケット |
| Zendesk の定型文の見え方 | Show Ticket After Changes(チケットは変えない) | 当てた後の件名・状態・コメント |
| Amazon Bedrock | Cohere Embed/Converse API(Claude) | 埋め込みと、書き換える点の指摘 |
| Amazon OpenSearch Service | Lambda からの登録・検索 | 定型文とチケットの索引、検索のパイプライン |
| Zendesk のチケットの内部メモ | チケットの更新(public: false) | 候補の一覧 |
定型文を当てた後の見え方は、チケットを変えずに取れます。 公式のドキュメントでは、Show Ticket After Changes は定型文を当てた後のチケットの全体を返し、実際にはチケットを変えないとされています。定型文が状態や担当のグループも変える場合は、その変更を内部メモに書き添えます。 担当が当てたときに、思わぬ変更に気づけます。
人が確認する
- 候補を見る … 内部メモの候補から定型文を選びます。合うものが無ければ、いつもどおり探します
- 書き換える点を見る … 指摘に沿って、定型文を当てた後の文を直します
- 答えていない点を見る … 手順書で答えを足すか、上の担当に回します
- 担当の判断が必要な点を回す … 返金・料金の例外・障害の原因は、決まった担当に回します
- 印を付ける … 候補が合わなかったら「合わなかった」の印を付けます
3番目を省かないでください。 定型文は1つの質問に答える文で、問い合わせの2つ目の質問は、定型文を当てただけでは答えられていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 候補が語の一致だけ・ベクトルだけ | 内部メモに「片方のみ一致」と出す |
| 合う定型文が無い | 「候補なし」と書き、似た解決済みのチケットだけを出す |
| 問い合わせが長く埋め込みでエラー | 件名と最初の段落に短くして入れ直す |
| 増分の書き出しの回数の上限 | Retry-After の値を待って取り直す |
| 無効になった定型文が候補に出る | active の絞り込みを確かめる。取り込みの日付を確かめる |
AIの quote が本文に無い | その指摘を外す。全部外れたら候補の番号だけを出す |
| 構造化出力が返らない | 検索の候補の番号と名前だけを内部メモに書く |
1行目の「片方のみ一致」は、見落としの多い候補です。 ベクトルだけで当たった候補は、言い方は近いが別の機能の定型文であることがあります。
記録を残す
- チケットごとの、伏せ字にした問い合わせの文、検索の条件、候補と点数と当たった道
- AIの出力と、照合で外した指摘
- 内部メモに書いた内容と書いた時刻
- 担当が選んだ定型文と「合わなかった」の印
- 検索のパイプラインの重みと、機能とプランの表を見直した日と担当
4つ目が、重みと定型文の見直しの材料です。 「合わなかった」が多い問い合わせの種類は、定型文が足りないか、古いかのどちらかです。
04実装レベルの3段階
半自動化で、1件6分が4分程度になります。 定型文を探す時間は減りますが、担当が検索を投げる手間と、書き換える点を探す作業が残ります。本格構成で2分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化を1か月使うと、ベクトルだけで当たる候補が合っているか、重みをどうするかが分かります。重みを決めてから内部メモに書く段階に進みます。
05工数削減シミュレーション
導入後 2,400件 × 2分 ÷ 60 = 80 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- Zendesk などのヘルプデスクの仕組みで問い合わせを受け、回答の定型文(マクロ)が数百件にふくらんでいて、どの定型文を使えばよいかを探すのに時間がかかっている SaaS・EC の会社。同じ内容の問い合わせが言い方を変えて何度も届き、ベテランは定型文の名前で覚えているが、新しい担当は過去のチケットを開いて探している場合。解決済みのチケットが何万件もたまっている場合。AWS を使える担当か委託先がいる場合。
- 定型文が数十件で、担当が全部を覚えている場合。問い合わせのほとんどが個別の調査(障害の切り分け、契約ごとの設定の確認)で、定型文で答えられるものが少ない場合。定型文の中身が古く、直す担当がいない場合(先に定型文を整えます)。なお、返信の文面を確定させること、返金・契約・障害の原因など会社としての判断を答えることは、この構成では代替できません。近い定型文とチケットを探し、書き換える点を示すまでです。
07最小構成で試す方法
- 先月の解決済みのチケットから50件を選ぶ(ベテランが答えたものと、新しい担当が答えたものを混ぜる)
- それぞれについて、ベテランに「どの定型文を当てるか」を書き出してもらう
- 定型文の一覧を書き出し、50件の問い合わせの文(個人の情報を伏せたもの)と一緒に手元のAIサービスに渡す
- 「この問い合わせに近い定型文を、一覧の中から3つまで番号で挙げてください。一覧に無いものを挙げず、返信の文を書かないでください」と指示する
- ベテランの答えと、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ガバナンス上の注意点
この構成で扱うデータ: 客からの問い合わせ(名前・メールアドレス・契約の情報・利用の状況)、解決済みのチケット、定型文です。
- 個人の情報を伏せてから渡す … 埋め込みにも Claude にも、伏せ字にした文だけを渡します。索引にも、伏せ字にした文だけを入れます
- 他社のモデルの契約を確かめる … Cohere Embed は AWS Marketplace を通じて請求される他社のモデルです。データの扱いの条件を、契約の確認に入れます
- 内部メモだけに書く … 客に見えるコメントとして書かないことを、処理で固定します
- 返信を送らせない … 定型文を当てるのも送るのも担当です
- 会社としての判断を答えさせない … 返金・料金の例外・障害の原因・今後の予定は、決まった担当が答えます
- 索引への接続を限る … OpenSearch には Lambda だけが接続できるようにします。チケットの索引には契約企業をまたいだ問い合わせが入るので、担当の画面から索引を直接引かせません
誤りが起きた場合のリスクは、合わない定型文が当たって誤った手順を伝えること、客に内部メモが見えること、個人の情報が外へ渡ることの3つです。 当たった道の表示と担当の確認、public: false の固定、伏せ字で防ぎます。
10まず何から始めるか
1週目:定型文を見る
定型文の一覧を書き出し、似た名前の定型文と、更新から1年を超えた定型文を数えます。定型文の担当と、まとめるものと無効にするものを決めます。
2週目:50件で試す
第8章のとおり、先月の50件でベテランの定型文が候補に入るかを見ます。返信の文を書いていないか、一覧に無いものを挙げていないかを最優先で見ます。
3週目:伏せ字の規則と機能の表を作る
伏せ字の規則と、機能名とプランの表を作ります。埋め込みを自社のチケットで試し、日本語の言い方の違いで近い定型文が出るかを確かめます。
4週目:索引を作る
OpenSearch に定型文とチケットの索引と検索のパイプラインを作り、担当が画面で検索できるようにします。この時点では、内部メモには書きません。
2か月目: 新しいチケットの取り込み、書き換える点と答えていない点、内部メモへの書き込みを足します。3か月目以降: 「合わなかった」の印の数、候補なしの数、新しい担当の1件あたりの時間を毎月数えます。新しい担当が、内部メモの候補からベテランと同じ定型文を選び、答え漏れなく返信を仕上げられた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
hybrid が複数の問い合わせの点数を検索のパイプラインで1つにまとめ、問い合わせが最大5つであること。filter で全体を絞れること。最上位に置くもので、function_score などに入れると実行時のエラーになるか、そろえる処理が黙って飛ばされることがあること | OpenSearch: Hybrid query | 2026-10-29 |
normalization-processor が尺度の違う点数をそろえてから合わせること。既定が min_max と arithmetic_mean で、min_max では最も点の高い文書が1.0になること。weights が問い合わせの数と同じ数で合計1であること | OpenSearch: Normalization processor | 2026-10-29 |
knn の問い合わせで vector と k(1〜10,000)を指定して近いベクトルを引けること | OpenSearch: k-NN query | 2026-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: Macros | 2026-10-29 |
| 増分の書き出しが1分あたり10回まで呼べ、直近の1分のデータを返さないこと | Zendesk: Incremental Exports | 2026-10-29 |
コメントの一覧が1ページ最大100件で、plain_body が文字だけの本文、public が false のコメントが内部メモであること | Zendesk: Ticket Comments | 2026-10-29 |
Converse API の outputConfig.textFormat で JSON スキーマに沿った出力が得られ、enum が使えること。additionalProperties: false が要ること。任意の項目が12個までであること | AWS: Structured outputs(Amazon Bedrock) | 2026-10-29 |
返信の内容、返金・料金の例外・障害の原因などの会社としての判断は、サポートの担当と自社の決まりに沿って行ってください。 本記事は上記の資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-2253)についてのご相談はこちらから。
