本期電子報重點: AI Agent 與 ChatGPT 、Claude 等在網頁上使用的 AI 工具不同,主要是我們可以自行定義大型語言模型需要的能力,例如記憶、推理框架、函式的能力等。本期以武俠小說生成器為例,介紹 AI Agent 如何實作。
我的第一個實驗性產品:金庸武俠小說生成器
在上一期介紹了什麼是 AI 代理(AI Agent),簡單地說, AI 代理與傳統的人工智慧應用相比,它不僅僅只是能被動地回應指令,還能依據我們事先設定好的行為,主動收集資訊,進行推理思考,或者使用相關工具。
至於 AI 代理的相關產品,從聊天機器人、流程自動化、即時翻譯、筆記整理等等,這些產品都很新,例如 NotebookLM ,去年發佈,到今年6月才支援繁體中文版讓台灣地區的民眾使用。
目前幾乎各家廠商都還在摸索如何應用生成式 AI ,學習良機就在此時。
我自己的個人興趣,主要關注如何將大型語言模型應用在人文學科、知識管理以及商務應用,第一個要做的實驗性產品就是金庸武俠小說生成器。
不過就做個小說生成器,很難嗎?
不得不說,當開始著手後,我發現真不簡單。
如果你直接在向 AI 要求寫個武俠小說,你會得到看似煞有其事,實際上有很大的改善空間的成品。
怎麼設計金庸武俠小說生成器
第一,我們需要讓語言模型懂得使用金庸筆法。實踐的方法有3種:
提示詞工程:最直接、快速的方式,就是直接用提示詞告訴語言模型。這個方法不是不行,但是生出來的文章總是少了一點感覺。
提示詞範例:
寫作風格要求:
1. 使用文言與白話結合的寫作手法
2. 加入詩詞歌賦的元素
3. 描寫要細膩傳神
4. 人物性格要鮮明立體
微調(Fine-tuning):這是最好的方法。簡單地說就是準備成對的訓練資料(input-output pairs),也就是給它適合的提示詞,然後提供對應的金庸小說原文。
缺點就是訓練比較昂貴,要準備訓練資料也很花時間。
訓練資料可能長得像是下面這樣:
{
"messages": [
{ "role": "system", "content": "系統訊息,告訴他金庸小說的特徵,並且他輸出類似的文字" },
{ "role": "user", "content": "提示詞" },
{ "role": "assistant", "content": "金庸小說段落" }
]
}
RAG(檢索增強生成):所謂的RAG就是指使用語言模型去檢索向量資料庫,套用在我要做的專案,就是直接將金庸小說匯入向量資料庫中,不用準備什麼訓練資料。
優點是能精確引用金庸小說中的場景和細節;要更新、擴充資料庫也很簡單。但是搜尋的提示詞要經過設計,不然也容易產出一些垃圾。
在這裡我決定直接使用RAG,也就是創建一堆生成器,讓每一個生成器都去對接向量資料庫。至於需要哪些生成器,我認為可以有底下這幾項:
人名生成器:使用者可選擇角色的個性,讓語言模型依據個性去搭配適合的名字
門派與團體生成器:如果是設定金庸小說內既有流派,那就在網頁上點選即可。但如果想要自訂門派,或者希望讓角色隸屬於某團體,類似桃谷六仙,就可用此生成器
綽號生成器:角色不一定要有綽號,如果想設定可以使用
武功招式生成器:包含內功與外功,外功又分身法、拳法、掌法、腿法、刀法、劍法、鞭法、棍法、槍法、暗器
角色生成器:設定小說裡的人物,包含男女主角、重要配角、重要反派。角色必須設定人名、性別、外型、個性、說話方式、江湖綽號、成名武功、攜帶的武器或裝備、門派或團體
故事大綱生成器:預計每個章節為2,000~3,000字,一共15~20個章節。武俠小說的故事都有套路,所以可事先設定好幾種套路,讓使用者在網頁上選擇,再依據指定的提示詞模版生成小說標題與情節大綱
場景生成器:當要使用章節內容生成器,敘述每個章節的故事之前,必須先使用場景生成器,描述此橋段發生於何處,以及何時
章節內容生成器:每章節生成約2,000~3,000字,依據上一段的故事情節及故事大綱去生成。生成後使用者可酌量修改或者要求重新生成
生成器生成文字後,要嘛是傳給其他生成器,不然就是存到資料庫內。最後由章節內容生成器抓取資料,並且不斷地更新角色狀態,避免語言模型忘記現在演到哪裡。
系統架構圖:
由於向量資料庫是系統架構的核心,第一步當然得從建置向量資料庫開始。我挑了金庸小說的《天龍八部》(北宋)、《射鵰英雄傳》(南宋)、《神鵰俠侶》(南宋)、《倚天屠龍記》(元)、《笑傲江湖》(明)。這幾部算是建構金庸宇宙的主體,字數約528萬字。
我是採用Facebook的FAISS向量資料庫,步驟是先定義編碼格式(畢竟是中文),然後作文本切割、嵌入模型,接著就可以建立向量資料庫了。
建立的速度很快,吃完飯回來就已經建立好了。印象中也花不到多少錢,應該不到2元美金吧。
因為整坨建立向量資料庫的程式碼丟上來可能沒人想看,所以我另外寫了筆記,請見底下連結。1
今天就先到這裡,下週會先從第一個生成器開始做起,我們下週見!
附註:
還有興趣的人,可以看我的筆記,記錄了部分程式碼及思考過程。