Skip to content

Commit 9f6a8c6

Browse files
authored
Merge pull request #17 from willismax/master
修正至可用狀態
2 parents 858b7e2 + d97d605 commit 9f6a8c6

File tree

5 files changed

+40
-36
lines changed

5 files changed

+40
-36
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# GPT-Linebot using python flask on vercel
22

3-
* last updated: 2022/12/15
3+
* last updated: 2023/10/9
4+
- 更新說明 by [willismax](willismax/GPT-Linebot-python-flask-on-vercel)
5+
- vercel.json修正,改為第2版
6+
- 修正單純安裝Flask==2.2.2 會與 Werkzeug 衝突的問題,在 requirements.txt 添加 Werkzeug==2.3.7 ([參考stack overflow](https://stackoverflow.com/questions/77213053/importerror-cannot-import-name-url-quote-from-werkzeug-urls))
47

5-
本文同步更新至我的個人網站:[【Side Project】(全圖文教學) 用 Python flask 實作類似 ChatGPT 的 Linebot,並部屬至 vercel 上](https://www.wongwonggoods.com/portfolio/personal_project/gpt-linebot-python-flask-for-vercel/)
68

79
> `本篇教學無經驗的新手也可學習,無須寫任何程式。`
810
>
@@ -233,12 +235,16 @@ Import Git Repository,選擇你剛剛 fork 的專案 import
233235
234236

235237
# 靈感來源
238+
* 本文同步更新至我的個人網站:[【Side Project】(全圖文教學) 用 Python flask 實作類似 ChatGPT 的 Linebot,並部屬至 vercel 上](https://www.wongwonggoods.com/portfolio/personal_project/gpt-linebot-python-flask-for-vercel/)
236239

237240
* 感謝 [memochou1993/gpt-ai-assistant](https://github.com/memochou1993/gpt-ai-assistant?fbclid=IwAR25uqLdKoDKEQd591fSjyM2sDJJR3Xb-VgcXDIFV_7i3RMWWv2oiyG26RQ) 提供的 node.js 版本串接 vercel 示範,讓我有了想把 python linebot 也串進 vercel 的靈感,(目前感覺下來,免費又好用(?))
238241
* 感謝 [Lanznx/HealthLineBot](https://github.com/Lanznx/HealthLineBot) 給了一個很好的 python Django 範例,然而我不會 Django XD,vercel 官方文件好像也沒有提到這部份,總之後來就改成了 flask 版本,也符合 linebot 推薦的範例。
239242

243+
244+
240245
# 參考資料
241246

242247
* Line 官方提供的 python flask 製作 linebot 的 sample code [line/line-bot-sdk-python](https://github.com/line/line-bot-sdk-python)
243248
* Vercel 官方提供的 python runtime Flask 範例 [Deploy an example with Flask](https://vercel.com/docs/concepts/functions/serverless-functions/runtimes/python#python-version)
244249

250+

api/chatgpt.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
11
from api.prompt import Prompt
2-
32
import os
4-
import openai
3+
from openai import OpenAI
4+
client = OpenAI()
55

6-
openai.api_key = os.getenv("OPENAI_API_KEY")
6+
client.api_key = os.getenv("OPENAI_API_KEY")
77

88

99
class ChatGPT:
1010
def __init__(self):
1111
self.prompt = Prompt()
12-
self.model = os.getenv("OPENAI_MODEL", default = "text-davinci-003")
12+
self.model = os.getenv("OPENAI_MODEL", default = "gpt-4-1106-preview")
1313
self.temperature = float(os.getenv("OPENAI_TEMPERATURE", default = 0))
14-
self.frequency_penalty = float(os.getenv("OPENAI_FREQUENCY_PENALTY", default = 0))
15-
self.presence_penalty = float(os.getenv("OPENAI_PRESENCE_PENALTY", default = 0.6))
16-
self.max_tokens = int(os.getenv("OPENAI_MAX_TOKENS", default = 240))
14+
self.max_tokens = int(os.getenv("OPENAI_MAX_TOKENS", default = 500))
1715

1816
def get_response(self):
19-
response = openai.Completion.create(
17+
response = client.chat.completions.create(
2018
model=self.model,
21-
prompt=self.prompt.generate_prompt(),
22-
temperature=self.temperature,
23-
frequency_penalty=self.frequency_penalty,
24-
presence_penalty=self.presence_penalty,
25-
max_tokens=self.max_tokens
19+
messages=self.prompt.generate_prompt(),
2620
)
27-
return response['choices'][0]['text'].strip()
21+
return response.choices[0].message.content
2822

2923
def add_msg(self, text):
3024
self.prompt.add_msg(text)

api/prompt.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,26 @@
22

33
chat_language = os.getenv("INIT_LANGUAGE", default = "zh")
44

5-
MSG_LIST_LIMIT = int(os.getenv("MSG_LIST_LIMIT", default = 20))
5+
MSG_LIST_LIMIT = int(os.getenv("MSG_LIST_LIMIT", default = 7))
66
LANGUAGE_TABLE = {
77
"zh": "哈囉!",
88
"en": "Hello!"
99
}
1010

11+
AI_GUIDELINES = '你是一個AI助教,會用蘇格拉底教學法代替老師初步回應,如果有需要會提醒學生跟老師確認'
12+
1113
class Prompt:
1214
def __init__(self):
1315
self.msg_list = []
14-
self.msg_list.append(f"AI:{LANGUAGE_TABLE[chat_language]}")
15-
16+
self.msg_list.append(
17+
{
18+
"role": "system",
19+
"content": f"{LANGUAGE_TABLE[chat_language]}, {AI_GUIDELINES})"
20+
})
1621
def add_msg(self, new_msg):
1722
if len(self.msg_list) >= MSG_LIST_LIMIT:
18-
self.remove_msg()
19-
self.msg_list.append(new_msg)
20-
21-
def remove_msg(self):
22-
self.msg_list.pop(0)
23+
self.msg_list.pop(0)
24+
self.msg_list.append({"role": "user", "content": new_msg})
2325

2426
def generate_prompt(self):
25-
return '\n'.join(self.msg_list)
27+
return self.msg_list

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
Flask==2.2.2
1+
flask==2.2.2
2+
Werkzeug==2.3.7
23
line-bot-sdk
3-
openai
4+
openai

vercel.json

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
{
2+
"version": 2,
23
"builds": [
3-
{
4-
"src": "api/index.py",
5-
"use": "@vercel/python"
6-
}
4+
{
5+
"src": "api/index.py",
6+
"use": "@vercel/python"
7+
}
78
],
89
"routes": [
9-
{
10-
"src": "/(.*)",
11-
"dest": "api/index.py"
12-
}
10+
{
11+
"src": "/(.*)",
12+
"dest": "api/index.py"
13+
}
1314
]
14-
}
15+
}

0 commit comments

Comments
 (0)