AI代理的记忆机制:向量数据库如何支撑大语言模型记忆
译者 | 崔皓
审校 | 重楼
当你与 AI 助手进行对话时,它会让你感觉它似乎能够记住你之前说过的话。然而,实际上大型语言模型本身并不具备真正意义上的记忆功能。如果不再次提供相关信息,它并不会记住之前的对话内容。那么,为什么它能够“记住”事物呢?答案就在于一种称为向量存储的技术,这正是本文将要介绍的核心内容。
什么是向量存储?
矢量存储是一种特殊的数据库类型,与传统数据库存储文本或数字不同,它专门用于保存矢量数据。矢量是一组数字列表,能够表达文本的语义信息。它通过一种叫做嵌入的过程生成这些矢量。当模型接收一个句子时,会将其转化为高维空间中的一个点。在这个空间里,含义相近的文本会被聚集在一起。
嵌入式工作原理
假设用户告诉助手:
“I live in Austin, Texas.”
模型将这个句子转换为一个向量:
[0.23, -0.41, 0.77, ..., 0.08]
这个向量对人类来说意义不大,但对 AI 来说,它是捕捉句子含义的一种方式。该向量会存储在向量数据库中,还会附带一些额外信息 - 也许是时间戳或者来自这个用户的注释。
如果用户说:
“Book a flight to my hometown.”
该模型会将这个新句子转换成向量,然后在向量数据库中搜索,找到最相似的已存储向量。例如,当系统检测到“我的家乡”时,可能会匹配到“我住在得克萨斯州奥斯汀市”,从而理解你的意思。这种基于语义理解而非单纯关键词匹配的能力,实际上为大型语言模型提供了一种类似记忆的功能。
为什么向量存储对记忆至关重要
大型语言模型通过上下文窗口来处理文本内容。以GPT-4-turbo为例,其处理能力可达128,000个标记(token),虽然这个数字非常庞大,但实际应用中很快就会被填满。这意味着我们无法一直将整个对话内容保存在内存中。为了解决这个问题,可以考虑使用向量存储技术来构建长期记忆。具体来说,我们可以将重要的信息进行向量化处理并保存起来。当需要使用时,只需从向量存储库中检索出最相关的几个片段,将其反馈给模型即可。这样,模型就只需记住关键信息就能表现出智能,而不必把所有内容都压在短期记忆里。
流行的向量存储
目前有几种流行的向量数据库。每种数据库都有其优势。
FAISS(Facebook AI 相似性搜索)
FAISS 是由 Meta 开发的开源库。它运行速度快,在本地或本地应用中表现良好。
FAISS 非常适合需要完全控制且不需要云托管的情况。它支持数百万个向量,并提供用于索引和高性能搜索的工具。
以下是 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])
这段代码的功能是通过预训练模型将句子“用户住在德克萨斯州奥斯汀”转换为对应的嵌入表达,并将其存储在FAISS索引中。当你提出类似“用户来自哪里?”这样的问题时,代码会将该问题转换为另一个嵌入,并在索引中搜索与之在语义上最相似的存储句子。最后,它会输出记忆中最相关句子的索引位置。FAISS的运行效率非常高,但需要注意的是,它并不是托管服务。这意味着你需要自行负责搭建和管理相关的基础设施。
Pinecone
Pinecone 是一个云原生向量数据库,特别适合用于生产系统。它为你管理和维护服务器,让你无需担心扩展或维护的问题。Pinecone 可以轻松处理数十亿规模的向量数据,并提供过滤、元数据支持和快速查询功能。此外,它还与 LangChain、OpenAI 等工具无缝集成。以下是如何进行基本设置:
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'])
如果你希望在无需管理硬件的情况下实现可扩展性和易用性,Pinecone 是一个理想的选择。其他常见的向量存储工具包括:
- Weaviate:将向量搜索与知识图谱相结合,支持强大的语义搜索和混合关键字查询。
- Chroma:以其简单易用的特点著称,适合进行原型设计和开发,常用于个人应用或演示。
- Qdrant:作为一款开源工具,专门针对高性能的向量搜索和过滤功能而设计。每种工具都有其适用的场景,具体取决于你对速度、规模、简单性还是特殊功能的需求。
利用检索增强生成使 AI 更聪明
整个系统——通过嵌入用户输入、将其存储在向量数据库中并支持后续检索——被称为检索增强生成(RAG)。虽然AI并没有真正的大脑,但它可以展现出具备思考能力的特征。你可以决定要记忆的内容、记忆的时间点,以及如何在对话中将这些信息调用回来。例如,当AI帮助用户跟踪项目进展时,可以将每个项目的详细信息存储为向量形式。当用户后续询问“设计阶段的进展如何?”时,系统会自动在记忆数据库中进行搜索,提取最相关的记录,并让大语言模型将这些信息整合成一个有用且清晰的回答。
向量记忆的局限性
向量存储为 AI 代理提供了模拟记忆的强大功能,但同时也存在一些重要限制。首先,向量搜索基于相似性,而不是真正的理解。这意味着在向量空间中,最接近的存储嵌入并不总是最适合特定上下文的。例如,两个在数学上非常接近的句子可能传达完全不同的含义。因此,AI 有时会给出令人困惑或与主题无关的结果,尤其是在涉及细微差别或情感色彩的情况下。其次,嵌入是静态的快照。一旦存储,除非被明确更新,否则它们不会变化或适应新的信息。如果用户改变主意或提供新信息,系统将无法“学习”,除非原始向量被移除或替换。与之不同,人类记忆会随着时间的推移而适应和改进,而基于向量的记忆则是“冻结”的,除非开发人员主动进行管理。以下是一些缓解这些挑战的方法:
- 在检索过程中增加上下文信息,例如通过元数据(如时间戳、主题或用户意图)来过滤结果,从而缩小范围,确保结果真正相关。
- 定期重新处理或重新嵌入旧记忆,以确保信息反映出对用户需求或偏好的最新理解。除了技术上的限制,向量存储还引发了一些隐私和伦理方面的关注。几个关键问题包括:谁来决定保存什么内容?这些记忆应该保留多长时间?用户能否控制记住或遗忘什么?
理想情况下,这些决策不应仅由开发人员或系统做出。更周到的方法是让记忆变得明确。例如,允许用户选择要记住的内容,并通过标记某些输入为“重要”来增加同意和透明度。同样,记忆的保留时间应根据信息的有用性来设定过期策略。同样重要的是,用户应能够查看、管理和删除他们存储的数据。无论是通过简单的界面还是编程接口,记忆管理工具对于建立信任都至关重要。随着向量存储的广泛应用,人们对 AI 系统尊重用户隐私和自主权的期望也在不断提高。更广泛的 AI 社区仍在探索围绕这些问题的最佳实践。但有一点是明确的:模拟记忆不仅要追求准确性和性能,还要注重问责。通过将强大的默认设置与用户控制相结合,开发人员可以确保基于向量的记忆系统既智能又负责任。
结论
AI代理提供了一种模拟记忆的功能,而且表现得非常出色。通过将文本转化为向量,并借助FAISS或Pinecone等工具,我们赋予了模型检索关键信息的能力。这并非真实记忆,却能让AI系统显得更具个性化、更有帮助和更人性化。随着这些工具的不断发展,AI的“幻觉”能力也会随之增强。但每一套智能AI的背后,本质上都是一套基于向量和相似性计算的系统。如果你能掌握这一原理,就能打造出一个能够随着时间推移不断学习、记忆并持续改进的智能助手。
译者介绍
崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。
原文标题:How AI Agents Remember Things: The Role of Vector Stores in LLM Memory,作者:Manish Shivanandhan
本文地址:https://www.yitenyun.com/341.html