AI Agent记忆系统:向量数据库原理解析与选择指南(2026)

📘 AI教程 💬 🔥 Trending

🩺 摘要

你的AI Agent每次对话都像「初次见面」一样重头开始?那是因为它没有记忆。 > > 解决这个问题的关键技术是**向量...

📝 详情

你的AI Agent每次对话都像「初次见面」一样重头开始?那是因为它没有记忆。

解决这个问题的关键技术是向量数据库。本文不讲复杂数学,从使用者的角度说清楚:它是什么、怎么选、怎么用。

为什么AI Agent需要向量数据库?

大语言模型本身没有记忆。你把对话历史全部塞进上下文窗口(Context Window),但GPT-4o的128K上下文也撑不过一小时深度对话。而且每次对话都塞全部历史,API费用直线飙升。

向量数据库解决的三个核心问题:

  1. 选择性记忆 — 不是记住所有对话,只记住「重要的部分」
  2. 语义检索 — 用「意思」去找回忆,不是用关键词。比如之前聊过「养猫开销」,下次问「养宠物贵不贵」也能关联到
  3. 无限扩展 — 上下文窗口是有限的(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-m3text-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