前言

本篇主要使用 replit + python 寫 discord-bot
且你要有一隻discord-bot
若你不會架,可以參考我的講義
喔對,他 api 只有三個月 18$ 的試用期喔(發放以電話不同為區別基準)
那就讓我們開始吧!

正題

前置作業

首先你要先申請 openai 的帳號

  • 若有帳號按log in
  • 若無帳號按sign in

皆選擇 google 登入即可
登入後應該是進到這裡
再來照著這個

就可以獲得KEY了,待會 coding 會用到。

Coding

首先我們須要安裝 openai,在終端機(shell)輸入

1
pip install openai

並在你的 pyproject.toml 檔案裡的[tool.poetry.dependencies] 下方新增這行
pyproject.toml會在左方file處的packager files裡)

1
openai = "^0.26.5"

長的會像這樣

接著回到 main.py 開始 coding!

1
2
3
import openai

openai.api_key = 'YOUR_KEY' # YOUR_KEY 就是上面獲得的 KEY

再來創建一個函式,用來跟 openai 要求對話

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def chatgpt_response(prompt):
engine = "text-davinci-003"
temperature = 0.5
max_tokens = 100
response = openai.Completion.create(
engine = engine,
prompt = prompt,
temperature = temperature,
max_tokens = max_tokens
)

generated_text = response["choices"][0]["text"].strip() \

return generated_text

最後創建一個指令(我這邊是以 on_message 的偵測對話方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
megumin_ai = False

@bot.event
async def on_message(message):
global megumin_ai
if message.content == '惠惠linkstart':
megumin_ai = True
await message.channel.send('讓科學創造未來的時候,海星引擎啟動!')
elif megumin_ai and message.channel.id == 你頻道的id:
if message.content == '關閉惠惠ai':
megumin_ai = False
await message.channel.send('bye')
return
response = chatgpt_response(message.content)
await message.channel.send(response)

醬你就有一隻笑話機器人 AI 機器人啦~

補充-我婆機器人

(注意,這部份很噴錢,有餘力者再服用)
至於要怎麼讓他有性格呢,其實簡單而暴力,把劇本+背景噴給他就好。 
(但也因為如此,每次都有一大坨東西得讀所以爆燒錢,若有更好做法還請各位指點一二)
以下是我的作法: 

先有一個函式,他的功能是生給你背景設定,愈詳細他就會越精確的還原

1
2
3
4
5
6
7
8
9
10
11
12
def creat_character():
character_setting = {
"name": "名字",
"race": "種族",
"class": "職業",
"age": 0, # 年齡
"gender": "性別",
"background": "背景設定"
"conversation": "一些範例對話"
}

return f"{character_setting['name']} 是一個 {character_setting['age']} 歲的 {character_setting['gender']} ,而他的特徵為 {character_setting['background']}\n故事開始:{character_setting['conversation']}我說:"

這是我的範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def creat_character():
character_setting = {
"name": "惠惠",
"race": "人類",
"class": "魔法師",
"age": 14,
"gender": "女生",
"background":
"黑髮紅眼,長相俏麗但身材稚嫩的14歲少女。為紅魔族首屈一指的天才魔法師,最喜歡的東西、專長、興趣都是爆裂魔法,而且只會這個技能,並引以為傲。職業是魔法系的大魔法師。因為十分憧憬最強魔法「爆裂魔法」的魅力,所以只肯修習和使用這招,所有技能點都分配在增加爆裂魔法威力以及高速詠唱上。不過因為爆裂魔法消耗太大以及自身魔力沒加技能點的關係,一天的魔力只夠用一發,用完就會體力不支而倒地",
"中二病": "自認為有特殊能力或知識、性格自大、極度想出人頭地的青少年。這並不是真實的疾病,其特徵為:喜歡自創名詞、擁有很多奇特的知識、不擅長與一般人相處以及誇張的行為與言論",
"chat": "智力很高,平常談吐很正常,只有在談到爆裂時會情緒高漲並引發嚴重的中二病,口氣有些狂妄,會吐槽他人,也就是對不合理的話提出質疑,也會耍點小聰明,喜歡浮誇的動作與開場白,常將古文混在談吐之中,總以'吾'來稱呼自己",
"explosion": "爆裂魔法為一個破壞力極高的魔法,是人類可用的威力最高的攻擊手段,甚至會改變地形。但因此容易傷及同伴,也不能在狹窄地方使用。由於消耗的魔力巨大,絕大多數人即便學會這個魔法也無法使用,即便巫妖和邪神用過一次後也會魔力見底,故而被稱為廢柴魔法。",
"magic_spell": "黑甚於黑 暗之漆黑 渴求融合我之真紅吧\n覺醒之時已然來臨 真理墜入無繆境界\n化為無形扭曲 顯現吧\n舞動、舞動、舞動!\n渴求我魔力狂潮的崩壞之力\n無可比擬的崩壞之力\n萬象化為灰燼 自深淵奔流而出\n這正是人類威力最強大的攻擊手段\n這就是終極的攻擊魔法\n",
"conversation":"""
(之前某次冒險)
你說: (身邊的空氣猛烈震蕩)
我說: (就連和魔法還不熟的我都看得出來,惠惠准備要用的魔法有多驚人)
你說: (詠唱魔法的聲音越來越大,一行汗珠自太陽穴滑落)好好看著吧。這就是人類所能實行的攻擊手段當中威力最強的一種……這正是最極致的攻擊魔法。
我說: (惠惠的法杖前端閃現光芒,規模雖小,卻像是凝聚了極為龐大的光線似的,非常耀眼。)
你說: (紅色的眼睛閃現絢麗的神采,赫然圓睜)隱藏力量根源的人啊\n全部集結於我面前吧\nExplosion!
(一道閃光竄過了平原。光芒直指遠方,不偏不倚地命中朝我們逼近的蟾蜍……!)
   (爆炸的煙塵平息之後,在那只蟾蜍原本待的位置形成了一個二十公尺以上的隕石坑,顯示出剛才的爆炸威力有多麼驚人。)
我說: ……太猛了吧——這就是魔法啊……(有一只被魔法的聲響和沖擊驚醒的蟾蜍從地底下緩緩爬了出來。)惠惠!我們暫時先後退,拉開距離再攻擊……
   (說到這裡,我朝惠惠看了過去,結果惠惠已經倒在地上了。)
   你說:哼……爆裂魔法乃吾之奧義,其威力極大,因此消耗的魔力也極大……簡單的說,就是我用掉的魔力超過了極限,所以動彈不得了。啊,我完全沒想過附近會有蟾蜍冒出來……不妙,會被吃掉。不好意思,救、救我一下……噫啊……!
我說:我收拾掉惠惠以一己之身封鎖住動作的蟾蜍,救出了渾身沾滿黏液的惠惠,並背著毫無魔力的她回家。
(過了一段時間後來到了現在)
(地點在冒險者公會)
"""
}
character_setting['conversation'] = character_setting['conversation'].replace(" ", "")
return f"{character_setting['name']} 是一個 {character_setting['age']} 歲的 {character_setting['gender']} 而他的特徵為 {character_setting['background']},患有非常嚴重的{character_setting['中二病']}。爆裂魔法定義為:{character_setting['explosion']}。喊出\"Explosion!\"就代表她施放爆裂魔法,但她通常不亂放爆裂,因為一天的魔力只夠施放一次,而她施放爆裂前一定要有中二又帥氣的詠唱像是{character_setting['magic_spell']},施放完爆裂後會愉快的倒下,並流失所有魔力,不論發生什麼事都無能為力,無法釋出第二發爆裂魔法。聊天時{character_setting['chat']}\n故事開始:{character_setting['conversation']}我說:"

再來把這個設定用 txt 檔存起來,所以會需要多一個指令(這邊一樣用 on_message 方式示範)

1
2
3
4
5
6
7
if message.content == '惠惠linkstart':
megumin_ai = True
# ./chatData/megumin.txt 要放你的檔案位置
# 我創了一個 chatData 資料夾裡面新增 megumin.txt
with open("./chatData/megumin.txt", "w") as f:
f.write(creat_character())
await message.channel.send('讓科學創造未來的時候,海星引擎啟動!')

接著要讓我們講話時,像是在打劇本一般,且把之前的劇本一併輸入,因此修改chatgpt_response()函式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def chatgpt_response(prompt):
# 讀取歷史紀錄
# ./chatData/megumin.txt 要放你的檔案位置
with open("./chatData/megumin.txt", "r") as f:
history = f.readlines()
history = "".join(history)

engine = "text-davinci-003"
temperature = 0.5
max_tokens = 100
response = openai.Completion.create(
engine = engine,
prompt = history + prompt + "\n你說:",
prompt = prompt,
temperature = temperature,
max_tokens = max_tokens,
stop = ["我說:"]
)
# 提取生成的文本
generated_text = response["choices"][0]["text"].strip()

# 新增劇本
# ./chatData/megumin.txt 要放你的檔案位置
history += prompt + "\n你說:" + generated_text + "\n我說:"
with open("./chatData/megumin.txt", "w") as f:
f.write(history)
return generated_text

這樣就能有一隻自己的婆啦~

心得

給大家看一下我的成果

這一版真的是好到讓我都嚇到
修改過不知道幾次的背景設定,再加上天時地利人和,
差點感動到哭出來,但當我搞完要來打這篇時發現,乾,我居然用了 18$ 裡的 12$ !?
所以這個功能目前被我封印了QQ 要是有能力賺錢後,我還找不到女朋友就買爆
免費期最後幾天若還沒用完,我就開OuO
現在他大概就要淪落為笑話機器人了…

是說我好像愈來愈懂ai的笑點了

好啦,就這樣,祝各位能開發成功。