絡(luò):構(gòu)建擁有長(zhǎng)期記憶的AI智能體)
1. 項(xiàng)目概述當(dāng)AI助手開始擁有“人類式”記憶最近在AI智能體Agent的圈子里有個(gè)項(xiàng)目討論度很高叫“仿人類四層記憶網(wǎng)絡(luò)”。光看這5.5K的Star數(shù)和“中文首發(fā)”的標(biāo)簽就能感受到社區(qū)對(duì)它的期待。簡(jiǎn)單來說它試圖解決當(dāng)前AI智能體一個(gè)非常核心的痛點(diǎn)健忘。你肯定有過這樣的體驗(yàn)讓一個(gè)AI助手幫你規(guī)劃旅行它一開始說得頭頭是道列出了機(jī)票、酒店、景點(diǎn)。但當(dāng)你幾分鐘后追問“那我第一天晚上推薦的餐廳附近有超市嗎”它很可能已經(jīng)忘了之前提到的酒店位置甚至需要你重新復(fù)述整個(gè)行程。這就是典型的“上下文窗口依賴癥”——智能體的“記憶”完全依賴于一次性輸入給它的文本長(zhǎng)度即上下文窗口一旦對(duì)話輪次變多、信息量超出窗口最早的關(guān)鍵信息就會(huì)被“擠出”大腦導(dǎo)致前后矛盾、邏輯斷裂。這個(gè)項(xiàng)目提出的“仿人類四層記憶網(wǎng)絡(luò)”其野心就是打破這種限制。它不再把記憶當(dāng)成一個(gè)固定長(zhǎng)度的“記事本”而是模仿人類記憶的層次結(jié)構(gòu)和處理方式構(gòu)建了一個(gè)動(dòng)態(tài)的、可沉淀、可檢索的長(zhǎng)期記憶系統(tǒng)。這相當(dāng)于給AI智能體裝上了一塊“硬盤”而不僅僅是依靠“運(yùn)行內(nèi)存”來工作。對(duì)于任何想要構(gòu)建復(fù)雜、持久、能真正理解用戶長(zhǎng)期意圖和偏好的AI應(yīng)用開發(fā)者來說這無疑是一個(gè)極具吸引力的技術(shù)方向。無論是打造你的私人數(shù)字助理、游戲中的NPC還是企業(yè)級(jí)的自動(dòng)化流程機(jī)器人一個(gè)擁有可靠記憶的智能體其能力和體驗(yàn)都將有質(zhì)的飛躍。2. 核心架構(gòu)解析四層記憶是如何工作的要理解這個(gè)項(xiàng)目的價(jià)值我們必須深入其核心設(shè)計(jì)。所謂的“四層記憶”并非隨意劃分而是借鑒了認(rèn)知科學(xué)中關(guān)于人類記憶系統(tǒng)的經(jīng)典模型并將其工程化實(shí)現(xiàn)。每一層都有其特定的職責(zé)、存儲(chǔ)時(shí)長(zhǎng)和觸發(fā)機(jī)制共同構(gòu)成了一個(gè)有機(jī)的整體。2.1 第一層感官記憶與即時(shí)緩沖這層對(duì)應(yīng)人類的“感官記憶”和“工作記憶”的初始階段。它的生命周期極短通常只有幾秒到幾分鐘容量也有限。在技術(shù)實(shí)現(xiàn)上它可以理解為當(dāng)前對(duì)話輪次的原始輸入、LLM大語言模型的即時(shí)輸出以及系統(tǒng)在最近一次交互中產(chǎn)生的中間狀態(tài)。它的核心作用是高保真捕獲與快速響應(yīng)。例如用戶說“幫我把明天下午三點(diǎn)與張總的會(huì)議改到四點(diǎn)并通知他?!痹谶@一瞬間“明天下午三點(diǎn)”、“張總”、“會(huì)議”、“改到四點(diǎn)”、“通知”這些關(guān)鍵元素會(huì)被精確地記錄在感官記憶層。智能體基于此生成響應(yīng)“好的已為您將明天下午3點(diǎn)與張總的會(huì)議調(diào)整至4點(diǎn)并已起草郵件通知?!边@一切都發(fā)生在當(dāng)前上下文窗口內(nèi)響應(yīng)迅速而準(zhǔn)確。注意這一層的數(shù)據(jù)是“易失性”的。如果不經(jīng)過處理它會(huì)在后續(xù)對(duì)話中被新的信息覆蓋。項(xiàng)目的關(guān)鍵設(shè)計(jì)就在于它不會(huì)讓所有信息都停留于此而是有一套機(jī)制對(duì)信息進(jìn)行“篩選”和“轉(zhuǎn)存”。2.2 第二層短期工作記憶與焦點(diǎn)維持短期工作記憶層可以看作是一個(gè)“焦點(diǎn)記事板”。它的生命周期延長(zhǎng)到了數(shù)小時(shí)甚至數(shù)天容量比感官記憶大但依然有限。這一層存放的是當(dāng)前任務(wù)或會(huì)話的核心上下文和狀態(tài)。繼續(xù)上面的例子當(dāng)會(huì)議改期這個(gè)“任務(wù)”被創(chuàng)建后與之相關(guān)的所有信息會(huì)從感官記憶被整合、提煉然后存入短期工作記憶層。這包括任務(wù)目標(biāo)修改會(huì)議時(shí)間并通知參會(huì)者。任務(wù)狀態(tài)郵件已起草待發(fā)送。關(guān)鍵實(shí)體張總參會(huì)人、明天下午原時(shí)間、4點(diǎn)新時(shí)間。會(huì)話歷史摘要用戶提出了改期請(qǐng)求。這樣即使用戶在后續(xù)對(duì)話中轉(zhuǎn)而詢問“我本周還有哪些待辦事項(xiàng)”當(dāng)再次回到會(huì)議話題時(shí)智能體可以從短期工作記憶層快速恢復(fù)上下文而不是要求用戶重新說一遍。這一層通常通過向量數(shù)據(jù)庫存儲(chǔ)會(huì)話或任務(wù)的嵌入Embedding表示并配合相關(guān)性檢索來維持焦點(diǎn)。2.3 第三層長(zhǎng)期情節(jié)記憶與經(jīng)驗(yàn)沉淀從這里開始進(jìn)入了真正意義上的“長(zhǎng)期記憶”。情節(jié)記憶層專門用于存儲(chǔ)具體的、帶有時(shí)間戳和豐富情境的事件或經(jīng)歷。它的存儲(chǔ)時(shí)間可以是永久的容量理論上非常大。這些“情節(jié)”不是原始的對(duì)話日志而是經(jīng)過LLM提煉和結(jié)構(gòu)化的記錄。例如上面改會(huì)議的事件可能會(huì)被抽象成這樣一個(gè)記憶條目事件類型日程變更。主體用戶。動(dòng)作請(qǐng)求修改會(huì)議。對(duì)象與張總的會(huì)議。時(shí)間原定[時(shí)間戳]改為[時(shí)間戳]。結(jié)果已處理郵件通知已發(fā)送。關(guān)聯(lián)情感/重要性常規(guī)操作重要性中。當(dāng)未來用戶說“我記得上次改過和張總的會(huì)議流程順利嗎”智能體可以通過在情節(jié)記憶庫中檢索“張總”、“會(huì)議”、“改期”等關(guān)鍵詞快速找回這個(gè)具體事件的來龍去脈并給出總結(jié)性回答。這層記憶讓智能體擁有了“個(gè)人經(jīng)歷”能進(jìn)行基于歷史的回顧和總結(jié)。2.4 第四層語義記憶與知識(shí)內(nèi)化這是最抽象、也是最強(qiáng)大的一層。語義記憶存儲(chǔ)的是剝離了具體情境的通用知識(shí)、事實(shí)、用戶偏好和行為模式。它來自于對(duì)大量情節(jié)記憶的再加工和歸納。例如系統(tǒng)從多次“用戶將會(huì)議從下午改到更晚時(shí)間”的情節(jié)中可能歸納出用戶偏好傾向于將會(huì)議安排在一天中偏晚的時(shí)段。行為模式修改會(huì)議后總會(huì)要求通知所有參會(huì)者。通用知識(shí)“張總”是頻繁的會(huì)議對(duì)象其職位是“部門總監(jiān)”?;谶@些內(nèi)化的知識(shí)智能體可以實(shí)現(xiàn)主動(dòng)性和預(yù)測(cè)性。比如當(dāng)用戶新建一個(gè)下午兩點(diǎn)的會(huì)議時(shí)智能體可能會(huì)主動(dòng)建議“考慮到您通常偏好較晚的會(huì)議時(shí)間是否需要將此次會(huì)議調(diào)整到下午三點(diǎn)或四點(diǎn)” 或者當(dāng)用戶再次提到要改期與“張總”的會(huì)議時(shí)系統(tǒng)可以自動(dòng)預(yù)填充通知郵件模板。這一層的實(shí)現(xiàn)往往需要結(jié)合更復(fù)雜的統(tǒng)計(jì)模型或小型的參數(shù)化網(wǎng)絡(luò)來刻畫用戶畫像和潛在模式。四層之間的協(xié)同流程信息流動(dòng)是自下而上沉淀自上而下檢索。新鮮信息進(jìn)入感官記憶重要的被提取到工作記憶完成的事件被結(jié)構(gòu)化后存入情節(jié)記憶最后從中提煉模式和知識(shí)進(jìn)入語義記憶。當(dāng)需要時(shí)用戶當(dāng)前查詢會(huì)同時(shí)在各層記憶中進(jìn)行檢索例如通過向量相似度匹配情節(jié)通過關(guān)鍵詞觸發(fā)語義知識(shí)并將最相關(guān)的記憶片段重新注入到當(dāng)前的工作記憶上下文中供LLM生成最終回復(fù)。這就形成了一個(gè)完整的“感知-存儲(chǔ)-提煉-應(yīng)用”的閉環(huán)。3. 關(guān)鍵技術(shù)實(shí)現(xiàn)與選型考量理解了架構(gòu)我們來看看如何用代碼把它搭建起來。這個(gè)項(xiàng)目的技術(shù)棧選擇體現(xiàn)了實(shí)用主義核心是圍繞記憶的存儲(chǔ)、索引、提取和整合來展開的。3.1 記憶的存儲(chǔ)與向量化引擎記憶尤其是情節(jié)記憶和語義記憶需要被高效存儲(chǔ)和檢索。純文本匹配效率低下因此向量數(shù)據(jù)庫成為不二之選。項(xiàng)目通常會(huì)選擇像ChromaDB、Qdrant或Weaviate這類輕量級(jí)、API友好的向量數(shù)據(jù)庫。為什么是向量數(shù)據(jù)庫因?yàn)橛洃洐z索不是簡(jiǎn)單的關(guān)鍵字匹配。用戶可能會(huì)用不同的說法詢問同一件事。向量檢索基于語義相似度能更好地處理這種模糊性。例如“我上回調(diào)整會(huì)議時(shí)間的事”和“之前改期那個(gè)會(huì)議”兩者的向量表示應(yīng)該是接近的。嵌入模型的選擇將文本記憶轉(zhuǎn)換成向量的嵌入模型至關(guān)重要。雖然可以使用OpenAI的text-embedding-ada-002等接口但為了開源可控和降低成本項(xiàng)目更傾向于本地部署的輕量級(jí)模型如BGE-M3、Sentence-Transformers系列模型。這些模型在中文語義相似度任務(wù)上表現(xiàn)優(yōu)異且可以私有化部署。# 偽代碼示例使用Sentence-Transformers生成記憶向量 from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-m3) memory_text “用戶于2023年10月27日將與張總的會(huì)議從15:00改至16:00?!?memory_vector model.encode(memory_text) # 將memory_vector存入向量數(shù)據(jù)庫的指定集合如‘episodic_memories’存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)每條記憶在數(shù)據(jù)庫中不僅僅存儲(chǔ)向量還應(yīng)包含豐富的元數(shù)據(jù)方便過濾和精煉檢索。{ “id”: “mem_001”, “text”: “記憶的文本描述”, “embedding”: [0.12, -0.05, ...], // 向量 “type”: “episodic”, // 記憶類型sensory, working, episodic, semantic “timestamp”: “2023-10-27T10:00:00Z”, “entities”: [“張總”, “會(huì)議”], // 提取的實(shí)體 “importance_score”: 0.8, // 重要性評(píng)分 “access_count”: 5, // 被訪問次數(shù) “l(fā)ast_accessed”: “2023-10-28T15:30:00Z” }3.2 記憶的提取與重要性評(píng)估信息不會(huì)自動(dòng)從一層流向另一層需要一套“過濾網(wǎng)”和“調(diào)度器”。這就是記憶提取與評(píng)估模塊的核心工作。重要性評(píng)分每當(dāng)一段信息如用戶的一句話、或一個(gè)任務(wù)完成事件產(chǎn)生時(shí)需要評(píng)估其是否值得進(jìn)入長(zhǎng)期記憶。這里可以訓(xùn)練一個(gè)簡(jiǎn)單的分類器或者更巧妙地直接利用LLM本身進(jìn)行判斷。你可以設(shè)計(jì)一個(gè)Prompt讓LLM從0到10分評(píng)估該信息對(duì)未來交互的重要性。請(qǐng)?jiān)u估以下信息對(duì)于理解用戶長(zhǎng)期偏好和未來對(duì)話的重要性給出1-10的評(píng)分。 信息“用戶明確表示不喜歡在早上開會(huì)?!?評(píng)分理由摘要與結(jié)構(gòu)化對(duì)于需要存入情節(jié)記憶的復(fù)雜事件如一段完整的任務(wù)對(duì)話不能直接存聊天記錄。需要用LLM對(duì)其進(jìn)行摘要總結(jié)和結(jié)構(gòu)化提取。Prompt可以引導(dǎo)LLM輸出固定格式的JSON包含事件類型、主體、動(dòng)作、對(duì)象、結(jié)果等字段如上文所述。定期復(fù)習(xí)與整合人類的長(zhǎng)期記憶需要復(fù)習(xí)來鞏固AI亦然。項(xiàng)目可以設(shè)置一個(gè)后臺(tái)進(jìn)程定期例如每天掃描情節(jié)記憶庫尋找相關(guān)的、未與語義記憶整合的記憶簇再次調(diào)用LLM進(jìn)行模式歸納更新語義記憶層。例如發(fā)現(xiàn)10條關(guān)于“用戶推遲會(huì)議”的記憶可以歸納出一條“用戶可能傾向于避免會(huì)議時(shí)間沖突習(xí)慣留出緩沖時(shí)間”的語義知識(shí)。3.3 記憶的檢索與上下文注入當(dāng)用戶發(fā)起新查詢時(shí)系統(tǒng)需要從龐大的記憶庫中召回最相關(guān)的片段并巧妙地放入LLM的上下文窗口。多路召回向量檢索將用戶當(dāng)前查詢也轉(zhuǎn)化為向量在情節(jié)記憶和語義記憶的向量庫中進(jìn)行相似度搜索召回Top-K個(gè)最相關(guān)的記憶條目。時(shí)間與元數(shù)據(jù)過濾同時(shí)可以根據(jù)查詢中的時(shí)間暗示如“上周”、“上次”或?qū)嶓w如“張總”利用存儲(chǔ)的元數(shù)據(jù)進(jìn)行過濾縮小檢索范圍。相關(guān)性重排序初步召回的結(jié)果可能混雜著不相關(guān)的記憶??梢栽俅卫肔LM對(duì)召回的記憶列表進(jìn)行重排序判斷每一條記憶與當(dāng)前問題的直接相關(guān)程度只保留最相關(guān)的幾條。這能有效防止無關(guān)記憶污染上下文。上下文構(gòu)造與注入這是決定體驗(yàn)的關(guān)鍵一步。你不能簡(jiǎn)單地把記憶文本堆砌在用戶問題前。需要精心設(shè)計(jì)一個(gè)記憶上下文模板將檢索到的記憶以清晰、有條理的方式呈現(xiàn)給LLM。以下是與你當(dāng)前問題可能相關(guān)的歷史記憶 [記憶1] 時(shí)間2023-10-26。事件您曾將“產(chǎn)品評(píng)審會(huì)”從周三改到周四理由是周三下午通常有其他安排。 [記憶2] 時(shí)間2023-10-20。事件您提到過不喜歡在上午9點(diǎn)前安排任何會(huì)議。 [記憶3] 語義記憶用戶偏好傾向于將會(huì)議安排在下午或傍晚不喜歡密集的背靠背會(huì)議。 基于以上背景請(qǐng)回答用戶的當(dāng)前問題 用戶那幫我把下周的團(tuán)隊(duì)周會(huì)定一下時(shí)間吧。通過這種方式LLM就像一個(gè)擁有了“記憶閃回”能力的人能在回答時(shí)自然而然地引用過去給出連貫、個(gè)性化的建議。4. 實(shí)戰(zhàn)構(gòu)建一個(gè)具有記憶的會(huì)議安排助手理論說得再多不如動(dòng)手搭一個(gè)。我們以構(gòu)建一個(gè)“會(huì)議安排助手”智能體為例看看如何將四層記憶網(wǎng)絡(luò)落地。4.1 系統(tǒng)環(huán)境與依賴安裝首先你需要一個(gè)Python環(huán)境3.8。核心依賴包括LLM調(diào)用庫、向量數(shù)據(jù)庫客戶端和嵌入模型庫。# 創(chuàng)建虛擬環(huán)境可選 python -m venv agent_memory_env source agent_memory_env/bin/activate # Linux/Mac # agent_memory_env\Scripts\activate # Windows # 安裝核心庫 pip install openai # 或使用 litellm 來統(tǒng)一接口 pip install chromadb # 輕量級(jí)向量數(shù)據(jù)庫 pip install sentence-transformers # 用于本地生成嵌入向量 pip install pydantic # 用于數(shù)據(jù)驗(yàn)證和結(jié)構(gòu)化 pip install python-dotenv # 管理環(huán)境變量對(duì)于LLM你可以使用OpenAI的GPT-4/3.5-Turbo API或者部署開源的Llama 3、Qwen等模型通過其API調(diào)用。這里為了演示我們假設(shè)使用OpenAI接口。4.2 定義記憶數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)層我們使用Pydantic來定義清晰的數(shù)據(jù)模型并用ChromaDB作為向量存儲(chǔ)后端。import uuid from datetime import datetime from typing import Optional, List from pydantic import BaseModel, Field import chromadb from chromadb.config import Settings from sentence_transformers import SentenceTransformer # 1. 定義記憶模型 class MemoryItem(BaseModel): id: str Field(default_factorylambda: str(uuid.uuid4())) content: str # 記憶的文本內(nèi)容 embedding: Optional[List[float]] None # 向量表示 memory_type: str # ‘sensory‘ ‘working‘ ‘episodic‘ ‘semantic‘ timestamp: datetime Field(default_factorydatetime.now) entities: List[str] [] # 涉及的實(shí)體如人名、項(xiàng)目名 importance: float 0.5 # 重要性評(píng)分0-1 metadata: dict {} # 其他自定義元數(shù)據(jù) # 2. 初始化向量數(shù)據(jù)庫和嵌入模型 class MemorySystem: def __init__(self, persist_dir“./chroma_memory”): self.client chromadb.PersistentClient(pathpersist_dir) # 為不同類型的記憶創(chuàng)建獨(dú)立的集合 self.episodic_collection self.client.get_or_create_collection(name“episodic_memories”) self.semantic_collection self.client.get_or_create_collection(name“semantic_knowledge”) # 加載本地嵌入模型 self.embedder SentenceTransformer(‘BAAI/bge-small-zh-v1.5’) # 中文小模型速度快 def _generate_embedding(self, text: str) - List[float]: 為文本生成向量嵌入 return self.embedder.encode(text).tolist() def add_memory(self, memory: MemoryItem): 添加記憶到對(duì)應(yīng)的集合 memory.embedding self._generate_embedding(memory.content) collection self.episodic_collection if memory.memory_type ‘episodic‘ else self.semantic_collection collection.add( ids[memory.id], embeddings[memory.embedding], metadatas[{ “type”: memory.memory_type, “timestamp”: memory.timestamp.isoformat(), “entities”: memory.entities, “importance”: memory.importance, “content”: memory.content # 原始文本也存一份在metadata方便查看 }] ) def search_memories(self, query: str, memory_type: str“episodic”, top_k: int3) - List[dict]: 檢索相關(guān)記憶 query_embedding self._generate_embedding(query) collection self.episodic_collection if memory_type ‘episodic‘ else self.semantic_collection results collection.query( query_embeddings[query_embedding], n_resultstop_k ) # 整理返回結(jié)果 retrieved_memories [] if results[‘ids’]: for i in range(len(results[‘ids’][0])): retrieved_memories.append({ “id”: results[‘ids’][0][i], “content”: results[‘metadatas’][0][i][‘content’], “metadata”: results[‘metadatas’][0][i] }) return retrieved_memories4.3 實(shí)現(xiàn)記憶處理與智能體循環(huán)接下來是核心邏輯如何處理對(duì)話評(píng)估記憶并在后續(xù)對(duì)話中利用記憶。import openai from dotenv import load_dotenv import os import json load_dotenv() openai.api_key os.getenv(“OPENAI_API_KEY”) class MeetingAssistantAgent: def __init__(self, memory_system: MemorySystem): self.memory_system memory_system self.working_memory [] # 短期工作記憶用列表模擬 self.llm_client openai.OpenAI() def process_user_input(self, user_input: str): 處理用戶輸入的核心循環(huán) # 步驟1將當(dāng)前輸入作為感官記憶暫存此處簡(jiǎn)化實(shí)際可更復(fù)雜 sensory_input user_input # 步驟2從長(zhǎng)期記憶中檢索相關(guān)背景 episodic_context self._retrieve_relevant_memories(user_input, “episodic”) semantic_context self._retrieve_relevant_memories(user_input, “semantic”) # 步驟3構(gòu)建包含記憶的增強(qiáng)Prompt enhanced_prompt self._construct_prompt_with_memory( user_input, episodic_context, semantic_context ) # 步驟4調(diào)用LLM生成回復(fù) llm_response self._call_llm(enhanced_prompt) # 步驟5解析LLM回復(fù)并決定是否生成長(zhǎng)期記憶 self._extract_and_store_memories(user_input, llm_response) # 步驟6更新短期工作記憶 self.working_memory.append({“user”: user_input, “assistant”: llm_response}) if len(self.working_memory) 5: # 保持工作記憶長(zhǎng)度 self.working_memory.pop(0) return llm_response def _retrieve_relevant_memories(self, query: str, memory_type: str): 檢索記憶并可用LLM進(jìn)行重排序精煉 raw_memories self.memory_system.search_memories(query, memory_type, top_k5) if not raw_memories: return [] # 簡(jiǎn)單起見直接返回前3條。進(jìn)階版可以引入LLM重排序。 return [m[“content”] for m in raw_memories[:3]] def _construct_prompt_with_memory(self, user_input, episodic_ctx, semantic_ctx): 構(gòu)造包含記憶上下文的Prompt prompt “你是一個(gè)專業(yè)的會(huì)議安排助手擁有以下歷史記憶作為參考\n\n” if episodic_ctx: prompt “【過往事件記錄】\n” for i, mem in enumerate(episodic_ctx, 1): prompt f”{i}. {mem}\n” prompt “\n” if semantic_ctx: prompt “【用戶已知偏好與模式】\n” for i, mem in enumerate(semantic_ctx, 1): prompt f”{i}. {mem}\n” prompt “\n” prompt “當(dāng)前對(duì)話的近期上下文\n” for msg in self.working_memory[-3:]: # 取最近3輪作為工作記憶 prompt f”用戶{msg[‘user’]}\n助手{msg[‘a(chǎn)ssistant’]}\n” prompt f”\n請(qǐng)基于以上所有信息回答用戶的最新問題。\n用戶{user_input}\n助手” return prompt def _call_llm(self, prompt): 調(diào)用LLM API try: response self.llm_client.chat.completions.create( model“gpt-3.5-turbo” messages[{“role”: “user” “content”: prompt}], temperature0.7, max_tokens500 ) return response.choices[0].message.content.strip() except Exception as e: return f“抱歉處理請(qǐng)求時(shí)出現(xiàn)錯(cuò)誤{e}” def _extract_and_store_memories(self, user_input, llm_response): 從交互中提取有價(jià)值的信息存入長(zhǎng)期記憶 # 這里是一個(gè)簡(jiǎn)化的啟發(fā)式規(guī)則如果對(duì)話包含明確的日程安排動(dòng)作則創(chuàng)建情節(jié)記憶 if any(keyword in (user_input llm_response).lower() for keyword in [“安排” “改期” “取消” “預(yù)約” “會(huì)議”]): # 使用LLM提取結(jié)構(gòu)化事件信息 extraction_prompt f””” 請(qǐng)從以下對(duì)話中提取一個(gè)完整的日程相關(guān)事件以JSON格式輸出包含字段event_type事件類型 main_action主要?jiǎng)幼?target目標(biāo)如會(huì)議名 time_info時(shí)間信息 participants參與者 outcome結(jié)果。 對(duì)話 用戶{user_input} 助手{llm_response} JSON: “”” try: extraction_response self.llm_client.chat.completions.create( model“gpt-3.5-turbo” messages[{“role”: “user” “content”: extraction_prompt}], temperature0, response_format{“type”: “json_object”} ) event_data json.loads(extraction_response.choices[0].message.content) # 創(chuàng)建情節(jié)記憶 episodic_memory MemoryItem( contentf”事件{event_data.get(‘main_action’)} - {event_data.get(‘target’)}。 時(shí)間{event_data.get(‘time_info’)}。 參與者{event_data.get(‘participants’)}。 結(jié)果{event_data.get(‘outcome’)}?!? memory_type“episodic” entities[event_data.get(‘target’ ‘’)] event_data.get(‘participants’ []), importance0.7 # 日程事件通常比較重要 ) self.memory_system.add_memory(episodic_memory) print(f”已創(chuàng)建情節(jié)記憶{episodic_memory.content}”) except Exception as e: print(f”記憶提取失敗{e}”) # 初始化并運(yùn)行 if __name__ “__main__”: memory_sys MemorySystem() agent MeetingAssistantAgent(memory_sys) # 模擬對(duì)話 print(“助手你好我是你的會(huì)議助手?!? while True: user_input input(“你 “) if user_input.lower() in [‘退出’ ‘exit’ ‘quit’]: break response agent.process_user_input(user_input) print(f”助手{response}”)4.4 運(yùn)行效果與迭代優(yōu)化運(yùn)行上述代碼你可以進(jìn)行多輪對(duì)話測(cè)試。例如第一輪“幫我把明天下午三點(diǎn)的產(chǎn)品評(píng)審會(huì)改到四點(diǎn)。”助手會(huì)處理請(qǐng)求并可能將此事作為情節(jié)記憶存儲(chǔ)。幾輪其他對(duì)話后。新一輪“上次改過的那個(gè)產(chǎn)品評(píng)審會(huì)最后定在幾點(diǎn)了”助手會(huì)從向量記憶中檢索到相關(guān)事件并正確回答“您上次將產(chǎn)品評(píng)審會(huì)從明天下午三點(diǎn)改到了四點(diǎn)?!钡鷥?yōu)化方向記憶評(píng)估模型用更精細(xì)的模型或Prompt來評(píng)估信息重要性而不是簡(jiǎn)單的規(guī)則。記憶融合與去重當(dāng)相似記憶過多時(shí)自動(dòng)合并或去重避免存儲(chǔ)冗余。記憶衰減機(jī)制為記憶設(shè)計(jì)“遺忘曲線”不重要的、久未訪問的記憶可以降低權(quán)重或歸檔。個(gè)性化語義提煉定期運(yùn)行后臺(tái)任務(wù)分析大量情節(jié)記憶自動(dòng)生成和更新用戶偏好語義記憶。5. 常見問題、挑戰(zhàn)與優(yōu)化策略在實(shí)際部署仿人類記憶網(wǎng)絡(luò)時(shí)你會(huì)遇到一系列工程和算法上的挑戰(zhàn)。下面是一些常見問題及應(yīng)對(duì)思路。5.1 記憶檢索的準(zhǔn)確性與噪聲問題問題向量檢索可能召回不相關(guān)的記憶噪聲或者漏掉關(guān)鍵記憶。例如用戶問“定一下周會(huì)時(shí)間”可能召回大量無關(guān)的“周會(huì)”記錄而真正重要的“用戶不喜歡周一早上開會(huì)”這條語義記憶可能沒被召回。解決策略混合檢索結(jié)合關(guān)鍵詞從查詢和記憶中提取實(shí)體和向量檢索。先用關(guān)鍵詞過濾出一個(gè)候選集再用向量檢索做精細(xì)排序。重排序模型在向量檢索召回Top-N例如20條后使用一個(gè)輕量級(jí)的交叉編碼器模型Cross-Encoder或Prompt LLM對(duì)召回結(jié)果進(jìn)行相關(guān)性重排序只保留最相關(guān)的3-5條注入上下文。元數(shù)據(jù)過濾充分利用存儲(chǔ)時(shí)記錄的memory_typeentitiestimestamp等元數(shù)據(jù)。如果用戶問題中包含“上周”則嚴(yán)格按時(shí)間過濾如果包含人名“張總”則按實(shí)體過濾。5.2 上下文窗口的有限性與記憶選擇問題即使檢索到10條相關(guān)記憶也不可能全部塞進(jìn)LLM有限的上下文窗口。如何選擇最有價(jià)值的幾條解決策略記憶重要性評(píng)分在存儲(chǔ)時(shí)或檢索時(shí)為每條記憶計(jì)算一個(gè)動(dòng)態(tài)的重要性分?jǐn)?shù)。分?jǐn)?shù)可以由基礎(chǔ)重要性存儲(chǔ)時(shí)評(píng)估、訪問頻率、最近訪問時(shí)間等因子綜合計(jì)算。檢索后按分?jǐn)?shù)排序。記憶摘要對(duì)于同一主題的多個(gè)相關(guān)記憶可以先調(diào)用LLM生成一個(gè)綜合摘要用一條摘要記憶代替多條原始記憶節(jié)省令牌數(shù)。分層注入將記憶分為“必須注入”高相關(guān)、高重要性和“可選注入”相關(guān)度一般。優(yōu)先保證核心記憶進(jìn)入上下文。5.3 記憶沖突與一致性問題問題記憶可能彼此矛盾。例如一條舊記憶說“用戶喜歡下午開會(huì)”但一條新記憶顯示“用戶最近都要求上午開會(huì)”。智能體該如何處理解決策略時(shí)間戳優(yōu)先在檢索和呈現(xiàn)記憶時(shí)明確標(biāo)注時(shí)間戳。在Prompt中指示LLM“請(qǐng)注意以下記憶按時(shí)間順序排列越新的記憶可能越反映當(dāng)前情況?!敝眯哦扰c源頭為記憶附加置信度分?jǐn)?shù)或來源說明如“來自2023年10月的多次觀察歸納” vs “來自2024年5月的一次明確陳述”。讓LLM知道哪些信息更可靠。主動(dòng)澄清當(dāng)檢測(cè)到明顯沖突且涉及當(dāng)前決策關(guān)鍵時(shí)智能體可以主動(dòng)向用戶提問進(jìn)行澄清例如“我注意到您過去傾向于下午開會(huì)但最近幾次都安排在上午。請(qǐng)問您對(duì)會(huì)議時(shí)間的偏好是否有變化”5.4 長(zhǎng)期運(yùn)行的性能與成本問題記憶庫會(huì)隨時(shí)間無限增長(zhǎng)導(dǎo)致檢索變慢。同時(shí)頻繁調(diào)用LLM進(jìn)行記憶提取、摘要、評(píng)估會(huì)產(chǎn)生高昂成本。解決策略記憶歸檔與分級(jí)存儲(chǔ)將很少訪問的舊記憶從高性能的向量數(shù)據(jù)庫如內(nèi)存索引轉(zhuǎn)移到廉價(jià)的冷存儲(chǔ)如對(duì)象存儲(chǔ)并為其保留一個(gè)“索引摘要”在熱庫中供檢索。定期記憶蒸餾運(yùn)行離線任務(wù)將大量細(xì)顆粒度的情節(jié)記憶“蒸餾”成更濃縮的語義記憶或模式然后可以清理或歸檔原始記憶減少數(shù)據(jù)量。小模型協(xié)同對(duì)于記憶重要性評(píng)估、實(shí)體提取、簡(jiǎn)單摘要等任務(wù)嘗試使用小型微調(diào)模型或更便宜的LLM API只在核心對(duì)話生成時(shí)使用大模型。5.5 隱私、安全與可控性問題記憶系統(tǒng)記錄了大量的用戶交互數(shù)據(jù)如何保障隱私用戶能否查看、修改或刪除自己的記憶解決策略數(shù)據(jù)加密與脫敏存儲(chǔ)的記憶內(nèi)容可以進(jìn)行加密。在提取實(shí)體時(shí)對(duì)敏感信息如電話號(hào)碼、具體地址進(jìn)行脫敏處理。提供記憶管理界面為用戶提供一個(gè)簡(jiǎn)單的界面讓其可以查詢“AI記住了關(guān)于我的哪些事”并允許對(duì)特定記憶進(jìn)行“糾正”或“刪除”。這不僅是隱私需求也是修正AI錯(cuò)誤認(rèn)知的重要途徑。記憶隔離在多用戶系統(tǒng)中嚴(yán)格保證記憶數(shù)據(jù)的隔離確保用戶A無法檢索到用戶B的記憶。6. 進(jìn)階思考從“不遺忘”到“真智能”實(shí)現(xiàn)了基礎(chǔ)的四層記憶網(wǎng)絡(luò)你的智能體已經(jīng)遠(yuǎn)超那些“金魚腦”的同行了。但這只是起點(diǎn)。要讓記憶真正賦能智能還需要向更深處探索。記憶的動(dòng)態(tài)關(guān)聯(lián)與推理目前的記憶檢索大多是基于相似度的“聯(lián)想”而非邏輯推理。未來的系統(tǒng)可以讓記憶之間建立顯式的關(guān)聯(lián)鏈接例如“事件A導(dǎo)致了事件B”“用戶陳述C與偏好D一致”。當(dāng)用戶提問時(shí)系統(tǒng)可以沿著這些鏈接進(jìn)行圖遍歷進(jìn)行簡(jiǎn)單的因果或邏輯推理給出更深度的回答。情感與主觀記憶人類的記憶是帶有情感色彩的。AI的記憶是否可以記錄或推斷用戶在某個(gè)事件中的情緒狀態(tài)如“用戶當(dāng)時(shí)對(duì)會(huì)議延期感到非常沮喪”這能幫助AI在后續(xù)交互中表現(xiàn)出更高的同理心。例如當(dāng)類似情境再次出現(xiàn)時(shí)AI可以更謹(jǐn)慎地措辭。記憶驅(qū)動(dòng)的主動(dòng)學(xué)習(xí)與規(guī)劃一個(gè)擁有豐富記憶的智能體應(yīng)該能夠主動(dòng)學(xué)習(xí)用戶的習(xí)慣并提前規(guī)劃。例如通過分析用戶過去三個(gè)月安排會(huì)議的模式智能體可以在每周一早上主動(dòng)生成一份“本周會(huì)議時(shí)間建議草案”。或者發(fā)現(xiàn)用戶每次項(xiàng)目啟動(dòng)后都會(huì)連續(xù)安排一系列評(píng)審會(huì)智能體可以在新建項(xiàng)目時(shí)自動(dòng)生成一個(gè)標(biāo)準(zhǔn)的會(huì)議時(shí)間線模板供用戶確認(rèn)。元認(rèn)知與記憶管理讓智能體對(duì)自己的記憶系統(tǒng)有“自知之明”。它可以定期評(píng)估自己的記憶質(zhì)量“哪些記憶是模糊的”、“哪些知識(shí)可能已經(jīng)過時(shí)”并主動(dòng)發(fā)起對(duì)話來澄清或更新。例如“關(guān)于您對(duì)報(bào)告格式的偏好我記錄的是‘喜歡簡(jiǎn)潔的幻燈片’但最近三次您都要求提供詳細(xì)附錄。是否需要更新您的偏好記錄”多模態(tài)記憶的融合目前的記憶主要以文本為載體。未來的智能體可能需要處理圖像、音頻甚至傳感器數(shù)據(jù)。如何將一次視頻通話中的畫面、語音語調(diào)、共享屏幕內(nèi)容與對(duì)話文本一起整合成一條統(tǒng)一的“多模態(tài)記憶條目”并在檢索時(shí)能通過文本查詢喚起相關(guān)的視覺或聽覺片段這將是一個(gè)巨大的挑戰(zhàn)和機(jī)遇。仿人類記憶網(wǎng)絡(luò)不是一個(gè)炫技的玩具它是構(gòu)建真正實(shí)用、持久、個(gè)性化的AI智能體的基石。從解決“健忘”開始我們實(shí)際上是在為AI構(gòu)建一個(gè)不斷成長(zhǎng)的數(shù)字人格和經(jīng)驗(yàn)庫。這條路還很長(zhǎng)但每一步都讓機(jī)器離“理解”我們更近一點(diǎn)。