跳转到主要内容

文档索引

获取完整文档索引: https://docs.crewai.com.cn/llms.txt

在深入了解之前,请使用此文件来浏览所有可用页面。

概述

CrewAI 提供了一个统一记忆系统——一个单一的 Memory 类,取代了传统的短期、长期、实体和外部记忆类型,整合为一个智能 API。记忆系统在保存内容时使用大语言模型 (LLM) 进行分析(推断范围、类别和重要性),并支持基于语义相似度、时效性和重要性复合评分的自适应深度回忆。 您可以以四种方式使用记忆:独立使用(脚本、Notebook)、配合 Crew 使用配合智能体 (Agent) 使用,或在 Flow 中使用

快速入门

from crewai import Memory

memory = Memory()

# Store -- the LLM infers scope, categories, and importance
memory.remember("We decided to use PostgreSQL for the user database.")

# Retrieve -- results ranked by composite score (semantic + recency + importance)
matches = memory.recall("What database did we choose?")
for m in matches:
    print(f"[{m.score:.2f}] {m.record.content}")

# Tune scoring for a fast-moving project
memory = Memory(recency_weight=0.5, recency_half_life_days=7)

# Forget
memory.forget(scope="/project/old")

# Explore the self-organized scope tree
print(memory.tree())
print(memory.info("/"))

四种使用记忆的方式

独立使用 (Standalone)

在脚本、Notebook、CLI 工具中或作为独立知识库使用,无需智能体或 Crew。
from crewai import Memory

memory = Memory()

# Build up knowledge
memory.remember("The API rate limit is 1000 requests per minute.")
memory.remember("Our staging environment uses port 8080.")
memory.remember("The team agreed to use feature flags for all new releases.")

# Later, recall what you need
matches = memory.recall("What are our API limits?", limit=5)
for m in matches:
    print(f"[{m.score:.2f}] {m.record.content}")

# Extract atomic facts from a longer text
raw = """Meeting notes: We decided to migrate from MySQL to PostgreSQL
next quarter. The budget is $50k. Sarah will lead the migration."""

facts = memory.extract_memories(raw)
# ["Migration from MySQL to PostgreSQL planned for next quarter",
#  "Database migration budget is $50k",
#  "Sarah will lead the database migration"]

for fact in facts:
    memory.remember(fact)

配合 Crew 使用

设置 memory=True 以使用默认配置,或传入已配置的 Memory 实例以实现自定义行为。
from crewai import Crew, Agent, Task, Process, Memory

# Option 1: Default memory
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential,
    memory=True,
    verbose=True,
)

# Option 2: Custom memory with tuned scoring
memory = Memory(
    recency_weight=0.4,
    semantic_weight=0.4,
    importance_weight=0.2,
    recency_half_life_days=14,
)
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    memory=memory,
)
memory=True 时,Crew 会创建一个默认的 Memory() 并自动传入 Crew 的 embedder 配置。除非智能体有其专用的记忆,否则 Crew 中的所有智能体将共享 Crew 的记忆。 在每次任务完成后,Crew 会自动从任务输出中提取离散事实并将其存储。在每次任务开始前,智能体会从记忆中检索相关背景信息,并将其注入到任务提示词中。

配合智能体 (Agent) 使用

智能体可以使用 Crew 共享的记忆(默认),也可以获得用于私有背景信息的受限视图。
from crewai import Agent, Memory

memory = Memory()

# Researcher gets a private scope -- only sees /agent/researcher
researcher = Agent(
    role="Researcher",
    goal="Find and analyze information",
    backstory="Expert researcher with attention to detail",
    memory=memory.scope("/agent/researcher"),
)

# Writer uses crew shared memory (no agent-level memory set)
writer = Agent(
    role="Writer",
    goal="Produce clear, well-structured content",
    backstory="Experienced technical writer",
    # memory not set -- uses crew._memory when crew has memory enabled
)
此模式使研究员智能体拥有私有发现,而撰稿智能体则可以从共享的 Crew 记忆中读取信息。

在 Flow 中使用

每个 Flow 都内置了记忆功能。在任何 flow 方法中均可使用 self.remember(), self.recall()self.extract_memories()
from crewai.flow.flow import Flow, listen, start

class ResearchFlow(Flow):
    @start()
    def gather_data(self):
        findings = "PostgreSQL handles 10k concurrent connections. MySQL caps at 5k."
        self.remember(findings, scope="/research/databases")
        return findings

    @listen(gather_data)
    def write_report(self, findings):
        # Recall past research to provide context
        past = self.recall("database performance benchmarks")
        context = "\n".join(f"- {m.record.content}" for m in past)
        return f"Report:\nNew findings: {findings}\nPrevious context:\n{context}"
有关 Flow 中记忆功能的更多信息,请参阅 Flows 文档

层级化作用域 (Hierarchical Scopes)

什么是作用域

记忆以类似文件系统的层级树状结构组织。每个作用域都是一个路径,例如 /, /project/alpha/agent/researcher/findings
/
  /company
    /company/engineering
    /company/product
  /project
    /project/alpha
    /project/beta
  /agent
    /agent/researcher
    /agent/writer
作用域提供了依赖于上下文的记忆——当您在作用域内进行回忆时,系统仅搜索该树分支,这提高了搜索精度和性能。

作用域推断的工作原理

当您调用 remember() 而未指定作用域时,LLM 会分析内容和现有的作用域树,并建议最佳位置。如果没有合适的作用域,它会自动创建一个新作用域。随着时间推移,作用域树会根据内容有机增长,您无需预先设计模式。
memory = Memory()

# LLM infers scope from content
memory.remember("We chose PostgreSQL for the user database.")
# -> might be placed under /project/decisions or /engineering/database

# You can also specify scope explicitly
memory.remember("Sprint velocity is 42 points", scope="/team/metrics")

可视化作用域树

print(memory.tree())
# / (15 records)
#   /project (8 records)
#     /project/alpha (5 records)
#     /project/beta (3 records)
#   /agent (7 records)
#     /agent/researcher (4 records)
#     /agent/writer (3 records)

print(memory.info("/project/alpha"))
# ScopeInfo(path='/project/alpha', record_count=5,
#           categories=['architecture', 'database'],
#           oldest_record=datetime(...), newest_record=datetime(...),
#           child_scopes=[])

MemoryScope:子树视图

MemoryScope 将所有操作限制在树的一个分支内。使用它的智能体或代码只能在该子树内查看和写入。
memory = Memory()

# Create a scope for a specific agent
agent_memory = memory.scope("/agent/researcher")

# Everything is relative to /agent/researcher
agent_memory.remember("Found three relevant papers on LLM memory.")
# -> stored under /agent/researcher

agent_memory.recall("relevant papers")
# -> searches only under /agent/researcher

# Narrow further with subscope
project_memory = agent_memory.subscope("project-alpha")
# -> /agent/researcher/project-alpha

作用域设计的最佳实践

  • 由浅入深,让 LLM 进行组织。 不要预先过度设计作用域层级。从 memory.remember(content) 开始,让 LLM 的作用域推断功能随着内容的积累构建结构。
  • 使用 /{entity_type}/{identifier} 模式。 自然的层级结构通常源于如 /project/alpha, /agent/researcher, /company/engineering, /customer/acme-corp 这样的模式。
  • 按关注点而非数据类型划分作用域。 使用 /project/alpha/decisions 而非 /decisions/project/alpha,这样可以将相关内容放在一起。
  • 保持层级浅显(2-3 级)。 过深的嵌套作用域会变得过于稀疏。/project/alpha/architecture 是好的,而 /project/alpha/architecture/decisions/databases/postgresql 则太深了。
  • 明确已知的作用域,未知时交给 LLM 推断。 如果要存储已知的项目决策,请传入 scope="/project/alpha/decisions"。如果存储的是非结构化的智能体输出,则省略作用域,让 LLM 处理。

用例示例

多项目团队
memory = Memory()
# Each project gets its own branch
memory.remember("Using microservices architecture", scope="/project/alpha/architecture")
memory.remember("GraphQL API for client apps", scope="/project/beta/api")

# Recall across all projects
memory.recall("API design decisions")

# Or within a specific project
memory.recall("API design", scope="/project/beta")
具有共享知识的各智能体私有背景
memory = Memory()

# Researcher has private findings
researcher_memory = memory.scope("/agent/researcher")

# Writer can read from both its own scope and shared company knowledge
writer_view = memory.slice(
    scopes=["/agent/writer", "/company/knowledge"],
    read_only=True,
)
客户支持(按客户划分上下文)
memory = Memory()

# Each customer gets isolated context
memory.remember("Prefers email communication", scope="/customer/acme-corp")
memory.remember("On enterprise plan, 50 seats", scope="/customer/acme-corp")

# Shared product docs are accessible to all agents
memory.remember("Rate limit is 1000 req/min on enterprise plan", scope="/product/docs")

记忆分片 (Memory Slices)

什么是分片

MemorySlice 是跨越多个可能不连续作用域的视图。与作用域(仅限单个子树)不同,分片允许您同时从多个分支进行回忆。

何时使用分片与作用域

  • 作用域:当智能体或代码块应受限于单个子树时使用。示例:只能查看 /agent/researcher 的智能体。
  • 分片:当需要合并来自多个分支的上下文时使用。示例:读取自身作用域和共享公司知识的智能体。

只读分片

最常见的模式:给予智能体对多个分支的读取权限,但不允许其写入共享区域。
memory = Memory()

# Agent can recall from its own scope AND company knowledge,
# but cannot write to company knowledge
agent_view = memory.slice(
    scopes=["/agent/researcher", "/company/knowledge"],
    read_only=True,
)

matches = agent_view.recall("company security policies", limit=5)
# Searches both /agent/researcher and /company/knowledge, merges and ranks results

agent_view.remember("new finding")  # Raises PermissionError (read-only)

读写分片

禁用只读模式后,您可以写入包含的任何作用域,但必须明确指定目标作用域。
view = memory.slice(scopes=["/team/alpha", "/team/beta"], read_only=False)

# Must specify scope when writing
view.remember("Cross-team decision", scope="/team/alpha", categories=["decisions"])

复合评分

回忆结果按三个信号的加权组合进行排序:
composite = semantic_weight * similarity + recency_weight * decay + importance_weight * importance
维度:
  • 相似度 (similarity) = 向量索引的 1 / (1 + distance) (0 到 1)
  • 衰减 (decay) = 0.5^(age_days / half_life_days) — 指数衰减(今天为 1.0,半衰期时为 0.5)
  • 重要性 (importance) = 记录的重要性评分(0 到 1),在编码时设定
直接在 Memory 构造函数上进行配置
# Sprint retrospective: favor recent memories, short half-life
memory = Memory(
    recency_weight=0.5,
    semantic_weight=0.3,
    importance_weight=0.2,
    recency_half_life_days=7,
)

# Architecture knowledge base: favor important memories, long half-life
memory = Memory(
    recency_weight=0.1,
    semantic_weight=0.5,
    importance_weight=0.4,
    recency_half_life_days=180,
)
每个 MemoryMatch 都包含一个 match_reasons 列表,以便您了解结果排名依据(例如 ["semantic", "recency", "importance"])。

LLM 分析层

记忆系统通过三种方式使用 LLM:
  1. 保存时 — 当您省略作用域、类别或重要性时,LLM 会分析内容并建议作用域、类别、重要性及元数据(实体、日期、主题)。
  2. 回忆时 — 对于深度/自动回忆,LLM 会分析查询(关键词、时间提示、建议的作用域、复杂度)以引导检索。
  3. 提取记忆extract_memories(content) 将原始文本(如任务输出)拆解为离散的记忆陈述。智能体在对每个陈述调用 remember() 之前使用此方法,从而存储原子事实,而非存储一大段文本。
如果 LLM 调用失败,所有分析将优雅降级 — 请参阅 故障行为

记忆整合

在保存新内容时,编码流水线会自动检查存储中是否存在类似记录。如果相似度超过 consolidation_threshold(默认 0.85),LLM 会决定如何处理:
  • 保留 (keep) — 现有记录仍然准确且不冗余。
  • 更新 (update) — 现有记录应使用新信息更新(LLM 提供合并后的内容)。
  • 删除 (delete) — 现有记录过时、被取代或存在矛盾。
  • 插入新记录 (insert_new) — 新内容是否应作为单独的记录插入。
这防止了重复积累。例如,如果您保存了三次“CrewAI 确保操作可靠”,整合机制会识别重复项并只保留一条记录。

批内去重

使用 remember_many() 时,同一批次内的项目在存入存储前会进行相互比较。如果两项的余弦相似度 >= batch_dedup_threshold(默认 0.98),后一项会被静默丢弃。这无需 LLM 调用(仅通过向量数学)即可在单批次内捕获精确或近乎精确的重复项。
# Only 2 records are stored (the third is a near-duplicate of the first)
memory.remember_many([
    "CrewAI supports complex workflows.",
    "Python is a great language.",
    "CrewAI supports complex workflows.",  # dropped by intra-batch dedup
])

非阻塞保存

remember_many()非阻塞的 — 它将编码流水线提交给后台线程并立即返回。这意味着智能体可以在记忆保存的同时继续执行下一项任务。
# Returns immediately -- save happens in background
memory.remember_many(["Fact A.", "Fact B.", "Fact C."])

# recall() automatically waits for pending saves before searching
matches = memory.recall("facts")  # sees all 3 records

读取屏障

每次 recall() 调用都会在搜索前自动调用 drain_writes(),确保查询始终能看到最新的持久化记录。这是透明的,您无需担心此逻辑。

Crew 关闭

当 Crew 结束时,kickoff() 会在其 finally 块中清空所有待处理的记忆保存,因此即使 Crew 在后台保存任务进行时完成,也不会丢失保存内容。

独立使用

对于没有 Crew 生命周期的脚本或 Notebook,请显式调用 drain_writes()close()
memory = Memory()
memory.remember_many(["Fact A.", "Fact B."])

# Option 1: Wait for pending saves
memory.drain_writes()

# Option 2: Drain and shut down the background pool
memory.close()

来源与隐私

每条记忆记录都可以带有用于来源追踪的 source 标签和用于访问控制的 private 标志。

来源追踪

source 参数标识了记忆的来源。
# Tag memories with their origin
memory.remember("User prefers dark mode", source="user:alice")
memory.remember("System config updated", source="admin")
memory.remember("Agent found a bug", source="agent:debugger")

# Recall only memories from a specific source
matches = memory.recall("user preferences", source="user:alice")

私有记忆

私有记忆仅在 source 匹配时才会出现在回忆结果中。
# Store a private memory
memory.remember("Alice's API key is sk-...", source="user:alice", private=True)

# This recall sees the private memory (source matches)
matches = memory.recall("API key", source="user:alice")

# This recall does NOT see it (different source)
matches = memory.recall("API key", source="user:bob")

# Admin access: see all private records regardless of source
matches = memory.recall("API key", include_private=True)
这在多用户或企业部署中非常有用,可以确保不同用户的记忆得到隔离。

RecallFlow(深度回忆)

recall() 支持两种深度:
  • depth="shallow" — 直接使用复合评分进行向量搜索。速度快 (~200ms),无 LLM 调用。
  • depth="deep"(默认) — 运行多步 RecallFlow:查询分析、作用域选择、并行向量搜索、基于置信度的路由以及在置信度较低时进行可选的递归探索。
智能跳过 LLM:短于 query_analysis_threshold(默认 200 字符)的查询会完全跳过 LLM 查询分析(即使在深度模式下)。像“我们使用什么数据库?”这样的短查询本身就是很好的搜索短语,LLM 分析带来的价值很小。这为典型的短查询每次回忆节省了约 1-3 秒。只有较长的查询(如完整的任务描述)才会经过 LLM 提炼并转化为目标子查询。
# Shallow: pure vector search, no LLM
matches = memory.recall("What did we decide?", limit=10, depth="shallow")

# Deep (default): intelligent retrieval with LLM analysis for long queries
matches = memory.recall(
    "Summarize all architecture decisions from this quarter",
    limit=10,
    depth="deep",
)
控制 RecallFlow 路由器的置信度阈值是可配置的。
memory = Memory(
    confidence_threshold_high=0.9,   # Only synthesize when very confident
    confidence_threshold_low=0.4,    # Explore deeper more aggressively
    exploration_budget=2,            # Allow up to 2 exploration rounds
    query_analysis_threshold=200,    # Skip LLM for queries shorter than this
)

嵌入器 (Embedder) 配置

记忆系统需要一个嵌入模型将文本转换为用于语义搜索的向量。您可以通过三种方式配置它。

直接传入 Memory

from crewai import Memory

# As a config dict
memory = Memory(embedder={"provider": "openai", "config": {"model_name": "text-embedding-3-small"}})

# As a pre-built callable
from crewai.rag.embeddings.factory import build_embedder
embedder = build_embedder({"provider": "ollama", "config": {"model_name": "mxbai-embed-large"}})
memory = Memory(embedder=embedder)

通过 Crew Embedder 配置

当使用 memory=True 时,Crew 的 embedder 配置会自动传入。
from crewai import Crew

crew = Crew(
    agents=[...],
    tasks=[...],
    memory=True,
    embedder={"provider": "openai", "config": {"model_name": "text-embedding-3-small"}},
)

提供商示例

memory = Memory(embedder={
    "provider": "openai",
    "config": {
        "model_name": "text-embedding-3-small",
        # "api_key": "sk-...",  # or set OPENAI_API_KEY env var
    },
})
memory = Memory(embedder={
    "provider": "ollama",
    "config": {
        "model_name": "mxbai-embed-large",
        "url": "https://:11434/api/embeddings",
    },
})
memory = Memory(embedder={
    "provider": "azure",
    "config": {
        "deployment_id": "your-embedding-deployment",
        "api_key": "your-azure-api-key",
        "api_base": "https://your-resource.openai.azure.com",
        "api_version": "2024-02-01",
    },
})
memory = Memory(embedder={
    "provider": "google-generativeai",
    "config": {
        "model_name": "gemini-embedding-001",
        # "api_key": "...",  # or set GOOGLE_API_KEY env var
    },
})
memory = Memory(embedder={
    "provider": "google-vertex",
    "config": {
        "model_name": "gemini-embedding-001",
        "project_id": "your-gcp-project-id",
        "location": "us-central1",
    },
})
memory = Memory(embedder={
    "provider": "cohere",
    "config": {
        "model_name": "embed-english-v3.0",
        # "api_key": "...",  # or set COHERE_API_KEY env var
    },
})
memory = Memory(embedder={
    "provider": "voyageai",
    "config": {
        "model": "voyage-3",
        # "api_key": "...",  # or set VOYAGE_API_KEY env var
    },
})
memory = Memory(embedder={
    "provider": "amazon-bedrock",
    "config": {
        "model_name": "amazon.titan-embed-text-v1",
        # Uses default AWS credentials (boto3 session)
    },
})
memory = Memory(embedder={
    "provider": "huggingface",
    "config": {
        "model_name": "sentence-transformers/all-MiniLM-L6-v2",
    },
})
memory = Memory(embedder={
    "provider": "jina",
    "config": {
        "model_name": "jina-embeddings-v2-base-en",
        # "api_key": "...",  # or set JINA_API_KEY env var
    },
})
memory = Memory(embedder={
    "provider": "watsonx",
    "config": {
        "model_id": "ibm/slate-30m-english-rtrvr",
        "api_key": "your-watsonx-api-key",
        "project_id": "your-project-id",
        "url": "https://us-south.ml.cloud.ibm.com",
    },
})
# Pass any callable that takes a list of strings and returns a list of vectors
def my_embedder(texts: list[str]) -> list[list[float]]:
    # Your embedding logic here
    return [[0.1, 0.2, ...] for _ in texts]

memory = Memory(embedder=my_embedder)

提供商参考

提供商Key典型模型注意
OpenAIopenaitext-embedding-3-small默认。需设置 OPENAI_API_KEY
Ollamaollamamxbai-embed-large本地运行,无需 API 密钥。
Azure OpenAIazuretext-embedding-ada-002需要 deployment_id
Google AIgoogle-generativeaigemini-embedding-001需设置 GOOGLE_API_KEY
Google Vertexgoogle-vertexgemini-embedding-001需要 project_id
Coherecohereembed-english-v3.0强大的多语言支持。
VoyageAIvoyageaivoyage-3针对检索进行了优化。
AWS Bedrockamazon-bedrockamazon.titan-embed-text-v1使用 boto3 凭据。
Hugging Facehuggingfaceall-MiniLM-L6-v2本地 sentence-transformers。
Jinajinajina-embeddings-v2-base-en需设置 JINA_API_KEY
IBM WatsonXwatsonxibm/slate-30m-english-rtrvr需要 project_id
Sentence Transformersentence-transformerall-MiniLM-L6-v2本地,无需 API 密钥。
Customcustom需要 embedding_callable

LLM 配置

记忆系统使用 LLM 进行保存分析(作用域、类别、重要性推断)、整合决策和深度回忆查询分析。您可以配置所使用的模型。
from crewai import Memory, LLM

# Default: gpt-4o-mini
memory = Memory()

# Use a different OpenAI model
memory = Memory(llm="gpt-4o")

# Use Anthropic
memory = Memory(llm="anthropic/claude-3-haiku-20240307")

# Use Ollama for fully local/private analysis
memory = Memory(llm="ollama/llama3.2")

# Use Google Gemini
memory = Memory(llm="gemini/gemini-2.0-flash")

# Pass a pre-configured LLM instance with custom settings
llm = LLM(model="gpt-4o", temperature=0)
memory = Memory(llm=llm)
LLM 是延迟加载的——仅在首次需要时创建。这意味着 Memory() 在构建时绝不会失败,即使未设置 API 密钥也是如此。错误仅在实际调用 LLM 时才会出现(例如在没有明确作用域/类别的情况下保存,或在深度回忆期间)。 对于完全离线/私有的操作,请对 LLM 和嵌入器都使用本地模型:
memory = Memory(
    llm="ollama/llama3.2",
    embedder={"provider": "ollama", "config": {"model_name": "mxbai-embed-large"}},
)

存储后端

  • 默认:LanceDB,存储在 ./.crewai/memory 下(如果设置了环境变量 $CREWAI_STORAGE_DIR,则为该路径,或者您可以传入 storage="path/to/dir")。
  • 自定义后端:实现 StorageBackend 协议(请参阅 crewai.memory.storage.backend)并将实例传入 Memory(storage=your_backend)

发现

检查作用域层级、类别和记录。
memory.tree()                        # Formatted tree of scopes and record counts
memory.tree("/project", max_depth=2) # Subtree view
memory.info("/project")              # ScopeInfo: record_count, categories, oldest/newest
memory.list_scopes("/")              # Immediate child scopes
memory.list_categories()             # Category names and counts
memory.list_records(scope="/project/alpha", limit=20)  # Records in a scope, newest first

故障行为

如果 LLM 在分析期间失败(网络错误、速率限制、响应无效),记忆系统会优雅降级:
  • 保存分析 — 记录警告,记忆仍以默认作用域 /、空类别和重要性 0.5 存储。
  • 提取记忆 — 完整内容作为单条记忆存储,确保不会丢失信息。
  • 查询分析 — 回忆回退到简单的作用域选择和向量搜索,以便您仍然能获得结果。
这些分析失败不会抛出异常;只有存储或嵌入器失败才会抛出异常。

隐私说明

记忆内容会发送给已配置的 LLM 进行分析(保存时的作用域/类别/重要性推断,以及查询分析和可选的深度回忆)。对于敏感数据,请使用本地 LLM(如 Ollama)或确保您的提供商符合您的合规性要求。

记忆事件

所有记忆操作都会发出 source_type="unified_memory" 的事件。您可以监听计时、错误和内容。
事件描述关键属性
MemoryQueryStartedEvent查询开始query, limit
MemoryQueryCompletedEvent查询成功query, results, query_time_ms
MemoryQueryFailedEvent查询失败query, error
MemorySaveStartedEvent保存开始value, metadata
MemorySaveCompletedEvent保存成功value, save_time_ms
MemorySaveFailedEvent保存失败value, error
MemoryRetrievalStartedEvent智能体检索开始task_id
MemoryRetrievalCompletedEvent智能体检索完成task_id, memory_content, retrieval_time_ms
示例:监控查询时间
from crewai.events import BaseEventListener, MemoryQueryCompletedEvent

class MemoryMonitor(BaseEventListener):
    def setup_listeners(self, crewai_event_bus):
        @crewai_event_bus.on(MemoryQueryCompletedEvent)
        def on_done(source, event):
            if getattr(event, "source_type", None) == "unified_memory":
                print(f"Query '{event.query}' completed in {event.query_time_ms:.0f}ms")

故障排除

记忆未持久化?
  • 确保存储路径可写(默认 ./.crewai/memory)。传入 storage="./your_path" 以使用其他目录,或设置环境变量 CREWAI_STORAGE_DIR
  • 使用 Crew 时,请确认已设置 memory=Truememory=Memory(...)
回忆缓慢?
  • 对于常规智能体上下文,请使用 depth="shallow"。将 depth="deep" 保留用于复杂查询。
  • 增加 query_analysis_threshold 以跳过更多查询的 LLM 分析。
日志中出现 LLM 分析错误?
  • 记忆仍能以安全默认值保存/回忆。如果您需要完整的 LLM 分析,请检查 API 密钥、速率限制和模型可用性。
日志中出现后台保存错误?
  • 记忆保存运行在后台线程中。错误会作为 MemorySaveFailedEvent 发出,但不会导致智能体崩溃。检查日志以确定根本原因(通常是 LLM 或嵌入器连接问题)。
并发写入冲突?
  • LanceDB 操作通过共享锁进行序列化,并会在冲突时自动重试。这处理了指向同一个数据库的多个 Memory 实例(例如智能体记忆 + Crew 记忆)。无需采取额外操作。
从终端浏览记忆
crewai memory                              # Opens the TUI browser
crewai memory --storage-path ./my_memory   # Point to a specific directory
重置记忆(例如用于测试)
crew.reset_memories(command_type="memory")  # Resets unified memory
# Or on a Memory instance:
memory.reset()                    # All scopes
memory.reset(scope="/project/old")  # Only that subtree

配置参考

所有配置均作为关键字参数传递给 Memory(...)。每个参数都有合理的默认值。
参数默认值描述
llm"gpt-4o-mini"用于分析的 LLM(模型名称或 BaseLLM 实例)。
storage"lancedb"存储后端("lancedb"、路径字符串或 StorageBackend 实例)。
embedderNone (OpenAI 默认)嵌入器(配置字典、可调用对象或 None 表示 OpenAI 默认)。
recency_weight0.3复合评分中时效性的权重。
semantic_weight0.5复合评分中语义相似度的权重。
importance_weight0.2复合评分中重要性的权重。
recency_half_life_days30时效性评分减半所需的天数(指数衰减)。
consolidation_threshold0.85保存时触发整合的相似度阈值。设为 1.0 可禁用。
consolidation_limit5整合过程中进行比较的最大现有记录数。
default_importance0.5未提供且 LLM 分析被跳过时分配的重要性值。
batch_dedup_threshold0.98remember_many() 批处理中丢弃近重复项的余弦相似度。
confidence_threshold_high0.8超过此回忆置信度时,直接返回结果。
confidence_threshold_low0.5低于此回忆置信度时,触发更深层的探索。
complex_query_threshold0.7对于复杂查询,在此置信度之下进行更深层探索。
exploration_budget1深度回忆期间 LLM 驱动的探索轮数。
query_analysis_threshold200深度回忆期间,短于此字符数的查询将跳过 LLM 分析。