とりあえず書いてみます

興味がある事や考えなどとりあえず記事にしてます。

LambdaでOpenAIのAPIを使ってLINEbotを作ってみた

こんにちは

ChatGPTのプロンプト色々と調べて質問するのに最近ハマっているオビ―です。

はじめに

LINEbotですぐに質問できる自分だけのChatGPT的なの作れたら面白いなーと思って試してみた記事です。

自己満足で作成した内容を忘れないうちに記事にしているのでロジックがイケていないだとか、やりかたブサイクだとかめっちゃあるかと思いますが優しい目で見てもらえたらうれしいです!

作ったのは下記です。

前提

各サービスのアカウント作成方法などは詳細に書いていない為、適宜調べながら作成お願いします。

利用するサービス

1:OpenAIのアカウント作成

OpenAI API

上記でアカウント作成してから下記にアクセスし「SEACRET KEY」を取得

Account API Keys - OpenAI API

2:LINEDeveloperのアカウント作成

LINE Developers

上記よりアカウントを作成しておく

3:AWSのアカウント作成

アマゾン ウェブ サービス(AWS クラウド)- ホーム (amazon.com)

上記からアカウント作成

手順

早速作っていきます。

1:PythonのOpenAIモジュールを落としてくる

pip install openai

インストールされたモジュール群を「python」フォルダ作成してそこに移動させてzipで圧縮

2:Lambdaのコード作成

Lambda→関数作成→Pythonで作成

※python3.8で作っていました。

関数名は任意、下記コードをコピーして貼り付ける

import logging
import os
import urllib.request
import json
import openai

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    
    message_event = json.loads(json.dumps(event))["events"]
    reply_token = message_event[0]["replyToken"]
    message = message_event[0]["message"]["text"]

    openai.api_key = os.environ['OPEN_APIKEY']
    res = openai.Completion.create(
        model='text-davinci-003',
        prompt=message,
        temperature=0, 
        max_tokens=1000, 
        top_p=1.0, 
        frequency_penalty=0.0, 
        presence_penalty=1.0 
    )

    res_text = ''.join([choice['text'] for choice in res.choices])

    url = "https://api.line.me/v2/bot/message/reply"
    
    headers = {
        "Content-Type": "application/json",
        'Authorization': 'Bearer ' + os.environ['ACCESS_TOKEN']
    }
    
    data = {
        'replyToken': reply_token,
        'messages': [
            {
                "type": "text",
                "text": res_text.lstrip("\n"),
            }
        ]
    }
    
    req = urllib.request.Request(url=url, data=json.dumps(data).encode("utf-8"), method="POST", headers=headers)
    
    with urllib.request.urlopen(req) as res:
        
        logger.info(res.read().decode("utf-8"))
        
        return {
            "statusCode": 200,
            "body": json.dumps("Hello from Lambda!")
        }

※コード汚いとかは内緒で。。。

上記コードで一応動いています。。

3:Lambdaのレイヤーにモジュールアップロード

コード書いているところの最下部に「レイヤーの追加」というのがあるのでそこから1で作成していた「python.zip」ファイルをアップロードして追加する

4:Lambdaの環境変数設定

コード上に直接トークンやKeyなどを書きたくないので環境変数に登録します。

今回はOpenAIのAPIキーとLINEのAccessトークンを設定します。

Lambda関数→設定→環境変数

から追加できます。

「OPEN_APIKEY」にOpenAIのAPIキー

ACCESS_TOKEN」にLINEのAccessトーク

を設定しています。

・LINEのAccessトーク

前提2で作成したLINEDeveloperでアプリを作成し下記添付の「Channel access token」部分を環境変数に適用

LINEDeveloper
・OpenAIのKey

前提1で作成したアカウントで「SECRET KEY」を作成して環境変数に設定

5:AWSのAPIGatewayの設定

APIGatewayを使ってアクセスできるようにします。

自分は「APIの作成」からRestAPIを選択して作成しました。

登録後Lambdaで作った関数を指定します。

設定後「リソース」→「アクション」→「APIのデプロイ」すると下記添付のように青枠のURL出てくるのでURLをどこかにメモしておきます。

※個人で好きに作っているだけなので設定などはデフォルトのままでprod一択です笑

6:LINEDeveloperのWebhook URLを設定

下記添付のWebhook URLの場所に5で作ったURLを設定

7:Lambdaのコードを自分の好みに書き換えて遊ぶ

Lambdaのコードで「Deply」してもらうことで好きに書き換えれるのでAPIのパラメータを書き換えながら試してみてください!

以上です!

 

PS

LINEのBot作成する際に一度名前決めると変更できないのでChatGPTbotって書いたがOpenAIのAPIを使ったbotなので後で名前変えようかなーと思います。。