• AI代理的记忆机制:向量数据库如何支撑大语言模型记忆

AI代理的记忆机制:向量数据库如何支撑大语言模型记忆

2025-08-16 12:33:31 栏目:宝塔面板 0 阅读

译者 | 崔皓

审校 | 重楼

当你与 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

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL Web 应用 异步数据库 数据同步 ACK 双主架构 循环复制 Deepseek 宝塔面板 Linux宝塔 Docker 生命周期 JumpServer JumpServer安装 堡垒机安装 Linux安装JumpServer 序列 核心机制 esxi esxi6 root密码不对 无法登录 web无法登录 SSL 堡垒机 跳板机 HTTPS Windows Windows server net3.5 .NET 安装出错 宝塔面板打不开 宝塔面板无法访问 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 连接控制 机制 HTTPS加密 Windows宝塔 Mysql重置密码 无法访问宝塔面板 HexHub 运维 Oracle 处理机制 Serverless 无服务器 语言 Spring Redis 异步化 ES 协同 技术 group by 索引 InnoDB 数据库锁 监控 开源 PostgreSQL 存储引擎 分页查询 高可用 SQL 动态查询 响应模型 缓存方案 缓存架构 缓存穿透 R edis 线程 数据 主库 自定义序列化 服务器 管理口 scp Linux的scp怎么用 scp上传 scp下载 scp命令 日志文件 MIXED 3 查询 SVM Embedding 存储 OB 单机版 Linux 安全 工具 电商 系统 SQLark SQLite-Web SQLite 数据库管理工具 架构 Rsync Postgres OTel Iceberg RocketMQ 长轮询 配置 Recursive 云原生 流量 共享锁 修改DNS Centos7如何修改DNS • 索引 • 数据库 防火墙 黑客 向量数据库 大模型 聚簇 非聚簇 sftp 服务器 参数 PG DBA 缓存 业务 AI 助手 Ftp ​Redis 机器学习 推荐模型 场景 GreatSQL 连接数 优化 万能公式 Netstat Linux 服务器 端口 数据备份 MySQL 9.3 RDB AOF openHalo 数据分类 加密 同城 双活 信息化 智能运维 INSERT COMPACT 窗口 函数 人工智能 推荐系统 核心架构 订阅机制 事务 Java 开发 MVCC 磁盘架构 线上 库存 预扣 redo log 重做日志 mini-redis INCR指令 网络架构 网络配置 Doris SeaTunnel prometheus Alert Redisson 锁芯 向量库 Milvus Undo Log 高效统计 今天这篇文章就跟大家 Python 引擎 性能 网络故障 B+Tree ID 字段 模型 IT运维 Canal Web PostGIS Redis 8.0 不宕机 数据脱敏 加密算法 R2DBC Hash 字段 分布式 集中式 崖山 新版本 自动重启 Pottery OAuth2 Token JOIN Entity ZODB 微软 SQL Server AI功能 容器化 虚拟服务器 虚拟机 内存 MongoDB 数据结构 DBMS 管理系统 容器 数据类型 读写 sqlmock 启动故障 悲观锁 乐观锁 分库 分表 LRU SpringAI 数据页 StarRocks 数据仓库 数据集成工具 分页 单点故障 QPS 高并发 传统数据库 向量化 工具链 Testcloud 云端自动化 Redka filelock 排行榜 排序 发件箱模式 事务隔离 部署 聚簇索引 非聚簇索引 分页方案 排版 大表 业务场景 意向锁 记录锁 速度 服务器中毒 Web 接口 1 SSH 池化技术 连接池 Caffeine CP 仪表盘 分布式架构 分布式锁​ dbt 数据转换工具 日志 原子性 EasyExcel MySQL8 AIOPS MCP 开放协议 优化器 网络 InfluxDB Order IT 双引擎 RAG HelixDB 频繁 Codis Go 数据库迁移 字典 单线程 Ansible 对象 Crash 代码 LLM 事务同步 订单 线程安全 Pump List 类型 UUIDv7 主键 服务器性能 锁机制 Weaviate MGR 分布式集群 并发控制 恢复机制 ReadView 国产数据库 Next-Key 国产 用户 RR 互联网 数据字典 兼容性 算法 语句 播客 拦截器 动态代理 TIME_WAIT 负载均衡 矢量存储 数据库类型 AI代理 失效 行业 趋势 多线程 技巧 分布式锁 Zookeeper 解锁 调优 闪回 产业链 快照读 当前读 视图 关系数据库 编程 主从复制 代理 GitHub Git count(*) count(主键) 行数 UUID ID 神经系统 慢SQL优化 千万级 表空间 Valkey Valkey8.0 查询规划 恢复数据 CAS