前言
本篇主要使用 replit + python 寫 discord-bot
且你要有一隻discord-bot
若你不會架,可以參考我的講義
喔對,他 api 只有三個月 18$ 的試用期喔(發放以電話不同為區別基準)
那就讓我們開始吧!
正題
前置作業
首先你要先申請 openai 的帳號
皆選擇 google 登入即可
登入後應該是進到這裡
再來照著這個
就可以獲得KEY了,待會 coding 會用到。
Coding
首先我們須要安裝 openai,在終端機(shell)輸入
並在你的 pyproject.toml
檔案裡的[tool.poetry.dependencies]
下方新增這行
(pyproject.toml
會在左方file
處的packager files
裡)
長的會像這樣
接著回到 main.py
開始 coding!
1 2 3
| import openai
openai.api_key = 'YOUR_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 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): 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()
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的笑點了
好啦,就這樣,祝各位能開發成功。