こんにちは、IDCフロンティアの新卒開発研修Bグループです。
今回はカスタマーポータルサービスの仕様に関するチャットボットの作成を行いました。
「カスタマーポータルの使い方が分からない…」
「『あの仕様』ってどこに書いてたっけ…」
そんな課題を解決するチャットボットです!
この記事では、作成の流れを皆さんに共有したいと思います。
目次
背景
チャットボットとは
チャットボットは、『ユーザーからの質問に自動で回答してくれるプログラム』です。例えば、このような動作をします。
ユーザー: IDCフロンティアのサポートに連絡したいんだけど。
チャットボット: お問い合わせフォームはこちらです → [サポートページURL]
チャットボットを形成するうえで、知識の限界やハルシネーションといった課題が存在します。そこで、RAGを用いることで問題解決を行います。
RAG(Retrieval-Augmented Generation)とは
RAGは、『検索で得た情報で知識を補強し、回答を生成する仕組み』です。
今回は、カスタマーポータルの仕様に関する情報を事前学習させます。

作成の流れ
1.基本のチャットボットの作成
ここでは、プログラムからGemini APIのコールとSlackからのメッセージを受け取り、Geminiに渡して応答を返す機能を作成します。
流れとしては次の通りです。
1.Slack上で、質問を書き込む
2.Rocky Linux上でのAPIコール
3.LLMからのレスポンス

Gemini APIの呼び出し部分
このセクションは、プログラムがGeminiモデルと通信する心臓部です。Vertex AIクライアントの初期化、プロンプトの準備、モデルへの送信、そして応答の解析を行います。

-
vertexai.init(...)-
Google Cloudプロジェクトに接続するための初期設定です。
-
-
model = GenerativeModel(...)-
使用する生成AIモデル(
gemini-1.5-flash)を指定し、操作するためのオブジェクトを生成します。
-
-
model.generate_content(...)-
実際にプロンプト(ユーザーの質問と追加指示)をAPIへ送信する中心的な処理です。これによりモデルがテキストを生成します。
-
-
response.candidates[...]-
APIからの応答は複数の候補やメタデータを含む複雑な構造のため、この記述で最終的に必要となる生成テキスト本体のみを抽出しています。
-
Slackメッセージの処理と応答部分
この部分は、Slackチャンネルでのボットへのメンションを待ち受け、ユーザーの質問を抽出し、最終的な回答を同じスレッドに投稿する役割を担います。

-
@app.event("app_mention")-
slack_boltフレームワークの機能で、特定のイベント(ここではボットへのメンション)が発生した際に関数を実行するための仕組みです。
-
-
body-
Slackから送られてくるイベント情報の全てが含まれる辞書オブジェクトです。ここからチャンネルID、発言者、メッセージ内容などを取り出します。
-
-
user_message = ... .strip()-
ユーザーが実際に送信したテキスト部分を正確に抜き出すための文字列処理です。
-
-
say(text=..., thread_ts=...)-
Slackにメッセージを投稿する関数です。
thread_ts(タイムスタンプ)を引数に加えることで、単なるチャンネル投稿ではなく、特定のメッセージに対するスレッド返信となり、会話の文脈を維持します。
-
2.RAGの導入
次に、ボットに専門知識を持たせるため、RAGを導入してカスタマーポータルの仕様(テキストファイルやPDF)を知識源として読み込ませました。
『意図したファイルを読んでくれない』という事象が発生しました。具体的には、回答の根拠となる情報がテキストファイルにしか書かれていない質問をしても、ボットはなぜか全く関係のないPDFファイルの情報ばかりを参照し、的外れな回答をしていました。
そこで原因を調べてみると、単純な「ベクトル検索」の特性にありました。質問の単語が偶然多く含まれるだけの、無関係でもボリュームの大きいPDFが「関連性が高い」と誤判断されていたのです。 そこで、検索アルゴリズムを多様性を重視する「MMR (Maximal Marginal Relevance)」に変更しました。これにより、内容が異なる多様な情報源が選ばれるようになり、的確な情報を持つテキストファイルがきちんと参照されるようになりました。

3.Slackを通じての事前学習
Slackから直接、AIに知識を「与える」仕組み ボットへのメンションと共にURLを投稿するだけで、その内容を自動で学習する機能を実装しました。裏側では、URLからWebページやPDFの内容を抽出し、documentsフォルダに保存後、RAGのデータベースを自動で再構築しています。
この仕組みにより、Slackの会話の流れでURLを投げるだけで、誰でも簡単にボットの知識をアップデートできるようになりました。

終わりに
まとめ
SlackとGemini APIを連携させ、カスタマーサポートの仕様に関するチャットボットを開発しました。AI特有の知識不足や不正確な情報(ハルシネーション)を解決するため、外部の文書を参照して回答を生成するRAG(検索拡張生成)技術を導入しました。
開発過程で、RAGが質問と無関係な文書を誤って参照する問題が発生しましたが、検索アルゴリズムを多様性を重視するMMR (Maximal Marginal Relevance)に変更することで、回答精度を向上させました。
さらに、Slack上でボットにURLを送るだけで、その内容をAIが自動で学習する機能を実装。これにより、誰でも簡単にボットの知識を更新できる、運用しやすいシステムが完成しました。
今後の展望
今後の展望として挙げられる部分は、入力データの品質を最大化する「前処理技術」の高度化です。
具体的には、文字コードの不整合や不要な記号といったノイズを自動的に検知・修正し、AIが情報を最も効率的に学習できる形式へとデータを整形するパイプラインを構築します。
この地道なデータ整備こそが、情報のベクトル化(Embedding)の精度を飛躍的に向上させる鍵だと思います。これにより、AIボットの回答精度を高めるだけでなく、将来的にはより複雑な対話や自律的な判断が可能な、真に賢いAIへと進化させるための強固な基盤を築いていくと思います。
所感
今回の開発研修では、話題の生成AI技術に触れるだけでなく、それを実用的なサービスに落とし込むことの難しさを実感しました。
当初はAPIを繋げば簡単に賢いボットができると考えていましたが、RAGが意図通りに動かない問題に直面しました。その際に、原因を深く探求し、MMRという解決策に辿り着けたのは、チームで一つの問題にフォーカスできたからだと思います。
ユーザーにとって本当に役立つものを作るには、技術の特性を深く理解し、試行錯誤を重ねる過程が不可欠だと痛感しました。
この経験を糧に、今後も挑戦を続けていきたいです。
ぜひ皆さんもChatbotの作成をしてみてください!
---
Gemini は Google LLC の商標です。