目次
- 目次
- 1. はじめに
- 2. 全体の構成
- 3. Generative AI Agents を Functions から呼び出す
- 4. API Gateway と Functions を統合
- 5. Slack App で API Gateway を指定
- 6. Slack から呼び出し確認
- 7. まとめ
- 8. さいごに
1. はじめに
こんにちは、クラウド事業部の早房です。 前回の記事では OCI Generative AI Agents の基本的な部分を紹介しましたが、今回は OCI Generative AI Agents を用いた簡易的な Slack チャットボットを作成してみました! ぜひ最後までお付き合いください! 🙌
2. 全体の構成
全体の構成とデータフローは以下です。
① ユーザーによる Slackbot へのメンションを契機に、Slack App から API Gateway へリクエストが送信される。
② API Gateway が Functions を実行する
③ Functions が Generative AI Agents へプロンプトを投げる
④ Generative AI Agents がナレッジベースに格納されているデータを元に回答を作成する
⑤ Generative AI Agents が Functions に回答を返却する
⑥ Functions が NAT Gateway および InternetGateway 経由でSlack Appに回答を返却する
コンポーネント | 役割 |
---|---|
Slack App | ユーザーからの質問を API Gateway に送信する |
API Gateway | Slack App からリクエストを受け取り、Functions を実行する |
Functions | Generative AI Agent を呼び出して Slack App に応答を返す |
Service Gateway | Functions から Generative AI Agent へのプライベート接続を提供する |
Generative AI Agent | ユーザーからの質問に対する回答を生成する |
Object Storage | ナレッジベース用 PDF の格納先 |
NAT/IGW | Functions から Slack App へのアウトバウンドアクセス経路を提供する |
3. Generative AI Agents を Functions から呼び出す
まずは Generative AI Agents を呼び出す Functions を作成します。
Functionsは「アプリケーション」内に作成されるため、アプリケーション未作成の場合は作成が必要です。
docs.oracle.com
3.1 アプリケーションの作成
アプリケーションはプライベートサブネット内に作成します。
3.2 Functions の作成
事前にコンテナレジストリにpushしておいたイメージを指定します。
3.3 環境変数の定義
アプリケーション内の構成タブから設定しておきます。
変数 | 用途 |
---|---|
SLACK_SIGNING_SECRET |
Slack App からのリクエストを Functions で検証する際のシークレット |
SLACK_BOT_TOKEN |
Functions から Slack へ投稿する際の認証用トークン |
AGENT_ENDPOINT_OCID |
Generative AI Agent エンドポイントを指定 |
3.4 IAM ポリシー
Funcitons が Generative AI Agents を呼び出せるように、あらかじめ Functions をダイナミックグループに所属させ、 所属させたダイナミックグループに generative-ai-family を使用するポリシーを割り当てる必要があります。
allow dynamic-group fn-slack-bot-dg to use generative-ai-family in compartment demo
(参考) Generative AI Agents を呼び出すコード
以下のように OCI の Python SDK 使用して Functions から Generative AI Agents を呼び出すことができます。
Generative AI Agents の呼び出しには Functions のリソースプリンシパルが使用されます。
import os import oci from oci.generative_ai_agent_runtime import GenerativeAiAgentRuntimeClient from oci.generative_ai_agent_runtime.models import CreateSessionDetails, ChatDetails # ① リソースプリンシパルを取得、リソースプリンシパルを用いたGenerativeAiAgentRuntimeClientの呼び出しを定義。 signer = oci.auth.signers.get_resource_principals_signer() client = GenerativeAiAgentRuntimeClient({}, signer=signer) endpoint_id = os.environ["AGENT_ENDPOINT_OCID"] # エージェントエンドポイントの OCID はFunctionsの環境変数で定義しておく。 # ② セッションを開始 session = client.create_session(endpoint_id, CreateSessionDetails(display_name="slack-session")).data # ③ LLMにプロンプトを投げる res = client.chat(endpoint_id, ChatDetails(session_id=session.id, user_message="こんにちは")).data print(res.message.content.text)
詳細は以下公式ドキュメントをご参照ください。 docs.oracle.com
(参考) Slack Appへのレスポンスを行うコード
Slack Appへのレスポンスは Python Slack SDK が使用できます。
import os import traceback from slack_sdk.web import WebClient def post_answer_to_slack(channel: str, text: str) -> None: try: client = WebClient(token=os.environ["SLACK_BOT_TOKEN"]) client.chat_postMessage(channel=channel, text=text) except Exception as e: traceback.print_exc() raise RuntimeError(f"Slack 送信失敗: {e}") from e
4. API Gateway と Functions を統合
続いて、作成した Funcitons と Slack App からのリクエストを受け取るための API Gateway を統合します。
4.1 ルート設定
API Gateway のルート設定で、作成済みのアプリケーションおよびFunctionsを指定します。
設定 | 値 | 備考 |
---|---|---|
パス | /slack/events |
任意のエンドポイント |
メソッド | POST |
Slack App が JSON を POST するため |
バックエンド・タイプ | Oracleファンクション |
作成したアプリケーション/関数名を指定 |
4.2 IAM ポリシー
API Gateway が Functions を実行できるように、以下のポリシーを作成します。
allow service apigateway to use function-family in compartment demo
5. Slack App で API Gateway を指定
Slack Appを作成して、API Gatewayのエンドポイントを設定します。
Create New App → From scratch を選択
任意の Slack App 名、ワークスペースを選択
Event Subscriptions → Enable Events を
On
にし、Request URL に API Gateway のエンドポイント/パスを設定
- OAuth & Permissions → Bot Token Scopes で
chat:write
とapp_mentions:read
を付与
6. Slack から呼び出し確認
Slackbotをメンションし、応答が返ってきたらOKです!
前回作成したナレッジベースの情報を元に返答もできていました。
※架空の就業規則を参照させています
7. まとめ
SlackとOCIのマネージドサービスを用いてチャットボットを作成することができました。
道中、IAMポリシーの設定でつまずいたり、コンテナレジストリにプッシュできなかったり・・・など一筋縄ではいかない部分もありましたが何とか形にすることができて良かったです。
ハマった箇所についてはまた別途記事を書けたらなと思います。
8. さいごに
私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。