Skip to content

记忆系统 ​

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()