CrewAI中的内存系统介绍

crewAI框架引入了一个复杂的内存系统,旨在显著增强AI代理的能力。 该系统包括短期记忆长期记忆实体记忆上下文记忆,每种记忆在帮助代理记忆、推理和学习过去的互动中都发挥着独特的作用。

内存系统组件

组件描述
短期记忆使用RAG临时存储最近的交互和结果,使代理能够在当前执行期间回忆并利用与其当前上下文相关的信息。
长期记忆保留过去执行中的宝贵见解和学习成果,使代理能够随着时间的推移建立和完善其知识。
实体记忆捕获和组织在任务过程中遇到的实体(人、地点、概念)信息,促进更深入的理解和关系映射。使用RAG来存储实体信息。
上下文记忆通过结合ShortTermMemoryLongTermMemoryEntityMemory来维护交互的上下文,帮助在一系列任务或对话中保持代理响应的连贯性和相关性。
用户内存存储用户特定的信息和偏好,增强个性化和用户体验。

内存系统如何赋能代理

  1. 上下文感知: 通过短期和上下文记忆,代理能够在对话或任务序列中保持上下文,从而产生更连贯和相关的响应。

  2. 经验积累: 长期记忆使代理能够积累经验,从过去的行动中学习,以改进未来的决策和问题解决。

  3. 实体理解: 通过维护实体记忆,代理能够识别并记住关键实体,增强其处理和交互复杂信息的能力。

在你的团队中实现记忆

在配置一个团队时,您可以启用并自定义每个记忆组件,以适应团队的目标和它将执行的任务的性质。 默认情况下,记忆系统是禁用的,您可以通过在团队配置中设置memory=True来确保其激活。 记忆将默认使用OpenAI嵌入,但您可以通过将embedder设置为不同的模型来更改它。 也可以使用您自己的实例来初始化记忆实例。

'embedder' 仅适用于使用 Chroma 进行 RAG 的短期记忆长期记忆使用 SQLite3 来存储任务结果。目前,无法覆盖这些存储实现。 数据存储文件保存在使用 appdirs 包找到的平台特定位置, 并且可以使用 CREWAI_STORAGE_DIR 环境变量覆盖项目名称。

示例:为团队配置内存

Code
from crewai import Crew, Agent, Task, Process

# Assemble your crew with memory capabilities
my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True
)

示例:使用自定义内存实例,例如 FAISS 作为 VectorDB

Code
from crewai import Crew, Agent, Task, Process

# Assemble your crew with memory capabilities
my_crew = Crew(
    agents=[...],
    tasks=[...],
    process="Process.sequential",
    memory=True,
    long_term_memory=EnhanceLongTermMemory(
        storage=LTMSQLiteStorage(
            db_path="/my_data_dir/my_crew1/long_term_memory_storage.db"
        )
    ),
    short_term_memory=EnhanceShortTermMemory(
        storage=CustomRAGStorage(
            crew_name="my_crew",
            storage_type="short_term",
            data_dir="//my_data_dir",
            model=embedder["model"],
            dimension=embedder["dimension"],
        ),
    ),
    entity_memory=EnhanceEntityMemory(
        storage=CustomRAGStorage(
            crew_name="my_crew",
            storage_type="entities",
            data_dir="//my_data_dir",
            model=embedder["model"],
            dimension=embedder["dimension"],
        ),
    ),
    verbose=True,
)

集成Mem0以增强用户记忆

Mem0 是一个用于LLM应用程序的自我改进内存层,能够实现个性化的AI体验。

要包含用户特定的内存,您可以获取您的API密钥这里并参考文档以添加用户偏好。

Code
import os
from crewai import Crew, Process
from mem0 import MemoryClient

# Set environment variables for Mem0
os.environ["MEM0_API_KEY"] = "m0-xx"

# Step 1: Record preferences based on past conversation or user input
client = MemoryClient()
messages = [
    {"role": "user", "content": "Hi there! I'm planning a vacation and could use some advice."},
    {"role": "assistant", "content": "Hello! I'd be happy to help with your vacation planning. What kind of destination do you prefer?"},
    {"role": "user", "content": "I am more of a beach person than a mountain person."},
    {"role": "assistant", "content": "That's interesting. Do you like hotels or Airbnb?"},
    {"role": "user", "content": "I like Airbnb more."},
]
client.add(messages, user_id="john")

# Step 2: Create a Crew with User Memory

crew = Crew(
    agents=[...],
    tasks=[...],
    verbose=True,
    process=Process.sequential,
    memory=True,
    memory_config={
        "provider": "mem0",
        "config": {"user_id": "john"},
    },
)

内存配置选项

如果你想访问特定的组织和项目,你可以在内存配置中设置org_idproject_id参数。

Code
from crewai import Crew

crew = Crew(
    agents=[...],
    tasks=[...],
    verbose=True,
    memory=True,
    memory_config={
        "provider": "mem0",
        "config": {"user_id": "john", "org_id": "my_org_id", "project_id": "my_project_id"},
    },
)

额外的嵌入提供商

使用OpenAI嵌入(已经是默认设置)

Code
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "openai",
        "config": {
            "model": 'text-embedding-3-small'
        }
    }
)

或者,您可以直接将OpenAIEmbeddingFunction传递给embedder参数。

示例:

Code
from crewai import Crew, Agent, Task, Process
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder=OpenAIEmbeddingFunction(api_key=os.getenv("OPENAI_API_KEY"), model_name="text-embedding-3-small"),
)

使用Ollama嵌入

Code
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "ollama",
        "config": {
            "model": "mxbai-embed-large"
        }
    }
)

使用Google AI嵌入

Code
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "google",
        "config": {
            "api_key": "<YOUR_API_KEY>",
            "model_name": "<model_name>"
        }
    }
)

使用 Azure OpenAI 嵌入

Code
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder=OpenAIEmbeddingFunction(
        api_key="YOUR_API_KEY",
        api_base="YOUR_API_BASE_PATH",
        api_type="azure",
        api_version="YOUR_API_VERSION",
        model_name="text-embedding-3-small"
    )
)

使用Vertex AI嵌入

Code
from chromadb.utils.embedding_functions import GoogleVertexEmbeddingFunction
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder=GoogleVertexEmbeddingFunction(
        project_id="YOUR_PROJECT_ID",
        region="YOUR_REGION",
        api_key="YOUR_API_KEY",
        model_name="textembedding-gecko"
    )
)

使用Cohere嵌入

Code
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "cohere",
        "config": {
            "api_key": "YOUR_API_KEY",
            "model_name": "<model_name>"
        }
    }
)

使用HuggingFace嵌入

Code
from crewai import Crew, Agent, Task, Process

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "huggingface",
        "config": {
            "api_url": "<api_url>",
        }
    }
)

使用Watson嵌入

Code
from crewai import Crew, Agent, Task, Process

# Note: Ensure you have installed and imported `ibm_watsonx_ai` for Watson embeddings to work.

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True,
    embedder={
        "provider": "watson",
        "config": {
            "model": "<model_name>",
            "api_url": "<api_url>",
            "api_key": "<YOUR_API_KEY>",
            "project_id": "<YOUR_PROJECT_ID>",
        }
    }
)

重置内存

crewai reset-memories [OPTIONS]

重置内存选项

选项描述类型默认值
-l, --long重置长期记忆。标志(布尔值)False
-s, --short重置短期记忆。标志(布尔值)False
-e, --entities重置 ENTITIES 内存。标志(布尔值)False
-k, --kickoff-outputs重置最新的KICKOFF任务输出。标志(布尔值)False
-a, --all重置所有记忆。标志(布尔值)False

使用CrewAI内存系统的优势

  • 🦾 自适应学习: 随着时间的推移,团队变得更加高效,适应新信息并改进他们的任务处理方法。
  • 🫡 增强个性化: 记忆功能使代理能够记住用户偏好和历史交互,从而提供个性化的体验。
  • 🧠 提升问题解决能力: 访问丰富的记忆存储有助于代理做出更明智的决策,借鉴过去的学习和上下文洞察。

结论

将CrewAI的记忆系统集成到您的项目中非常简单。通过利用提供的内存组件和配置,您可以快速赋予您的代理记忆、推理和从交互中学习的能力,从而解锁新的智能和能力水平。

这个页面有帮助吗?