AI代理如何记忆:向量存储在LLM记忆中的关键作用

本文深入探讨了向量存储如何为AI代理提供记忆能力,详细介绍了嵌入技术的工作原理、主流向量数据库FAISS和Pinecone的实现方式,以及检索增强生成(RAG)系统的构建和局限性分析。

AI代理如何记忆:向量存储在LLM记忆中的关键作用

当你与AI助手交谈时,它似乎能记住你之前说过的话。但大型语言模型(LLMs)本身并没有记忆功能。除非再次提供相同的信息,否则它们不会记住对话内容。

那么,它们是如何实现"记忆"的呢?答案在于一种称为向量存储的技术——这正是本文要探讨的内容。

目录

  • 什么是向量存储?
  • 嵌入技术如何工作
  • 为什么向量存储对记忆至关重要
  • 主流向量存储方案
  • 通过检索增强生成让AI显得更智能
  • 基于向量记忆的局限性
  • 结论

什么是向量存储?

向量存储是一种特殊类型的数据库。与常规数据库存储文本或数字不同,它存储的是向量。

向量是一组数字列表,代表了文本片段的含义。这些向量是通过称为嵌入的过程获得的。模型将句子转换为高维空间中的点,在这个空间中,相似含义的向量位置相近。

例如,如果嵌入"我喜欢寿司",它在向量空间中可能接近"寿司是我最喜欢的食物"。这些嵌入帮助AI代理找到相关的想法,即使确切的词语不同。

嵌入技术如何工作

假设用户告诉助手:“我住在德克萨斯州奥斯汀”。

模型将这个句子转换为向量: [0.23, -0.41, 0.77, …, 0.08]

这个向量对我们来说没有太多意义,但对AI来说,它是捕捉句子含义的一种方式。该向量与一些额外信息(如时间戳或用户来源备注)一起存储在向量数据库中。

之后,如果用户说:“预订一张到我家乡的机票”。

模型将这个新句子转换为新的向量,然后在向量数据库中搜索找到最相似的存储向量。最接近的匹配可能是"我住在德克萨斯州奥斯汀"。现在AI知道"我的家乡"可能指的是什么。

这种基于含义(而不仅仅是关键词匹配)查找相关历史输入的能力,为LLMs提供了一种记忆形式。

为什么向量存储对记忆至关重要

LLMs使用上下文窗口处理语言,这是它们一次能"看到"的文本量。

对于GPT-4-turbo,窗口可以处理多达128,000个token,这听起来很大——但即使这样也会很快被填满。你不能永远保留整个对话。

相反,你可以使用向量存储作为长期记忆。嵌入并保存有用的信息,然后在需要时查询向量存储,检索最相关的部分,并将其反馈给LLM。这样,模型就能记住足够的信息来表现得聪明——而不需要将所有内容都保存在短期记忆中。

主流向量存储方案

有几种流行的向量数据库在使用,每种都有其优势。

FAISS(Facebook AI相似性搜索)

FAISS是Meta开发的开源库。它速度快,适用于本地或内部部署应用。

如果你需要完全控制且不需要云托管,FAISS是很好的选择。它支持数百万个向量,并提供高性能的索引和搜索工具。

以下是使用FAISS的示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# 加载预训练的句子转换模型,将句子转换为数值向量(嵌入)
model = SentenceTransformer('all-MiniLM-L6-v2')

# 定义要存储在记忆中的输入句子
sentence = "User lives in Austin, Texas"

# 将句子转换为密集向量(嵌入)
embedding = model.encode(sentence)

# 获取嵌入向量的维度(用于创建FAISS索引)
dimension = embedding.shape[0]

# 使用嵌入维度创建L2(欧几里得)相似性搜索的FAISS索引
index = faiss.IndexFlatL2(dimension)

# 将句子嵌入添加到FAISS索引(这是我们的"记忆")
index.add(np.array([embedding]))

# 编码要匹配存储记忆的新查询句子
query = model.encode("Where is the user from?")

# 在FAISS索引中搜索与查询最相似的前1个向量
D, I = index.search(np.array([query]), k=1)

# 打印最相关记忆的索引(本例中索引中只有一个项目)
print("Most relevant memory index:", I[0][0])

这段代码使用预训练模型将"User lives in Austin, Texas"这样的句子转换为嵌入向量,将其存储在FAISS索引中。当你询问"Where is the user from?“时,代码将该问题转换为另一个嵌入向量,并搜索索引以找到含义最相似的存储句子。

FAISS效率高,但不是托管服务,这意味着你需要管理自己的基础设施。

Pinecone

Pinecone是一个云原生向量数据库。它是托管的,非常适合生产系统。

你不需要担心扩展或维护服务器。Pinecone处理数十亿个向量,并提供过滤、元数据支持和快速查询。它与LangChain和OpenAI等工具集成良好。

以下是基本的Pinecone设置示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pinecone
from sentence_transformers import SentenceTransformer

# 使用API密钥和环境初始化Pinecone
pinecone.init(api_key="your-api-key", environment="us-west1-gcp")

# 连接或创建名为"memory-store"的Pinecone索引
index = pinecone.Index("memory-store")

# 加载预训练的句子转换模型,将文本转换为嵌入向量
model = SentenceTransformer('all-MiniLM-L6-v2')

# 将事实/句子转换为数值嵌入(向量)
embedding = model.encode("User prefers vegetarian food")

# 使用唯一ID将嵌入存储(更新插入)到Pinecone中
index.upsert([("user-pref-001", embedding.tolist())])

# 将查询句子编码为嵌入向量
query = model.encode("What kind of food does the user like?")

# 搜索Pinecone以找到与查询最相关的存储嵌入
results = index.query(queries=[query.tolist()], top_k=1)

# 打印最匹配记忆的ID
print("Top match ID:", results['matches'][0]['id'])

如果你需要可扩展性和易用性而不需要管理硬件,Pinecone是理想的选择。

其他流行的向量存储包括:

  • Weaviate - 将向量搜索与知识图谱结合,提供强大的语义搜索和混合关键词支持
  • Chroma - 简单易用,适合原型设计,常用于个人应用或演示
  • Qdrant - 开源,专为高性能向量搜索和过滤而构建

根据你对速度、规模、简单性或特殊功能的需求,每种都有其适用场景。

通过检索增强生成让AI显得更智能

这整个系统——嵌入用户输入、将其存储在向量数据库中并在以后检索——被称为检索增强生成(RAG)。

AI仍然没有大脑,但它可以表现得像有大脑一样。你选择记住什么、何时回忆以及如何将其反馈到对话中。

如果AI帮助用户跟踪项目更新,你可以将每个项目细节存储为向量。当用户后来询问"设计阶段的进展如何?“时,你搜索记忆数据库,提取最相关的笔记,并让LLM将它们拼接成有用的答案。

基于向量记忆的局限性

虽然向量存储为AI代理提供了一种强大的模拟记忆方式,但这种方法存在一些重要的局限性。

向量搜索基于相似性,而不是真正的理解。这意味着最相似的存储嵌入可能并不总是最相关或在上下文中最有帮助。例如,两个句子在向量空间中可能数学上接近,但含义却大相径庭。因此,AI有时可能会提供令人困惑或偏离主题的结果,特别是在涉及细微差别或情感语气时。

另一个挑战是嵌入是静态快照。一旦存储,除非明确更新,否则它们不会进化或适应。如果用户改变主意或提供新信息,除非删除或替换原始向量,否则系统不会"学习”。与人类记忆随时间适应和完善不同,基于向量的记忆是冻结的,除非开发人员主动管理。

有几种方法可以缓解这些挑战。一种是在检索过程中包含更多上下文,例如通过时间戳、主题或用户意图等元数据过滤结果。这有助于将结果缩小到当前真正相关的内容。

另一种方法是定期重新处理或重新嵌入旧的记忆,确保信息反映用户需求或偏好的最新理解。

除了技术限制外,向量存储还引发隐私和道德问题。关键问题是:谁决定保存什么?记忆应该持续多久?用户是否有权控制记住或忘记什么?

理想情况下,这些决定不应仅由开发人员或系统做出。更周到的方法是使记忆明确化。让用户选择记住什么。例如,通过将某些输入标记为"重要”,增加了一层同意和透明度。同样,记忆保留应该有适当的时间限制,基于信息保持有用的时间制定过期策略。

同样重要的是用户能够查看、管理或删除其存储数据的能力。无论是通过简单界面还是编程API,记忆管理工具对于建立信任至关重要。随着向量存储使用的扩展,对AI系统尊重用户自主权和隐私的期望也在增加。

更广泛的AI社区仍在围绕这些问题制定最佳实践。但有一点是明确的:模拟记忆的设计不仅应考虑准确性和性能,还应考虑责任。通过将强大的默认设置与用户控制相结合,开发人员可以确保基于向量的记忆系统既智能又负责任。

结论

向量存储为AI代理提供了一种伪造记忆的方式——而且做得很好。通过将文本嵌入到向量中并使用FAISS或Pinecone等工具,我们赋予了模型回忆重要内容的能力。这不是真正的记忆,但它使AI系统感觉更个性化、更有帮助、更人性化。

随着这些工具变得越来越先进,幻觉也越来越真实。但在每个智能AI背后,都是一个简单的向量和相似性系统。如果你能掌握这一点,你就能构建出能够记忆、学习和随时间改进的助手。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计