APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【OCI】OCI Generative AI Agentsを活用したSlackチャットボットを作成してみる!

目次

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

techblog.ap-com.co.jp

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 エンドポイントを指定

dev.classmethod.jp

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

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

tools.slack.dev

qiita.com

4. API Gateway と Functions を統合

続いて、作成した Funcitons と Slack App からのリクエストを受け取るための API Gateway を統合します。

4.1 ルート設定

API Gateway のルート設定で、作成済みのアプリケーションおよびFunctionsを指定します。

設定 備考
パス /slack/events 任意のエンドポイント
メソッド POST Slack App が JSON を POST するため
バックエンド・タイプ Oracleファンクション 作成したアプリケーション/関数名を指定

docs.oracle.com

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のエンドポイントを設定します。

  1. Create New App → From scratch を選択

  2. 任意の Slack App 名、ワークスペースを選択

  3. Event SubscriptionsEnable EventsOn にし、Request URL に API Gateway のエンドポイント/パスを設定

  4. OAuth & Permissions Bot Token Scopeschat:writeapp_mentions:read を付与

api.slack.com

6. Slack から呼び出し確認

Slackbotをメンションし、応答が返ってきたらOKです!

前回作成したナレッジベースの情報を元に返答もできていました。
※架空の就業規則を参照させています

7. まとめ

SlackとOCIのマネージドサービスを用いてチャットボットを作成することができました。
道中、IAMポリシーの設定でつまずいたり、コンテナレジストリにプッシュできなかったり・・・など一筋縄ではいかない部分もありましたが何とか形にすることができて良かったです。 ハマった箇所についてはまた別途記事を書けたらなと思います。

8. さいごに

私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp