どうも、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を作成します:
-
Bedrockコンソールにアクセス
- AWSマネジメントコンソールから「Amazon Bedrock」を選択
- 左側メニューから「Agents」を選択し、「Create agent」をクリック
-
基本設定
- Agent名:分かりやすい名前を設定
- モデル:使いたいモデルを選択
-
インストラクションの設定例
あなたはaumoのデータにアクセスできるアシスタントです。ユーザーの質問に基づいて、 店舗情報を検索し、親切で自然な形で回答してください。以下のポイントを守ってください: - ユーザーが店舗を探している場合は、必ずgetStoresアクションを使用してデータを取得する - エリアやキーワードを適切に抽出してパラメータに設定する - 店舗情報が見つかったら、シンプルなリスト形式で提示する - 見つからない場合は、検索条件を変えてみることを提案する - 常に親切でカジュアルな口調を維持する
-
アクショングループの追加
- 「Add action group」をクリック
- アクショングループ名:例「StoreSearch」
- 説明:例「aumoの店舗データを検索するためのアクション」
- 「Define with OpenAPI schema」を選択し、先ほど作成したOpenAPIスキーマをペースト or S3にアップロードして選択
- Lambda関数:先ほど作成したLambda関数のARNを指定
-
Lambdaとの権限設定
- Lambda関数にリソースベースのポリシーを追加して、Bedrockからの呼び出しを許可:
aws lambda add-permission \ --function-name 関数名 \ --statement-id bedrock-agent \ --principal bedrock.amazonaws.com \ --action lambda:InvokeFunction
-
Agentの準備とテスト
- 「Prepare」ボタンをクリックしてAgentを準備
- 準備完了後、「Test」タブでAgentの動作を確認: 質問を入力して正しく回答されるか確認
-
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)」を使います。
接続手順はこんな感じ:
- AWS Management Consoleから「Amazon Q Developer」に移動
- Slackワークスペースを連携(初回だけOAuth認証が必要)
- 連携したいSlackチャンネルを選択
- コネクタ機能を使って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画面はこんな感じです:
※僕の質問内容が悪くてわかりにくいけど、一応aumoのデータに基づいた回答
まとめ
今回は「自社データを活用したLLMを社内で簡単に使えるようにする」をテーマに、Amazon BedrockとLambdaやAmazon Q Developer(旧AWS Chatbot)を組み合わせて、Slackから使えるデータドリブンなボットを作りました。
技術的なポイントとしては:
- Bedrock Agentの活用:既存LLMと自社データの融合
- Amazon Q Developer(旧AWS Chatbot):Slackとの簡単な接続
という2点で、すでにAWS環境内に自社データが蓄積されているのであれば、とても簡単にSlack上に自社データを活用したチャットボットを召喚することが可能です。
また、今回は実施していませんが、BedrockにはKnowledge Baseという機能も存在し、これを使うことでRAGも簡単に扱えます。RAGでよいもの、Lambdaを使うものなど必要に応じて実装をわけていくことで、より広範な自社データを効率よくLLMと融合していくことが可能です。さらに、Bedrockには独自モデルをホストする機能もあるので、そういったものも組み合わせることでコスト効率を高めていくことも可能でしょう。
グリーエックスではAI活用を爆速で進めているところなので、このようなAI活用に興味がある方のご応募をお待ちしています!