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

本文深入探讨了向量存储如何让AI代理模拟记忆功能,详细介绍了嵌入技术的工作原理、FAISS和Pinecone等流行向量数据库的实现方式,以及检索增强生成(RAG)系统如何让LLM表现出智能记忆行为。

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

当你与AI助手交谈时,它似乎能记住你之前说过的话。但大型语言模型(LLM)实际上并没有自己的记忆。除非再次提供这些信息,否则它们不会记住对话内容。

那么,它们是如何看似能够回忆事物的呢?

答案在于一种叫做向量存储的东西——这正是你将在本文中学到的内容。

什么是向量存储?

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

向量是一组数字列表,代表了一段文本的含义。你通过一个称为嵌入的过程来获得这些向量。

模型将一个句子转换为空间中的一个高维点。在这个空间中,相似的含义彼此接近。

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

嵌入如何工作

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

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

这个向量对我们来说意义不大,但对AI来说,它是捕捉句子含义的一种方式。该向量与一些额外信息(可能是时间戳或来自此用户的注释)一起存储在向量数据库中。

后来,如果用户说:“预订一张到我家乡的航班。”

模型将这个新句子转换为一个新向量。然后它搜索向量数据库以找到最相似的存储向量。

最接近的匹配可能是"我住在德克萨斯州奥斯汀。“现在AI知道你所说的"我的家乡"可能是什么意思。

这种基于含义(而不仅仅是匹配关键词)查找相关过去输入的能力,赋予了LLM一种记忆形式。

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

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

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

相反,你可以使用向量存储作为长期记忆。你嵌入并保存有用的信息。

然后,在需要时,你查询向量存储,检索最相关的部分,并将它们反馈给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 = "用户住在德克萨斯州奥斯汀"

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

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

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

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

# 编码一个新的查询句子,我们想要与存储的记忆匹配
query = model.encode("用户来自哪里?")

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

# 打印最相关记忆的索引(在这种情况下,索引中只有一个项目)
print("最相关记忆索引:", I[0][0])

这段代码使用预训练模型将像"用户住在德克萨斯州奥斯汀"这样的句子转换为嵌入。

它将这个嵌入存储在FAISS索引中。当你问"用户来自哪里?“这样的问题时,代码将该问题转换为另一个嵌入,并搜索索引以找到含义最相似的存储句子。

最后,它打印内存中最相关句子的位置(索引)。

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="你的API密钥", environment="us-west1-gcp")

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

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

# 将事实/句子转换为数值嵌入(向量)
embedding = model.encode("用户偏好素食")

# 将嵌入存储(upsert)到Pinecone中,带有唯一ID
index.upsert([("user-pref-001", embedding.tolist())])

# 将查询句子编码为嵌入
query = model.encode("用户喜欢什么类型的食物?")

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

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

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

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

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

根据你是否需要速度、规模、简单性或特殊功能,这些都有各自的适用场景。

通过检索增强生成让AI显得聪明

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

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

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

基于向量的记忆的局限性

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

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

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

有几种方法可以缓解这些挑战。

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

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

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

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

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

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

结论

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

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

希望你喜欢这篇文章。在Linkedin上与我联系。

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