CrewAI의 메모리 시스템 소개

crewAI 프레임워크는 AI 에이전트의 능력을 크게 향상시키기 위해 설계된 정교한 메모리 시스템을 도입한다. 이 시스템은 단기 메모리, 장기 메모리, 엔티티 메모리, 컨텍스트 메모리로 구성되며, 각각 에이전트가 과거 상호작용을 기억하고, 추론하고, 학습하는 데 독특한 목적을 제공한다.

메모리 시스템 구성 요소

구성 요소설명
단기 메모리RAG를 사용해 최근 상호작용과 결과를 임시로 저장한다. 에이전트가 현재 실행 중에 관련 정보를 기억하고 활용할 수 있게 한다.
장기 메모리과거 실행에서 얻은 유용한 통찰과 학습 내용을 보존한다. 에이전트가 시간이 지남에 따라 지식을 구축하고 정교화할 수 있게 한다.
엔티티 메모리작업 중 마주친 엔티티(사람, 장소, 개념)에 대한 정보를 캡처하고 조직화한다. 더 깊은 이해와 관계 매핑을 지원한다. RAG를 사용해 엔티티 정보를 저장한다.
컨텍스트 메모리단기 메모리, 장기 메모리, 엔티티 메모리를 결합해 상호작용의 컨텍스트를 유지한다. 일련의 작업이나 대화에서 에이전트 응답의 일관성과 관련성을 높인다.
사용자 메모리사용자별 정보와 선호도를 저장한다. 개인화와 사용자 경험을 향상시킨다.

메모리 시스템이 에이전트에 힘을 실어주는 방식

  1. 상황 인식: 단기 및 상황 메모리를 통해 에이전트는 대화나 작업 시퀀스 동안 상황을 유지할 수 있다. 이로 인해 더 일관적이고 관련성 높은 응답을 제공한다.

  2. 경험 축적: 장기 메모리는 에이전트가 경험을 축적할 수 있게 한다. 과거의 행동을 통해 배우고, 미래의 결정과 문제 해결 능력을 향상시킨다.

  3. 엔티티 이해: 엔티티 메모리를 유지함으로써 에이전트는 주요 엔티티를 인식하고 기억할 수 있다. 이를 통해 복잡한 정보를 처리하고 상호작용하는 능력이 향상된다.

크루에 메모리 기능 구현하기

크루를 구성할 때, 각 메모리 컴포넌트를 활성화하고 크루의 목적과 수행할 작업의 특성에 맞게 커스텀할 수 있다. 기본적으로 메모리 시스템은 비활성화되어 있으며, 크루 설정에서 memory=True로 설정해 활성화할 수 있다. 메모리는 기본적으로 OpenAI 임베딩을 사용하지만, embedder를 다른 모델로 설정해 변경할 수 있다. 또한, 직접 생성한 메모리 인스턴스로 초기화할 수도 있다.

‘embedder’는 단기 메모리에만 적용되며, 단기 메모리는 RAG를 위해 Chroma를 사용한다. 장기 메모리는 작업 결과를 저장하기 위해 SQLite3을 사용한다. 현재는 이러한 스토리지 구현을 재정의할 수 있는 방법이 없다. 데이터 스토리지 파일은 appdirs 패키지를 통해 플랫폼별 특정 위치에 저장되며, CREWAI_STORAGE_DIR 환경 변수를 사용해 프로젝트 이름을 재정의할 수 있다.

예제: Crew를 위한 메모리 설정

from crewai import Crew, Agent, Task, Process

# 메모리 기능을 갖춘 Crew를 조립한다
my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    verbose=True
)

예제: FAISS와 같은 커스텀 메모리 인스턴스를 VectorDB로 사용하기

from crewai import Crew, Process
from crewai.memory import LongTermMemory, ShortTermMemory, EntityMemory
from crewai.memory.storage import LTMSQLiteStorage, RAGStorage
from typing import List, Optional

# 메모리 기능을 갖춘 크루를 조립한다
my_crew: Crew = Crew(
    agents = [...],
    tasks = [...],
    process = Process.sequential,
    memory = True,
    # 세션 간 지속적인 저장을 위한 장기 메모리
    long_term_memory = LongTermMemory(
        storage=LTMSQLiteStorage(
            db_path="/my_crew1/long_term_memory_storage.db"
        )
    ),
    # RAG를 사용한 현재 컨텍스트를 위한 단기 메모리
    short_term_memory = ShortTermMemory(
        storage = RAGStorage(
                embedder_config={
                    "provider": "openai",
                    "config": {
                        "model": 'text-embedding-3-small'
                    }
                },
                type="short_term",
                path="/my_crew1/"
            )
        ),
    ),
    # 엔티티에 대한 주요 정보를 추적하기 위한 엔티티 메모리
    entity_memory = EntityMemory(
        storage=RAGStorage(
            embedder_config={
                "provider": "openai",
                "config": {
                    "model": 'text-embedding-3-small'
                }
            },
            type="short_term",
            path="/my_crew1/"
        )
    ),
    verbose=True,
)

보안 고려 사항

메모리 저장소를 설정할 때 다음 사항을 고려한다:

  • 저장소 경로에는 환경 변수를 사용한다 (예: CREWAI_STORAGE_DIR)
  • 데이터베이스 자격 증명과 같은 민감한 정보를 하드코딩하지 않는다
  • 저장소 디렉터리의 접근 권한을 신중히 설정한다
  • 이식성을 유지하기 위해 가능한 경우 상대 경로를 사용한다

환경 변수를 사용한 예제:

import os
from crewai import Crew
from crewai.memory import LongTermMemory
from crewai.memory.storage import LTMSQLiteStorage

# 환경 변수를 사용해 저장소 경로 설정
storage_path = os.getenv("CREWAI_STORAGE_DIR", "./storage")
crew = Crew(
    memory=True,
    long_term_memory=LongTermMemory(
        storage=LTMSQLiteStorage(
            db_path="{storage_path}/memory.db".format(storage_path=storage_path)
        )
    )
)

설정 예제

기본 메모리 설정

from crewai import Crew
from crewai.memory import LongTermMemory

# 간단한 메모리 설정
crew = Crew(memory=True)  # 기본 저장 위치 사용

커스텀 스토리지 설정

from crewai import Crew
from crewai.memory import LongTermMemory
from crewai.memory.storage import LTMSQLiteStorage

# 커스텀 스토리지 경로 설정
crew = Crew(
    memory=True,
    long_term_memory=LongTermMemory(
        storage=LTMSQLiteStorage(db_path="./memory.db")
    )
)

사용자 메모리 향상을 위한 Mem0 통합

Mem0는 LLM 애플리케이션을 위한 자기 개선형 메모리 레이어로, 개인화된 AI 경험을 가능하게 한다.

사용자별 메모리를 포함하려면 여기에서 API 키를 얻고 문서를 참조해 사용자 선호도를 추가할 수 있다.

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

# Mem0 환경 변수 설정
os.environ["MEM0_API_KEY"] = "m0-xx"

# 1단계: 과거 대화나 사용자 입력을 기반으로 선호도 기록
client = MemoryClient()
messages = [
    {"role": "user", "content": "안녕하세요! 휴가 계획을 세우고 있는데 조언이 필요합니다."},
    {"role": "assistant", "content": "안녕하세요! 휴가 계획을 도와드릴게요. 어떤 종류의 여행지를 선호하시나요?"},
    {"role": "user", "content": "저는 산보다 해변을 더 좋아해요."},
    {"role": "assistant", "content": "흥미롭네요. 호텔과 Airbnb 중 어떤 것을 선호하시나요?"},
    {"role": "user", "content": "저는 Airbnb를 더 좋아해요."},
]
client.add(messages, user_id="john")

# 2단계: 사용자 메모리를 포함한 Crew 생성

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

메모리 설정 옵션

특정 조직과 프로젝트에 접근하려면 메모리 설정에서 org_idproject_id 파라미터를 설정할 수 있다.

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 임베딩 사용 (기본 설정)

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 인자에 직접 전달할 수 있다.

예시:

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={
        "provider": "openai",
        "config": {
            "model": 'text-embedding-3-small'
        }
    }
)

Ollama 임베딩 사용하기

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 임베딩 사용하기

준비사항

Google AI 임베딩을 사용하기 전에 다음 사항을 확인한다:

  • Gemini API 접근 권한
  • 필요한 API 키와 권한

pyproject.toml 의존성을 업데이트해야 한다:

dependencies = [
    "google-generativeai>=0.8.4", #2025년 1월 기준 메인 버전 - crewai v.0.100.0 및 crewai-tools 0.33.0
    "crewai[tools]>=0.100.0,<1.0.0"
]
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": "<model_name>"
        }
    }
)

Azure OpenAI 임베딩 사용하기

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={
        "provider": "openai",
        "config": {
            "api_key": "YOUR_API_KEY",
            "api_base": "YOUR_API_BASE_PATH",
            "api_version": "YOUR_API_VERSION",
            "model_name": 'text-embedding-3-small'
        }
    }
)

Vertex AI 임베딩 사용하기

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={
        "provider": "vertexai",
        "config": {
            "project_id": "YOUR_PROJECT_ID",
            "region": "YOUR_REGION",
            "api_key": "YOUR_API_KEY",
            "model_name": "textembedding-gecko"
        }
    }
)

Cohere 임베딩 사용하기

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": "<model_name>"
        }
    }
)

VoyageAI 임베딩 사용하기

from crewai import Crew, Agent, Task, Process

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

HuggingFace 임베딩 사용하기

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 임베딩 사용하기

from crewai import Crew, Agent, Task, Process

# 참고: Watson 임베딩을 사용하려면 `ibm_watsonx_ai`를 설치하고 임포트해야 한다.

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>",
        }
    }
)

Amazon Bedrock 임베딩 사용하기

# 참고: Bedrock 임베딩을 사용하려면 `boto3`가 설치되어 있어야 한다.

import os
import boto3
from crewai import Crew, Agent, Task, Process

boto3_session = boto3.Session(
    region_name=os.environ.get("AWS_REGION_NAME"),
    aws_access_key_id=os.environ.get("AWS_ACCESS_KEY_ID"),
    aws_secret_access_key=os.environ.get("AWS_SECRET_ACCESS_KEY")
)

my_crew = Crew(
    agents=[...],
    tasks=[...],
    process=Process.sequential,
    memory=True,
    embedder={
        "provider": "bedrock",
        "config":{
            "session": boto3_session,
            "model": "amazon.titan-embed-text-v2:0",
            "vector_dimension": 1024
        }
    },
    verbose=True
)

커스텀 임베딩 함수 추가하기

from crewai import Crew, Agent, Task, Process
from chromadb import Documents, EmbeddingFunction, Embeddings

# 커스텀 임베딩 함수 생성
class CustomEmbedder(EmbeddingFunction):
    def __call__(self, input: Documents) -> Embeddings:
        # 임베딩 생성
        return [1, 2, 3] # 더미 임베딩

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

메모리 초기화

crewai reset-memories [OPTIONS]

메모리 옵션 초기화

옵션설명타입기본값
-l, --long장기 메모리 초기화.플래그 (불리언)False
-s, --short단기 메모리 초기화.플래그 (불리언)False
-e, --entities엔티티 메모리 초기화.플래그 (불리언)False
-k, --kickoff-outputs최신 킥오프 작업 출력 초기화.플래그 (불리언)False
-a, --all모든 메모리 초기화.플래그 (불리언)False

CrewAI 메모리 시스템의 장점

  • 🦾 적응형 학습: 크루는 시간이 지남에 따라 더 효율적으로 변한다. 새로운 정보에 적응하고 작업 방식을 개선한다.
  • 🫡 향상된 개인화: 메모리 기능을 통해 에이전트는 사용자 선호도와 이전 상호작용을 기억한다. 이를 통해 개인화된 경험을 제공한다.
  • 🧠 문제 해결 능력 향상: 풍부한 메모리 저장소에 접근할 수 있어 에이전트는 과거 학습 내용과 상황별 통찰력을 바탕으로 더 나은 결정을 내린다.

결론

CrewAI의 메모리 시스템을 여러분의 프로젝트에 통합하는 것은 간단하다. 제공되는 메모리 컴포넌트와 설정을 활용해 에이전트가 상호작용을 기억하고, 추론하고, 학습할 수 있는 능력을 빠르게 부여할 수 있다. 이를 통해 새로운 수준의 지능과 기능을 구현할 수 있다.