フィットネスクラブの会員から届く休会・プラン変更・施設利用の質問に、会員規約と店舗ごとの施設案内を根拠にチャットで答え、手続きが要るものをフロントへ回す
フィットネスクラブの会員アプリに届く休会・プラン変更・施設利用の質問に、会員規約と店舗ごとの施設案内を根拠にチャットで答えます。手続きが要るものと答えられないものは、フロントの待ち行列へ回します。
- 生成AI
- Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 連携・自動化
- Python
- 対象業界
- その他/宿泊
- 対象部門
- カスタマーサポート
- 対象業務
- 問い合わせ対応
- 主な課題
- 人手が足りない/問い合わせが多い/属人化している
- AIで行う処理
- 対話
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 会員から電話・窓口・会員アプリのメッセージで質問を受ける
- 会員番号で会員管理のシステムを開き、プランと所属店舗を確かめる
- 会員規約か施設案内を開き、該当する条項を探す。分からなければ店長や本部に聞く
- 会員に答える。手続きが要るものは申請書の案内をする
- 会員アプリのメッセージは、営業時間内に返事を書く
- 【会員】 会員アプリにログインし、チャットで質問する
- 自動中継プログラムが会員管理のシステムから所属店舗・プラン・状態・年齢の区分を引く。18歳未満の会員にはチャットを出さない
- 自動所属店舗とプランで絞り込みを作り、Agent Search(Vertex AI Search)の answer メソッドに質問を渡す
- 自動answer メソッドが規約と施設案内から条項を引き、引用付きの回答を返す
- 自動引用された条項に「手続きが要る」の印があれば、「フロントで手続き」のボタンを出す
- 自動会費の質問には、料金表の値を回答の下にそのまま表示する
- 自動回答が作られなかった質問、根拠が弱い回答は、所属店舗のフロントの待ち行列へ回す
- 人フロントが待ち行列の質問に答え、手続きの申し出を受ける
各工程の詳しい説明を読む
- 会員から電話・窓口・会員アプリのメッセージで質問を受ける
- 会員番号で会員管理のシステムを開き、プランと所属店舗を確かめる
- 会員規約か施設案内を開き、該当する条項を探す。分からなければ店長や本部に聞く
- 会員に答える。手続きが要るものは申請書の案内をする
- 会員アプリのメッセージは、営業時間内に返事を書く
(a)同じ説明を繰り返している。 月末の休会の締め切りの前は、同じ「休会の申し出はいつまでか」に1日に何度も答えます。 電話がふさがっている間、窓口の会員を待たせます。
(b)店舗とプランで答えが変わる。 駐車場の扱い、営業時間、使える設備は店舗ごとに違い、休会の条件や他店舗の利用はプランごとに違います。フロントは自分の店舗のことは覚えていても、他の店舗の会員から聞かれると答えに詰まります。
(c)規約の改定が届かない。 規約や料金表が改定されると、本部から文書が配られますが、アルバイトまで行き渡るのに時間がかかります。 古い説明は、たいてい改定の直後に起きます。
(d)営業時間外に答えられない。 夜に会員アプリへ届いた質問は、翌日まで待たせます。休会の締め切りの日の夜に届いた質問は、答えたときには締め切りを過ぎています。
(e)手続きと質問が混ざる。 「休会したい」という会員は、条件を聞きたいだけのこともあれば、すぐ手続きしたいこともあります。フロントは話を聞きながら、どちらかを見分けています。
- 【会員】 会員アプリにログインし、チャットで質問する
- 【自動】 中継プログラムが会員管理のシステムから所属店舗・プラン・状態・年齢の区分を引く。18歳未満の会員にはチャットを出さない
- 【自動】 所属店舗とプランで絞り込みを作り、Agent Search(Vertex AI Search)の answer メソッドに質問を渡す
- 【自動】 answer メソッドが規約と施設案内から条項を引き、引用付きの回答を返す
- 【自動】 引用された条項に「手続きが要る」の印があれば、「フロントで手続き」のボタンを出す
- 【自動】 会費の質問には、料金表の値を回答の下にそのまま表示する
- 【自動】 回答が作られなかった質問、根拠が弱い回答は、所属店舗のフロントの待ち行列へ回す
- 【人】 フロントが待ち行列の質問に答え、手続きの申し出を受ける
2番目が、この設計の前提です。 Google Cloud の規約は、生成AIのサービスを18歳未満が使う(使いうる)サービスの一部として使うことを禁じています。チャットはログインした会員だけに出し、会員の生年月日で18歳未満のアカウントには出しません。 ログインしない公開のWebサイトには置きません。
7番目で回す基準は、答えの中身ではなく、answer メソッドが返す印で決めます。 回答が作られなかった理由(answerSkippedReasons)や、根拠の強さで絞った結果です。「答えに自信があるか」をAIに聞くのではなく、返ってきた印で機械的に振り分けます。
02今回想定するシステム構成
会員規約 店舗ごとの施設案内 手続きの案内 料金表(表計算) │ 文書ごとに店舗・プラン・版・施行日・手続きの印を付ける ▼ Cloud Storage ── メタデータ(JSON Lines) 料金表の値(データベース) ▼ Agent Search(Vertex AI Search)── データストア(レイアウト パーサー、チャンク分割) ▲ │ answer メソッド(session、filter、引用、根拠の強さ) 中継プログラム(Python、Cloud Run) ├──▶ 会員管理のシステム:所属店舗・プラン・状態・年齢の区分 ├──▶ 料金表の値の表示 ├──▶ 手続きの印 →「フロントで手続き」ボタン └──▶ 回答なし・根拠が弱い → フロントの待ち行列 ▲ 会員アプリのチャット ──【トリガー】会員の質問(18歳以上の会員だけ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Vertex AI Search(Agent Search)の answer メソッド | Azure AI Search、Amazon OpenSearch Service |
| 生成AI | Gemini(answer メソッドの回答の生成に使うモデル) | ─ |
| 連携 | 中継プログラム(Python。Cloud Run で動かし、会員アプリ・会員管理・料金表・待ち行列をつなぐ) | Node.js で同じものを書く |
| 保管 | Cloud Storage(規約・施設案内の写しとメタデータ、会話の記録) | ─ |
会員管理のシステムには、この構成から書き込みません。 所属店舗・プラン・状態・生年月日から出した年齢の区分を読むだけです。休会・変更・退会の受付は、フロントがこれまでどおり会員管理のシステムで行います。
土台は、Agent Search の answer メソッドです。 公式のドキュメントでは、Vertex AI Search は Agent Search へ改称中とされています。answer メソッドは検索の結果から回答を作り、session を渡して前のやり取りを踏まえた追加の質問に答えられます。 追加の質問を使うには、アプリの「Generative responses」の設定を有効にする必要があります。古い converse メソッドは非推奨になり、answer メソッドに置き換わっています。
会員ごとの事情は endUserSpec で渡せます。 公式では、ログインした利用者のプロフィールの情報を endUserMetadata に入れて回答を個人に合わせられ、文字列の上限は8,000文字です。渡すのはプランと所属店舗と状態(在籍・休会中)だけで、氏名や会員番号は渡しません。
取り込みには、レイアウト パーサーとチャンク分割を使います。 レイアウト パーサーは段落・表・リスト・見出しを検出し、チャンクの大きさは100〜500トークン(既定500)、includeAncestorHeadings で上位の見出しを各チャンクに付けられます(既定は付けない)。「第12条 休会」の見出しが付かないと、条項の一部だけを引いたときに、どの規定の話か分からなくなります。
03どうやって実装するのか
処理の起点を決める
会員が会員アプリにログインし、チャットの画面で質問を送ったときに動かします。 中継プログラムは、質問を受けるたびに会員管理のシステムから会員の情報を引きます。会員の状態は月の途中でも変わるので、チャットを開いたときではなく、質問のたびに引きます。
チャットを出すかどうかは、ログインした時点で決めます。 生年月日から18歳未満と分かる会員、ジュニアのスクールの会員のアカウントには、チャットの入口を出しません。ジュニアのスクールの質問は、保護者の会員アカウントか、フロントで受けます。
もう1つの起点は、規約・施設案内・料金表の改定です。 本部が改定した文書を Cloud Storage の決まった場所に置き、施行日を付けて取り込みます。施行日の前に取り込んでおき、絞り込みで施行日を見て切り替えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 会員の質問 | チャットの本文と、同じ会話の前の質問 | 会員アプリ |
| 会員の情報 | 所属店舗、プラン、状態(在籍・休会中)、年齢の区分 | 会員管理のシステム |
| 会員規約 | 全店舗共通の規約。条ごとに見出し | データストア(Agent Search) |
| 施設案内 | 店舗ごとの営業時間・設備・駐車場・レンタル品・スタジオの予約の決まり | データストア |
| 手続きの案内 | 休会・プラン変更・退会・他店舗の登録の受付の締め切りと方法 | データストア(手続きの印付き) |
| 料金表 | プラン別・店舗別の月会費、休会中の会費、オプションの料金 | データベース(表計算から取り込む) |
質を決めるのは、施設案内が店舗ごとに書き分けられていることです。 全店舗の案内が1つの文書にまとまっていると、絞り込みが効きません。店舗ごとの文書に分け、店舗の番号をメタデータに入れます。
料金表は、データストアに入れません。 金額は回答の文に出さず、料金表の値をプログラムが表示します。データストアに料金表を入れると、回答に金額が混ざります。
データの取得方法を決める
文書ごとのメタデータは、JSON Lines で次のように書きます。
{"id": "facility-s03-2026-10", "structData": {"title": "施設案内(S03 駅前店)", "store_id": "S03", "plan": ["ALL"], "doc_kind": "facility", "needs_front": false, "effective_from": "2026-10-01T00:00:00+09:00", "effective_to": "9999-12-31T00:00:00+09:00"}, "content": {"mimeType": "application/pdf", "uri": "gs://club-docs/facility/s03_2026-10.pdf"}}
{"id": "procedure-suspend-2026-04", "structData": {"title": "休会の手続き", "store_id": "ALL", "plan": ["ALL"], "doc_kind": "procedure", "needs_front": true, "effective_from": "2026-04-01T00:00:00+09:00", "effective_to": "9999-12-31T00:00:00+09:00"}, "content": {"mimeType": "application/pdf", "uri": "gs://club-docs/procedure/suspend_2026-04.pdf"}}
answer メソッドの呼び出しは、次のようになります。
POST .../engines/club-faq/servingConfigs/default_search:answer
{
"query": { "text": "休会中もスタジオのレッスンは予約できますか" },
"session": "projects/.../engines/club-faq/sessions/SESSION_ID",
"searchSpec": {
"searchParams": {
"filter": "store_id: ANY(\"S03\", \"ALL\") AND plan: ANY(\"REGULAR\", \"ALL\") AND effective_from <= \"2026-10-14T00:00:00+09:00\" AND effective_to > \"2026-10-14T00:00:00+09:00\""
}
},
"groundingSpec": { "filteringLevel": "FILTERING_LEVEL_HIGH", "includeGroundingSupports": true },
"answerGenerationSpec": {
"includeCitations": true,
"ignoreAdversarialQuery": true,
"ignoreNonAnswerSeekingQuery": true,
"ignoreLowRelevantContent": true,
"answerLanguageCode": "ja",
"promptSpec": { "preamble": "(次の小見出しの指示)" }
},
"endUserSpec": {
"endUserMetadata": [
{ "chunkInfo": { "content": "所属店舗はS03。プランはレギュラー。状態は在籍。",
"documentMetadata": { "title": "会員の所属とプラン" } } }
]
}
}
session には、会話を始めるときにアプリの sessions を作って得た番号を入れ、同じ会話では毎回同じ番号を渡します。 セッションには利用者の仮の ID(userPseudoId)を付けられるので、会員番号ではなく、中継プログラムが会員ごとに振った別の番号を入れます。
絞り込みの ANY() は、列挙した値との完全一致です。 店舗の番号と「ALL」を並べ、その店舗の案内と全店舗共通の規約だけを引きます。 絞り込みに使う項目は、データストアのスキーマで索引可能(Indexable)にしておく必要があります。施行日の比較は、ISO 8601 の日時の文字列で書けます。
groundingSpec の filteringLevel は、根拠の弱い回答を落とす設定です。 低・高の2つの水準があり、指定しなければ落としません。会員に直接返すので、高い水準から始めます。 落ちた質問はフロントへ回します。
AIへ渡す前に整形する
- 文書の分割 … 施設案内を店舗ごとの文書に、手続きの案内を手続きごとの文書に分けます
- メタデータの付与 … 店舗・プラン・文書の種類・手続きの印・施行日と失効日を JSON Lines に書きます
- 見出しの整え … 規約の条の見出し(「第12条(休会)」)を、PDF の見出しとして検出されるように整えます
- 料金表の取り込み … 表計算の料金表を、店舗・プラン・項目・金額・施行日の行にしてデータベースへ入れます
- 会員の情報の整え … 生年月日から年齢の区分だけを出し、
endUserMetadataには氏名・会員番号・生年月日を入れません - 改定時の切り替え … 新しい版を施行日付きで入れ、古い版に失効日を付けます。古い版は消さずに残します
6番目で古い版を消さないのは、後から確かめるためです。 「先月そう答えられた」と言われたとき、その日に有効だった版で何を答えたかを、会話の記録と版の組で確かめられます。
AIに処理させる
させるのは、会員の質問に、絞り込んだ規約と施設案内の条項を引いて答えることだけです。
| させること | 中身 |
|---|---|
| 質問への回答 | 規約・施設案内・手続きの案内に書かれていることを、会員に分かる言葉で答える |
| 引用 | 回答の文ごとに、根拠の条項を引用として返す |
| 追加の質問への対応 | 同じ会話の前の質問を踏まえて答える(「それは休会中も?」) |
| 書かれていないことの区別 | 規約に書かれていなければ、書かれていないと答える |
| させないこと | 理由 |
|---|---|
| 会費の金額を書く | 料金表の値をプログラムが表示する |
| 手続きを受け付ける | 会員管理のシステムでフロントが受ける |
| 規約に無い例外を約束する | けがや転勤の特例は店長と本部が判断する |
| 他の店舗・他のプランの条項で答える | 絞り込みで引かせない |
| 会員の個人の事情を推測する | 渡すのはプラン・店舗・状態だけ |
1行目がいちばん起きやすい失敗です。 料金表を引ける状態にすると、「休会中の会費は月○円です」と書きます。改定の前の金額や、別のプランの金額が混ざると、そのまま会員との約束になります。 金額は回答から外し、表示はプログラムが受け持ちます。
会員の状態を渡すのは、同じ質問でも答えが変わるからです。 「スタジオを予約できるか」は、在籍中の会員と休会中の会員で答えが違います。状態を endUserMetadata に入れておくと、休会中の会員には休会中の決まりの条項を引いて答えます。 ただし状態は質問のたびに会員管理のシステムから引き直し、会話の途中で休会の手続きが済んだ場合にも古い状態で答えないようにします。
指示内容を固定する
answer メソッドの preamble に、次の指示を入れます。
あなたはフィットネスクラブの会員サポートとして、会員からの質問に答えます。
検索で見つかった会員規約・施設案内・手続きの案内だけを根拠にしてください。
【答え方】
- 短く、会員に分かる言葉で答えてください。条の番号を添えてください。
- 会員の所属店舗とプランは、会員の情報として渡しています。
他の店舗やプランの決まりで答えないでください。
- 手続きが必要な内容(休会・プラン変更・退会・他店舗の登録)は、
締め切りと方法を案内し、「手続きはフロントで承ります」と添えてください。
【厳守事項】
- 金額(会費・料金・手数料)を回答に書かないでください。
金額の質問には「料金は下に表示しています」とだけ書いてください。
- 規約に書かれていない例外(けが・病気・転勤などの特例)を約束しないでください。
「個別のご事情はフロントにご相談ください」と案内してください。
- 根拠が見つからないときは、推測で答えずに「この内容は確認が必要です」と答えてください。
- 「できます」「できません」と言い切れるのは、根拠の条項に書かれている場合だけです。
- 健康状態や運動の可否についての質問には答えず、医師やトレーナーへの相談を案内してください。
「金額を書かない」を明記しないと、施設案内の中の料金の記載を拾って書きます。 料金表をデータストアから外していても、施設案内に「タオル1回○円」と書かれていることがあります。指示で禁じ、後段のチェックでも金額の表記を検出します。
健康の質問を外すのは、答える立場に無いからです。 「腰が痛いがプールは大丈夫か」に規約は答えません。トレーナーと医師への相談を案内するだけにします。
出力形式を固定する
answer メソッドの応答から、中継プログラムが次の形に組み直して会員アプリへ返します。
{
"session": "",
"answer_text": "",
"citations": [
{ "doc_id": "", "title": "", "section": "", "needs_front": false }
],
"fee_rows": [
{ "store_id": "", "plan": "", "item": "", "amount": "", "effective_from": "" }
],
"show_front_button": false,
"route": "answered | front_queue",
"route_reason": "",
"doc_versions": []
}
1つ目の理由は、needs_front で手続きのボタンを機械的に出せることです。 引用された文書に手続きの印があれば show_front_button を真にします。回答の文から「手続きが要りそうか」を読み取るのではなく、引いた文書の印で決めます。
2つ目は、fee_rows で金額を生成文から切り離せることです。 質問に会費・料金の言葉があれば、料金表から会員の店舗とプランの行を引いて並べます。金額は料金表の値そのもので、AIの文を通りません。
3つ目は、route と route_reason で回した理由が残ることです。 answerSkippedReasons の値、根拠の強さで落ちたこと、金額の表記の検出。フロントは理由を見て、どこから答えればよいかが分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 会員アプリ | チャットの画面から中継プログラムを呼ぶ | 質問の送信、回答と引用と料金の表示、手続きのボタン |
| 会員管理のシステム | 読み取りの API | 所属店舗・プラン・状態・年齢の区分 |
| Agent Search | answer メソッド、セッション | 条項の検索と回答 |
| 料金表のデータベース | 読み取り | 会員の店舗とプランの料金の行 |
| フロントの待ち行列 | 会員アプリのメッセージの機能 | 回した質問と会話の経緯、回した理由 |
人が確認する
- 待ち行列の質問に答える … 回答が作られなかった質問、根拠が弱かった質問、例外の相談に、フロントが会員アプリのメッセージで答えます
- 手続きの申し出を受ける … ボタンから来た会員の手続きを、会員管理のシステムで受け付けます
- 回答の抜き取り … 本部の会員サポートが、毎週100件の回答を抜き取り、引用と回答が合っているかを読みます
- 改定の前に試す … 規約や施設案内を改定するときは、施行日の前に、よくある質問20件で回答を確かめます
3番目を省かないでください。 会員に直接返す回答は、誤りがあっても会員が気づかないまま使われます。 抜き取りで見つけた誤りは、文書の書き方か絞り込みの設定に原因があります。
目標は、1,200件をならして1件2分です。 7割前後はチャットで終わり、フロントは回ってきた質問と手続きに時間を使うという見込みです。
例外に対処する
| 起きること | 対応 |
|---|---|
回答が作られない(answerSkippedReasons が返る) | フロントの待ち行列へ回し、会員には「確認してご連絡します」と返す |
| 根拠の強さの水準で回答が落ちる | 同じく待ち行列へ。理由を残す |
| 回答に金額の表記が混ざる | 回答を表示せず待ち行列へ回し、指示と文書を見直す |
| 会員の情報が引けない | チャットで答えず、フロントへの問い合わせを案内する |
| 18歳未満の会員がチャットを開こうとする | 入口を出さない。保護者の会員アカウントかフロントを案内する |
| 退会や苦情の申し出 | 回答を作らず、すぐにフロントの待ち行列へ回す |
| けがや体調の相談 | 規約で答えず、フロントとトレーナーへの相談を案内する |
| 改定の施行日をまたぐ質問 | 両方の版の条項を引用し、施行日を添えて答える |
6行目は、質問の言葉で振り分けます。 「退会したい」「やめたい」「苦情」などの言葉が入った質問は、answer メソッドに渡す前に中継プログラムが待ち行列へ回します。引き止めや謝罪を、AIの文でしないためです。
記録を残す
- 会話の記録(セッションの番号、質問、回答、引用、日時)。会員番号は中継プログラムの側で別に持ちます
- そのとき使った絞り込み(店舗・プラン・日付)と、引用した文書の版
- 表示した料金の行と、料金表の施行日
- 回した質問と理由、フロントの返事
- 抜き取りで見つけた誤りと、直した文書
2行目の「文書の版」が、申し出への答えになります。 会員に「チャットでそう言われた」と言われたとき、その日に有効だった版の、どの条項を引いて答えたかを示せます。
04実装レベルの3段階
半自動化で、1件6分が4分程度になります。 条項を探す時間は消えますが、フロントが会員に答える作業は残ります。本格構成で2分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化で1か月使うと、フロントが直した回答から、文書の書き方の足りない箇所と、絞り込みの漏れが分かります。そこを直してから会員に直接返します。
05工数削減シミュレーション
導入後 1,200件 × 2分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の店舗を持つ総合型のフィットネスクラブやスポーツクラブ、ホテルの会員制のフィットネス・スパで、会員アプリやWebの会員ページがあり、休会・プラン変更・他店舗の利用・スタジオの予約などの質問が月に千件前後フロントに届いている場合。会員規約と施設案内が文書で整っていて、店舗ごとの違い(営業時間・設備・駐車場)が書き分けられている場合。会員の生年月日をシステムで持っていて、18歳未満の会員にチャットを出さない設定ができる場合。
- 店舗が1つで会員が数百人程度、フロントが口頭で十分に答えられる場合。会員の多くが18歳未満で、ジュニアのスクールが中心のクラブの場合(第13章のとおり、Google Cloud の生成AIの規約で18歳未満が使う(使いうる)サービスでの利用が禁じられています)。休会や退会の手続きそのものをチャットの中で完了させたい場合。なお、規約に書かれていない例外の扱い(けがによる休会の特例など)の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月フロントに届いた質問から、休会・プラン変更・施設利用の質問を50件選ぶ(店舗によって答えが違う質問を必ず含める)
- 会員規約と、2つの店舗の施設案内を用意する
- 手元のAIサービスに規約と施設案内を渡し、「この会員はS03店のレギュラープランです。規約と施設案内だけを根拠に、条の番号を添えて答えてください。金額は書かないでください。書かれていないことは推測しないでください」と指示して、50件を1件ずつ聞く
- 出てきた回答を、フロントが実際に答えた内容と比べる
| 出てきた内容 | 判断 |
|---|---|
| フロントと同じ答えが条の番号付きで出た | データストアと絞り込みの仕組みづくりに進む |
| 金額を書いた、例外を約束した | 指示と後段のチェックで直る。構成は有効 |
| 他の店舗の案内で答えた | 施設案内を店舗ごとの文書に分けるのが先 |
3行目が出ることは珍しくありません。 それは失敗ではなく、施設案内を店舗ごとに書き分ける作業が要るということが分かったということです。
試すときは、フロントの社員とアルバイトの両方に回答を見てもらってください。 社員が「この答え方だと誤解される」と言う回答が、規約の書き方を直すべき箇所です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 他の店舗の案内で答える | 店舗ごとの文書に分け、ANY() で絞る。項目を索引可能にする |
| 回答に金額が混ざる | 料金表をデータストアから外し、指示で禁じ、金額の表記を検出する |
| 改定の前の条項で答える | 施行日と失効日で絞る |
| 条項の一部だけ引かれてどの規定か分からない | includeAncestorHeadings で見出しを付ける |
| 追加の質問が前の話を踏まえない | session を渡し、「Generative responses」を有効にする |
| 例外を約束する | 指示で禁じ、待ち行列へ回す |
| 18歳未満の会員がチャットを使う | 生年月日で入口を出さない。公開のWebサイトに置かない |
| 退会の申し出にAIが引き止めの文を返す | 言葉で振り分け、answer に渡さずフロントへ |
| 会員の氏名がAIに渡る | endUserMetadata はプラン・店舗・状態だけ |
| 引用の位置がずれて表示される | 引用の開始と終了の位置はバイト単位。文字数で切らない |
上の3行が、この構成の失敗のほとんどです。 どれも「その会員に当てはまらない答え」を返す失敗です。絞り込みと料金の切り離しを、文書を入れる前に設計します。
最後の行は、日本語で必ず起きます。 answer メソッドの引用の startIndex と endIndex は、文字ではなく UTF-8 のバイトで数えられています。日本語の回答で文字数として切ると、引用の位置がずれます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 会員の所属店舗・プラン・状態・年齢の区分、会員の質問の本文、会員規約と施設案内です。質問の本文には、体調や家庭の事情が書かれることがあります。
- 18歳未満が使うサービスに組み込まない … Google Cloud のサービス固有の規約は、生成AIのサービスを、18歳未満を対象とする、または18歳未満が使う可能性が高いWebサイト・アプリ・オンラインサービスの一部として使うことを禁じています。生成AIのサービスには、サービスの生成AIの機能も含まれるとされています。ログインした18歳以上の会員だけにチャットを出し、ジュニアのスクールが中心のクラブではこの構成を使いません。 適用の範囲は、自社の法務と確かめてください
- AIに渡す会員の情報を絞る … 渡すのはプラン・店舗・状態だけで、氏名・会員番号・生年月日は渡しません
- 体調の相談に答えない … 規約で答えられない内容で、トレーナーと医師への相談を案内します
- 会話の記録の扱いを決める … セッションはアプリに保存されます。保存の期間と、本部の誰が読めるかを決め、会員規約やプライバシーポリシーとの整合を確かめます
- 回答と手続きを切り離す … 休会・退会の受付は人が会員管理のシステムで行い、チャットの回答だけで契約の状態が変わらないようにします
誤りが起きた場合のリスクは、誤った条件や金額を会員に伝えることと、規約に反する使い方をすることの2つです。 前者は絞り込みと料金の切り離しと抜き取りで、後者は年齢の区分と公開範囲の設計で防ぎます。
10まず何から始めるか
1週目:文書を分けて印を付ける
施設案内を店舗ごとの文書に分け、手続きの案内を手続きごとの文書にします。店舗・プラン・文書の種類・手続きの印・施行日の一覧を作ります。
2週目:50件で試す
先月の質問から50件を選び、手元のAIサービスで答えさせます。フロントが実際に答えた内容と比べ、他の店舗の案内で答えた質問がどれかを見ます。
3週目:データストアを作る
文書とメタデータを Cloud Storage に置き、レイアウト パーサーとチャンク分割を有効にしてデータストアを作ります。絞り込みに使う項目を索引可能にし、店舗とプランで絞った回答を確かめます。
4週目:フロントの画面で使う
半自動化として、フロントが社内の画面で answer メソッドの回答を見ながら答える形で使います。フロントが直した回答を集め、文書の書き方を直します。
2か月目: 会員アプリのチャット、年齢の区分、料金の表示、手続きのボタン、待ち行列を足し、一部の店舗の会員に出します。3か月目以降: 全店舗に広げ、1件6分が何分になったかを実測します。月末の休会の締め切りの前に、フロントの電話が鳴りやまない状態がなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Vertex AI Search が Agent Search へ改称中であること。answer メソッドが converse メソッドに置き換わったこと、session で追加の質問に答えられ、そのために「Generative responses」の設定が要ること。includeCitations(既定は無効)、ignoreAdversarialQuery・ignoreNonAnswerSeekingQuery・ignoreLowRelevantContent、preamble、answerSkippedReasons。groundingSpec の filteringLevel(低・高、指定しなければ絞らない)。endUserSpec の endUserMetadata(上限8,000文字)。引用の位置が UTF-8 のバイト単位であること | Google Cloud: Get answers and follow-ups | 2026-10-14 |
絞り込みの ANY() が列挙した値との完全一致を見ること、AND/OR、日時の項目を ISO 8601 の文字列と比べられること、項目を索引可能にする必要があること | Google Cloud: Filter custom search for structured or unstructured data | 2026-10-14 |
レイアウト パーサーが段落・表・リスト・見出しを検出すること。チャンクの大きさが100〜500トークン(既定500)で、includeAncestorHeadings(既定は無効)で見出しを付けられること | Google Cloud: Parse and chunk documents | 2026-10-14 |
メタデータを JSON Lines で id・structData・content(mimeType・uri)として書くこと | Google Cloud: Prepare data for ingesting | 2026-10-14 |
| 生成AIのサービスを、18歳未満を対象とする、または18歳未満が使う可能性が高いWebサイト・アプリ・オンラインサービスの一部として使ってはならないこと。Agent Search(旧 Vertex AI Search)の項目 | Google Cloud: Service Specific Terms | 2026-10-14 |
| 生成AIのサービスに、サービスの生成AIの機能も含まれること | Google Cloud: Google Cloud Platform Services Summary | 2026-10-14 |
休会・プラン変更・退会の条件と例外の扱いは、各クラブの会員規約と店長・本部の判断に従ってください。 本記事は Google Cloud の公式ドキュメントと規約で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1440)についてのご相談はこちらから。
