見出し画像

GPT-3+LINE公式+GoogleCloudFunctionsで簡単実装!英会話botの作り方。(Pythonで解説)

今回は話題のGTP-3のAPIを使って、LINEで英会話できる簡単なbotを作ります。
コードはGoogle Cloud Functionsを使ってサーバレスに実装します。サンプルコードはPythonとなります。

今回のアーキテクチャはシンプルながらも今後、様々な応用例があると思います。
全工程をサンプルコード・画像付きで説明していますので、ぜひ遊んでみてください!

ご購入頂きありがとうございます。以下からが構築手順になります。

1.GPT-3


まずはGPT-3の準備に入りましょう。

GPT-3のAPIを利用するためにOpenAIのアカウントを作りましょう。

アカウントを作成します。既に登録済みの人はログインしてください。

メニューのAPI KeysからAPIキーを発行します。

もう見れないので、API Keyはどこかに記録しておてください。


注意:APIはRequestごとに料金がかかるので、常にUsageで確認するようにしてください。(登録時はトライアルで18ドル分使えます。) 

今回のサンプルコードはExamplesにある「Chat」を使います。他のアプリを使いたい人は違うので試しても構いません。


GPT-3が初めての人は、Google Colaboratory等で動作確認してみましょう。もちろん、OpenAIのPlaygroudで遊んでみてもいいです。

API KEYをセット後、実行して下記のように返答があればOKです。

上記のソースコードを載せておきます。

!pip install openai
import openai
import json

openai.api_key = "ここにAPIKEYが入ります。"


#APIに送るリクエスト
prompt= "The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:",#prompt= "Human: I thougth iit was too expensive",prompt= "Human: Thanks!",#ここががRequestになる。

#API実行
response = openai.Completion.create( 
    model="text-davinci-003", 
    prompt=prompt, 
    temperature=0.9, 
    max_tokens=150, 
    top_p=1, 
    frequency_penalty=0.0, 
    presence_penalty=0.6, 
    stop=[" Human:", " AI:"]
)

#レスポンス
print(response['choices'][0]['text'])

GPT-3の設定は以上です。
尚、パラメータ等に関して以下の記事が詳しいです。



2.LINE公式のアカウント作成

LINE公式アカウントを作成します。

「LINE公式アカウントを始める」を選んでください。

既にアカウントがある人はログインしてください。

以下の画面が出ると思いますので「作成」を選んで入力を進めてください。

今回の設定はbotモード、応答メッセージはオフにしておきます。

Webhookは後ほど使いますので、オンにしておいてください。

次に、実際にお友達になりましょう。

以下の応答がLINEからあればOKです。

 LINEアプリ内


最後にLINEのチャンネルシークレットとチャンネルアクセストークンを確認しておきましょう。(こちらは後からでも確認できますので、控える必要はありません。)

チャンネル シークレットは設定⇨MessagingAPIから確認できます。

チャンネル アクセストークンはLINE Devlopersからの発行になりますので
、注意してください(LINE公式とは場所が違います)。

LINE Devlopersにログインして自分のアカウントに移動してください。MessagingAPI設定の一番下、チャンネルアクセストークンから発行できます。

LINEの設定は以上です。

3.Google Cloud Functions

Google Cloud FunctionsはGoogle Cloud Platformから設定します。

まずは、Google Cloud Platformのアカウントを作成します。

請求先が必要なので、クレジットカードを用意しておいてください。

アカウント作成が終わると、以下のダッシュボードが表示されると思います。

Cloud Functionsで検索します。

Cloud Functionsの画面になると「関数の作成」をクリック。

以下を入力していきます。

HTTPSはオンにしておいてください。「次へ」をクリック。

最後にコード編集画面が表示されると思いますので、Python 3.8を選んで、Open AIで試したサンプルを組み込みます。
※これはあくまで、サンプルを実行して挙動を確認するものなので、無理にGTP-3のコードを入れる必要はありません。


以下の、コードを編集画面に貼り付け。
main.py

import openai
import json

def hello_world(request):
  
    openai.api_key = "ここにAPIKEYが入ります。"

    request_json = request.get_json()

  #ここががRequestになる。
    prompt= request_json['message']

    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0.9,
        max_tokens=150,
        top_p=1,
        frequency_penalty=0.0,
        presence_penalty=0.6,
        stop=[" Human:", " AI:"]
    )

    if request.args and 'message' in request.args:
        return request.args.get('message')
    elif request_json and 'message' in request_json:
        return json.dumps(response['choices'][0]['text'], ensure_ascii=False, indent=2)
    else:
        return f'Enter something'

requirements.txt

# Function dependencies, for example:
# package>=version
openai==0.26.4


デプロイをクリックします。

以下、デプロイが始まるので、緑のチェックがつくまで待ちましょう。尚
エラーがある場合は黄色か赤になります。

デプロイが完了したらログを確認。

 問題なければテストしましょう。サンプルコードではrequest_json['message']で待ち受けてますので、以下のようにキーをmessageにして、好きな文章を英語で送りましょう。

以下のように応答があればOKです。


4.結合


いよいよ、本番コードをGoogle Cloud FunctionsにデプロイしてLINE公式のWebHookに登録します。

LINE公式に対応したコードとGPT-3コードをCloud Functionsの編集画面に貼り付けます。(今回の本番コードです。)LINEのチャンネルシークレットとアクセストークンも忘れずセットしてください。 
エントリポイントがmainになっているので、Cloud Functionsのエントリポイントも忘れずにmainに合わせてください。


尚、今回は最低限の動くコードだけ書きます。リファクタリング、環境変数の登録は各自自由に設定してください。

import openai
import json

from flask import abort, jsonify

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage
)

LINE_CHANNEL_ACCESS_TOKEN = "LINEアクセストークンはここなります。"
LINE_CHANNEL_SECRET = "LINEチャンネルシークレットはここなります。"

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

#Cloud Functionsエントリポイント
def main(request):
   
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
 
    return 'OK'

#LINEにRequestがあった時に実行される。
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):

    openai.api_key = "GTP-3のAPIKEYはここ。"

    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=event.message.text,
        temperature=0.9,
        max_tokens=150,
        top_p=1,
        frequency_penalty=0.0,
        presence_penalty=0.6,
        stop=[" Human:", " AI:"]
    )

    #LINEに返信されるメッセージ
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response['choices'][0]['text'].strip()))

requirements.txt

# Function dependencies, for example:
# package>=version
line-bot-sdk
openai==0.26.4


全て完了したらデプロイしてください。デプロイとログの確認手順は、先ほどと同じです。今回はLINEからでないと、動作確認できないので注意してください。

LINE公式にWebhook URLを登録。

Webhook URLはCloud Functionsの「関数の編集」から確認できます。

最後にLINEにメッセージを送って、返信があれば成功です!

ここまで、お疲れ様でした!
一度やってみれば、そんなに難しくなかったと思います。
今後、色々と応用ができそうなシンプルなアーキテクチャだと思います。ぜひ、自分のアイディアを活かしてみてください。GTP-3や生成AIの今後が楽しみですね。

※本コードによって発生した料金・損害につきましては、いかなる責任も負いかねます。自己責任で実行してください。


生成AIの可能性を予言した名著です。プログラマーでなくても理解できるので、ぜひ読んでみてください。

GPT-3のアルゴリズムTransformerも解説。自然言語処理を理解するならマストの名著。



いいなと思ったら応援しよう!