
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のチャンネルシークレットとチャンネルアクセストークンを確認しておきましょう。(こちらは後からでも確認できますので、控える必要はありません。)
チャンネル シークレットは設定⇨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も解説。自然言語処理を理解するならマストの名著。