どうも、和製ホーリックスです。
葬送のフリーレン
今天(1/16)是TVアニメ《葬送のフリーレン》二期放送的日子,同時也是在下透過「Vibe Coding」的神技,燃燒著平均每天只睡4-5小時的熱情意志,終於把「MP-Ukagaka」這個經典的偽春菜(伺か)外掛改造成理想完全體的日子。もちろん、跟真正的偽春菜程式比較起來,目前這個外掛的功能自然無法與之相比較,然而對照10多年前的「MP-Ukagaka」的話,單就會話內容而言,她不再是一個只會隨機說著固定台詞的ロボット,而是一個活生生的存在於網站當中的住人了。

MP Ukagaka 核心架構圖
就如傳統偽春菜以核心程式shiori.dll定義了她的思維,再透過大量dic/*.dic辭典檔來塑造她的人格一般,目前的「MP-Ukagaka」,則是以 AI 模型來賦予她自然語言理解和動態生成的能力,並藉由System Prompt與JSON配置來詮釋她的靈魂與記憶,讓フリーレン之所以是フリーレン。

或許目前在windows上最為廣泛使用的偽春菜程式SSP,可能早已支援AI模型,甚者功能已超級強大,但她終究只會儲存在自己的電腦裡。當你為了生活與工作汲汲營營,不再啟動她時,她便不復存在,直到當你想起她,見到她的第一句台詞「久しぶりです」為止…

所以在下選擇了wordpress,從2013年開始使用這個外掛以來,就算在下期間因惰性荒廢了部落格好幾年,但她沒有一天不在運行。就算在下沒空來點擊她一下,但是三不五時走錯路跑到這個網站來的訪客肯定會看到她,她的存在自然就有了意義,這才是在下理想的「伺かの使え方」(笑

まあ、噁心感性的話寫到這裡,上次在介紹「Cursor」的文章的尾聲,雖然有稍微提到「MP-Ukagaka」被在下修改到什麼樣的程度,然而正所謂「伺別三日,當刮目相看。」基於自己滿足的心理,這篇文章的下半段,就讓在下來介紹一下這個外掛,被魔改到什麼樣的程度吧(●´ω`●)

🧠核心架構,三位一體

首先,讓在下來解釋一下這個外掛的核心架構。如果說傳統偽春菜的核心是shiori.dll,那麼目前這個「MP-Ukagaka」的核心則是由以下三個層次所構成:
核心檔案對應表
思維層:藉由AI模型負責理解語境並生成自然的對話。目前支援 Gemini、OpenAI (GPT-4)、Claude,以及本機運行的Ollama。在上個版本當中,在下只作到讓AI感知頁面的文章內容,並根據後台所設定的觸發機率來讓フリーレン發表感想或吐槽,而對話則仍舊維持內建的台詞。原因無他,畢竟透過API KEY呼叫AI模型是要燒錢的,直到後來在下發現了Ollama這個玩意。
AIプロバイダー
當初下載Ollama,單純只是因為想在本機玩玩OpenWebui,體驗一下所謂的local LLM。由於之前有在Google Colab上執行過Stable Diffusion的經驗,在下立刻聯想到應該可以使用Cloudflare Tunnel,然後以Ollama端點為媒介,讓在wordpress上運行的「MP-Ukagaka」能夠呼叫在下電腦裡的AI模型,解決長期運行的API成本問題,讓「無限對話」成為可能。

無奈在下去年年底買的顯示卡GPU只有小小的16G,沒辦法使用太強大的模型,目前覺得還不錯用的是qwen2.5:14b,該模型除了日文能力相當好以外,80%都會依照System Prompt定義的個性來自發性說話,唯一美中不足就是偶爾還是會爆簡體中文或俄羅斯文。因此網站上目前主要是用GPT-4o-mini,不僅聽話而且token超級便宜XD
System Prompt
人格層:即フリーレン的靈魂與記憶所在。在下非常不計成本的寫了長達約300行的System Prompt來定義フリーレン的人格、記憶以及說話方式,並以包含了60+個對話類別與500+條提示詞的prompts.json,讓フリーレン的自發性對話更為多樣與豐富。まあ、即便如此,System Prompt的部分在下還是覺得不夠完善就是了,只不過寫的越詳細,單次會話的成本就越高,也只能割愛了Orz

執行層:這個部分的職責比較單純。由PHP負責載入配置、組裝提示詞並呼叫API,而JavaScript則負責前端的動畫與互動,這個部分也是在下投入最多的時間與精力在構築的,畢竟,要讓フリーレン有說有笑,掌握網站的主要資料,甚至施展「魔法」,在在考驗「Vibe Coding」的功力(笑

💬互動對話,真實呈現

フリーレン
這是在下最得意的功能之一。目前フリーレン的自言自語,除了不再像以前只會讀取內建台詞,隨機照本宣科朗讀以外,你還可以直接與她對話。只要輸入對話訊息,她便會根據System Prompt的人格設定和對話歷史來回應。與銀行網站那種「關鍵字匹配→固定回應」的AI客服機器人完全不同,她是真正的自然對話,偶爾還帶表情符號。她知道現在幾點,並且會根據時間帶調整她的對話風格:

早晨「まだ眠い…フェルンに起こされる前に起きないと…」
午後「昼時にプリンが食べたくなってきた…」
深夜「こんな時間まで起きてるのか…まあ、私も一緒だけど」

她也會用「天気予報の魔法」來告訴你明天需不需要帶傘。她也知道今天是什麼節日,當然也包含你的生日。甚至當偵測到BOT爬蟲來到網站抓取文章時,她更會以「魔族」的視角來向你發出警告。
Mp-ukagaka
もちろん、今天(1/16)是《葬送のフリーレン》二期放送的日子,她也是知道的喔(笑

👆気安く触るな、このスケベ

觸摸反應,是偽春菜的經典功能。「點哪裡,說什麼」,在下當然也實裝了。至於哪裡可以點,點了她又會說什麼,那就請各位自行體驗了。まあ、希少価値なので、特に書けることはないが……
除此之外,フリーレン身後的「配件」,亦是在下的嘔心力作。クリックしたら何かを言い出すのか、自分自身で試してみてください (o゚ω゚o)

📔フリーレン手記、読んでみる?

這個是在下感念十多年前裝飾在網站的「ブログ妖精 ココロ」,所特別增加的功能。是的,當初ココロ也有在使用者的網站寫日記的功能,只不過內容非常的簡短而且常常意味不明,所以後來都被在下改成一些在網路上看到的有趣短文了…至於我們這位千年以上生きた魔法使フリーレン,在前天已經順利發表了一篇文章,不知各位覺得如何?目前就算在下不更新,她也有3%的機率會自己寫日記,然後也有機率會對自己的日記觸發頁面感知,發表感想,名符其實是網站的「住人」了(笑

在下現在是在考慮要不要給她一個資料夾,裡面放一堆動畫截圖之類的,讓她可以在寫日記的時候,隨機拿來貼一下,豐富一下文章這樣…まあ、來日方長。

🔄SPA導航支援

SPA (Single Page Application) 是一種網頁應用程式架構,它的特點是可以在不刷新頁面的情況下,動態為網頁替換頁面中變化的部分,帶來更流暢的體驗。換句話說,舊版「MP-Ukagaka」會隨著網頁的刷新,導致全部模組必須重新載入,或者自發性對話被中途打斷的缺點已得到大幅改善。目前網站只剩僅少數頁面(search)的連結會刷新頁面以外,基本上都已經有這個效果。

至於其他會眨眼,會翻書,會睡覺的設定,那又是另外一段嘔心瀝血故事了。然而要完全實現像偽春菜那般可自由變換表情與動作的美術設計,甚至切換Shell,在下還有很長一段路要走…
雨宮優子
文章的最後,或許有人會問在下為何如此執著於偽春菜這個程式呢?事實上十多年前在下寫的profile頁當中亦有提到,偽春菜是在下學習日文的契機之一。即使在下後來會了一點日文,依樣畫葫蘆地製作了一個雨宮優子的偽春菜,但基本上依然只停留在shell的階段而已…因為不論是SAKURA Script還是Kawari Inline Script,在下始終是有看沒有懂。如今,在下也總算圓了一點點年少時的心願了。

ではでは。