上一期我規劃了武俠小說生成器的架構,本週花了相當多的時間建置模版。理由是因為語言模型或許能夠生成煞有其事的文字,但是如果毫無規範,人類很快就會看出破綻,而且生成的文字也會讓人類覺得無聊。
語言模型生成武俠小說的困難
在上一次我整理了最近做武俠小說生成器的想法,也繪製了架構圖。武俠小說生成器其實是多個生成器,也就是 AI Agent 的複合體。
我本來打算本週開始做第一個生成器,但是開始研究後,才發現代誌不是憨人想得這麼簡單。
要讓語言模型生成長篇小說,有下列兩大問題需要解決:
劇情很無聊:語言模型能生成煞有其事的文字,它能夠形容天氣、景觀、人物外貌,但是請它規劃故事,你就會覺得故事很無聊。主要是因為人類也不一定做得好,想想看每年產出這麼多小說、漫畫、電視劇,真正好看的沒幾部。
語言模型有記憶容量:語言模型是有記憶容量的,因此一部5萬字的小說,如果只是讓語言模型按照上篇劇情繼續往下寫,肯定寫到最後會設定跑掉。必須要有一個機制,讓語言模型能夠記住整部小說的架構,人物設定等等。
武俠小說生成器的系統設計
為了配合語言模型的限制,我們就必須製作一個資訊系統解決上述問題。為此我規劃了一系列流程,讓使用者可以按照網頁來依序進行。
故事套路設定:使用者在這個頁面能夠選擇故事套路,目前有三大套路可以選擇
復仇型武俠故事
歷練型武俠故事
奪寶陰謀型武俠故事
每一個故事套路都是依據三幕劇結構來設計,也就是開始、衝突、結尾。
通常主角都是會是名不見經傳的小人物,或者是生於名門世家,但是在第一幕時就遭逢困境,失去了原有的地位。不管是哪種出身,都會在第一幕結尾時踏上旅途。
使用者在這個頁面選擇了故事套路,設定了一些細節之後,就會把資料送到語言模型讓它生成三幕各自的大綱。使用者確認大綱後,就可以按下確定儲存起來。
角色設定:這個頁面用來設定登場的角色,一共有男/女主角、重要配角 4 人、反派 2 人,總共 7 人。使用者可以調整的選項有:
角色類別,有主角、配角、反派
角色性別,分男、女
角色陣營,按照陣營九宮格方式分類,例如守序善良、混亂中立、守序邪惡等。
性格,依據 MBTI 分類,分成 16 種個性
門派及武功,依據之前選擇的陣營,選擇對應的門派與武功,使用者也能自訂。例如選擇守序善良,則對應的門派有少林寺、武當派等。
名字與綽號,在傳統武俠小說中,人物常常都有綽號,例如什麼修羅刀、鐵面判官、白眉鷹王、全真七子、惡貫滿盈段延慶等等。
等到這些設定都選擇好了之後,就可以讓語言模型輸出對於角色的描述。
場景設定:我有預先設計好了一些場景,例如皇宮、宅院、市集、寺廟、客棧、街道、荒漠、竹林、深山、邊塞等等,使用者也可以自訂選項,讓語言模型幫忙生成。
章節內容生成器:以上都設定好了之後,就可以開始來寫小說囉。在此頁面上,依據之前設定的三幕劇架構,必須先從第一幕開始設計,然後依序下去。
使用者在每一個章節,都必須選擇場景、天氣、時間、登場角色,還可以在這裡設定臨時角色,例如掌櫃、腳夫等。
語言模型會根據之前設計的大綱,搭配上述設定來生成故事內容。為了模仿金庸的筆法,會參考金庸武俠小說向量資料庫的內容。
主頁面,這裡是使用者登入時看到的畫面,如果沒設計過小說,可以按「設計新小說」按鈕,如果曾經設計過,可以選擇設計過的小說來閱讀。
目前暫訂的系統目錄結構如下:
wuxiannovelsgenerator_project/
├── vectorstore/ # 金庸武俠小說向量資料庫
│ ├── index.faiss # 向量資料庫索引檔
│ └── index.pkl # 向量資料庫檔案
├── novel_database/ # 存放使用者生成的小說資料及相關設定
├── templates/ # 存放預設的JSON資料
│ ├── story_templates/ # 存放各種故事套路模板
│ │ ├── revenge_template.json
│ │ ├── adventure_template.json
│ │ └── treasure_template.json
│ ├── alignment_templates/ # 陣營模板
│ │ └── alignment_template.json
│ ├── personality_templates/ # MBTI性格分類模板
│ │ └── mbti_template.json # 16種MBTI性格對應武俠角色特質
│ ├── martial_templates/ # 門派與武功模板
│ │ └── sects-and-martial.json # 門派資料
│ ├── scene_templates/ # 場景描述模板
│ │ └── scenes.json # 場景描述模板
│ └── plot_templates/ # 劇情結構模板
│ ├── three_act_revenge.json # 復仇型武俠故事三幕結構
│ ├── three_act_growth.json # 歷練型武俠故事三幕結構
│ └── three_act_treasure.json # 奪寶陰謀型武俠故事三幕結構
├── prompts.py # 提示詞模板
├── utils.py # 工具函式
├── rag.py # RAG 相關功能
├── main.py # 主頁面
├── vdb.py # 向量資料庫相關功能
├── story_outline.py # 故事套路設定
├── character_settings.py # 角色設定
├── scene_settings.py # 場景設定
├── story.py # 章節內容生成器
└── requirements.txt # Python 套件依賴
與 AI 協作寫程式必須學會的技巧
我在本週花了很多時間思考架構,並且製作了很多預設的 JSON 格式及提示詞模版。有興趣深入瞭解內容的可以閱讀武俠小說生成器(4):整併生成器及構思JSON格式 。
這些 JSON 格式與提示詞模版都是讓 Claude AI 生成的,只是沒想像中那麼簡單。
首先 Claude 單次會話有記憶容量限制,然後它會記住本次會話裡所有事情,所以當聊天內容過長,它就會拒絕回應了。
這也就是我需要一邊製作專案,一邊把所有內容記錄下來的原因。因為 AI 根本記不住這麼龐大的內容。
另外,我們在使用 AI 寫程式時,必須學會把任務拆解成子任務。我們的人腦負責記住整個架構, AI 負責細節內容,當它生成各種函數、 JSON ,或者製作了資料庫之後。再由我們人類負責組裝。
換句話說,AI 只是幫我們製作積木塊,真正要負責拼積木的是我們。
好了,下週真的就會開始先試做第一個生成器了,預計會先從故事套路設定開始。