记忆系统
1. 记忆概述
记忆系统是 CrewAI 的关键特性之一,让 Agent 能够"记住"过去的信息。没有记忆的 Agent 每次执行都是"从零开始";有了记忆,Agent 可以:
- 在同一任务执行过程中记住之前的对话和发现
- 跨多次执行积累经验和知识
- 追踪和关联重要实体信息
三种记忆类型
┌─────────────────────────────────────────────────────┐
│ CrewAI 记忆系统 │
├─────────────┬─────────────────┬─────────────────────┤
│ 短期记忆 │ 长期记忆 │ 实体记忆 │
│ (Session) │ (Cross-Session) │ (Entity) │
│ │ │ │
│ 当前执行的 │ 跨执行的经验 │ 人/事/物的知识图谱 │
│ 上下文信息 │ 积累和学习 │ 结构化实体关系 │
├─────────────┼─────────────────┼─────────────────────┤
│ ChromaDB │ SQLite │ ChromaDB │
│ (向量检索) │ (持久化存储) │ (向量检索) │
└─────────────┴─────────────────┴─────────────────────┘2. 短期记忆(Short-term Memory)
短期记忆存储当前 Crew 执行过程中的交互和上下文信息。它让 Agent 能够记住在同一轮执行中之前发生的事情。
工作原理
- 使用 ChromaDB 作为向量存储
- 基于 RAG(检索增强生成)机制
- 在 Crew 执行期间有效
- 执行结束后默认清除(除非启用长期记忆)
使用方式
python
from crewai import Crew, Process
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
process=Process.sequential,
memory=True # 一行代码启用所有记忆
)
result = crew.kickoff()短期记忆的作用
python
# 任务 1:研究员发现了一个重要信息
task1 = Task(
description="调研 AI 框架的最新进展",
expected_output="调研报告",
agent=researcher
)
# 任务 2:写手可以引用任务 1 中研究员发现的信息
# 短期记忆确保上下文连贯
task2 = Task(
description="基于调研结果撰写博客",
expected_output="技术博客",
agent=writer,
context=[task1]
)3. 长期记忆(Long-term Memory)
长期记忆跨 Crew 执行持久化存储信息。它让 Agent 能够从过去的执行中学习,不断改进。
工作原理
- 使用 SQLite 进行持久化存储
- 记录每次执行的关键信息和决策
- 在后续执行中自动检索相关历史信息
- 帮助 Crew 随时间改进表现
使用方式
python
from crewai import Crew, Process
crew = Crew(
agents=[agent1, agent2],
tasks=[task1, task2],
process=Process.sequential,
memory=True # 同时启用短期和长期记忆
)
# 第一次执行
result1 = crew.kickoff()
# 第二次执行 - Agent 会记住第一次执行的经验
result2 = crew.kickoff()重置记忆
bash
# 通过 CLI 重置
crewai reset-memories
# 通过代码重置
crew.reset_memories()4. 实体记忆(Entity Memory)
实体记忆追踪和存储特定实体(人物、组织、概念等)的信息,帮助 Agent 构建知识图谱。
工作原理
- 使用 RAG + 嵌入向量存储
- 自动识别和提取任务中的关键实体
- 建立实体之间的关联关系
- 在后续执行中检索实体信息
示例
python
from crewai import Agent, Task, Crew, Process
analyst = Agent(
role="企业分析师",
goal="分析企业信息",
backstory="资深企业分析师"
)
# 第一次执行:分析特斯拉
task1 = Task(
description="分析特斯拉的商业模式和竞争优势",
expected_output="企业分析报告",
agent=analyst
)
crew = Crew(
agents=[analyst],
tasks=[task1],
memory=True # 实体记忆会记住"特斯拉"相关信息
)
crew.kickoff()
# 第二次执行:分析电动车市场
# Agent 可以从实体记忆中检索"特斯拉"的历史分析
task2 = Task(
description="分析电动车市场竞争格局",
expected_output="市场分析报告",
agent=analyst
)
crew2 = Crew(
agents=[analyst],
tasks=[task2],
memory=True
)
crew2.kickoff() # 会参考之前关于特斯拉的分析5. 自定义嵌入器
记忆系统依赖嵌入模型将文本转换为向量。默认使用 OpenAI 的嵌入模型,但可以自定义:
5.1 使用 OpenAI 自定义模型
python
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
embedder={
"provider": "openai",
"config": {
"model": "text-embedding-3-small", # 或 text-embedding-3-large
"api_key": "your-api-key" # 可选,默认使用环境变量
}
}
)5.2 使用其他提供商
python
# Ollama(本地)
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
embedder={
"provider": "ollama",
"config": {
"model": "nomic-embed-text",
"url": "http://localhost:11434/api/embeddings"
}
}
)
# Google
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
embedder={
"provider": "google",
"config": {
"model": "models/text-embedding-004",
"api_key": "your-google-api-key"
}
}
)
# Azure OpenAI
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
embedder={
"provider": "azure",
"config": {
"model": "text-embedding-3-small",
"api_key": "your-azure-key",
"api_base": "https://your-resource.openai.azure.com"
}
}
)5.3 使用本地嵌入模型
python
# Hugging Face 模型
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
embedder={
"provider": "huggingface",
"config": {
"model": "sentence-transformers/all-MiniLM-L6-v2"
}
}
)6. 记忆配置最佳实践
6.1 何时启用记忆
| 场景 | 是否启用 | 原因 |
|---|---|---|
| 单次简单任务 | ❌ | 不需要跨执行记忆 |
| 多任务协作 | ✅ | 短期记忆保持上下文连贯 |
| 反复执行相似任务 | ✅ | 长期记忆积累经验 |
| 涉及实体追踪 | ✅ | 实体记忆构建知识图谱 |
| 资源敏感场景 | ⚠️ | 记忆会增加存储和嵌入计算开销 |
6.2 记忆对性能的影响
python
# 记忆会增加以下开销:
# 1. 嵌入计算 - 每次存储信息需要调用嵌入模型
# 2. 向量检索 - 每次执行需要检索相关记忆
# 3. 存储空间 - ChromaDB 和 SQLite 的磁盘占用
# 优化建议:
# - 使用轻量嵌入模型(如 text-embedding-3-small)
# - 定期重置不需要的记忆
# - 在资源受限环境中考虑禁用记忆6.3 调试记忆
python
crew = Crew(
agents=[...],
tasks=[...],
memory=True,
verbose=True # 查看记忆相关的日志
)总结
| 知识点 | 要点 |
|---|---|
| 短期记忆 | 当前执行的上下文,基于 ChromaDB 向量检索 |
| 长期记忆 | 跨执行的经验积累,基于 SQLite 持久化 |
| 实体记忆 | 实体关系追踪,基于 RAG + 嵌入向量 |
| 启用方式 | memory=True 一行代码启用全部 |
| 自定义嵌入 | 支持 OpenAI、Ollama、Google、HuggingFace 等 |
| 重置记忆 | crewai reset-memories 或 crew.reset_memories() |