AWS Chalice を使って、ChatGPT Slack Appを作成してみた(LangChain編)

ChatGPT(OpenAI API), LangChainの検証の為に、AWS Chaliceを使用してChatGPT Slack Appを作成してみます。
2023.07.06

AWS事業本部の梶原@福岡オフィスです。

先日作成したSlack Appに対して、ChatGPT(OpenAI API)の検証の為に、応答部分を変更してChatGPT Slack Appを作成してみます。

尚、検証にあたり以下をコンセプトに各サービスやフレームワークを選定して作っています。

  • なるべく標準的なフレームワークや純正によせる。
  • なるべくAWSによせる。
  • 本番想定でなく、検証用に環境を作る
  • 一撃♪(後片付けも)

ということで、前回作成したSlack Appに対して、更新をおこなって、 LangChainを使用して、OpenAI API から回答を作成し、返信する Slack Appを作成してみます AWS Chalice, Slack Appの設定部分などは前回のエントリーをご参考ください

AWS Chalice を使って、Slack App (Slack Bolt for Python) を作成してみた

はじめに

以下の技術、サービスを使っています。詳しくは参考情報や、リンクなどをご参照ください

  • Slack (Slack Bolt for Python)
    • Slack 純正のSDK
  • AWS Chalice(Python Serverless Microframework for AWS)
    • ちょっと情報は少ないですが、デプロイと削除が1撃で手軽にできるので選定しました
  • ChatGPT
    • 生成AIといえばこれ!
    • 実際には OpenAI API を使用していますので作成する際はAPIキーを取得しておいてください
  • LangChain
    • プロンプト部分や、他の生成AIへの変更がしやすそうだったのでこちらを生成AIのAPIを呼び出す際に使用して呼び出します。

前提条件

  • AWS アカウント(以下サービスを使用しています)また権限が必要です
    • AWS IAM
    • AWS Lambda
    • Amazon API Gateway
    • Amazon S3
    • AWS Chalice
  • Slack
    • アプリケーションがインストール可能なこと
  • OpenAI
    • OpenAI のAPI キーを取得してください

事前準備

AWS 環境設定

AWS Chaliceでデプロイをおこなうので、事前にCredential等を設定してください

$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [ap-northeast-1]: 
Default output format [None]:

Pythonの環境設定

Python 3.10 の環境設定をします。

以降の処理はPython3.10 のvenv環境での実行を想定しています

$ python3.10 -m venv .venv310
$ source .venv310/bin/activate
$ python --version
Python 3.10.12
$ pip --version
pip 23.0.1 from .venv310/lib/python3.10/site-packages/pip (python 3.10)

各種pipパッケージのインストール

Slack, AWS Chalice, Boto3, Langchain, OpenAI のパッケージをインストールしておきます。

尚、requirements.txt に記載したファイルはAWS Lambdaにデプロイされる際にAWS Chaliseの機能で、Lambda Layerに一緒にパッケージングされます。便利!

$ pip install -r requirements.txt

requirements.txt

slack_bolt
chalice
boto3
langchain==0.0.221
openai

AWS Chalice、Slackについて

動作確認までは以下エントリーでご案内していますのでご参考ください

AWS Chalice を使って、Slack App (Slack Bolt for Python) を作成してみた

やってみた

メンションの応答の実装部分に、langChain, またChatGPTの処理を追加して、メンションされた内容に対して、OpenAI APIで回答を作成して返すようにしてみます

なお、コードはLangChainのQuickstartサンプルコードを参考にしています。

環境変数設定

AWS Chalice(AWS Lambda)の環境変数にOPENAI_API_KEYを追加します。作成されたLambda関数内でLangChainがこのOPENAI_API_KEYの値を読み込んでAPI利用時に使用されます

config.json

{... 
  "stages": {
    "dev": {
      "environment_variables": {
                ...
        "OPENAI_API_KEY": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}

実装部分

既存の処理はSlackアプリに対して、メンションされた場合(”app_mention”)に、say()でメッセージを返していますので、この部分に変更を行います

元のコード

@bolt_app.event("app_mention")
def handle_app_mentions(body, say, logger):
    logger.info(body)
    say("What's up? I'm a Chalice app :wave:")

OpenAI でメンションから返信を作成するコードに置き換えます

  1. メンションでAppが受け取ったメッセージからメンション部分を削除
  2. Open AI で応答を生成
  3. スレッドに返信する
from langchain.llms import OpenAI

@bolt_app.event("app_mention")
def handle_app_mentions(body, say, logger):
    logger.info(body)

    event = body["event"]
    channel = event["channel"]
    ts = event["ts"]

    # Slackでメンションを受け取ったらメッセージからメンションを取り除く
    mention_text = re.sub(r'<@.*?> ', "", event["text"])

    # 応答を生成
    llm = OpenAI(temperature=0.9)
    text = llm.predict(mention_text)

    # スレッドに返信
    say(text, thread_ts = ts)

デプロイ

めんどくさいLambdaのLayerも自動で作成して、更新デプロイしてくれるのでとても助かります。

$ chalice deploy
...
Creating Rest API
Resources deployed:
  - Lambda Layer ARN: arn:aws:lambda:ap-northeast-1:123456789012:layer:bolt-python-chalice-dev-managed-layer:1
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:123456789012:function:bolt-python-chalice-dev
  - Rest API URL: https://hoge.execute-api.ap-northeast-1.amazonaws.com/api/

動作確認

インストールが正常にいけば、任意の部屋に追加したSlack Appを追加して、メンションしてください。

以下のようにOpenAI からの答えが生成されており、スレッドに返信されていれば成功です。(返信内容はご愛嬌

リソース削除

以下コマンドでAWS上のリソースはきれいに削除できます

$ chalice delete

まとめ

ここまでできれば、ChatGPT(Open AI)、またLangChainの機能をつかって、検証や実装などをすることができます。 実際にやりたいプロンプトのカスタマイズやモデルの検証など、実際のビジネスロジックに注力したいとおもいます。 プロンプト検証は、Jypter Notebook(SageMaker)などで、行うことが多いと思いますが、デモや共有して検証して貰う際などに流用できるかと思いますので、ご参考ください

参考情報

https://python.langchain.com/docs/get_started/introduction.html

https://github.com/openai/openai-quickstart-python

https://github.com/hwchase17/langchain