SlackからスタンプでBacklog起票できる仕組みにAIで要約をつけてみた

この記事は <a href="https://qiita.com/advent-calendar/2024/mediba">mediba Advent Calendar 2024</a> 15日目の記事です。

## はじめに
株式会社medibaでインフラエンジニアをしております、馬淵と申します。

Slackでやりとりをしている時に、タスクとして登録しておきたい仕事が飛んでくる時ってありますよね。
以前、そのようなメッセージをスタンプを押せばBacklogに登録してくれる仕組みを作りました。
記事　→ <a href="https://speakerdeck.com/mabuchi/slacktesutanhuwoya-sutobacklogniqi-piao-surushi-zu-miwozuo-ru-1">こちら</a>

しかし、タスクの題名や内容についてがイケてなかったので、今回はAIを使って題名付けをしてみました。

## 前提条件
AWSを使ったことがある
Bedrockが利用可能なリージョンに開発環境がある

## 構成図
![スクリーンショット 2024-12-15 17.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/15784a0d-aea9-e72a-ceeb-0fb3552368a0.png)

## 作成するまでの流れ
１.BedRockのモデルを利用可能にする
２.IAMロールの作成
３.Lambdaに処理を追加
４.完了！

### １.BedRockのモデルを利用可能にする
最初に、BedRockを使えるようにする準備をします。
まずはAWSのマネジメントコンソールに<b>[Bedrock]</b>と入力し、画面へ遷移してください。
![スクリーンショット 2024-12-13 20.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/0f127bea-bdd3-34ad-4ad6-50f9f17b5381.png)

次に、画面左側の<b>[モデルアクセス]</b>を押下し、使いたいモデルにチェックを入れてください。
![スクリーンショット 2024-12-13 20.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/5554c9ab-0ae9-5126-93e7-da188d6e3853.png)

僕が作成した環境では以下３モデルのアクセスが有効になっています。
![スクリーンショット 2024-12-13 20.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/6c9958dc-003f-55b3-9afb-370a7af629ad.png)


### ２.IAMロールの作成
BedRockを使える許可を持ったロールを作成します。

まずはAWSのマネジメントコンソールに<b>[IAM]</b>と入力し、画面へ遷移してください。
![スクリーンショット 2024-12-13 20.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/409fd89b-bf4f-baf9-862e-5da627aca37b.png)

画面左側にある<b>[ポリシー]</b>から、<b>[ポリシーを作成]</b>を押下し、ポリシーを作成します。
アクセス許可では<b>[JSON]</b>から以下を貼り付け<b>[次へ]</b>を選択し、任意のポリシー名を付けて<b>[ポリシーの作成]</b>を押下します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "bedrock:*",
            "Resource": "*"
        }
    ]
}
```

次に、今作成したポリシーを持ったロールを作成します。
画面左側にある<b>[ロール]</b>から、<b>[ロールを作成]</b>を押下し、ロールを作成します。
ユースケースにはLambdaを指定してください。
![スクリーンショット 2024-12-13 20.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/dad5f45f-ac0e-906a-4264-6bebe34e316d.png)
ポリシーには先ほど作ったポリシーを作成します。
![スクリーンショット 2024-12-13 20.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/e8feaf8a-9531-0a8d-fc10-8e0b02148d75.png)

これでロールを作成できました。
このロールをLambdaに追加すれば準備完了です。

### 3.Lambdaに処理を追加
処理を加えたいLambdaにBedrockを呼び出す処理を加えます。
今回はAnthropic Claudeのinvoke_modelメソッドを使用しました。

以下コードを参考に処理を追加します。

呼び出し部
```
    bedrock_runtime = boto3.client('bedrock-runtime')

    # 各種パラメーターの指定
    modelId = 'anthropic.claude-v2:1' 
    accept = 'application/json'
    contentType = 'application/json'
```

処理部
slack_message変数には要約してほしいメッセージが入っています。
これをHuman:とAssistant:に挟んでプロンプトメッセージを作成し、Bedrockに渡します。

```
        prompt_message="次の業務対応依頼にをチケット化したいと考えています。チケットの題名を考えてください。回答は題名のみでお願いします。他の返答を含めないでください。"
        # リクエストBODYの指定
        body = json.dumps({
            "prompt": "\n\nHuman:"+prompt_message+slack_message["text"]+"\n\nAssistant:",
            "max_tokens_to_sample": 100,
        })

        # Bedrock APIの呼び出し
        response = bedrock_runtime.invoke_model(
        	modelId=modelId,
        	accept=accept,
        	contentType=contentType,
            body=body
        )
```
レスポンス解釈部
```
        # APIレスポンスからBODYを取り出す
        body = response.get("body")

        # iter_chunks() を使用する場合
        for chunk in response['body'].iter_chunks():
          decoded_chunk = chunk.decode('utf-8')
          try:
            # JSON オブジェクトとして読み込み、"completion" キーの値を取得
            title = json.loads(decoded_chunk)["completion"]
          except (json.JSONDecodeError, KeyError):
            # JSON デコードエラーまたは KeyError が発生した場合、チャンク全体を出力
            print(decoded_chunk)

```

これでtitle変数の中にチケットを要約したいい感じの題名が入っています。



### 4.完了！
これでBackLogのAPIを叩けば、いい感じに起票が行われます。

こちらが使用例になります。
![スクリーンショット 2024-12-15 17.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960719/602de96e-da11-5094-7bb3-3bf0b0685331.png)


## 終わりに
以上になります。ここまで長い記事をご覧いただきありがとうございました。
AIの進化がめざましいので、どんどん業務に活かしていきたいですね。

## 参考記事
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-parameters-anthropic-claude-text-completion.html
https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html
https://dev.classmethod.jp/articles/invoke-bedrock-form-lambda-function/#toc-lambda
https://dev.classmethod.jp/articles/amazon-bedrock-ga/
https://speakerdeck.com/mabuchi/slacktesutanhuwoya-sutobacklogniqi-piao-surushi-zu-miwozuo-ru-1