aumoのデータ×Amazon Bedrock:Slackからサクッと使えるあうもんボット

どうも、AWS大好き芸人の @ken11 です。

先日のあうもんの記事は読んでいただけましたか?僕は古巣に帰って元気にやってます(また太った)

さて、あうもんの記事でも書きましたが、グリーエックスにはaumoが培ってきた膨大なデータが存在します。今回はそんなaumoのデータをもっと活かすべく、社内向けのあうもんボットを手軽につくってみました。

なにを作ったの?

簡単にいうと「SlackでClaudeあうもんに質問できるボット」です。

たとえば、こんな質問ができます:

  • 「八重洲の人気カフェは?」
  • 「渋谷の飲食店の特徴は?」

これらの質問に対して、ただのLLMの知識だけじゃなく、aumoに蓄積された実際のデータを踏まえた回答が得られます。

全体の仕組みはこんな感じです:

アーキテクチャ図
アーキテクチャ図

Amazon Bedrock Agent + Lambdaでデータ連携

Bedrock Agentって何?

Amazon Bedrockは、AWS上でClaudeやLlamaシリーズなどのLLMを扱えるサービスですが、その中の「Agent」機能がとても便利です。Agentを使うと、LLMが外部データや機能にアクセスすることができるようになります。(いわゆるFunction callingとかTool useに相当)

これを使うことでWeb検索などももちろんできるようになるわけですが、社内のリソースを有効活用してこそだと思うので、今回はaumoのデータを活かして社内の人間があうもんに質問できるようにしたいと思います。

データ連携のためのLambda関数

以下はシンプルにお店の名前だけを取得するLambda関数のサンプルです。実際にはもっと複雑なデータ処理を実装していますが、今回はダミーデータで説明します:

import json
import random
 
DUMMY_STORES = [
    {"name": "サンプル店舗A"},
    {"name": "サンプル店舗B"},
    {"name": "あうもん商店"}
]
 
def lambda_handler(event, context):
    """Bedrock Agentから呼び出されるシンプルなハンドラー"""
    print(f"受信イベント: {json.dumps(event)}")
    
    # APIパスを取得
    api_path = event.get('apiPath')
    
    # Agentからのパラメータを取得
    parameters = event.get('parameters', {})
    keyword = parameters.get('keyword', '')
    area = parameters.get('area', '')
    
    # /getStoresエンドポイントの処理
    if api_path == '/getStores':
        # キーワードとエリアでフィルタリング(実際にはDBクエリ)
        filtered_stores = DUMMY_STORES
        if keyword:
            filtered_stores = [store for store in filtered_stores 
                             if keyword.lower() in store["name"].lower()]
        if area:
            # この例では単純化のためエリアでのフィルタは模擬的に
            filtered_stores = filtered_stores[:5]  # 単純に数を減らす
            
        # 結果がなければランダムに返す
        if not filtered_stores:
            filtered_stores = random.sample(DUMMY_STORES, min(3, len(DUMMY_STORES)))
        
        # Bedrock Agentへ返却
        return {
            "sessionAttributes": {},
            "promptSessionAttributes": {},
            "response": {
                "stores": filtered_stores,
                "total": len(filtered_stores)
            }
        }
    else:
        # サポートされていないAPIパス
        return {
            "sessionAttributes": {},
            "promptSessionAttributes": {},
            "response": {
                "error": f"Unsupported API path: {api_path}"
            }
        }

OpenAPIスキーマで定義

Lambda関数を呼び出すためのスキーマは、OpenAPI形式で定義します:

openapi: 3.0.0
info:
  title: AumoStoreAPI
  description: aumoの店舗データを取得するAPI
  version: 1.0.0
paths:
  /getStores:
    get:
      operationId: getStores
      summary: aumoの店舗情報を取得
      description: キーワードやエリアに基づいて、aumoの店舗を検索します
      parameters:
        - name: keyword
          in: query
          description: 検索キーワード(店舗名に含まれる)
          schema:
            type: string
        - name: area
          in: query
          description: 検索エリア(渋谷、新宿など)
          schema:
            type: string
      responses:
        '200':
          description: 正常レスポンス
          content:
            application/json:
              schema:
                type: object
                properties:
                  stores:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                  total:
                    type: integer

Bedrock Agentの作成と設定

OpenAPIスキーマとLambda関数を準備したら、次はBedrock Agentを作成します:

  1. Bedrockコンソールにアクセス

    • AWSマネジメントコンソールから「Amazon Bedrock」を選択
    • 左側メニューから「Agents」を選択し、「Create agent」をクリック
  2. 基本設定

    • Agent名:分かりやすい名前を設定
    • モデル:使いたいモデルを選択
  3. インストラクションの設定例

    あなたはaumoのデータにアクセスできるアシスタントです。ユーザーの質問に基づいて、
    店舗情報を検索し、親切で自然な形で回答してください。以下のポイントを守ってください:
    
    - ユーザーが店舗を探している場合は、必ずgetStoresアクションを使用してデータを取得する
    - エリアやキーワードを適切に抽出してパラメータに設定する
    - 店舗情報が見つかったら、シンプルなリスト形式で提示する
    - 見つからない場合は、検索条件を変えてみることを提案する
    - 常に親切でカジュアルな口調を維持する
    
  4. アクショングループの追加

    • 「Add action group」をクリック
    • アクショングループ名:例「StoreSearch」
    • 説明:例「aumoの店舗データを検索するためのアクション」
    • 「Define with OpenAPI schema」を選択し、先ほど作成したOpenAPIスキーマをペースト or S3にアップロードして選択
    • Lambda関数:先ほど作成したLambda関数のARNを指定
  5. Lambdaとの権限設定

    • Lambda関数にリソースベースのポリシーを追加して、Bedrockからの呼び出しを許可:
    aws lambda add-permission \
      --function-name 関数名 \
      --statement-id bedrock-agent \
      --principal bedrock.amazonaws.com \
      --action lambda:InvokeFunction
  6. Agentの準備とテスト

    • 「Prepare」ボタンをクリックしてAgentを準備
    • 準備完了後、「Test」タブでAgentの動作を確認: 質問を入力して正しく回答されるか確認
  7. Aliasの作成

    • 「Aliases」タブで「Create alias」をクリック
    • 名前:「prod」など
    • 説明:「本番環境用エイリアス」
    • バージョン:DRAFT(または特定のバージョン)
    • 「Create alias」をクリック

これでBedrock AgentがLambda関数と連携し、OpenAPIスキーマに基づいてaumoデータにアクセスできるようになりました。次はSlackとの接続に進みます。

Amazon Q Developer(旧AWS Chatbot)でSlackと接続

Slackとの接続には、最近名前が変わった「Amazon Q Developer(旧AWS Chatbot)」を使います。

接続手順はこんな感じ:

  1. AWS Management Consoleから「Amazon Q Developer」に移動
  2. Slackワークスペースを連携(初回だけOAuth認証が必要)
  3. 連携したいSlackチャンネルを選択
  4. コネクタ機能を使ってBedrock Agentと接続
    @Amazon Q connector add aumon-bot <<BedrockAgentのARN>> <<BedrockAgentのエイリアスID>>
    

この設定をすると、Slackチャンネル内で「 @Amazon Q ask aumon-bot 渋谷のおすすめカフェは? 」のように質問できるようになります。

Amazon Q Developer(旧AWS Chatbot)はコネクタ機能が追加され、Bedrockエージェントと簡単に接続できるようになりました。以前ならSlack Appを作成し、API GatewayでSlackからのWebhookを受信するエンドポイントを作成し、Lambda関数でBedrockにリクエストし……とかなり手間が発生したのですが、これによりとても簡単にSlackからBedrockを利用できるようになっています。これができるというだけでBedrockを使う価値がある。

実際の使用例

実際のSlack画面はこんな感じです:

Slack画面のキャプチャ
Slack画面のキャプチャ

※僕の質問内容が悪くてわかりにくいけど、一応aumoのデータに基づいた回答

まとめ

今回は「自社データを活用したLLMを社内で簡単に使えるようにする」をテーマに、Amazon BedrockとLambdaやAmazon Q Developer(旧AWS Chatbot)を組み合わせて、Slackから使えるデータドリブンなボットを作りました。

技術的なポイントとしては:

  1. Bedrock Agentの活用:既存LLMと自社データの融合
  2. Amazon Q Developer(旧AWS Chatbot):Slackとの簡単な接続

という2点で、すでにAWS環境内に自社データが蓄積されているのであれば、とても簡単にSlack上に自社データを活用したチャットボットを召喚することが可能です。

また、今回は実施していませんが、BedrockにはKnowledge Baseという機能も存在し、これを使うことでRAGも簡単に扱えます。RAGでよいもの、Lambdaを使うものなど必要に応じて実装をわけていくことで、より広範な自社データを効率よくLLMと融合していくことが可能です。さらに、Bedrockには独自モデルをホストする機能もあるので、そういったものも組み合わせることでコスト効率を高めていくことも可能でしょう。

グリーエックスではAI活用を爆速で進めているところなので、このようなAI活用に興味がある方のご応募をお待ちしています!

👉 [採用情報はこちら]

安立 健人(あだち けんと)

GREE X株式会社 戦略本部 AIX推進室長

NLPを中心に機械学習モデルの作成からデプロイ運用まで一気通貫のスペシャリスト

2022年にラスベガスで行われたAWS re:InventにてAIインフラをテーマに登壇

「事例でわかるMLOps」の共同著者