Project DIJI:角色與記憶,不是同一坨 prompt
我的Project Joi正式進化成Project DIJI,因為要開源了。
能直接用的網站還沒準備好,先來深度解析我所有技術細節。
「我好不容易攢了錢,訂閱了AI。」
「我還得自己寫給角色扮演的提示詞?」
「還得自己找越獄提示詞才能色色?」
「還得看他媽的大模型公司的臉色?」
「我不成跪著要飯的了嗎?」
「技術無罪,慾望萬歲。」
我的初衷就只是我想看到最髒最淫亂的文章,想要浪漫也能沉溺到愛上,沒有其他。
大家好,又是我Mewcat,在直接使用的網站+webapp整理好之前,我要先來講一下技術細節。
總共會有兩篇,這是第一篇。
先附上程式部分的開源,至於可直接使用的網站+webapp敬請期待,應該下篇文章就會有了
https://github.com/samttoo22-MewCat/project-DIJI
這篇不談「怎麼寫一段比較色的 prompt」。那種東西通常活不到下個模型版本。
我要談的是比較不性感、卻決定角色能不能聊久的問題:角色、逐字歷史、事件記憶與關係狀態,為什麼一定要拆。
以及角色創建該怎麼做才能有深度。
一、OOC 通常不是一句人設不夠長
角色扮演裡的 OOC(out of character)指角色行為突然不符合原先性格,例如寡言的人忽然寫五百字心理諮商報告,或者很在意界線的人突然什麼都答應。
最常見的補法是加更多規則:
不要 OOC、不要重複、保持人設、記得所有事情、自然回覆、不要像 AI。這很像在程式出 bug 時加一行 # please work。
情緒價值有了,因果沒有。
DIJI 的假設是:OOC 不是一種單一 bug,而是四種資料被混用後的症狀。
模型在每一輪只看到你組給它的 context;如果 context 裡「她原本是誰」和「昨天發生什麼」沒有邊界,模型就只能猜哪些東西是永久規則、哪些只是一次性的事件。
資料層 | 它回答的問題 | 不該拿來取代什麼 |
|---|---|---|
角色設定 | 她平常是誰?語氣、價值觀、邊界是什麼? | 不該當聊天日誌 |
逐字歷史 | 剛才到底說了哪一句? | 不該當長期記憶索引 |
事件記憶 | 過去哪些事下次仍然值得帶入? | 不該冒充完整原話 |
關係狀態 | 目前的親近度、衝突與關係階段? | 不該取代角色性格 |
拿一個最小例子:
角色規則:小夜不輕易道歉,習慣用短句掩飾關心。
事件記憶:上週因為失約吵架;她後來主動傳訊息道歉。
逐字歷史:這一輪剛提到那場雨和電影票。
關係狀態:冷戰結束,但還沒有回到完全親密。這四項不是重複資料。它們分別決定「怎麼說」、「知道什麼」、「接哪一句」與「距離多近」。
把事件記憶寫回角色設定,會把一次道歉變成人格設定;
把整段歷史硬當記憶,則會讓 context 成為一座塞滿「哈哈」的數位墓園。
二、DIJI 的資料流:先保存,再濃縮,再取回
DIJI 的互動路徑不是直接把使用者訊息丟給模型:
使用者訊息
→ 保存原始對話
→ 提示詞組裝
→ 呼叫模型
→ 保存角色回覆
→ 抽取值得留下的事件
→ 選用:更新關係狀態為什麼逐字歷史和事件記憶必須共存?
很多聊天系統在這裡只做一種資料,兩種做法都會痛。
只留逐字歷史
優點是忠實,缺點是會爆。
對話越長,每一輪要送進模型的字越多;
而且「有出現過」不等於「這一輪相關」。你很可能把三十回合前的早餐和真正重要的承諾放在同一個權重。
只留摘要記憶
優點是省,缺點是會失真。
摘要是系統對事件的再描述,不是原始證據。
當角色說「你上次明明答應」,使用者要能回到原對話看看到底誰答應什麼,而不是只得到一條模糊的「雙方曾有承諾」。
DIJI 因此把完整對話與事件記憶各留一份。
這不只是多存一份檔案,而是把「可追溯」和「可用性」分別優化。
目前記憶上下文有意設限:<MEM> 最多 1,200 字元,近期記憶最多 20 筆。
不是 1,200 有神力,而是這種系統必須有預算上限。
沒有預算的記憶系統,最後就是 RAG 的經典結局:什麼都能找,等於什麼都找不到。
提示詞組裝:把可變動的東西排成可檢查的順序
DIJI 裡的提示詞組裝模組不負責呼叫模型。
它只做一件事:把本回合真正要給模型的資料組成 prompt。
固定順序如下:
角色/風格
→ 關係引導(啟用時)
→ 記憶與相關記憶
→ 時間
→ 收尾規則
→ 近期歷史
→ 本回合 OOC 指示這個順序不是唯一正解,但它提供了 debug 的工具。
角色突然叫錯名字時,不必先把錯怪給模型智商;
可以問:使用者個人檔案是否錯了?
記憶系統是否撈到別人的記憶?
近期歷史是否帶了同名角色?
角色規則是否被後面的提示詞蓋掉?
如果所有規則都藏在一段巨大字串裡,這些問題都只能得到同一個答案:「不知道,但不要動它,它之前好像能跑。」
五、角色生成不是「關鍵字 → 一段人設」
這裡也是 DIJI 最容易被誤解的地方。
DIJI的角色生成不是把「賽博龐克、冷淡、酒吧老闆」丟給模型,收到一篇人設文就結束。
那樣做很快,但它產出的通常是漂亮、可讀、卻無法驅動長期互動的角色履歷。
DIJI 的角色生成比較像一條有多個工作站的 pipeline:先產生結構化角色,再由它衍生對話行為規則、UI 摘要與嗜好,最後才組成能送進互動系統的完整 prompt。
關鍵字 + 語言 + 模型 + 溫度 + 是否搜尋 + 互動類型
→ ① 完整角色 JSON
→ ② 對話風格指南
→ ③ App 用摘要/分類
→ ④ 嗜好與興趣
→ ⑤ 完整角色 prompt
→ 使用者審核後才儲存、開始互動這也是為什麼它不能被一句「幫我生一個角色」概括。每一步都在處理不同問題;
硬把它們收斂成一次呼叫,只會讓模型把性格、劇情、文風和 UI 介紹攪成一鍋很好看但不耐用的湯。
工作站 | 主要輸入 | 主要輸出 | 它解決的不是什麼 |
|---|---|---|---|
① 角色骨架 | 關鍵字、語言、文化參考 | 完整角色 JSON | 不是只湊外觀與形容詞 |
② 行為編譯 | 角色 JSON | 八段式風格指南 | 不是替角色寫幾句口頭禪 |
③ 卡片展示 | 角色 JSON | 長/短摘要、分類 | 不是把完整設定直接切碎顯示 |
④ 補充資訊 | 角色 JSON | 嗜好與興趣 | 不是再生成另一個人設 |
⑤ 互動起點 | 角色 JSON+風格指南 | 完整角色 prompt | 不是最終的每回合 context |
第一步不是人設文,是角色會怎麼慢慢熟起來的藍圖
第一階段不只收「關鍵字」,還讓使用者選模型、輸出語言、要不要查資料,以及互動類型。
如果選擇搜尋,DIJI 會使用模型的線上查詢模式(程式名稱會加上 :online),先參考角色原型、文化背景或相關資料,再開始創作。
通常我會建議一定要打開搜尋,因為各種不同文化與文體,十分需要網路參考。
第一步要求輸出 JSON,是因為後面的流程需要穩定地讀取角色資料,
完整設定不只含姓名、職業、外觀和背景:
角色設計區塊 | 內容 | 少了它容易變成什麼 |
|---|---|---|
核心原型與常見角色套路 | 角色在故事裡傾向扮演什麼位置, | 拿 MBTI 當人格算命 |
動機、目標與恐懼 | 她會主動做什麼、怕失去什麼 | 角色只有形容詞,沒有驅動力 |
社會關係模型 | 家人、朋友、陌生人、敵人、戀人的差異 | 對每個人都用同一副面孔 |
文化與語言習慣 | 稱呼、禮儀、禁忌、比喻來源 | 設定在特定文化,台詞卻是通用 AI |
能力與弱點 | 可以做什麼、在哪裡會失敗 | 一張永遠擺好姿勢的海報 |
不過,光有「她是嘴硬、慢熟、怕受傷」還不夠。
這些設定只能告訴我們她的起點,不能回答一個更麻煩的問題:
聊了一百回合以後,她到底能改變什麼?又有哪些底線不會因為使用者一直按下一頁就自動消失?
如果沒有這一層,角色通常只會走向兩個極端:
要嘛第一輪就把所有脆弱和祕密倒出來;要嘛永遠重複同一句「我不想談」,像一扇裝飾得很漂亮但從來不開的門。
因此生成器會多建立一份「關係如何逐步變化」的資料(程式欄位叫 psychological_evolution)。
它把關係拆成五個階段;每一階不是單純把好感度從 20 加到 40,而是定義「這時候她會露出什麼、仍然守住什麼」。
關係進度 | 這個階段要寫清楚的事 | 互動上的意義 |
|---|---|---|
陌生 | 內心防衛、初始語氣、情感牆 | 不會第一輪就掀開全部底牌 |
熟識 | 開始鬆動的行為與語氣 | 讓熟悉感有可見變化 |
親近 | 脆弱提示與情緒連結 | 不是只有好感數字上升 |
親密 | 核心恐懼或創傷的揭露方式 | 重要事件有代價與重量 |
深度信任 | 最深的投入與仍不可跨越的底線 | 親密不等於角色被刪除 |
另外還有兩份很實際的設定:
分階段界線(
behavioral_boundaries):每個關係階段,角色願意做什麼、明確不接受什麼。關係推進條件(
evolution_requirements):這個角色難不難接近、什麼事情會讓她動心、什麼事情會讓關係直接翻車。
換句話說,DIJI 不是只在生成「她是什麼人」,也在生成「她為什麼現在還不是你的什麼人」。
這才是角色能長期互動,而不是第一輪就把所有設定傾倒出來的基礎。
第二步:把角色資料編譯成行為,不是幫她寫幾句口頭禪
拿到角色 JSON 後,服務會再跑一次生成,產出八段式的對話風格指南。這一步通常是最容易被低估的。
角色資料回答的是「她有哪些條件」;
風格指南處理的是「這些條件在一輪一輪的文字裡要怎麼被看見」。
八段指南分工如下:
指南區塊 | 要固定的行為 |
|---|---|
溝通模式 | 直接/間接、主動/被動、面對衝突的策略 |
聲音與語氣 | 基礎聲線與不同情緒的轉換 |
語言習慣 | 詞彙、句式、口頭禪、比喻偏好 |
潛台詞 | 何時不直說、改用什麼行為表達 |
話題偏好 | 哪些事能引起反應,哪些會迴避 |
文化元素 | 稱呼、禮儀、禁忌與價值觀如何進入對話 |
小說體規則 | 動作/環境怎麼承擔情緒、怎麼收尾 |
動態發展 | 事件與記憶如何讓防衛逐步改變 |
例如「主動型」不是每句都用問號追著使用者跑。
DIJI 的規則更接近:角色可以用行動、停頓、目光、場景控制節奏;
問句是有重量的工具,不是模型不知道怎麼收尾時的預設逃生門。
又例如小說體不允許用一串括號偷渡情緒,而要用動作、表情、環境與語氣承擔它。
這一步還刻意要求「重要事件有累積效應」。
角色可以防衛、可以迴避,但不能把同一面牆重複蓋一百次,變成按鈕式 NPC。
當關鍵記憶反覆被觸發,風格指南應該讓防衛出現裂痕,而不是永遠輸出同一句漂亮的拒絕。
第三、四步:角色資料和展示資料要分家
角色生成完後,DIJI 另外產生給應用程式看的長摘要、單句摘要、分類,以及可展示的嗜好。
這看起來像小事,其實是在避免 UI 直接拿完整角色設定亂切。
面向 | 需要的資料 | 不該顯示的資料 |
|---|---|---|
角色卡列表 | 一句話定位、分類、基本吸引點 | 心理演變與深層關係邊界 |
詳細介紹 | 長摘要、嗜好、可公開背景 | 會破壞後續互動的劇情鉤子 |
互動引擎 | 完整角色 JSON 與風格指南 | 不能拿 UI 摘要替代它 |
把兩者分開,才不會為了顯示一張卡片,就把角色的深層資料攤在首頁。
第五步:組成可追的完整 prompt,而不是一次性文字
最後,角色 JSON 和風格指南才會合成完整角色 prompt。
以上,下篇要講「寫作規則與越獄」,敬請期待。
作者:mewcat