譯者 | 崔皓
審校 | 重樓
當(dāng)你與 AI 助手進(jìn)行對(duì)話時(shí),它會(huì)讓你感覺它似乎能夠記住你之前說過的話。然而,實(shí)際上大型語言模型本身并不具備真正意義上的記憶功能。如果不再次提供相關(guān)信息,它并不會(huì)記住之前的對(duì)話內(nèi)容。那么,為什么它能夠“記住”事物呢?答案就在于一種稱為向量存儲(chǔ)的技術(shù),這正是本文將要介紹的核心內(nèi)容。
什么是向量存儲(chǔ)?
矢量存儲(chǔ)是一種特殊的數(shù)據(jù)庫(kù)類型,與傳統(tǒng)數(shù)據(jù)庫(kù)存儲(chǔ)文本或數(shù)字不同,它專門用于保存矢量數(shù)據(jù)。矢量是一組數(shù)字列表,能夠表達(dá)文本的語義信息。它通過一種叫做嵌入的過程生成這些矢量。當(dāng)模型接收一個(gè)句子時(shí),會(huì)將其轉(zhuǎn)化為高維空間中的一個(gè)點(diǎn)。在這個(gè)空間里,含義相近的文本會(huì)被聚集在一起。
嵌入式工作原理
假設(shè)用戶告訴助手:
“I live in Austin, Texas.”
模型將這個(gè)句子轉(zhuǎn)換為一個(gè)向量:
[0.23, -0.41, 0.77, ..., 0.08]
這個(gè)向量對(duì)人類來說意義不大,但對(duì) AI 來說,它是捕捉句子含義的一種方式。該向量會(huì)存儲(chǔ)在向量數(shù)據(jù)庫(kù)中,還會(huì)附帶一些額外信息 - 也許是時(shí)間戳或者來自這個(gè)用戶的注釋。
如果用戶說:
“Book a flight to my hometown.”
該模型會(huì)將這個(gè)新句子轉(zhuǎn)換成向量,然后在向量數(shù)據(jù)庫(kù)中搜索,找到最相似的已存儲(chǔ)向量。例如,當(dāng)系統(tǒng)檢測(cè)到“我的家鄉(xiāng)”時(shí),可能會(huì)匹配到“我住在得克薩斯州奧斯汀市”,從而理解你的意思。這種基于語義理解而非單純關(guān)鍵詞匹配的能力,實(shí)際上為大型語言模型提供了一種類似記憶的功能。
為什么向量存儲(chǔ)對(duì)記憶至關(guān)重要
大型語言模型通過上下文窗口來處理文本內(nèi)容。以GPT-4-turbo為例,其處理能力可達(dá)128,000個(gè)標(biāo)記(token),雖然這個(gè)數(shù)字非常龐大,但實(shí)際應(yīng)用中很快就會(huì)被填滿。這意味著我們無法一直將整個(gè)對(duì)話內(nèi)容保存在內(nèi)存中。為了解決這個(gè)問題,可以考慮使用向量存儲(chǔ)技術(shù)來構(gòu)建長(zhǎng)期記憶。具體來說,我們可以將重要的信息進(jìn)行向量化處理并保存起來。當(dāng)需要使用時(shí),只需從向量存儲(chǔ)庫(kù)中檢索出最相關(guān)的幾個(gè)片段,將其反饋給模型即可。這樣,模型就只需記住關(guān)鍵信息就能表現(xiàn)出智能,而不必把所有內(nèi)容都?jí)涸诙唐谟洃浝铩?/span>
流行的向量存儲(chǔ)
目前有幾種流行的向量數(shù)據(jù)庫(kù)。每種數(shù)據(jù)庫(kù)都有其優(yōu)勢(shì)。
FAISS(Facebook AI 相似性搜索)
FAISS 是由 Meta 開發(fā)的開源庫(kù)。它運(yùn)行速度快,在本地或本地應(yīng)用中表現(xiàn)良好。
FAISS 非常適合需要完全控制且不需要云托管的情況。它支持?jǐn)?shù)百萬個(gè)向量,并提供用于索引和高性能搜索的工具。
以下是 FAISS 的使用方式:
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# Load a pre-trained sentence transformer model that converts sentences to numerical vectors (embeddings)
model = SentenceTransformer('all-MiniLM-L6-v2')
# Define the input sentence we want to store in memory
sentence = "User lives in Austin, Texas"
# Convert the sentence into a dense vector (embedding)
embedding = model.encode(sentence)
# Get the dimensionality of the embedding vector (needed to create the FAISS index)
dimension = embedding.shape[0]
# Create a FAISS index for L2 (Euclidean) similarity search using the embedding dimension
index = faiss.IndexFlatL2(dimension)
# Add the sentence embedding to the FAISS index (this is our "memory")
index.add(np.array([embedding]))
# Encode a new query sentence that we want to match against the stored memory
query = model.encode("Where is the user from?")
# Search the FAISS index for the top-1 most similar vector to the query
D, I = index.search(np.array([query]), k=1)
# Print the index of the most relevant memory (in this case, only one item in the index)
print("Most relevant memory index:", I[0][0])
這段代碼的功能是通過預(yù)訓(xùn)練模型將句子“用戶住在德克薩斯州奧斯汀”轉(zhuǎn)換為對(duì)應(yīng)的嵌入表達(dá),并將其存儲(chǔ)在FAISS索引中。當(dāng)你提出類似“用戶來自哪里?”這樣的問題時(shí),代碼會(huì)將該問題轉(zhuǎn)換為另一個(gè)嵌入,并在索引中搜索與之在語義上最相似的存儲(chǔ)句子。最后,它會(huì)輸出記憶中最相關(guān)句子的索引位置。FAISS的運(yùn)行效率非常高,但需要注意的是,它并不是托管服務(wù)。這意味著你需要自行負(fù)責(zé)搭建和管理相關(guān)的基礎(chǔ)設(shè)施。
Pinecone
Pinecone 是一個(gè)云原生向量數(shù)據(jù)庫(kù),特別適合用于生產(chǎn)系統(tǒng)。它為你管理和維護(hù)服務(wù)器,讓你無需擔(dān)心擴(kuò)展或維護(hù)的問題。Pinecone 可以輕松處理數(shù)十億規(guī)模的向量數(shù)據(jù),并提供過濾、元數(shù)據(jù)支持和快速查詢功能。此外,它還與 LangChain、OpenAI 等工具無縫集成。以下是如何進(jìn)行基本設(shè)置:
import pinecone
from sentence_transformers import SentenceTransformer
# Initialize Pinecone with your API key and environment
pinecone.init(api_key="your-api-key", envirnotallow="us-west1-gcp")
# Connect to or create a Pinecone index named "memory-store"
index = pinecone.Index("memory-store")
# Load a pre-trained sentence transformer model to convert text into embeddings
model = SentenceTransformer('all-MiniLM-L6-v2')
# Convert a fact/sentence into a numerical embedding (vector)
embedding = model.encode("User prefers vegetarian food")
# Store (upsert) the embedding into Pinecone with a unique ID
index.upsert([("user-pref-001", embedding.tolist())])
# Encode the query sentence into an embedding
query = model.encode("What kind of food does the user like?")
# Search Pinecone to find the most relevant stored embedding for the query
results = index.query(queries=[query.tolist()], top_k=1)
# Print the ID of the top matching memory
print("Top match ID:", results['matches'][0]['id'])
如果你希望在無需管理硬件的情況下實(shí)現(xiàn)可擴(kuò)展性和易用性,Pinecone 是一個(gè)理想的選擇。其他常見的向量存儲(chǔ)工具包括:
- Weaviate:將向量搜索與知識(shí)圖譜相結(jié)合,支持強(qiáng)大的語義搜索和混合關(guān)鍵字查詢。
- Chroma:以其簡(jiǎn)單易用的特點(diǎn)著稱,適合進(jìn)行原型設(shè)計(jì)和開發(fā),常用于個(gè)人應(yīng)用或演示。
- Qdrant:作為一款開源工具,專門針對(duì)高性能的向量搜索和過濾功能而設(shè)計(jì)。每種工具都有其適用的場(chǎng)景,具體取決于你對(duì)速度、規(guī)模、簡(jiǎn)單性還是特殊功能的需求。
利用檢索增強(qiáng)生成使 AI 更聰明
整個(gè)系統(tǒng)——通過嵌入用戶輸入、將其存儲(chǔ)在向量數(shù)據(jù)庫(kù)中并支持后續(xù)檢索——被稱為檢索增強(qiáng)生成(RAG)。雖然AI并沒有真正的大腦,但它可以展現(xiàn)出具備思考能力的特征。你可以決定要記憶的內(nèi)容、記憶的時(shí)間點(diǎn),以及如何在對(duì)話中將這些信息調(diào)用回來。例如,當(dāng)AI幫助用戶跟蹤項(xiàng)目進(jìn)展時(shí),可以將每個(gè)項(xiàng)目的詳細(xì)信息存儲(chǔ)為向量形式。當(dāng)用戶后續(xù)詢問“設(shè)計(jì)階段的進(jìn)展如何?”時(shí),系統(tǒng)會(huì)自動(dòng)在記憶數(shù)據(jù)庫(kù)中進(jìn)行搜索,提取最相關(guān)的記錄,并讓大語言模型將這些信息整合成一個(gè)有用且清晰的回答。
向量記憶的局限性
向量存儲(chǔ)為 AI 代理提供了模擬記憶的強(qiáng)大功能,但同時(shí)也存在一些重要限制。首先,向量搜索基于相似性,而不是真正的理解。這意味著在向量空間中,最接近的存儲(chǔ)嵌入并不總是最適合特定上下文的。例如,兩個(gè)在數(shù)學(xué)上非常接近的句子可能傳達(dá)完全不同的含義。因此,AI 有時(shí)會(huì)給出令人困惑或與主題無關(guān)的結(jié)果,尤其是在涉及細(xì)微差別或情感色彩的情況下。其次,嵌入是靜態(tài)的快照。一旦存儲(chǔ),除非被明確更新,否則它們不會(huì)變化或適應(yīng)新的信息。如果用戶改變主意或提供新信息,系統(tǒng)將無法“學(xué)習(xí)”,除非原始向量被移除或替換。與之不同,人類記憶會(huì)隨著時(shí)間的推移而適應(yīng)和改進(jìn),而基于向量的記憶則是“凍結(jié)”的,除非開發(fā)人員主動(dòng)進(jìn)行管理。以下是一些緩解這些挑戰(zhàn)的方法:
- 在檢索過程中增加上下文信息,例如通過元數(shù)據(jù)(如時(shí)間戳、主題或用戶意圖)來過濾結(jié)果,從而縮小范圍,確保結(jié)果真正相關(guān)。
- 定期重新處理或重新嵌入舊記憶,以確保信息反映出對(duì)用戶需求或偏好的最新理解。除了技術(shù)上的限制,向量存儲(chǔ)還引發(fā)了一些隱私和倫理方面的關(guān)注。幾個(gè)關(guān)鍵問題包括:誰來決定保存什么內(nèi)容?這些記憶應(yīng)該保留多長(zhǎng)時(shí)間?用戶能否控制記住或遺忘什么?
理想情況下,這些決策不應(yīng)僅由開發(fā)人員或系統(tǒng)做出。更周到的方法是讓記憶變得明確。例如,允許用戶選擇要記住的內(nèi)容,并通過標(biāo)記某些輸入為“重要”來增加同意和透明度。同樣,記憶的保留時(shí)間應(yīng)根據(jù)信息的有用性來設(shè)定過期策略。同樣重要的是,用戶應(yīng)能夠查看、管理和刪除他們存儲(chǔ)的數(shù)據(jù)。無論是通過簡(jiǎn)單的界面還是編程接口,記憶管理工具對(duì)于建立信任都至關(guān)重要。隨著向量存儲(chǔ)的廣泛應(yīng)用,人們對(duì) AI 系統(tǒng)尊重用戶隱私和自主權(quán)的期望也在不斷提高。更廣泛的 AI 社區(qū)仍在探索圍繞這些問題的最佳實(shí)踐。但有一點(diǎn)是明確的:模擬記憶不僅要追求準(zhǔn)確性和性能,還要注重問責(zé)。通過將強(qiáng)大的默認(rèn)設(shè)置與用戶控制相結(jié)合,開發(fā)人員可以確保基于向量的記憶系統(tǒng)既智能又負(fù)責(zé)任。
結(jié)論
AI代理提供了一種模擬記憶的功能,而且表現(xiàn)得非常出色。通過將文本轉(zhuǎn)化為向量,并借助FAISS或Pinecone等工具,我們賦予了模型檢索關(guān)鍵信息的能力。這并非真實(shí)記憶,卻能讓AI系統(tǒng)顯得更具個(gè)性化、更有幫助和更人性化。隨著這些工具的不斷發(fā)展,AI的“幻覺”能力也會(huì)隨之增強(qiáng)。但每一套智能AI的背后,本質(zhì)上都是一套基于向量和相似性計(jì)算的系統(tǒng)。如果你能掌握這一原理,就能打造出一個(gè)能夠隨著時(shí)間推移不斷學(xué)習(xí)、記憶并持續(xù)改進(jìn)的智能助手。
譯者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。
原文標(biāo)題:How AI Agents Remember Things: The Role of Vector Stores in LLM Memory,作者:Manish Shivanandhan