Skip to content

Commit b8b3e65

Browse files
authored
Merge branch 'master' into master
2 parents d6fe2f8 + f077f34 commit b8b3e65

4 files changed

Lines changed: 49 additions & 41 deletions

File tree

README.md

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# GPT-Linebot using python flask on vercel
1+
# GPT-Linebot using python flask on vercel
2+
3+
* last updated: 2022/12/14
24

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

@@ -15,18 +17,6 @@
1517
>
1618
> 而非 ChatGPT 使用的 GPT-3.5
1719
18-
# TODO List
19-
20-
> 目前基本功能都已經有了,然後我比較忙可能沒空一直更新QQ
21-
>
22-
> `還有很多可以優化的地方,歡迎提供 PR!`
23-
24-
- [x] (已調整完成) 回復文字感覺不是很順 (可能需要研究一下 API 使用方法)
25-
- [x] (已調整完成) 記憶功能
26-
...
27-
28-
> 目前算法是「`紀錄使用者與 AI 的前20句對話`」,嘗試推論出下一句話應該要說什麼。以達成延續話題的效果。
29-
3020
# 安裝步驟
3121

3222
主要會有四個地方要去:(`這部份不看也沒關係,以下照著做就可以了!`)
@@ -200,6 +190,8 @@ Import Git Repository,選擇你剛剛 fork 的專案 import
200190
[![](https://www.wongwonggoods.com/wp-content/uploads/2022/12/截圖-2022-12-12-下午11.21.45.png)](https://www.wongwonggoods.com/?attachment_id=8018)
201191

202192

193+
194+
203195
# 此 linebot 的其他一些內建功能
204196

205197
## 機器人「說話開關」
@@ -208,24 +200,38 @@ Import Git Repository,選擇你剛剛 fork 的專案 import
208200
意外得到好評,所以這個功能就被保留下來
209201

210202
* 輸入「說話」:機器人開啟說話模式,預設是開啟的
211-
* 輸入「閉嘴」:機器人暫停說話模式 (`但一段時間會自動再起動`),閉嘴後將不會對任何對話有反應。
203+
* 輸入「閉嘴」:機器人暫停說話模式 (`但一段時間會自動再起動`),閉嘴後將不會對任何對話有反應。輸入「說話」可再次開啟對話。
212204

213205
## 其他環境參數功能
214206

215-
參考自[memochou1993/gpt-ai-assistant](https://github.com/memochou1993/gpt-ai-assistant?fbclid=IwAR25uqLdKoDKEQd591fSjyM2sDJJR3Xb-VgcXDIFV_7i3RMWWv2oiyG26RQ)的作法,下列參數可藉由設定vercel的環境變數來作調控
207+
參考自 [memochou1993/gpt-ai-assistant](https://github.com/memochou1993/gpt-ai-assistant?fbclid=IwAR25uqLdKoDKEQd591fSjyM2sDJJR3Xb-VgcXDIFV_7i3RMWWv2oiyG26RQ) 的作法,下列參數也可藉由設定 vercel 的環境變數來作調控
216208

217209
|環境變數名稱 |預設值 |說明 |
218210
|------------------------|--------------- |-----|
219-
|OPENAI_MODEL |text-davinci-003|請參考OpenAI對[model](https://beta.openai.com/docs/api-reference/completions/create#completions/create-model)的敘述|
220-
|OPENAI_TEMPERATURE |0 |請參考OpenAI對[temperature](https://beta.openai.com/docs/api-reference/completions/create#completions/create-temperature)的敘述|
221-
|OPENAI_FREQUENCY_PENALTY|0 |請參考OpenAI對[frequency_penalty](https://beta.openai.com/docs/api-reference/completions/create#completions/create-frequency_penalty)的敘述|
222-
|OPENAI_PRESENCE_PENALTY |0.6 |請參考OpenAI對[presence_penalty](https://beta.openai.com/docs/api-reference/completions/create#completions/create-presence_penalty)的敘述|
223-
|OPENAI_MAX_TOKENS |240 |請參考OpenAI對[max_tokens](https://beta.openai.com/docs/api-reference/completions/create#completions/create-max_tokens)的敘述|
224-
|MSG_LIST_LIMIT |20 |prompt參數往回參照的句數|
225-
|INIT_LANGUAGE |zh |決定初始語言,可設置為 zhen|
211+
| OPENAI_MODEL | text-davinci-003| 請參考 OpenAI 對 [model](https://beta.openai.com/docs/api-reference/completions/create#completions/create-model) 的敘述|
212+
| OPENAI_TEMPERATURE | 0 | 請參考 OpenAI 對 [temperature](https://beta.openai.com/docs/api-reference/completions/create#completions/create-temperature) 的敘述|
213+
| OPENAI_FREQUENCY_PENALTY| 0 | 請參考 OpenAI 對 [frequency_penalty](https://beta.openai.com/docs/api-reference/completions/create#completions/create-frequency_penalty) 的敘述|
214+
| OPENAI_PRESENCE_PENALTY | 0.6 | 請參考 OpenAI 對 [presence_penalty](https://beta.openai.com/docs/api-reference/completions/create#completions/create-presence_penalty) 的敘述|
215+
| OPENAI_MAX_TOKENS | 240 | 請參考 OpenAI 對 [max_tokens](https://beta.openai.com/docs/api-reference/completions/create#completions/create-max_tokens) 的敘述|
216+
| MSG_LIST_LIMIT | 20 | prompt 參數往回參照的句數|
217+
| INIT_LANGUAGE | zh | 決定初始語言,可設置為 "zh""en"|
226218

227219

228220

221+
# TODO List & Future Work
222+
223+
224+
> 目前基本功能都已經有了,然後我比較忙可能沒空一直更新QQ
225+
>
226+
> `還有很多可以優化的地方,歡迎提供 PR!`
227+
228+
- [x] (已調整完成) 回復文字感覺不是很順 (可能需要研究一下 API 使用方法)
229+
- [x] (已調整完成) 記憶功能
230+
...
231+
232+
> 目前算法是「`紀錄使用者與 AI 的前20句對話`」,嘗試推論出下一句話應該要說什麼。以達成延續話題的效果。
233+
234+
229235
# 靈感來源
230236

231237
* 感謝 [memochou1993/gpt-ai-assistant](https://github.com/memochou1993/gpt-ai-assistant?fbclid=IwAR25uqLdKoDKEQd591fSjyM2sDJJR3Xb-VgcXDIFV_7i3RMWWv2oiyG26RQ) 提供的 node.js 版本串接 vercel 示範,讓我有了想把 python linebot 也串進 vercel 的靈感,(目前感覺下來,免費又好用(?))
@@ -234,5 +240,5 @@ Import Git Repository,選擇你剛剛 fork 的專案 import
234240
# 參考資料
235241

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

api/chatgpt.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,24 @@
55

66
openai.api_key = os.getenv("OPENAI_API_KEY")
77

8+
89
class ChatGPT:
910
def __init__(self):
1011
self.prompt = Prompt()
11-
self.model = os.getenv("OPENAI_MODEL",default="text-davinci-003")
12-
self.temperature = int(os.getenv("OPENAI_TEMPERATURE",default="0"))
13-
self.frequency_penalty = int(os.getenv("OPENAI_FREQUENCY_PENALTY",default="0"))
14-
self.presence_penalty = float(os.getenv("OPENAI_PRESENCE_PENALTY",default="0.6"))
15-
self.max_tokens = int(os.getenv("OPENAI_MAX_TOKENS",default="240"))
12+
self.model = os.getenv("OPENAI_MODEL", default="text-davinci-003")
13+
self.temperature = int(os.getenv("OPENAI_TEMPERATURE", default=0))
14+
self.frequency_penalty = int(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))
1617

1718
def get_response(self):
1819
response = openai.Completion.create(
19-
model = self.model,
20-
prompt = self.prompt.generate_prompt(),
21-
temperature = self.temperature,
22-
frequency_penalty = self.frequency_penalty,
23-
presence_penalty = self.presence_penalty,
24-
max_tokens = self.max_tokens
20+
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
2526
)
2627
return response['choices'][0]['text'].strip()
2728

api/index.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
app = Flask(__name__)
1414
chatgpt = ChatGPT()
1515

16-
# domain root
16+
# domain root
1717
@app.route('/')
1818
def home():
1919
return 'Hello, World!'
20-
20+
2121
@app.route("/webhook", methods=['POST'])
2222
def callback():
2323
# get X-Line-Signature header value
@@ -54,12 +54,13 @@ def handle_message(event):
5454
return
5555

5656
if working_status:
57-
chatgpt.add_msg(f"HUMAN:{event.message.text}?\n")
58-
reply_msg = chatgpt.get_response().replace("AI:", "", 1)
59-
chatgpt.add_msg(f"AI:{reply_msg}\n")
57+
chatgpt.add_msg(f"Q:{event.message.text}?\n")
58+
reply_msg = chatgpt.get_response().replace("A:", "", 1)
59+
chatgpt.add_msg(f"A:{reply_msg}\n")
6060
line_bot_api.reply_message(
6161
event.reply_token,
6262
TextSendMessage(text=reply_msg))
6363

64+
6465
if __name__ == "__main__":
6566
app.run()

api/prompt.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
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 = 20))
66
LANGUAGE_TABLE = {
77
"zh": "哈囉!",
88
"en": "Hello!"
@@ -11,7 +11,7 @@
1111
class Prompt:
1212
def __init__(self):
1313
self.msg_list = []
14-
self.msg_list.append(f"AI:{LANGUAGE_TABLE[chat_language]}")
14+
self.msg_list.append(f"A:{LANGUAGE_TABLE[chat_language]}")
1515

1616
def add_msg(self, new_msg):
1717
if len(self.msg_list) >= MSG_LIST_LIMIT:

0 commit comments

Comments
 (0)