社内RAG質問回答システム
AIで業務効率を劇的に向上
プロジェクト概要
社内の分散した情報(Notion、Google Drive、Backlog、Confluenceなど)を統合し、Slackから自然言語で質問すると、AIが適切な回答を返すRAG(Retrieval-Augmented Generation)システムを開発しました。
従業員が欲しい情報を見つけるのに費やしていた時間を大幅に削減し、業務効率を向上させることを目的としています。AWS BedrockとAmazon Kendraを活用し、高精度な検索と自然な回答生成を実現しました。
システムの特徴
マルチソースデータ統合
- Notion、Google Drive、Backlog、Confluenceなど複数のデータソースから情報を収集
- 各ソースのAPIを活用した自動同期
- 増分更新により、常に最新の情報を反映
- メタデータ(作成者、更新日時、カテゴリなど)も同時に取得
高精度な検索とRAG
- Amazon Kendraによる高度なセマンティック検索
- AWS Bedrock(Claude)を活用した自然言語生成
- 関連度スコアリングによる最適な情報の抽出
- 回答には情報源(ソースURL)を明記
Slack統合
- Slackのスラッシュコマンドやメンションで簡単に質問
- スレッド形式での対話型回答
- 回答へのフィードバック機能(高評価/低評価で精度向上)
- 検索履歴とよくある質問の自動集計
IaCとモニタリング
- CloudFormationによるインフラ構成管理
- Lambda関数の自動デプロイ
- CloudWatchによるログ監視とアラート設定
- エラー発生時の自動通知
技術スタック
AI/ML
- AWS Bedrock: Claude 3 Sonnetを利用した高品質な回答生成
- Amazon Kendra: エンタープライズ向けインテリジェント検索サービス
- Amazon OpenSearch: 補助的な全文検索エンジン
- LangChain: RAGパイプラインの構築とプロンプト管理
バックエンド
- Python: メインの開発言語
- AWS Lambda: サーバーレス実行環境
- Amazon SQS: 非同期処理のキューイング
- Amazon DynamoDB: 検索履歴やユーザーフィードバックの保存
データ連携
- Notion API: ページとデータベースの取得
- Google Drive API: ドキュメント、スプレッドシート、PDFの取得
- Backlog API: Wiki、課題、コメントの取得
- Confluence API: ページとスペースの取得
インフラ
- AWS CloudFormation: Infrastructure as Code
- AWS CloudWatch: ログ管理、メトリクス監視
- AWS Secrets Manager: APIキーの安全な管理
- Amazon EventBridge: スケジュールトリガー
システムアーキテクチャ
データ収集フロー
- 定期実行: EventBridgeが毎時Lambda関数をトリガー
- データ取得: 各データソースのAPIから情報を取得
- 前処理: テキスト抽出、チャンク分割、メタデータ付与
- インデックス登録: Kendraにドキュメントを登録
- ログ記録: CloudWatchに処理ログを出力
質問回答フロー
- Slack入力: ユーザーがSlackで質問
- API Gateway: Slack Eventsを受信
- Lambda処理: 質問文を解析し、Kendraで検索
- RAG処理: 検索結果をコンテキストとしてBedrockに渡し、回答生成
- Slack返信: 生成された回答とソースURLをSlackに投稿
- フィードバック収集: リアクションボタンで回答品質を記録
実装した主要機能
1. セマンティック検索
Kendraのセマンティック検索機能により、キーワード一致だけでなく、意味的に類似した情報も検索できます。例えば「休暇申請の方法」と質問すると、「有給休暇」「年休」「休日取得」といった関連ドキュメントも適切に検索されます。
2. コンテキスト管理
長いドキュメントは適切なサイズにチャンク分割し、各チャンクにメタデータを付与。これにより、関連性の高い部分だけを抽出し、トークン数を最適化しています。
3. プロンプトエンジニアリング
Bedrockに渡すプロンプトを工夫し、以下を実現:
- 検索結果のみに基づいた回答(ハルシネーション防止)
- 情報源の明示(どのドキュメントから回答したか)
- わかりやすい日本語での回答生成
- 情報が見つからない場合の適切な応答
4. フィードバックループ
ユーザーからのフィードバック(高評価/低評価)を収集し、DynamoDBに保存。定期的に分析することで、回答精度の改善につなげています。
開発における課題と解決策
課題1: データソース間のフォーマット差異
課題: Notion、Google Drive、Backlogなど、各サービスのデータ形式が異なり、統一的な処理が困難
解決策: 共通のデータモデルを定義し、各データソースに対応したAdapterパターンを実装。これにより、新しいデータソースの追加も容易になりました。
課題2: トークン数の制限
課題: Bedrockに渡せるトークン数に制限があり、長文のドキュメントを処理できない
解決策: ドキュメントを適切なサイズにチャンク分割し、関連度の高いチャンクのみを選択してコンテキストに含める戦略を採用。また、重要度に基づいた要約機能も実装しました。
課題3: Kendraのコスト
課題: Kendraは高機能だがコストも高い
解決策: 頻繁に更新されないドキュメントはOpenSearchに格納し、Kendraは重要度の高いドキュメントのみに使用する ハイブリッド構成を採用。コストを60%削減しつつ、検索品質を維持しました。
課題4: リアルタイム性
課題: Slackでの質問から回答までの時間を短縮したい
解決策: よくある質問はDynamoDBにキャッシュし、検索とLLM呼び出しをスキップ。また、Lambda関数のプロビジョンド同時実行数を設定し、コールドスタートを回避しました。
プロジェクトの成果
- 情報検索時間を平均70%削減: 従来15分かかっていた情報検索が平均5分に短縮
- 月間質問数3,000件以上: 社内で活発に利用される重要ツールに成長
- 回答精度85%: ユーザーフィードバックによる満足度
- 新入社員のオンボーディング時間30%短縮: 社内情報へのアクセスが容易に
- 問い合わせ件数20%削減: 人事・総務への問い合わせが減少
今後の改善予定
- マルチモーダル対応: 画像や図表からの情報抽出
- 対話履歴の活用: 前の質問を考慮した回答生成
- パーソナライゼーション: ユーザーの役職・部署に応じた回答カスタマイズ
- プロアクティブな情報提供: ユーザーが必要そうな情報を事前に提案
- 音声入力対応: Slack Huddleからの音声質問
技術的な学び
- RAGシステムにおけるチャンク戦略とコンテキスト管理の重要性
- プロンプトエンジニアリングによる回答品質の向上手法
- LLMのハルシネーション対策とソース明示の必要性
- サーバーレスアーキテクチャによるスケーラブルなシステム設計
- CloudFormationを活用したIaCのベストプラクティス
このプロジェクトに興味をお持ちですか?
SNSリンクを見る