凌晨三點,一個AI代理自信地重寫了認證函數——依據的是兩個月前已從代碼庫刪除的分支片段。向量數據庫顯示它的余弦相似度排名第一,代理"誠實"地抓取、"誠實"地拼接、"誠實"地生成補丁。針對一段來自"平行宇宙"的代碼。
這就是RAG(檢索增強生成,Retrieval-Augmented Generation)的真相:我們以為買了長期記憶,到手的是換了皮膚的Ctrl+F。
![]()
從Lucene到向量:一場換湯不換藥的革命
2026年典型的AI"記憶"長這樣:文本被切成512-1024詞的片段,灌入嵌入模型(bge、text-embedding-3或OpenAI的模型),扔進向量數據庫(Qdrant、pgvector、Chroma、Pinecone),用余弦相似度取前K個結果,拼進提示詞。
作者說得很直白:這不是記憶,這是搜索。2003年的Lucene搜索引擎,把TF-IDF換成余弦相似度,倒排索引換成嵌入向量,內核一模一樣。
如果業界誠實叫它"向量搜索"或"語義檢索",沒問題。但營銷話術是"我的AI有長期記憶"——這就麻煩了。工程師聽到"記憶",期待的是:誰說了什么、何時說的、什么語境下、當時為真vs現在為真。拿到手的卻是Ctrl+F。于是他們用Ctrl+F搭沙堡,然后困惑為什么代理分不清過去與現在。
三個生產環境的真實破洞
作者列出了他親手抓到的三個故障,不是理論推演。
破洞一:片段不知道自己是個片段。
想象一份設計文檔里的完整聲明:"我們改用JWT(JSON Web Token,一種開放標準),因為不透明會話無法支撐我們的流量。備選方案是帶Redis集群的有狀態會話,但因某客戶的審計要求被否決——他們不允許會話狀態留在其安全邊界外。JWT同時解決兩個問題,但增加了失效復雜度,我們用短TTL和刷新令牌來緩解。"
標準的512詞分塊器會把它切成兩半。第一半停在"他們不允許",第二半從"會話狀態"開始。半年后,工程師問:"為什么選JWT而不是Redis?"RAG返回第二半,代理回答:"我們選JWT是因為有狀態會話的審計要求"——因果徹底顛倒。原始文檔明明說Redis因審計被斃,JWT是替代方案。
這就是"高級Ctrl+F"的致命傷:它返回相關文本塊,但不返回文本塊在原始語境中的角色。是前提?結論?被否決的備選?已失效的歷史?片段一無所知。
破洞二:時間?不存在的維度。
向量數據庫里沒有"2024年6月"這個字段。一個 chunk 的嵌入向量不編碼它屬于哪個時間點。于是2023年的架構決策和2025年的推翻決策,在向量空間里可能肩并肩坐著,相似度都高。
作者沒有展開講第三個破洞,但前兩個已經足夠說明問題:RAG系統缺乏對信息生命周期的原生理解。它檢索的是語義相似,不是時序真相。
為什么工程師集體失明
作者把矛頭指向了我們自己。不是技術不行,是術語污染了認知。"長期記憶"這個詞讓我們誤以為系統具備某種認知持久性,實際上只是緩存了可搜索的文本碎片。
更深層的問題是架構誠實性。如果我們承認代理只有Ctrl+F,就會圍繞這個約束設計:顯式的時間戳過濾、版本控制、置信度閾值、人工復核流程。但"記憶"的幻覺讓我們跳過這些,直接信任檢索結果。
那個凌晨三點的場景——代理基于已刪除分支生成代碼——是這種信任崩塌的縮影。余弦相似度很高,所以系統很"自信"。但自信不等于正確,尤其是在代碼庫持續演化的真實世界里。
數據收束:一場關于命名的戰爭
這篇文章的閱讀量數據沒有給出,但它的傳播路徑很清晰:從開發者的深夜調試場景切入,用三個生產故障作為錨點,最終指向一個判斷——RAG的命名錯誤正在系統性誤導工程實踐。
作者的核心主張可以量化理解:當他說"512-1024 token chunks",指的是當前主流分塊策略的窗口大小;當他說"Top-1 in the retrieval",指的是檢索系統只返回最相似的單個結果,不做時序或因果校驗。這些數字不是修辭,是故障復現的關鍵參數。
最終,這篇文章的價值不在于否定RAG,而在于要求誠實。向量搜索是強大的工具,但工具的能力邊界必須被準確命名。把Ctrl+F叫成記憶,付出代價的是凌晨三點還在調試的工程師——以及他們背后依賴AI代理做決策的業務。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
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.