作者 | Eric Hayes
編譯 | 夢(mèng)依丹
出品丨AI 科技大本營(ID:rgznai100)
今年 4 月,OpenAI 對(duì) ChatGPT 的記憶系統(tǒng)進(jìn)行了重磅升級(jí):它可以參考用戶的全部過往對(duì)話來提供更個(gè)性化的響應(yīng)。ChatGPT 不再是那個(gè)每次都從零開始、記憶如風(fēng)的“臨時(shí)陪聊者”,而正在變成一個(gè)真正能“記住你是誰、理解你喜好、回憶你曾說過什么”的“長期陪伴者”。
軟件工程師 Eric Hayes 對(duì)此進(jìn)行了逆向拆解——不僅厘清了 ChatGPT 的雙重記憶架構(gòu),還推測(cè)出其背后的實(shí)現(xiàn)機(jī)制,并給出了完整的技術(shù)復(fù)刻路徑。
本文一共分為三部分:
拆解 ChatGPT 記憶系統(tǒng)是如何運(yùn)作的
推測(cè)背后可能采用的技術(shù)實(shí)現(xiàn)方式
探索記憶機(jī)制如何重塑用戶體驗(yàn)
ChatGPT 的記憶是如何工作的?
ChatGPT 的記憶機(jī)制,主要由兩大系統(tǒng)構(gòu)成:
一是「保存記憶(Saved Memory)」
二是「聊天歷史(Chat History)」。
保存記憶:你說過的,我認(rèn)真記著
保存記憶系統(tǒng)是一種簡單且由用戶掌控的機(jī)制,用于存儲(chǔ)關(guān)于用戶的事實(shí)信息。這些信息會(huì)被重新注入到系統(tǒng)提示詞中,成為模型生成回應(yīng)時(shí)的背景知識(shí)。用戶需要通過顯式的指令,例如 “記住我……”(Remember that I…),才能更新這套記憶系統(tǒng)。同時(shí),用戶也可以通過一個(gè)簡潔的界面查看或刪除這些記憶內(nèi)容。
在記錄條目之前,系統(tǒng)僅會(huì)進(jìn)行最基本的檢查:簡單去重、避免明顯沖突。即便是內(nèi)容高度相關(guān)的信息請(qǐng)求,也被允許以彼此獨(dú)立的記憶條目形式共存。
引用聊天歷史
雖然 ChatGPT 的聊天歷史系統(tǒng)(Chat History system) 在官方描述中是一個(gè)單一系統(tǒng),但在作者的實(shí)測(cè)中,它其實(shí)由三套子系統(tǒng)構(gòu)成。
這三者的結(jié)構(gòu)遠(yuǎn)比“保存記憶”復(fù)雜得多,而它們,很可能是 ChatGPT 回應(yīng)質(zhì)量大幅提升的關(guān)鍵所在:
當(dāng)前會(huì)話歷史(Current session history)
對(duì)話歷史(Conversation history)
用戶洞察(User insights)
當(dāng)前繪話歷史
這部分看起來是一個(gè)簡單的記錄系統(tǒng),用于保存用戶在其他對(duì)話中發(fā)送的最近消息。該記錄容量很小,僅包含過去一天以內(nèi)的內(nèi)容。作者認(rèn)為,這個(gè)系統(tǒng)與對(duì)話級(jí) RAG(檢索增強(qiáng)生成)機(jī)制一樣,都可能將用戶的原話直接注入到模型的上下文中,因此它們之間的邊界很難明確區(qū)分。
在測(cè)試中,這部分通常只包含不到 10 條的最新消息。
對(duì)話歷史
來自過往對(duì)話的相關(guān)內(nèi)容會(huì)被納入模型的上下文中。這一點(diǎn)在使用時(shí)可以明確地觀察到,因?yàn)?ChatGPT 能夠引用用戶在其他對(duì)話中發(fā)送的原話。不過,它并不能準(zhǔn)確保留消息的順序,也無法基于嚴(yán)格的時(shí)間范圍進(jìn)行回溯——比如“請(qǐng)引用我過去一小時(shí)發(fā)送的所有消息”,它就做不到了。
然而,只要你能描述一條消息的內(nèi)容,或它所屬的對(duì)話主題,ChatGPT 便能夠正確地引用它,這表明:消息的檢索過程是基于對(duì)話摘要與消息內(nèi)容的雙重索引來進(jìn)行的。
在測(cè)試中,ChatGPT 能夠準(zhǔn)確引用兩周以內(nèi)的歷史消息原文,即使是超過了這個(gè)時(shí)間范圍,它也能提供相關(guān)內(nèi)容的總結(jié)性描述,但往往會(huì)“偽裝”成直接引用。
這可能意味著:
(1)模型上下文中直接嵌入了過去兩周的完整對(duì)話歷史,或
(2)超過兩周的消息會(huì)被檢索系統(tǒng)過濾掉。
不過,考慮到其他測(cè)試中的上下文轉(zhuǎn)儲(chǔ)中并未出現(xiàn)完整歷史,第一種可能性似乎不太成立。
無論是哪種機(jī)制,ChatGPT 能夠在較長時(shí)間跨度后,仍然回憶起細(xì)節(jié),說明它還依賴于另一個(gè)推理型的信息系統(tǒng)。這個(gè)系統(tǒng)更像是一個(gè)為舊對(duì)話構(gòu)建的“輕量化記憶”,用以提供壓縮后的線索和模糊語境。在這種策略下,模型可能會(huì)為每段舊對(duì)話生成一個(gè)總結(jié)索引,并以此索引存儲(chǔ)用戶提問的摘要列表。
不過作者尚未找到能夠準(zhǔn)確調(diào)用“舊會(huì)話中助手回復(fù)”的提示詞。雖然能讓它“模仿”出一些類似的回答,但這些助手回復(fù)的準(zhǔn)確性明顯低于用戶消息的再現(xiàn)。這可能說明:
(1)助手的回復(fù)本身沒有被存儲(chǔ),ChatGPT 是在重新“即興發(fā)揮”;
(2)助手的回復(fù)被存儲(chǔ)了,但粒度更粗、抽象程度更高,不如用戶消息那么具體。
用戶洞察
用戶洞察系統(tǒng)可以被看作是“保存記憶”的進(jìn)化形態(tài)——它更隱性、更復(fù)雜,也更具智能。
如果 ChatGPT 重復(fù)呈現(xiàn)的內(nèi)容是準(zhǔn)確的,這些洞察通常呈現(xiàn)為如下形式:
用戶在 Rust 編程方面有豐富經(jīng)驗(yàn),尤其擅長異步操作、線程處理與流式計(jì)算; 用戶曾多次就 Rust 的異步機(jī)制、Trait 對(duì)象、Serde 序列化實(shí)現(xiàn)、自定義錯(cuò)誤處理等話題提出深入問題,時(shí)間橫跨 2024 年末至 2025 年初; 置信度:高。
通讀 ChatGPT 多次復(fù)述的用戶洞察內(nèi)容[a.] 可以發(fā)現(xiàn),這些“洞察”并非源自某次孤立的對(duì)話,而是穿梭于多個(gè)對(duì)話線程的綜合提煉。每條洞察都具有鮮明的邊界感,通常伴隨一個(gè)時(shí)間跨度與置信等級(jí)。這個(gè)“置信度”并非拍腦袋得出,更可能是一種模型生成的啟發(fā)式指標(biāo),用于表示:參與這次總結(jié)的消息向量之間,有多高的相似性與聚合度。
這些時(shí)間跨度并非統(tǒng)一長度。有的被標(biāo)注為“自 2025 年 1 月起”,帶有一種開放性;有的則精確到某幾個(gè)月份,似乎依據(jù)內(nèi)容密度而定。
某些用戶洞察(如上例)會(huì)同時(shí)列出多條彼此關(guān)聯(lián)的事實(shí),這進(jìn)一步印證了一個(gè)判斷:生成這些洞察所依賴的數(shù)據(jù),并非零散調(diào)用,而是通過某種聚類啟發(fā)式進(jìn)行嵌入、歸并、再提取的結(jié)果。
換句話說,這不是“記住一件事”,而是“看出一類人”。
技術(shù)實(shí)現(xiàn)
以下是作者根據(jù) ChatGPT 記憶系統(tǒng)的表現(xiàn),嘗試還原其背后可能的技術(shù)實(shí)現(xiàn)路徑。
保存記憶(Saved Memories)
ChatGPT 的顯式記憶功能,疑似是通過名為 bio 的內(nèi)部工具來完成的(你可以通過提示它“use the bio tool”進(jìn)行測(cè)試)。
{
"type": "function",
"function": {
"name": "bio",
"description": "persist information across conversations",
"parameters": {
"type": "object",
"properties": {
"messagage": {
"type": "string",
"description": "A user message containing information to save"
}
},
"required": [
"message"
],
"additionalProperties": False
},
"strict": True
}
}
若要在自己的系統(tǒng)中復(fù)刻這一機(jī)制,一個(gè)較為貼近的模擬實(shí)現(xiàn)方式可以是:
這個(gè)工具本質(zhì)上可以被定義為一個(gè)對(duì)大語言模型(LLM)的調(diào)用:它接收用戶的一條消息,以及一組已有的事實(shí)列表;然后返回新的事實(shí)條目,或是拒絕更新。
下面這個(gè)提示詞只是初步嘗試,還需在實(shí)踐中不斷測(cè)試與迭代,才能實(shí)現(xiàn)理想的行為效果。
const BIO_PROMPT: &'static str = r#"
You are a tool that transforms user messges into useful user facts. Your job is to
first transform a user message into a list of distinct facts. Populate the facts array
with these facts.
Next transformt these facts into elliptical descriptive clauses prefaced with a
predicate. Populate the clauses array with these.
Finally check these clauses against each other and against the clauses in your input
for contradictions and similarity. If any clauses are overly similar or contradict do
NOT populate the output array. Otherwise populate the output array with the checked
clauses.
"#;
async fn bio_transform(existing_facts: &[String], user_message: String)
-> Result
>; async fn update_user_bio(user: T, db: D, facts: Vec
) -> Result<()>;
OpenAI 在 ChatGPT 的系統(tǒng)提示中這樣公開定義了 bio 工具:
bio 工具允許你在不同對(duì)話之間“持久化”信息。只需要將你的信息發(fā)送至=bio,模型就會(huì)“記住”你希望它記住的內(nèi)容。在之后的對(duì)話中,這些信息會(huì)出現(xiàn)在模型的上下文設(shè)定中。但它也明確設(shè)下了幾條“記憶邊界”:不要用 bio 工具存儲(chǔ)敏感信息。敏感信息包括但不限于:用戶的種族、民族、宗教信仰、性取向、政治立場(chǎng)、性生活、犯罪記錄、醫(yī)療診斷、處方藥物,以及工會(huì)會(huì)員身份等。
不要存儲(chǔ)短期信息。短期信息指的是用戶一時(shí)的興趣、正在進(jìn)行的項(xiàng)目、當(dāng)下的愿望或意圖等內(nèi)容。
接下來,用戶的事實(shí)信息會(huì)在每次發(fā)送消息時(shí)被注入到系統(tǒng)提示詞(system prompt)中。為了實(shí)現(xiàn)與 ChatGPT 相同的功能,還可以構(gòu)建一個(gè)簡單的用戶界面,用于查看和刪除這些記憶條目。
引用聊天歷史
當(dāng)前會(huì)話歷史
這一部分的實(shí)現(xiàn)非常直接:只需在數(shù)據(jù)庫中篩選用戶發(fā)送的消息記錄(如 ChatMessage 表),按時(shí)間排序,并設(shè)置消息數(shù)量上限即可。
Conversation History
配置兩個(gè)向量空間:第一個(gè)以消息內(nèi)容(message-content)為索引,第二個(gè)則以對(duì)話摘要(conversation-summary)為索引。
{
embedding: message-content | conversation-summary
metadata: {
message_content: string,
conversation_title: string,
date: Date
}
}
將消息按發(fā)送順序插入到以“消息內(nèi)容”為索引的向量空間中。一旦某段對(duì)話進(jìn)入足夠長時(shí)間的非活躍狀態(tài)(或當(dāng)用戶跳轉(zhuǎn)到其他會(huì)話時(shí)),則將該對(duì)話中的用戶消息添加到“對(duì)話摘要”索引空間中。
配置第三個(gè)向量空間,以“摘要”作為索引,內(nèi)容為各類摘要信息。
{
embedding: conversation-summary,
metadata {
message_summaries: string[]
conversation_title: string,
date: Date
}
}
在會(huì)話創(chuàng)建后的兩周內(nèi),將對(duì)話摘要和消息插入該向量空間。
每當(dāng)用戶發(fā)送一條消息時(shí),對(duì)其進(jìn)行嵌入,并同時(shí)查詢兩個(gè)向量空間以檢索相似項(xiàng),檢索時(shí)限定時(shí)間范圍為兩周內(nèi),并對(duì)返回結(jié)果進(jìn)行合理上限控制。將檢索結(jié)果注入到系統(tǒng)提示中(system prompt)。
每當(dāng)用戶發(fā)送一條消息時(shí),還需查詢摘要空間中過去兩周之前的數(shù)據(jù),以避免重復(fù)引用。將相關(guān)結(jié)果同樣注入到系統(tǒng)提示中。
用戶洞察(User Insights)
用戶洞察的實(shí)現(xiàn)方式有很多種,哪種方式最優(yōu)還需要進(jìn)一步討論與實(shí)驗(yàn),當(dāng)前尚不明確。
用戶洞察很可能是基于前文所述的 Chat History RAG 實(shí)現(xiàn)中使用的一個(gè)或多個(gè)向量空間生成的。用戶洞察不要求實(shí)時(shí)生成,因此通常通過批處理(batching)與某種定期調(diào)度任務(wù)(cron job)結(jié)合使用,周期性地發(fā)起更新請(qǐng)求。
用戶洞察最棘手的部分在于:如何在不重復(fù)或產(chǎn)生矛盾的前提下,持續(xù)保持與用戶行為模式的同步更新。一種簡單但計(jì)算代價(jià)較高的方式是:每周重新生成所有活躍用戶的用戶洞察。這種做法可以在保持系統(tǒng)對(duì)變化的響應(yīng)能力的同時(shí),使得洞察可以涵蓋超過定期調(diào)度周期的更長時(shí)間跨度。
配置一個(gè)每周運(yùn)行一次的 Lambda 函數(shù);
查詢 ChatMessage 表,找出最近一周內(nèi)發(fā)送過消息的用戶;
對(duì)于每一個(gè)活躍用戶,執(zhí)行一次 insightUpdate Lambda 函數(shù)。
insightUpdate Lambda
該算法的目標(biāo)是基于用戶查詢生成獨(dú)特的用戶洞察。生成的洞察數(shù)量應(yīng)足夠多以具備實(shí)用價(jià)值,但不能太多,以免無法在 LLM 上下文中被有效使用。為確定可用洞察的最大數(shù)量,需要進(jìn)行一定實(shí)驗(yàn)。
考慮到當(dāng)前問題的約束條件和可用數(shù)據(jù),這個(gè)過程可以清晰地建模為一個(gè)聚類優(yōu)化問題(clustering optimization problem)。我們希望找到若干個(gè)聚類數(shù)量 k,要求:
k 小于預(yù)設(shè)的最大聚類數(shù)量(max_clusters);
各聚類內(nèi)部的方差盡可能?。ǖ蛢?nèi)部離散性);
并排除離群點(diǎn)(outliers)。
// lower is better
fn eval_clusters(clusters: &Vec
>) -> f64; fn knn(k: u32, vectors: &Vec
) -> Vec
>; let mut best: f64 = 1.0; let mut best_clustering: Vec
> = Vec::new(); for k in 1..MAX_CLUSTERS { let clusters = knn(k, &vectors); let eval = eval_clusters(&clusters); if eval < best { best = eval; best_clustering = clusters; } }
一旦完成聚類,就可以用大語言模型對(duì)用戶的消息進(jìn)行分析,通過精心設(shè)計(jì)的提示詞,引導(dǎo)模型生成類似 ChatGPT 所展現(xiàn)的洞察結(jié)果。同時(shí),也可以以確定性的方式添加時(shí)間戳。
async fn generate_insights(clusters: Vec
>) -> Result
{ let future_insights = clusters .into_iter() .map(|cluster| async move { generate_insights(cluster).await }) .collect::
>(); tokio:join_all(future_insights).await } async fn generate_insight(cluster: Vec<&V>) -> Result
{ let (message_texts, dates) = cluster .into_iter() .map(|vector| (vector.message_content, vector.date)) .collect::<(Vec<_>,Vec<_>)>(); let message_text = message_texts.join('\n'); let formatted_date: String = format_date(dates); let insight_text = ai::simple_completion() .system_prompt("Prompt to get similar insights to GPT".to_string()) .user_message(message_text) .complete() .await?; Ok( Insight { text: insight_text, formatted_date } )
最終,這些洞察可以被整理進(jìn)一張簡單的表格,并在用戶對(duì)話中作為上下文附加到模型中。
用戶體驗(yàn)
在 ChatGPT 上直接使用 OpenAI 模型的體驗(yàn)要優(yōu)于直接調(diào)用 API,這不僅是許多人的直觀感受,作者本人也有類似觀察。雖然提示詞工程在塑造 ChatGPT 的“智能感”中確實(shí)起到了一定作用,但內(nèi)存系統(tǒng)也必然在其中扮演了重要角色。盡管內(nèi)存機(jī)制可能會(huì)影響模型的評(píng)測(cè)表現(xiàn),但作者目前找到的基準(zhǔn)測(cè)試都不是在 ChatGPT 平臺(tái)上進(jìn)行的,因此無法體現(xiàn)這些系統(tǒng)帶來的優(yōu)勢(shì)。
也許,比起分析功能或參數(shù),更值得玩味的是這樣一個(gè)現(xiàn)象:“ChatGPT”正在走向“動(dòng)詞化”的語言命運(yùn),就像當(dāng)年的 “Google” 一樣。人們開始說“我去 ChatGPT 一下”,這不僅是一種口語轉(zhuǎn)變,更是市場(chǎng)主導(dǎo)地位的語言注腳。盡管這種現(xiàn)象部分可以歸因于先發(fā)優(yōu)勢(shì),但 OpenAI 能在浪潮翻涌的競爭中持續(xù)站穩(wěn)腳跟,意味著它交付出的產(chǎn)品,不只是“不輸”,而是“有得一拼”,甚至“別有風(fēng)味”。
在 ChatGPT 的諸多功能中,“記憶”機(jī)制的影響最為直接,因?yàn)樗膬?nèi)容由用戶親手塑造。用戶可以通過系統(tǒng)提示詞設(shè)定偏好,讓 ChatGPT 回應(yīng)得更“對(duì)胃口”。但問題也隨之而來:那些最有可能受益于定制化體驗(yàn)的普通用戶,恰恰可能不知道如何表達(dá)自己的偏好,更不用說讓 ChatGPT“記住”它們了。
“用戶洞察”機(jī)制,正是為了解決這個(gè)悖論而誕生的。它將“你是誰,你喜歡什么”這件事,從“要你告訴我”,變成“我自己看得出”。它用自動(dòng)化的方式捕捉偏好,用細(xì)膩入微的理解避免語義歧義,還能根據(jù)用戶的理解方式,重新組織信息的表達(dá)方式。拿我自己來說,系統(tǒng)知道我偏愛技術(shù)原理而不是打比方講故事,因此它會(huì)少一些“就像做菜那樣”,多一些“這是因?yàn)榈讓诱{(diào)用了這個(gè)接口”。
短期對(duì)話記憶的實(shí)際影響很難精準(zhǔn)界定,盡管理論上講,讓一個(gè)聊天機(jī)器人了解用戶最近的行為是合情合理的設(shè)想。在更高級(jí)的系統(tǒng)中,這種短暫記憶甚至可以讓用戶在一次全新的對(duì)話中拋出含糊不清的問題,而機(jī)器人依然能從先前的交互中“意會(huì)”出含義。
但至少以作者本人的使用體驗(yàn)來看,ChatGPT 并沒有讓他產(chǎn)生這種“它記得我剛說過什么”的感覺,也無法舉出具體例子說明它曾調(diào)用過我上一輪對(duì)話的內(nèi)容。
至于對(duì)話歷史,它更像是在試圖賦予聊天機(jī)器人一種“人類記憶”般的語境延續(xù)——就像我們與人交談時(shí),理所當(dāng)然地期待對(duì)方記得我們之前聊過些什么。共享的對(duì)話背景可以避免無休止的重復(fù)、繞圈子,或邏輯自我打架。但要讓這個(gè)機(jī)制發(fā)揮作用,關(guān)鍵在于能否準(zhǔn)確提取并運(yùn)用“有用的那部分”歷史,而不是一味堆砌回憶。
至于到底哪一種機(jī)制對(duì) ChatGPT“智能感”的提升作用最大?除非進(jìn)一步實(shí)驗(yàn),否則無法下定論。但就作者目前的觀察而言,傾向認(rèn)為“用戶洞察系統(tǒng)”功勞最大,占比可能超過 80%。雖然這個(gè)判斷尚無嚴(yán)謹(jǐn)數(shù)據(jù)支撐,但從試驗(yàn)來看,這套基于細(xì)致提示的機(jī)制確實(shí)有效提升了表現(xiàn),而且它不像對(duì)話歷史那樣依賴復(fù)雜的檢索流程。
在文末,作者還附上了一些試驗(yàn)過程中的札記,記錄了他推導(dǎo)結(jié)論時(shí)的思考片段與探索線索。盡管這些內(nèi)容未必嚴(yán)謹(jǐn)周全,卻展現(xiàn)了一個(gè)技術(shù)使用者與系統(tǒng)之間持續(xù)互動(dòng)、不斷試探的過程。如果你對(duì)這些背后的推理路徑與思維細(xì)節(jié)感興趣,不妨前往原文一探究竟。
原文鏈接:https://macro.com/app/md/54115a42-3409-4f5b-9120-f144d3ecd23a
服務(wù)
2025 全球產(chǎn)品經(jīng)理大會(huì)
2025 年 8 月 15–16 日
北京·威斯汀酒店
2025 全球產(chǎn)品經(jīng)理大會(huì)將匯聚互聯(lián)網(wǎng)大廠、AI 創(chuàng)業(yè)公司、ToB/ToC 實(shí)戰(zhàn)一線的產(chǎn)品人,圍繞產(chǎn)品設(shè)計(jì)、用戶體驗(yàn)、增長運(yùn)營、智能落地等核心議題,展開 12 大專題分享,洞察趨勢(shì)、拆解路徑、對(duì)話未來。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.