---
# System prepended metadata

title: 20230316 AWS ChatGPT LineBot
tags: [AWS Learning Group]

---

# 20230316 AWS ChatGPT LineBot

###### tags: `AWS Learning Group`

## Overview

延續Kevin 的[GPT3 Linebot](https://hackmd.io/@_ZfaCsoORM2ms6z9wV-aNw/HJmrePJOs) 加上用DynamoDB 儲存conversation 的功能，以及換上新推出的ChatGPT API~

![](https://i.imgur.com/T8QAnEL.png)

## Prerequisite

1. AWS CLI
2. npm
3. conda
4. OpenAI API account with payment set (or still in free trial)
5. [LineBot](https://developers.line.biz/en/)

Prepair your:
```=
openAI_API_token
Linebot: Channel_access_token and Channel_secret
AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
```

## OpenAI API

We are using ChatCompletion model (gpt-3.5-turbo), which is the same model behind ChatGPT.
See [Documentation](https://platform.openai.com/docs/guides/chat)

### Usage

Ex:
```pytohn=
# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)
```

There are no session managed by the api now.
We can maintain session by storing the conversation and feed it to the model again and again.

Ex:
```python=
import openai

openai.api_key = "XXXX" # supply your API key however you choose

message = {"role":"user", "content": input("This is the beginning of your chat with AI. [To exit, send \"###\".]\n\nYou:")};

conversation = [{"role": "system", "content": "DIRECTIVE_FOR_gpt-3.5-turbo"}]

while(message["content"]!="###"):
    conversation.append(message)
    completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=conversation) 
    message["content"] = input(f"Assistant: {completion.choices[0].message.content} \nYou:")
    print()
    conversation.append(completion.choices[0].message)
```

### Pricing

**gpt-3.5-turbo**: $0.002 / 1K tokens

## Use Serverless to Deploy Lambda & DynamoDB

```lua=
git clone https://github.com/jerry8137/aws-chatgpt-linebot.git
cd aws-chatgpt-linebot
```

### Prepare conda env

```lua=
conda create -n chatgpt_linebot python=3.9
conda activate chatgpt_linebot
pip install -r requirements.txt
```

### Prepare Serverless framework

```lua=
export AWS_ACCESS_KEY_ID=**********
export AWS_SECRET_ACCESS_KEY=***********
npm install serverless -g
```

### Change the keys in `serverless.yml`

Paste your `Channel_accesss_token`, `Channel_secret`, `openAI_API_token` in `serverless.yml`: `provider.environment`

## install plugin

```lua=
sls plugin install -n serverless-python-requirements
```

### Deploy!!!

```lua=
sls deploy
```
maybe need to use `sudo`, I'm not sure how to fix


### Set the webhook URL

Paste the webhook url in the terminal to linebot setting.

## Done!!!

Try it out.
Use CloudWatch to check logs and debug if needed.

Logs are automatically stored in S3.

## Reference

[OpenAI Documentation](https://platform.openai.com/docs/introduction)

[Serverless resources](https://www.serverless.com/framework/docs/providers/aws/guide/resources)

[Serverless workflow](https://www.serverless.com/framework/docs/providers/aws/guide/workflow)

大部分是問ChatGPT https://chat.openai.com/chat :laughing: 