
Google Chatボットに親しみやすいペルソナを実装する — Geminiのシステムプロンプトでユーザー名挨拶とemoji活用
はじめに
Google Chat上で動作するRAGベースの社内ITサポートボットを運用しています。Gemini + Vertex AI RAG Engineで構築したこのボットは、ナレッジベースに基づいて正確な回答を返してくれるのですが、ひとつ課題がありました。
回答が正確だけど、冷たい。
「VPNが繋がりません」と聞くと、淡々と手順を返してくれる。正しいけど、まるでマニュアルを読んでいるような感覚。社内ツールとして毎日使ってもらうには、もう少し「話しかけやすさ」が欲しいところです。
そこで、ボットのペルソナに親しみやすさを加える実装をやってみました。
方針: 「丁寧で親しみやすい、でもはしゃがない」
チャットボットのペルソナ設計について調べてみると、一貫して出てくる警告があります。
Over-humanizing creates expectations the system cannot meet.
つまり、ボットを陽気にしすぎると「人間と話している」という期待が生まれ、それに応えられないとき(例: ナレッジベースに情報がない場合)の失望が大きくなるということです。
特にITサポートの文脈では、ユーザーはVPNが繋がらない、プリンターが動かないなど困っている状態で質問してきます。「🎉 素晴らしい質問ですね!」と返されたら逆効果です。
そこで以下の方針を立てました。
- 境界部分に温かさを置く — 挨拶、フォローアップのヒント、エスカレーション案内
- 技術的な回答本文はクリーンに保つ — emojiなし、手順は簡潔に
- ユーザーの名前で呼びかける — ただし最初の1回だけ
実装
1. Google Chat APIからユーザー名を取得する
Google Chatのイベントペイロードには sender.displayName が含まれています。これはすでに取得していましたが、ログ記録にしか使っていませんでした。
sender_obj = message.get("sender", {})
sender = sender_obj.get("displayName", "someone")
この sender(表示名)をRAG生成パイプラインに渡すようにします。
2. Geminiの生成テンプレートにユーザー情報を追加する
生成テンプレートに {sender} プレースホルダを追加し、Geminiがユーザーの名前を認識できるようにします。
GENERATION_TEMPLATE = """\
以下のナレッジベースの情報を参考に、ユーザーの質問に回答してください。
## ユーザー情報
名前: {sender}
## ナレッジベース検索結果
{context}
## ユーザーの質問
{question}
## 回答
"""
会話履歴がある場合のテンプレート(GENERATION_TEMPLATE_WITH_HISTORY)にも同様に追加します。
3. システムプロンプトのトーン指示を調整する
ここが今回の実装の核心です。システムプロンプトのトーンセクションを以下のように変更しました。
変更前:
## トーン
- 丁寧だが簡潔(です/ます調)
- 技術用語はそのまま使用(社員はIT用語を理解している前提)
変更後:
## トーン
- 丁寧で親しみやすい(です/ます調)
- スレッド内の最初の回答では「{sender}さん、」と名前で呼びかけてから回答を始める
- フォローアップ(会話履歴がある場合)では名前の呼びかけは不要
- 技術用語はそのまま使用(社員はIT用語を理解している前提)
- 回答本文にはemojiを使わない(手順やステップの説明はクリーンに保つ)
- エスカレーション案内など末尾の補足行では軽いemojiを使ってよい(🙏 等)
ポイントは 「やること」と「やらないこと」の両方を明示している 点です。LLMは指示がないと「親しみやすく」を拡大解釈してemojiを回答中に散りばめることがあります。「回答本文にはemojiを使わない」と明示することで、温かさの範囲をコントロールしています。
4. generate_answer() にsenderを渡す
RAGパイプラインの生成関数にsenderパラメータを追加します。
def generate_answer(question: str, contexts: list[dict],
history: list[dict] | None = None,
sender: str = "") -> RagAnswer:
# ...
if history:
prompt = GENERATION_TEMPLATE_WITH_HISTORY.format(
sender=sender, history=history_str,
context=context_str, question=question,
)
else:
prompt = GENERATION_TEMPLATE.format(
sender=sender, context=context_str, question=question,
)
ワーカーからは単に sender を渡すだけです。
result = generate_answer(user_text, contexts, history=history or None,
sender=sender)
5. ウェルカムカードにemojiを追加する
ボットがスペースに追加されたときや /help コマンドで表示されるウェルカムカードのセクションヘッダーにemojiを追加しました。
{"header": "💻 サポート範囲", "widgets": [...]},
{"header": "💬 使い方", "widgets": [...]},
{"header": "📝 質問の例", "widgets": [...]},
ここはUI上の「飾り」なので、emojiが自然に馴染みます。
6. エスカレーションテキストを温かく
ナレッジベースに情報がなかった場合のエスカレーション案内も、少しだけ柔らかくしました。
変更前:
担当部署にお問い合わせください(Google Chat または helpdesk@example.com)。
変更後:
担当部署にお気軽にお問い合わせください(Google Chat または helpdesk@example.com)🙏
「お気軽に」の追加と末尾の🙏で、「回答できなかった申し訳なさ」と「次のアクションへの促し」を表現しています。
結果
変更後のボットの振る舞いは以下のようになります。
初回の質問:
ユーザー: VPNが繋がりません
ボット: 田中さん、VPN接続のトラブルシューティングについて、以下をお試しください。
- VPNクライアント を再起動します。
- Wi-Fiまたは有線LANの接続状態を確認します。
上記で解決しない場合は、担当部署にお気軽にお問い合わせください(Google Chat または helpdesk@example.com)🙏
💡 このスレッドで追加の質問もできます(24時間以内)
フォローアップの質問(同一スレッド内):
ユーザー: それでも繋がらない場合は?
ボット: VPNクライアントを一度アンインストールし、再インストールをお試しください。
- コントロールパネル → プログラムのアンインストール を開きます。
- ...
フォローアップでは名前の呼びかけなし。回答本文にemojiなし。技術的な内容はクリーンに保たれています。
emojiの配置戦略まとめ

| 場所 | emoji | 理由 |
|---|---|---|
| 回答本文(手順・説明) | ❌ 使わない | 技術情報の可読性を優先 |
| パイプライン状態表示 | ✅⏳❌⬜ | UI要素として元から使用 |
| ウェルカムカードのヘッダー | 💻💬📝 | 視覚的な案内として自然 |
| フォローアップヒント | 💡 | 行動を促すUI要素 |
| エスカレーション案内 | 🙏 | 温かさと申し訳なさの表現 |
まとめ
チャットボットに「親しみやすさ」を加える際のポイントは以下の通りです。
- 名前での呼びかけは強力だが、1回で十分。 毎回繰り返すとロボット感が増す
- emojiは「場所」で管理する。 回答本文ではなく、UI境界(挨拶、ヒント、エスカレーション)に配置する
- やらないことも明示する。 LLMは「親しみやすく」という指示を拡大解釈しがち。「回答本文にはemojiを使わない」と書くことで範囲を制御できる
- ペルソナは文脈に合わせる。 ITサポートのように「困っているユーザー」が対象の場合、「陽気」よりも「安心感」を目指す
実装自体は小さな変更ですが、「正確だけど冷たい」から「正確で、ちょっと温かい」へ。技術の正確さを犠牲にせずに実現できます。









