BLOG

ブログ

ゼロから始める社内AIアシスタント構築

▶︎ はじめに

ゼロから始める
社内AIアシスタント構築

「社内の情報共有をもっと効率化したい」「同じ質問への回答に時間を取られている」といった課題を解決するため、Slack上で動作する社内AIアシスタントの構築方法を紹介します。 
本記事では、より精度を高めるためのRAG(検索拡張生成)の考え方を取り入れ、効率的なデータ検索を行う構成となっています。
この「社内AIアシスタント」は、コミュニケーションツールであるSlack上で動作し、AWSのサービスと連携することで、社内ナレッジを素早く、正確に提供することを目指します。

また、多くの企業がAI導入を検討しながら二の足を踏む最大の理由は、「高額な月額費用」です。
AWSの従量課金と既存のクラウド機能を賢く組み合わせることで、月額数百円程度からの導入を可能にします。
このようなスモールスタートでも特定のFAQ対応や社内ルールの即時提示といった実務には必要十分な性能を備えています。
「最初から完璧で高価なもの」を求めて立ち止まるのではなく、まずは最小限のリスクでAIの恩恵を体感し、ニーズに合わせてシステムを育てていくような構成となっています。

本記事の目的

本記事では、技術的なソースコードは最小限に留め、システムの概念と構築ステップを中心に分かりやすく解説します。特に、RAGを実現するためのDynamoDBを活用した2段階検索の設計について紹介します。

本記事では、技術的なソースコードは最小限に留め、システムの概念と構築ステップを中心に分かりやすく解説します。特に、RAGを実現するためのDynamoDBを活用した2段階検索の設計について紹介します。

1. システム概要

今回構築する社内AIアシスタントは、以下の主要なコンポーネントで構成されます。

システムの処理の流れは、Slackでの質問を起点に、以下のステップで進行します。

  1. 質問の受付:
    ユーザーがSlackの特定のチャンネルやメンションでAIアシスタントに質問を投稿します。
  2. Lambdaの起動:
    Slackのイベント機能により、投稿された質問がトリガーとなり、AWS Lambda関数が起動します。
  3. カテゴリ検索:
    Lambdaは、ユーザーの質問をトークン化し、質問内容に最も関連性の高いナレッジのカテゴリをDynamoDBの「カテゴリ管理用」テーブルから特定します。これがRAGの核となる「検索(Retrieval)」の第一段階です。
  4. 内容の取得:
    特定されたカテゴリに紐づく、具体的なナレッジの内容をDynamoDBの「内容保持用」テーブルから取得します。
  5. 回答の生成:
    Lambdaは、ユーザーの質問と、取得した関連性の高い内容をプロンプトとして結合し、OpenAI API(LLM)に送信します。LLMは、この2つの情報を基に、最も適切で分かりやすい最終回答を生成します。
  6. Slackへの返信:
    Lambdaは、LLMが生成した回答をSlackに返信し、ユーザーに提供します。

1. 質問の受付:
ユーザーがSlackの特定のチャンネルやメンションでAIアシスタントに質問を投稿します。

2. Lambdaの起動:
Slackのイベント機能により、投稿された質問がトリガーとなり、AWS Lambda関数が起動します。

3. カテゴリ検索:
Lambdaは、ユーザーの質問をトークン化し、質問内容に最も関連性の高いナレッジのカテゴリをDynamoDBの「カテゴリ管理用」テーブルから特定します。これがRAGの核となる「検索(Retrieval)」の第一段階です。

4. 内容の取得:
特定されたカテゴリに紐づく、具体的なナレッジの内容をDynamoDBの「内容保持用」テーブルから取得します。

5. 回答の生成:
Lambdaは、ユーザーの質問と、取得した関連性の高い内容をプロンプトとして結合し、OpenAI API(LLM)に送信します。LLMは、この2つの情報を基に、最も適切で分かりやすい最終回答を生成します。

6. Slackへの返信:
Lambdaは、LLMが生成した回答をSlackに返信し、ユーザーに提供します。

この流れにより、LLMは質問全体を漠然と理解するだけでなく、関連性の高い社内ナレッジを参照しながら回答を生成できるようになり、回答の精度と信頼性が大幅に向上します。

2. AWS環境の構築

RAGを実現し、スケーラビリティを確保するため、DynamoDBを2つのテーブルに分けて設計します。

2段階検索の設計
Lambdaが実行するカテゴリ検索のステップは以下の通りです。

  1. 質問のトークン化:
    ユーザーの質問「今月の経費申請はどうやるの?」を、AIに聞く前にプログラム内部で質問に含まれる単語を解析します。「経費申請」「今月」などのキーワード(トークン)に分解します。AI(LLM)の利用料を抑えるコツは、「AIに渡す文字数を極限まで減らすこと」です。
  2. DynamoDB検索:
    これらのキーワードを基に、「カテゴリ管理用」テーブルを検索します。このテーブルのキー設計により、高速なキーワードマッチングが可能です。
  3. カテゴリ検索:
    質問のトークンに最も一致度の高い、あるいは関連性の高いカテゴリ(例:「経費精算」)のcategory_idを特定します。
  4. ナレッジ内容の取得:
    特定したcategory_idを使用して、「内容保持用」テーブルから、関連する全ての詳細なナレッジテキストを取得します。
  1. 質問のトークン化:
    ユーザーの質問「今月の経費申請はどうやるの?」を、AIに聞く前にプログラム内部で質問に含まれる単語を解析します。「経費申請」「今月」などのキーワード(トークン)に分解します。AI(LLM)の利用料を抑えるコツは、「AIに渡す文字数を極限まで減らすこと」です。
  2. DynamoDB検索:
    これらのキーワードを基に、「カテゴリ管理用」テーブルを検索します。このテーブルのキー設計により、高速なキーワードマッチングが可能です。
  3. カテゴリ検索:
    質問のトークンに最も一致度の高い、あるいは関連性の高いカテゴリ(例:「経費精算」)のcategory_idを特定します。
  4. ナレッジ内容の取得:
    特定したcategory_idを使用して、「内容保持用」テーブルから、関連する全ての詳細なナレッジテキストを取得します。

この2段階に分けることで、ナレッジの全体像から関連性の高い一部の内容のみを抽出できるため、LLMへの入力情報(コンテキスト)を効率的に絞り込むことができ、処理コストの削減と回答精度の向上に繋がります。
無駄なデータを読み込ませないため、API費用を大幅に節約でき、同時に回答の精度も向上します。

AWS Lambdaの役割と実装
Lambda関数は、主に以下の処理を実行します。

Slackからのペイロード解析: 質問内容を抽出します。
トークン化とカテゴリ検索: 上記の2段階検索を実行します。
プロンプトの構築: 抽出した質問とナレッジ内容を組み込んだプロンプトを作成します。
OpenAI API呼び出し: LLMにプロンプトを送信し、回答を取得します。
Slackへの応答: 取得した回答をSlack APIを通じて返信します。

Slackからのペイロード解析: 質問内容を抽出します。
トークン化とカテゴリ検索: 上記の2段階検索を実行します。
プロンプトの構築: 抽出した質問とナレッジ内容を組み込んだプロンプトを作成します。
OpenAI API呼び出し: LLMにプロンプトを送信し、回答を取得します。
Slackへの応答: 取得した回答をSlack APIを通じて返信します。

3. Slackの連携設定

Slackアプリの作成と設定
社内AIアシスタントをSlack上で動作させるために、SlackのAPI管理画面で新しいアプリを作成します。

  1. Appの作成:
    Slack APIの管理画面で「Create New App」を選択し、アプリ名(例:社内ナレッジボット)を設定します。
  2. 権限(Scope)の設定:
    メッセージの読み取りや投稿に必要な権限(例:app_mentions:read, chat:write)を設定します。
  3. イベントの設定:
    「Event Subscriptions」を有効にし、LambdaのAPI GatewayのエンドポイントをURLとして設定します。これにより、メンションされた時などにLambdaが起動するようになります。
  4. ワークスペースへのインストール:
    作成したアプリを、対象のSlackワークスペースにインストールします。
  1. Appの作成:
    Slack APIの管理画面で「Create New App」を選択し、アプリ名(例:社内ナレッジボット)を設定します。
  2. 権限(Scope)の設定:
    メッセージの読み取りや投稿に必要な権限(例:app_mentions:read, chat:write)を設定します。
  3. イベントの設定:
    「Event Subscriptions」を有効にし、LambdaのAPI GatewayのエンドポイントをURLとして設定します。これにより、メンションされた時などにLambdaが起動するようになります。
  4. ワークスペースへのインストール:
    作成したアプリを、対象のSlackワークスペースにインストールします。

4. システムの動作確認と今後の拡張

動作確認のステップ
構築後、以下のステップで動作を確認します。

  1. ナレッジの投入:
    DynamoDBの「カテゴリ管理用」と「内容保持用」テーブルに、テスト用のナレッジを登録します(例:休暇申請の手順)。
  2. Slackからの質問:
    SlackでAIアシスタントに「有給休暇の取り方を教えて」と質問を投げかけます。
  3. ログの確認:
    Lambdaのログ(CloudWatch Logs)を確認し、カテゴリ検索が正しく行われ、関連性の高いナレッジがプロンプトに組み込まれているかを確認します。
  4. 回答の精度評価:
    Slackに返ってきた回答が、DynamoDBの内容に基づいた正確なものであるかを評価します。
  1. ナレッジの投入:
    DynamoDBの「カテゴリ管理用」と「内容保持用」テーブルに、テスト用のナレッジを登録します(例:休暇申請の手順)。
  2. Slackからの質問:
    SlackでAIアシスタントに「有給休暇の取り方を教えて」と質問を投げかけます。
  3. ログの確認:
    Lambdaのログ(CloudWatch Logs)を確認し、カテゴリ検索が正しく行われ、関連性の高いナレッジがプロンプトに組み込まれているかを確認します。
  4. 回答の精度評価:
    Slackに返ってきた回答が、DynamoDBの内容に基づいた正確なものであるかを評価します。

今後の拡張:プロンプトの精緻化
AIアシスタントの回答品質は、LLMへのプロンプト設計に大きく左右されます。

拡張ポイント詳細
System Promptの強化「あなたは社のナレッジアシスタントです。フレンドリーかつ正確に回答してください。」といった役割とトーンを明確にする指示を追加します。
回答フォーマットの統一回答に必ずナレッジの参照元を含める、箇条書きで分かりやすくするなど、一貫性のあるフォーマットを指定します。
多段プロンプティングの導入最初に質問の意図を把握させるプロンプト、次に検索結果との比較を行わせるプロンプトなど、複数段階に分けて処理させることで、より複雑な質問にも対応できるようにします。

今後の拡張:機能面の強化

拡張ポイント詳細
フィードバック機能ユーザーが回答の満足度を評価できるボタンをSlackに設置し、フィードバックをDynamoDBなどに蓄積してナレッジの改善に役立てます。
ナレッジ管理GUIDynamoDBへのナレッジ登録・更新を容易にするための簡単なウェブインターフェース(AWS Amplifyや Place など)を構築します。
複数データソースの統合DynamoDBだけでなく、Google DriveやConfluenceなどの既存の社内ドキュメントも検索対象に追加し、RAGの検索範囲を広げます。

5. おわりに

本記事では、Slack、AWS Lambda、DynamoDB、そしてOpen AI(LLM)を組み合わせ、RAGの仕組みを活用した社内AIアシスタントの構築プロセスをご紹介しました。

特に、安価なDynamoDBを2つのテーブルで運用する「2段階検索」は、APIコストを最小限に抑えつつ、高精度な回答を実現するための鍵となります。
既存のSlack環境とサーバーレスなAWS構成を最大活用することで、月額数百円程度からの極めて低いランニングコストでの運用が可能です。

このAIアシスタントは、社員が日常的に利用するSlack上で、必要な情報を迅速に提供することで、社内ナレッジ活用の課題を解決し、業務効率の向上に大きく貢献します。

まずは最小限のリスクでAIの恩恵を体感できるスモールスタートから始めてみませんか?
構築に必要な技術要素は揃っています。ぜひ、この記事を参考に、自社に最適な「賢く、安価な」AIアシスタントの構築を始めてみてください。

ー ー ー ☆ ☆ ☆ ー ー ー 最 後 ま で お 読 み い た だ き 、 あ り が と う ご ざ い ま し た ー ー ー☆ ☆ ☆ ー ー ー

関連記事
▶︎AIが変えた開発現場のリアル

上部へスクロール