###### tags: `AWS Learning Group`
# 20221215 Line-bot + GPT-3
前言
> 12/1 OpenAI 釋出ChatGPT,短短一週就破百萬用戶,使用者可以在OpenAI提供的Web聊天室跟chatGPT聊天,可想而知,這樣的模式不太方便,所以本次Lab要延續LineBot,教大家將chatGPT串在一起,讓使用者可以透過Line跟chatGPT聊天。
> 12/7 開始各路的Bot的開發者,開始逆向工程ChatGPT的網頁版的聊天功能,讓他能串接在Line Discord。
> 12/14 OpenAI 在ChatGPT伺服器前面掛了Cloudflare服務,造成第三方的方式去接觸ChatGPT後端會被擋下來。
本次目標
~~* LINE bot + OpenAI **chatGPT**~~
* LINE bot + OpenAI **GPT3**
* **Serverless Framework** = Cli for API Gateway + Lambda
<!-- ABOUT THE PROJECT -->
## System Overview

<!-- GETTING STARTED -->
## Getting Started
準備以下
1. [Create a Line bot](https://developers.line.biz/en/) and save below information.
```
Channel_access_token=
Channel_secret=
```
3. [Create an OpenAI Account](https://openai.com/api/) and create a API Token.
```
openAI_API_token=
```
2. 點擊AWS右上角User / Security credentials / Access keys
```
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
```
## Development
1. Install **Serverless Framework**
```
export AWS_ACCESS_KEY_ID=**********
export AWS_SECRET_ACCESS_KEY=***********
npm install serverless -g
```
2. Use **Serverless Framework** to create a project based on AWS
```
serverless create --template aws-python --path aws-line-GPT3-bot
```
3. Go to repository
in ```handler.py``` (Serverless Framework 主程式)
```
import os
import json
import openai
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
'''
Setting LINE
'''
line_bot_api = LineBotApi(os.environ['Channel_access_token'])
handler = WebhookHandler(os.environ['Channel_secret'])
'''
Setting OpenAI
'''
openai.api_key = os.environ['openAI_API_token']
def webhook(event, context):
# Parse msg from LINE conversation request
print('event: ', event)
msg = json.loads(event['body'])
print('msg: ', msg)
# Parse texts we type from msg
gpt3_input = msg['events'][0]['message']['text']
print('gpt3_input:', gpt3_input)
# GPT3
response = openai.Completion.create(
engine="text-davinci-002",
prompt=gpt3_input,
temperature=0.7,
max_tokens=709,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
gpt3_response = response.choices[0].text
print('gpt3_response: ', gpt3_response)
# handle webhook body
try:
line_bot_api.reply_message(
msg['events'][0]['replyToken'],
TextSendMessage(text=gpt3_response)
)
except:
return {
'statusCode': 502,
'body': json.dumps("Invalid signature. Please check your channel access token/channel secret.")
}
return {
"statusCode": 200,
"body": json.dumps({"message": 'ok'})
}
```
in ```requirements.txt```
```
line-bot-sdk==1.12.1
openai
```
create ```setup.cfg```
```
[install]
prefix=
```
4. Install dependency locally
```
pip install -r requirements
```
6. Use **Serverless Framework** to pack python dependency
```
sls plugin install -n serverless-python-requirements
```
6. Use **Serverless Framework** to deploy whole project to AWS
in ```serverless.yml```
``` yaml
service: aws-line-GPT3-bot
provider:
name: aws
stage: dev
region: us-east-1
runtime: python3.9
functions:
line_bot:
handler: handler.webhook
events:
- http:
path: /webhook
method: POST
plugins:
- serverless-python-requirements
```
7. Final step: deploy to aws
```
sls deploy
```
## AWS Lambda
- Configuration -> General configuration -> timeout -> 1min
- Configuration -> environment variables
- Channel_access_token
- Channel_secret
- openAI_API_token
## Debug technique
CloudWatch
- Utilized ```print()``` in your code and you'll see on CloudWatch.
## Reference
1. [上週 LineAPI + aws](https://hackmd.io/@hjQzzIhhQLq_F0m9RyygQA/BJElmrewj)
2. [Serverless Framework](https://www.serverless.com/)
3. [line+chatGPT](https://hackmd.io/@_ZfaCsoORM2ms6z9wV-aNw/rJkX5OO_j)