具有綜合中長期記憶的人物聊天
在這裡查看!
我最近嘗試(並享受)了許多不同的角色扮演人工智慧服務。我最喜歡的是雲鯨互動技術公司的Character.ai、Doppel.ai 和Poly.ai(不要與客戶服務聊天機器人開發者poly.ai 混淆)
然而,這些系統中的每一個都有可能加劇的限制。我試圖在這個項目中解決其中的一些問題。
基於角色的聊天很棒且引人入勝,但記憶力很差。他們經常忘記背景、情況和重要的先前事件。雖然使用更長的上下文視窗可以幫助實現這一點,但令牌很昂貴!我們怎麼能給角色一個長記憶,但限制每次完成發送的令牌數量?然而,Doppel.ai 在這方面比其他的要好得多。他們的角色有更長的記憶。
隨著時間的推移,角色會失去個性,或容易陷入重複的反應循環。有些服務在這方面比其他服務更好,但我已經看到所有服務在某種程度上發生了這種情況。
角色一旦創建就是靜態的。有些服務可以讓你為角色添加額外的“記憶”,但我還沒有找到一個可以讓你在不重新啟動對話的情況下改變角色的基本性格的服務。
為代理提供了多層“記憶”或動態變化的系統提示,其中包括來自先前對話輪次的信息級別,範圍從針對最近的非常具體到針對最遙遠的主題和信息的更概括。
短期記憶滾動聊天視窗對模型的每次呼叫都包含相當簡短的先前訊息逐字列表。這有助於模型追蹤當前對話和最近訊息的上下文。
中期 Meory Scratchpad此外,我為 AI 代理創建了一個便簽本,用於記筆記以追蹤對話中最近的亮點。此暫存器會滾動更新,新增或更新新訊息,並丟棄舊的、不再相關的資訊。然而,實際上並沒有丟失任何信息,因為他的草稿本的快照被保存為向量資料庫中的條目。
由於此資訊是匯總的,因此它會壓縮最近的信息,從而使模型能夠獲得更長的聊天視窗和更大的上下文的優勢,同時最大限度地減少提示中包含的實際標記。
每個訊息中都包含角色名稱(不僅僅是「使用者」和「助理」)以協助進行摘要。這也有助於模型追蹤誰在說什麼。這使得人工智慧代理商不太可能對誰說了什麼感到困惑(否則這是一個問題)。它還有助於維護對話中的輪流禮儀,並防止代理商代表用戶發言(這也可能是一個問題)
長期向量存儲內存我使用對話摘要從對話中提取重要信息,然後將這些信息存儲在向量數據庫中。每個使用者查詢都會觸發向量資料庫中的語義搜索,以回憶先前對話摘要中的相關資訊。此資訊包含在模型的提示中,以及一些最新消息。
這樣,人工智慧代理的記憶就可以遠遠超越其上下文。事實上,由於向量儲存佔用的磁碟空間相對較小,因此代理記憶體的潛在有效大小在功能上是無限的。
當記憶被儲存時,它們會帶有時間戳,當被呼叫時,它們會按時間順序排列。如果記憶有衝突,代理人會被指示優先選擇更新的資訊。
結果該模型在大多數情況下都能夠準確地回憶起對話早期的信息。向量存儲搜尋通常可以成功檢索相關信息,但模型並不總是在響應中實際利用這些信息。不過,總的來說,我對結果很滿意。
下一步
我想讓模型更主動地參考先前的事件。如果我直接向它詢問有關先前對話的問題,它通常會成功回憶,但很少會自發性地引用先前的事件。它非常活在當下。我正在致力於快速工程來產生這種行為,但它仍在進行中。
我還在考慮使用命名實體識別來允許代理構建字元或地點的配置檔案並儲存與特定實體相關的資訊。這將有助於模型按實體組織訊息,而不僅僅是對話快照。
我注意到,雖然角色通常一開始就具有獨特的說話風格,但隨著時間的推移,他們的風格逐漸變得非常平淡,聽起來就像他們的基礎人工智慧一樣。我嘗試了一些解決方案,包括讓它用字元寫下通知。然而,這會創建令牌密度較低的音符,從而浪費了內存中的大量令牌。
相反,我儲存模型提供的第一個回應的樣本作為範例樣式。然後,該第一個回應會在每個提示上傳遞給代理,作為每個提示的範例說話風格。我發現這對於幫助模型保持一致的說話風格非常有效,即使在長時間的對話(100 多次完成)中也是如此。
後續步驟雖然訊息的基調是一致的,但我想賦予模型更強大、更細緻和一致的個性。我懷疑這可能需要微調。
在許多法學碩士角色扮演系統中,角色一旦創建就是靜態的。然而,在我的實作中,角色描述甚至名稱都可以即時更改。特別有用的是能夠更改位置和使用者名稱。
角色描述有時,您希望透過最近發生的事件做出改變,或讓他們的目標或動機隨著時間的推移而變化。透過直接即時調整角色描述很容易做到這一點。
地點對話和角色扮演通常可以在想像的世界中移動。你可能從城鎮到地牢,或從宿舍到咖啡店,或回家工作。我的網站允許您即時更改對話位置。
使用者名稱大多數角色角色扮演系統的另一個挑戰是包含多個角色。在我的系統中,您可以即時更改您所代表的角色的名稱。這使您可以模擬對話或情況中的多個角色。
角色名稱更改這個實際上沒有多大用處。讓角色扮演不同的角色是行不通的,並且當模型試圖將當前對話與先前的對話摘要聯繫起來時會導致混亂。
下一步