AWS Serverless FrameworkとOpenAIを連動したSlack BOT!!

AWS

2024.2.9

Topics

はじめに 

こんにちは、エンジニアのFeelです。
発展していくAI技術が様々な分野で導入され、業務効率が高まっているというニュースをよく聞くようになりました。
特に ChatGPT はアクセシビリティが良く、多くの分野で使用されています。
私もその雰囲気に便乗してSlack BOTとOpenAIのGPT-3.5-turboを活用したChatBOTの実装を行ってみました。 本ブログでは、OpenAIのGPT-3.5-turboとAWSのインフラを活用した実装方法を説明してみます。

特性

まず、既存のオープンソースを検索してみましたが、やはり多くの資料が存在しました。 GPT-4である最新APIを利用している資料もありましたが、月20ドルの支払いが発生するためGPT-3.5-turboを利用する下記の方法で進めることにしました。
GitHub – xgro/Friday: Slack Bot @OpenAI
韓国の方がアップロードしたソース環境であるためソースコメントが韓国語で表記されています。全体の構造を確認してみると、AWS Lambdaを使用してSlack BOTを実装し、gpt-3.5-turbo APIをcallしてresponseする形式を持っていました。また、ソース構成はpythonになっており、配布はymlファイルを実行する形になっていました。

事前準備

まず、事前準備作業で以下の過程をチェックする必要があります。

  • Create an OpenAI account and get an API Key
  • Create an AWS account
  • Setup your Slack BOT. You can follow this instructions to get your token.
  • サーバーレスフレームワークを使用して配布するため、最小限のパッケージを事前にインストールする必要があります。
    • node v20.11.0
    • serverless@3.28.1

アーキテクチャー

全体のアーキテクチャは以下のようです。

アーキテクチャ

設定

1.OpenAIのAPI keysを作成

まず、OpenAIによって開発されたAIモデルをSlackで使用するためにAPI Keyを発行する必要があります。無料で発行と使用が可能です。ただし、制限があります。アカウント作成後に18ドルのクレジットを受け取れますが、これを使いきると有料になります。もう一つは、以下の画面で表示されるシークレットキーを作成した後に必ずコピーして保存しておく必要があります。

上記のウィンドウを閉じた後、下記のイメージを見ると右の鉛筆の絵文字を押せば、まるでAPI Keyの情報を確認できるかのように見えますが、違いました。どこを見ても作成したシークレットキーを確認できませんでした。 もちろん、私が見つけられなかっただけかもしれませんので、後ほど解決すればこの部分を修正することとします。

2. Slack BOTの作成

OpenAI APIキーを作成したため、続けて連携するBOTを作成しました。ついでに、 以下のサイトを参照しました。
参照: https://qiita.com/odm_knpr0122/items/04c342ec8d9fe85e0fe9

テストするアプリ名はtechoにしました。作成を進めてみると「App Home」 – “Display Name”と“Default username”を設定する画面が出てきますが、以下のように同じくtechoを入力しました。

そして「OAuth & Permissions」 – 「Scopes」は使用するBOTの機能を追加する場所であり、https://api.slack.com/scopesで機能の説明を読んで機能を確認しながら追加すれば問題ありません。私はトークヒストリを確認して管理するscopeのみ追加しても問題ないため、下記のイメージに表示されたものを、まず追加しました。

権限の設定を完了すると、Install to Workspace というボタンが表示されます。それをクリックしてワークスペースにBOTをインストールします。インストールを進めると、以下のように作成したtechoというBOTアプリが、techotechoというワークスペースにアクセスリクエストされたことが確認できます。

「許可する」というボタンを押すと、下記イメージのようにOAuth Tokens for Your Workspace項目からBot User OAuth Tokenが作成されたことが確認できます。続けて、黄色の警告ウィンドウに書かれている内容の通り、新しいscopesを追加するためにワークスペースの再インストールすればBOTの適用は終わりです。

AWSサーバーレスフレームワークを利用したOpenAIとSalck BOTの連動作業

AIを持っているSlack BOTを作るための事前作業は完了しました。ではここから、この2つを連動する必要があるため、今回はAWSサーバーレス環境を利用して連動作業を進めます。直接AWSコンソールに入り、一つ一つコーディングを行う方式ではなく、サーバーレスフレームワークを活用した方式を使用するため、下記のイメージのように「serverless -ai」というCloud9環境を作成して利用しました。サーバーレスフレームワークとしてデプロイすると、serverless-python-requirementsプラグインを使用して自動的にrequirements.txtに指定されたパッケージをAWS Lambda Layerにデプロイします。

まず、Githubからソースコードをcloneして、

必要なパッケージをインストールします。

プラグインもここで一緒にインストールします。

その後、環境変数を修正します。
cp .env.sample .env
これを実行して、.envに入り、下記のイメージに表示されるSLACK_TOKEN部分とOPENAI_KEY部分を修正します。 上記で確認したOpenApiのSECRET KEYとSlackのBOT User OAuth Tokenをここに記載します。

※ソースに修正が必要な部分あります。たとえば、環境変数でOPENAI_KEYがOPENAI_TOKENになっていますが、別のファイルではOPENAI_KEYというキー名で環境変数を参照しているため、対応が必要です。私の場合は.envを修正しました。

環境設定が完了したら、サーバーレスフレームワークを使用してインフラ配布を進行します。次のイメージに示すように、severless deployを介してAWS CloudFormationにstack(slack-chat-dev)を作成して実行します。

上記のコマンド実行後、AWSのCloudFormationコンソールを確認すると、作成されたstackと進行されたイベントが確認できます。

上記にて「アーキテクチャー」部分でも表現したように、Slackでテクスティングをすると、リクエスト処理のため下記のイメージのようにAPI Gatewayを経てLambdaに行くことになります。

そして、以下のようにslack-chat-dev-producerという関数にたどり着き、Slackのchallenge認証を行い、認証を通過すると、メッセージは、AWS SQSというサービスのメッセージキューに移動します。

続けて、SQSのメッセージは、slack-chat-dev-jobsWorkerという関数でOpenAIの答えをハンドリングしてから、再びsalckでポスティングする完全なserverless構造でイベント処理を完了することになります。

上記のプロセスがすべて完了したら、配布したサーバーレスインフラとSlack BOTを連動します。 [Event Subscriptions]タブで[Enable Events]を選択して機能を有効にします。Request URLには Cloud9にてseverless deployを実行してから表示するapi-gatewayのアドレスを入力します。正常にデプロイが完了すると、Request URL項目がVerifiedと表示されます。

結論

最後にSlackでテストをやってみました。いくつかのサイトですでに検証できました。また、OpenAI Slack BOTであるためやはり問題なく実行できました。私が感じたのはインテリジェントなデータ処理をしてくれるOpenAIのアルゴリズムも確かに驚くべきものには間違いありませんが、このように迅速にサーバーレス環境を構築できるAWSも有用だと感じました。

 

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら