編輯 | Tina
生成式 AI 促進了向量資料庫的火爆,但如今的技術風向變化似乎也挺快。作為全球最著名的 AI 項目之一,AutoGPT 宣布不再使用向量資料庫,這一決定可能讓不少人感到驚訝。畢竟從一開始,向量資料庫就一直協助管理著 AI 智能體的長期記憶。
那麼這個基本設計思路怎麼就變了?又該由哪種新方案代替?對於大模型應用來說,向量資料庫是必要的嗎?
事情發展
AutoGPT 是今年 3 月 30 日發布的一種「AI agent(AI 智能體)」,類似的還有 LlamaIndex 和 LangChain。AutoGPT 一發布就名聲大噪,上線僅 7 天就在 GitHub 上獲得了 44,000 顆星。相較於之前一遍又一遍向模型輸入提示詞的用法,它能夠自行工作、規劃任務、將問題拆分成多個較小的部分、再逐個加以執行。毫無疑問,這是個雄心勃勃的計劃。
AutoGPT 的設計思路還涉及一種以嵌入形式管理智能體記憶的方法,外加一套用於存儲記憶並在必要時檢索的向量資料庫。從當時的角度看,向量資料庫被認為是整個解決方案當中最重要的組成部分。而且其他通用人工智慧(AGI)項目也紛紛採取同樣的方法,例如 BabyAGI。
之前在默認情況下,AutoGPT 支持五種存儲模式:
- LocalCache (will be renamed to JSONFileMemory)
- Redis
- Milvus
- Pinecone
- Weaviate
但現在查看 AutoGPT 的說明文檔,我們會發現一條令人驚訝的警告消息:
AutoGPT 最近剛剛經歷了「向量記憶改造」,其刪除了所有向量資料庫實現,包括 Milvus、Pinecone、Weaviate,僅保留幾個負責記憶管理的類。如今,JSON 文件成為存儲記憶 / 嵌入的默認方式。
原因是向量資料庫沒有附加價值?
其實,AutoGPT 的維護者 Reinier van der Leer 於今年 5 月份就在 GitHub 上詢問大家對「增加不同存儲方式的價值」的看法,因為他們想進行重構,並打算放棄除「本地」內存提供程序(現在稱為 json_file)之外的所有東西,同時努力實現 Redis VectorMemoryProvider。
有開發者對此表示贊同,認為如果後端足夠好,那麼沒有理由保留這些向量資料庫。「但我建議將 pinecone(如果有優勢的話,那也可以是 redis)集成到自定義 JSONFileMemory 中。」
當然也會有反對者,他們認為「向量資料庫比當前的 JSON 文件內存系統更高效。它們是為此類任務而構建的,可以簡化開發並減少 token 消耗。」Reinier 對此進行了反駁,「這說法太籠統了,是否有例子或假設案例來證明這一點是正確的?」
至於以後要不要恢復向量資料庫,該開發團隊表示這肯定不是當前的首要任務,況且他們也沒發現向量資料庫能帶來什麼特別的附加價值。
在開發內存系統時,我們要關注數據結構,而不是存儲機制。使用具有 JSON 持久性是最簡單的實現方法,為實驗留出了空間。
為什麼 AutoGPT 一開始採用但現在又放棄向量資料庫?是向量資料庫的價值問題還是架構設計問題?InfoQ 詢問了流資料庫公司 RisingWave(risingwave.com)創始人 &CEO 吳英駿,他認為更多的是設計決策上的事情:
AutoGPT 最開始採用矢量資料庫進行矢量存儲與查詢,相信單純是為了快速打造產品原型,縮短開發周期。選用矢量資料庫進行初代產品的開發可以更快得到高效可靠的矢量存儲查詢功能。而如今,AutoGPT 選擇「放棄」矢量資料庫,多半也是發現運維與使用矢量資料庫的代價已經超過了其帶來的好處。在這種情況下,重新自己造輪子更符合項目發展的長遠收益。畢竟,在軟體開發過程中,過早優化會帶來極高開發成本與風險,導致軟體複雜度不可控。
AutoGPT 最開始採用矢量資料庫進行矢量存儲與查詢,相信單純是為了快速打造產品原型,縮短開發周期。選用矢量資料庫進行初代產品的開發可以更快得到高效可靠的矢量存儲查詢功能。而如今,AutoGPT 選擇「放棄」矢量資料庫,多半也是發現運維與使用矢量資料庫的代價已經超過了其帶來的好處。在這種情況下,重新自己造輪子更符合項目發展的長遠收益。畢竟,在軟體開發過程中,過早優化會帶來極高開發成本與風險,導致軟體複雜度不可控。
這也正如 AutoGPT 項目維護者 Reinier 所言,AutoGPT 支持多個向量資料庫,確實會拖慢開發速度。那麼像 AutoGPT 這樣的大模型應採用向量資料庫並不是必要的嗎?對於長期記憶,我們還有其他選擇?
該如何選型?
早在 4 月份,就有網友對 AutoGPT 最初的選擇提出批評,認為向量資料庫是種「小題大做的解決方案」。他的論證過程也很簡單:
假設大語言模型需要 10 秒鐘才能生成一條結果,即需要存儲的單條新記憶。那麼我們獲得 10 萬條記憶的時間周期將為: 100000 x 10 秒 = 1000000 秒——約等於 11.57 天。而即使我們用最簡單的暴力算法(Numpy 的點查詢),整個過程也只需要幾秒鐘時間,完全不值得進行優化! 也就是說,我們就連近似最近鄰搜索都不需要,更不用說向量資料庫了。
假設大語言模型需要 10 秒鐘才能生成一條結果,即需要存儲的單條新記憶。那麼我們獲得 10 萬條記憶的時間周期將為: 100000 x 10 秒 = 1000000 秒——約等於 11.57 天。而即使我們用最簡單的暴力算法(Numpy 的點查詢),整個過程也只需要幾秒鐘時間,完全不值得進行優化! 也就是說,我們就連近似最近鄰搜索都不需要,更不用說向量資料庫了。
那麼我們應該如何為自己的項目選型?吳英駿老師認為,對於任何大模型應用,是否需要選用矢量資料庫,完全取決於該應用對於矢量存儲與查詢的依賴程度。
「對於需要存儲大量矢量的場景,如海量圖像檢索、音視頻檢索等,很顯然使用矢量資料庫可以獲得更加強大、專業的功能,而對於數據量並沒有那麼大的場景來說,還不如使用 Numpy 等 Python 庫計算來的高效、便捷。實際上,在矢量資料庫這個賽道上,也分為輕量級矢量資料庫以及重量級矢量資料庫等,到底是選擇 PostgreSQL 上的 pgvector 插件還是選擇一個專用的分布式矢量資料庫,也是需要對於特定應用做出具體分析之後再做出決策。」
這個說法也符合如今 AutoGPT 項目的真實選擇,使用 np.dot 進行嵌入比較:
Andrej Karpathy 也曾在 Twitter 上表達過此類觀點。之前他利用 OpenAI 的 API 建了一個大模型應用,有網友問使用了什麼向量資料庫,Karpathy 表示,不用追風一些「奇特的東西」,使用 Python 庫中的 np.array 已經足夠了。推文底下當即有人評論說,這種務實的觀點應該傳播到學術界和整個機器學習社區!
寫在最後
目前據我們所知,不採用向量資料庫的也不止 AutoGPT:比如 GPT Engineer、GPT Pilot 甚至是 GitHub Copilot 等都不使用向量資料庫——相反,它們通過最近文件、文件系統內的鄰近度或查找對特定類 / 函數的引用來獲取相關上下文。
是否選擇使用向量資料庫要看情況,而 AutoGPT 放棄向量資料庫,是朝著正確方向邁出的重要一步,即專注於提供價值、而非深陷技術泥潭。
會不會有一天,向量資料庫又將重返 AutoGPT?向量資料庫到底算不算是 AI 技術革命中的重要組成部分?或者說,向量資料庫 Pinecone 成為 AI 長期記憶方案的願景,只是一句空洞的口號?或許也有人認為,真正的問題是像 AutoGPT 這樣的項目並沒能帶來任何價值。也許目前我們能夠論證的就只有這些,餘下的只有靠時間來證明......
延伸閱讀:
向量資料庫?不要投資!不要投資!不要投資!
下一代 Docker 來了!1小時構建縮至1.5分鐘,還能結合 LangChain、Ollama 等做 AI 應用開發
蘋果中國App Store將不允許未備案應用上架;iPhone 15發熱嚴重,問題源於第三方軟體?Meta又要裁員了 | Q資訊
微軟裁員內幕
Angular 重磅回歸
讀者福利
2023 中國雲原生成熟度模型報告