AI Agent记忆系统:向量数据库原理解析与选择指南(2026)
🩺 摘要
你的AI Agent每次对话都像「初次见面」一样重头开始?那是因为它没有记忆。 > > 解决这个问题的关键技术是**向量...
📝 详情
你的AI Agent每次对话都像「初次见面」一样重头开始?那是因为它没有记忆。
解决这个问题的关键技术是向量数据库。本文不讲复杂数学,从使用者的角度说清楚:它是什么、怎么选、怎么用。
为什么AI Agent需要向量数据库?
大语言模型本身没有记忆。你把对话历史全部塞进上下文窗口(Context Window),但GPT-4o的128K上下文也撑不过一小时深度对话。而且每次对话都塞全部历史,API费用直线飙升。
向量数据库解决的三个核心问题:
- 选择性记忆 — 不是记住所有对话,只记住「重要的部分」
- 语义检索 — 用「意思」去找回忆,不是用关键词。比如之前聊过「养猫开销」,下次问「养宠物贵不贵」也能关联到
- 无限扩展 — 上下文窗口是有限的(128K tokens≈10万字),向量数据库可以存几百万条记忆
向量数据库工作原理(三句话说明白)
第一句: 每个「记忆」变成一个数学向量(一串几百个数字)
第二句: 相似的记忆在向量空间里靠得近(「养猫开销」和「养宠物贵不贵」的向量距离很近)
第三句: 查询时把问题也转成向量,找最近的那些记忆
这个过程叫做近似最近邻搜索(ANN)。不需要懂数学公式,只需要知道它≈语义搜索。
类比:向量数据库就像你的大脑——你和朋友聊天时不会回忆一生的每一秒,只会提取相关的几段记忆。它帮你做「相关记忆检索」,而不是「全文搜索」。
Agent记忆的三种类型
1. 对话记忆(Short-term / Conversation Memory)
存当前会话的最近N轮对话。最常见、最基础。
实现方式: 简单存一个列表,按时间顺序保留最近20轮(或按token数截断)
# 最简单的对话记忆
class ConversationMemory:
def __init__(self, max_turns=20):
self.history = []
self.max_turns = max_turns
def add(self, role: str, content: str):
self.history.append({"role": role, "content": content})
if len(self.history) > self.max_turns * 2:
self.history = self.history[-self.max_turns * 2:]
def get_context(self) -> list:
return self.history
什么时候够用: 简短问答、单一任务的Agent。不需要长期记忆。
2. 摘要记忆(Summary Memory)
对话太长时,让LLM定期生成摘要,保存摘要代替原始对话。
实现方式: 每N轮对话触发一次LLM调用,总结前面的内容
async def summarize_conversation(history: list) -> str:
prompt = f"请用3-5句话总结以下对话的关键信息:\n{format_history(history)}"
response = await llm.complete(prompt)
return response
什么时候用: 需要长期对话但不要求精确召回的场景(如心理咨询Agent、长期陪伴型Agent)。
3. 向量记忆(Vector Memory)
最重要的类型。每条记忆转为向量存入数据库,用语义检索找相关记忆。
实现方式: Embedding API + 向量数据库查询
class VectorMemory:
def __init__(self, collection_name="agent_memory"):
self.client = chromadb.Client()
self.collection = self.client.get_or_create_collection(collection_name)
def remember(self, text: str, metadata: dict = None):
"""存入一条记忆"""
embedding = get_embedding(text) # 调用Embedding API
self.collection.add(
embeddings=[embedding],
documents=[text],
metadatas=[metadata or {}],
ids=[str(uuid4())]
)
def recall(self, query: str, top_k: int = 5):
"""检索相关记忆"""
embedding = get_embedding(query)
results = self.collection.query(
query_embeddings=[embedding],
n_results=top_k
)
return results['documents'][0]
4款主流向量数据库对比
数据来源:GitHub(截至2026年7月18日),官方文档
| 特性 | Chroma | Milvus | Qdrant | Weaviate |
|---|---|---|---|---|
| GitHub Stars | 28.8K | 45.3K | 33.4K | 16.6K |
| 部署方式 | 嵌入式/客户端 | 独立服务 | 独立服务/Docker | 独立服务/Docker |
| 语言 | Python原生 | Go/Java SDK | Rust | Go |
| 上手难度 | ⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| 内存占用 | 低(文件型) | 高(集群推荐) | 中 | 中高 |
| 适合场景 | 个人/原型 | 生产级/千亿级 | 高并发生产 | 混合检索 |
| 内置过滤 | 有限 | 丰富 | 丰富 | 丰富(GraphQL) |
| 中文支持 | 取决于Embedding | 取决于Embedding | 取决于Embedding | 取决于Embedding |
选型建议
Chroma — 适合入门和原型验证
pip install chromadb
5行代码跑起来:
import chromadb
client = chromadb.Client()
collection = client.create_collection("test")
collection.add(documents=["你好", "世界"], ids=["1", "2"])
它的优势就是简单。但生产级不行——没有分布式、内存多了会崩、过滤能力弱。
适用: 个人项目、黑客松、MVP验证。不要用于线上服务。
Milvus — 企业级大规模部署
docker compose -f milvus-standalone.yml up -d
支持十亿级向量检索,有GPU加速。但部署复杂,最轻量模式也要2个服务。适合数据量100万+条的场景。
适用: 需要处理海量数据的RAG系统、推荐系统。小项目用Milvus是大炮打蚊子。
Qdrant — 高并发生产首选
docker run -d --name qdrant -p 6333:6333 qdrant/qdrant
Rust编写,性能极佳。它的filtered search(带过滤条件的向量搜索)是所有库中最好用的:
client.search(
collection_name="products",
query_vector=vector,
query_filter=models.Filter(
must=[
models.FieldCondition(key="price", range=models.Range(gte=100, lte=500)),
models.FieldCondition(key="category", match=models.MatchValue(value="electronics"))
]
),
limit=10
)
适用: 需要高性能+灵活过滤的中大型项目。
Weaviate — 混合检索(向量+全文搜索)
Weaviate的最大亮点是同时支持向量搜索和BM25全文搜索:
# 混合搜索:70%向量相似度 + 30%关键词匹配
result = client.query.get("Document", ["title", "content"]) \
.with_hybrid(query="AI Agent", alpha=0.7) \
.with_limit(10) \
.do()
适用: 需要兼顾语义搜索和精确关键词匹配的应用。
实战:给FastAPI Agent加上向量记忆
结合上一篇的FastAPI Agent,加记忆只需要改一行:
# 改造后的Agent类
class AIAgentWithMemory(AIAgent):
def __init__(self, memory_type="vector"):
super().__init__()
self.short_term = ConversationMemory(max_turns=20)
if memory_type == "vector":
# 用Chroma做原型,后面可以换Qdrant
self.long_term = VectorMemory("agent_working_memory")
async def chat(self, message: str) -> str:
# 1. 从长期记忆中检索相关上下文
relevant_memories = self.long_term.recall(message, top_k=3)
# 2. 把相关记忆注入System Prompt
enhanced_prompt = self.system_prompt + "\n\n相关记忆:\n" + "\n".join(relevant_memories)
# 3. 加上短期对话历史
messages = [{"role": "system", "content": enhanced_prompt}]
messages += self.short_term.get_context()
messages.append({"role": "user", "content": message})
# 4. 调用LLM
response = await self.call_llm(messages)
# 5. 重要信息存入长期记忆
self.long_term.remember(f"用户问了:{message} → 回答了:{response}")
self.short_term.add("user", message)
self.short_term.add("assistant", response)
return response
这个模式的关键是三阶段记忆架构: - 短期(ConversationMemory):最近20轮对话,快速存取 - 长期(VectorMemory):重要的、可检索的历史记忆 - 注入(Injection):每次请求自动注入相关记忆,Agent「记得」之前的事
关于Embedding模型的建议
向量数据库只是存储层,真正决定记忆质量的是Embedding模型。
| 模型 | 维度 | 适合场景 |
|---|---|---|
| text-embedding-3-small | 512/1536 | 通用,性价比最高 |
| text-embedding-3-large | 3072 | 追求精度,预算充足 |
| BAAI/bge-m3 | 1024 | 开源,多语言(含中文) |
| intfloat/multilingual-e5-large | 1024 | 开源,英文效果极佳 |
中文场景首选 BAAI/bge-m3 或 text-embedding-3-small。前者免费自托,后者OpenAI收费但质量稳定。
总结
向量数据库不是选「最好」的,是选「最合适」的:
- 第一次接触 → Chroma,5分钟上手
- 做原型/MVP → Chroma(后面迁移到Qdrant)
- 上生产、高并发 → Qdrant
- 海量数据、GPU加速 → Milvus
- 需要混合搜索 → Weaviate
而Agent记忆系统的最佳实践是分层存储:
短期记忆(列表)→ 摘要记忆(LLM总结)→ 向量记忆(语义检索)
三层各司其职,成本可控,效果最好。
💡 建议收藏本文。 向量数据库选型一旦上线很难改,这篇帮你一开始就选对。下篇讲用Playwright打造网页抓取Agent。
📤 转发给做RAG/Agent的朋友。 很多人用向量数据库但不知道各款差异,这篇文章能帮他避坑。
上篇:用FastAPI搭建AI Agent API 下篇:用Playwright打造AI网页抓取Agent
💬 评论 (0)