SECTION 21

実践: 社内AIチャットボット

社内FAQ自動応答 — 問い合わせ対応工数を80%削減

calendar_today 2026 LCREATOR.Inc Google AI 研修プログラム

SECTION 21 — 社内AIチャットボット

社内問い合わせの現状と課題

OVERVIEW
refresh

同じ質問の繰り返し

「有給の取り方は?」「経費精算の締め日は?」など、同一の質問が毎月数十件寄せられる

person_off

担当者の負荷集中

総務・情シス・人事など特定部署に問い合わせが集中し、本来業務を圧迫している

timer_off

レスポンス遅延

担当者の返信待ちで業務がブロックされる。特に夜間・休日は翌営業日まで待機となる

68%
同一質問の繰り返し率(社内調査)
2.4h
平均レスポンス待機時間
80%
AIで自動化可能な問い合わせ割合

SECTION 21 — 社内AIチャットボット

AIチャットボットの仕組み

CONCEPT

3つの要素で構成される

1

ナレッジベース

社内FAQ、規程、マニュアルをスプレッドシートに集約。AIが参照する情報源となる

2

Gemini API(自然言語処理)

質問の意図を理解し、ナレッジベースから最適な回答を生成。文脈に合わせた自然な文章で返答する

3

チャットインターフェース

Google Chat または Chatwork。社員が普段使うツールに統合することで導入障壁を下げる

AIチャットボット動作画面

処理フロー

chat 社員が質問を入力
arrow_downward
code GAS がリクエストを受信
arrow_downward
table_chart ナレッジベースを検索
arrow_downward
psychology Gemini が回答生成
arrow_downward
send チャットに返信
check_circle GASはサーバー不要でGoogle Workspaceに直接統合できる

SECTION 21 — 社内AIチャットボット

システム構成図

ARCHITECTURE
chat Google Chat
forum Chatwork
arrow_forward
code Google Apps Script Webhook受信 / 制御
arrow_forward
psychology Gemini API 回答生成
arrow_forward
table_chart スプレッドシート ナレッジベース

チャットツール層

社員が日常的に使うツール。Webhook URLを設定するだけで接続できる

GAS ロジック層

受信メッセージの解析、ナレッジ検索、API呼び出し、返信送信を担当

データ層

FAQ・規程・マニュアルをスプレッドシートで管理。非エンジニアでも更新可能

SECTION 21 — 社内AIチャットボット

ナレッジベース設計

DESIGN

スプレッドシート構造(推奨)

シート1枚をFAQ、もう1枚をマニュアル・規程として分けると管理しやすい

列名 内容
カテゴリ 部門・ジャンル分類 総務 / 人事 / 情シス
質問キーワード 検索に使うキーワード群 有給 休暇 取り方 申請
質問文 代表的な質問文 有給休暇の申請方法は?
回答 正式な回答テキスト kintoneの申請フォームから…
関連リンク 詳細資料へのURL https://…

収録すべき情報

  • よくある質問(総務・人事・情シス)
  • 各種申請フロー(稟議・経費・備品)
  • 就業規則・規程のサマリー
  • システム操作マニュアルの概要
  • 社内用語・略語辞典
warning
初期登録の目安: 50〜100件
少なすぎると回答できないケースが多発。まず高頻度の質問トップ50から始める
build

実装

GAS × Gemini API でチャットボットを構築する

SECTION 21 — 実装

RAG(Retrieval Augmented Generation)の基本

CONCEPT

RAGとは「検索 + 生成」の2段階プロセス

AIが自分の知識だけで答えるのではなく、社内資料から情報を「検索」してから「回答を生成」する手法

1

Retrieve(検索)

ユーザーの質問に関連する情報をナレッジベースから取り出す。キーワードマッチングや類似度検索を使用

2

Augment(拡張)

取得した情報をプロンプトに組み込み、AIへの指示を強化する。「以下の情報をもとに回答せよ」という形式

3

Generate(生成)

Gemini が文脈を理解したうえで、自然な回答文を生成して返す

RAGアーキテクチャ図

なぜRAGが必要か

Gemini はインターネット上の情報は知っているが、あなたの会社の内部情報は知らない。RAGによって社内知識を与えることで初めて有用な回答が可能になる

check_circle
GASでの実装はシンプル
本格的なベクトル検索エンジン不要。スプレッドシートのキーワードマッチングで80%のケースに対応できる

SECTION 21 — 実装

GASでのキーワードマッチング + Gemini 回答生成

IMPLEMENT

ナレッジ検索ロジック(GAS)

GAS function searchKnowledge(userQuestion) { const sheet = SpreadsheetApp .getActiveSpreadsheet() .getSheetByName('FAQ'); const data = sheet.getDataRange().getValues(); const keywords = userQuestion .replace(/[??。、]/g, ' ') .split(' '); let bestMatch = null; let maxScore = 0; for (let i = 1; i < data.length; i++) { const kwField = data[i][1]; // キーワード列 let score = 0; keywords.forEach(kw => { if (kwField.includes(kw)) score++; }); if (score > maxScore) { maxScore = score; bestMatch = data[i]; } } return maxScore > 0 ? bestMatch : null; }

Gemini API 呼び出し

GAS function generateAnswer(question, context) { const API_KEY = PropertiesService .getScriptProperties() .getProperty('GCP_PROJECT_ID'); const prompt = ` 社内FAQデータベースの情報: ${context} 社員からの質問: ${question} 上記の情報をもとに、簡潔かつ丁寧に回答してください。 情報が不足している場合は担当部署に確認するよう案内してください。`; const res = UrlFetchApp.fetch( 'https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash:generateContent' + API_KEY, { method: 'post', contentType: 'application/json', headers: { 'Authorization': `Bearer ${token}` }, payload: JSON.stringify({ contents: [{ parts: [{ text: prompt }] }] }) } ); return JSON.parse(res.getContentText()) .candidates[0].content.parts[0].text; }

SECTION 21 — 実装

Google Chat ボットの作成

IMPLEMENT

メッセージ受信 & 返信(GAS)

GAS function onMessage(event) { const userMsg = event.message.text; const spaceId = event.space.name; // ナレッジベースを検索 const matched = searchKnowledge(userMsg); let replyText; if (matched) { const context = `Q: ${matched[2]}\nA: ${matched[3]}`; replyText = generateAnswer(userMsg, context); } else { replyText = 'ご質問の内容に該当する情報が見つかりませんでした。' + '総務部(soumu@example.com)にお問い合わせください。'; } return { text: replyText }; }

Google Chat ボット設定手順

1

GASプロジェクトを作成

script.google.com で新規プロジェクト作成

2

Webアプリとしてデプロイ

「デプロイ」→「新しいデプロイ」→「Webアプリ」を選択。アクセスを「全員」に設定

3

Google Chat API を設定

Google Cloud Console でChat API を有効化し、ボット設定にWebアプリURLを登録

4

チャットスペースに招待

ボットアカウントをDMまたはスペースに追加してテスト

SECTION 21 — 実装

Chatwork Webhook 連携

IMPLEMENT

Chatworkを使っている組織でも同じGASロジックが使える。Webhook URLをChatworkに登録するだけ

Webhook受信処理

GAS function doPost(e) { const body = JSON.parse(e.postData.contents); const userMsg = body.webhook_event.body; const roomId = body.webhook_event.room_id; const accountId = body.webhook_event.account_id; const matched = searchKnowledge(userMsg); const reply = matched ? generateAnswer(userMsg, `Q:${matched[2]}\nA:${matched[3]}`) : '申し訳ありません。担当者に確認します。'; // Chatwork API で返信 const CW_TOKEN = PropertiesService .getScriptProperties() .getProperty('CW_TOKEN'); UrlFetchApp.fetch( `https://api.chatwork.com/v2/rooms/${roomId}/messages`, { method: 'post', headers: {'X-ChatWorkToken': CW_TOKEN}, payload: { body: `[To:${accountId}] ${reply}` } } ); }

Chatwork Webhook 設定手順

  1. Chatwork 管理画面 → API & Webhook
  2. 「Webhookを作成」をクリック
  3. GASのWebアプリURLを貼り付け
  4. 監視するルームIDを設定
  5. メッセージ作成イベントを有効化
lock
APIトークンの管理
GASのスクリプトプロパティに保存し、コードにハードコーディングしない

SECTION 21 — 実装

コンテキスト管理 — 会話履歴の保持

IMPLEMENT

なぜコンテキストが必要か

「さっきの件について詳しく教えて」のように、前の会話を参照した質問に正しく回答するためには、直前の会話履歴をプロンプトに含める必要がある

履歴管理(CacheService使用)

GAS function getHistory(userId) { const cache = CacheService.getUserCache(); const raw = cache.get(`history_${userId}`); return raw ? JSON.parse(raw) : []; } function saveHistory(userId, history) { const cache = CacheService.getUserCache(); // 最新10件のみ保持 const trimmed = history.slice(-10); cache.put( `history_${userId}`, JSON.stringify(trimmed), 3600 // 1時間で期限切れ ); }

履歴をプロンプトに組み込む

1

ユーザーIDで履歴取得

CacheService から該当ユーザーの直近会話を取得

2

プロンプトに連結

「これまでの会話:」として過去のQ&Aをプロンプト冒頭に付加

3

履歴を更新して保存

今回の質問・回答を追加してCacheServiceに保存(最大10件)

info CacheServiceは最大6時間保持できる。長期記憶が必要な場合はスプレッドシートへの永続化を検討
trending_up

品質向上

回答精度を改善し、運用を安定させる

SECTION 21 — 品質向上

回答精度の改善

QUALITY

プロンプトチューニング

システムプロンプトに制約を明記することで、的外れな回答を防ぐ

// システムプロンプト例 あなたは○○株式会社の社内FAQ担当AIです。 以下のルールを必ず守ってください: ・提供された社内情報のみをもとに回答する ・情報がない場合は「担当部署に確認」と案内する ・個人情報・機密情報には触れない ・回答は200文字以内にまとめる

Few-Shot例の追加

「このような質問にはこう答える」という例をプロンプトに含めると精度が大幅向上する

Few-Shot プロンプト例

// Few-Shot例をプロンプトに含める const fewShotExamples = ` 【例1】 Q: 有給の申請はどこでできますか? A: kintoneの「休暇申請」フォームから申請できます。 上長の承認後、翌日に反映されます。 【例2】 Q: 経費精算の締め日はいつですか? A: 毎月末日が締め日です。翌月10日までに freeeから申請してください。`;
lightbulb
精度改善の優先順位
1. システムプロンプトの制約強化 → 2. ナレッジベースの充実 → 3. Few-Shot追加

SECTION 21 — 品質向上

フォールバック設計 — エスカレーション

QUALITY

AIが答えられないケースは必ず発生する

ナレッジベースにない質問、個人情報を含む問い合わせ、緊急対応が必要な案件など。これらを適切に人間につなぐ設計が重要

1

回答できない場合の通知

「担当部署に転送します」と社員に伝え、担当者にも自動で通知メールを送る

2

エスカレーションログの記録

未回答質問をスプレッドシートに自動記録。ナレッジベース拡充の優先リストとして活用

3

ヒューマンハンドオフ

担当者が対応後、その回答を承認してナレッジベースに追加できる仕組みを整備

フォールバック・エスカレーション設計図

エスカレーション判定条件

  • キーワードマッチスコアが 0(ゼロ)
  • 「個人情報」「病気」「解雇」などの要注意ワードを含む
  • 同一ユーザーが3回以上再質問
  • Gemini の信頼度が低い(「わかりません」が含まれる)
mail
GmailApp.sendEmail() で自動通知
担当者へのエスカレーションメールも GAS だけで完結できる

SECTION 21 — 品質向上

ログと分析 — 問い合わせ傾向の可視化

QUALITY

記録すべきログ項目

項目 用途
タイムスタンプ 時間帯分析・ピーク把握
ユーザーID 部門別・個人別の質問傾向
質問テキスト 未カバー領域の特定
マッチしたFAQ 精度評価・ナレッジ品質向上
エスカレーション有無 自動化率の算出

Looker Studio で可視化

スプレッドシートのログをLooker Studioに接続するだけで自動ダッシュボードが完成

  • 日別問い合わせ件数の推移
  • カテゴリ別TOP10質問ランキング
  • 自動回答率の月次推移
  • 未回答質問リスト(優先度順)
insights
データドリブンで改善サイクルを回す
未回答の多い質問から順にナレッジを追加することで効率的に精度向上できる
laptop_mac

ハンズオン

実際に手を動かして社内チャットボットを作ってみよう

SECTION 21 — ハンズオン

ハンズオン 1: ナレッジベースを作成する

HANDS-ON 1
1

Googleスプレッドシートを新規作成

シート名を「FAQ」に変更する

2

ヘッダー行を設定

A列: カテゴリ / B列: キーワード / C列: 質問文 / D列: 回答 / E列: 関連リンク

3

FAQ を 10件以上入力

自部署でよく受ける質問から入力する。まずは回答が明確なものを選ぶ

4

スプレッドシートIDをメモ

URLの「/d/」と「/edit」の間の文字列がスプレッドシートID

5

データ入力の品質確認

キーワード列には検索に使われやすい単語を複数登録する(例: 「有給 休暇 年休 申請」)

ナレッジベース作成スプレッドシート

入力例

カテゴリキーワード回答概要
総務有給 休暇 申請kintoneから申請
総務経費 精算 締め日毎月末日
情シスパスワード リセット情シス宛メール
人事評価 面談 時期6月・12月実施
warning 個人情報・給与情報・機密事項はナレッジベースに入力しない

SECTION 21 — ハンズオン

ハンズオン 2: GAS でチャットボット実装

HANDS-ON 2
1

script.google.com でプロジェクト作成

「新しいプロジェクト」→ 名前を「社内チャットボット」に設定

2

スクリプトプロパティを設定

プロジェクトの設定 → スクリプトプロパティ → 「GCP_PROJECT_ID」を追加

3

コードを貼り付けて保存

配布のサンプルコード(searchKnowledge / generateAnswer / onMessage)を貼り付ける

4

Webアプリとしてデプロイ

「デプロイ」→「新しいデプロイ」→ 種類: Webアプリ → アクセス: 全員

5

Google Chat API に登録

Cloud Console で Chat API を有効化し、デプロイされたURLをボット設定に登録

動作確認チェックリスト

  • Google Chat にボットを招待できた
  • 登録したFAQの質問に回答が返ってくる
  • キーワードが一致しない質問でエスカレーションメッセージが出る
  • スプレッドシートにログが記録されている
bug_report
デバッグのヒント
GASの「実行ログ」(表示 → ログ)でエラー内容を確認。ほとんどのエラーはAPIキーの設定ミスか権限不足

SECTION 21 — ハンズオン

ハンズオン 3: テスト運用と精度改善

HANDS-ON 3

science テスト方法

1

正常系テスト: 登録したFAQをそのまま質問し、正しく回答されるか確認

2

表記ゆれテスト: 「有給」「ゆうきゅう」「有休」など異なる書き方で試す

3

境界値テスト: ナレッジにない質問でエスカレーションされるか確認

tune 精度改善サイクル

1

ログ確認: 未回答・誤回答の質問を抽出

2

ナレッジ追加: 未回答質問に対するFAQを追記

3

キーワード拡充: 表記ゆれに対応するキーワードを追加

4

自動化率計測: 週次でエスカレーション率をチェック

rocket_launch 本番移行チェックリスト

  • FAQ 50件以上登録済み
  • エスカレーション通知が動作する
  • ログ記録が機能している
  • APIキーがスクリプトプロパティに保存済み
  • 担当部署への引き継ぎ完了
  • ナレッジ更新担当者が決まっている

SECTION 21 — 社内AIチャットボット

まとめ

SUMMARY
80%
問い合わせ対応工数削減
24h
365日自動対応が可能
0円
サーバー費用(GAS利用)

今日学んだこと

  • 社内問い合わせの課題とAI解決アプローチ
  • RAG(検索+生成)の基本概念と実装方法
  • GAS × Gemini APIでの回答生成
  • Google Chat / Chatwork との連携
  • フォールバックとログ分析による品質向上

次のアクション

  1. 自部署のFAQトップ50を洗い出す
  2. ナレッジベーススプレッドシートを作成
  3. GASでプロトタイプを構築
  4. 少人数でβ運用を開始(1〜2週間)
  5. ログを分析して精度を改善

Section 21 完了

社内AIチャットボットの基礎から実装まで学習しました

arrow_forward 次のセクション: Section 21「統合演習: 業務ワークフロー設計」
SLIDES
21
KEY CONCEPTS
RAG / GAS / Webhook
HANDS-ON
3
🏠 研修ポータル ▶ この章の動画 📺 動画一覧