我们是如何为智能体系统构建“认知记忆”的
许多智能体系统每次运行都从零开始,系统及其智能体重复发现相同的上下文、调用相同的工具、犯相同的错误,一次又一次。
João (Joe) Moura
每一次。这不仅效率低下,而且为智能体系统所能实现的目标设置了一个巨大的上限。
最明显的解决办法是在系统中附加某种记忆功能,存储所有内容,通过向量相似度检索,然后听天由命。
但是,幼稚的记忆实现会产生其自身的问题,例如上下文膨胀、过时的信息污染新的执行过程,智能体产生幻觉,到最后你用一个问题换来了更糟糕的问题。
我们经历过这些,CrewAI 处理着数十亿次智能体执行,我们看到了将记忆视为存储问题时会发生什么,也看到了不这样做时会发生什么。
因此,我们从头重构了整个记忆系统,专注于真正支持生产级智能体系统。它不再是一个带有搜索层的数据库,而是一个认知过程:一个能够选择性编码、解决自身矛盾、主动遗忘,并知道何时自己“不知道”的过程。我们有机会使用 LanceDB 作为该实现的数据库底座,这带来了许多令人惊喜的收获,从安装极其简便、运行快速,到其极具前沿性的特性。
以下是我们如何构建它以及如何使用它。
为什么幼稚的记忆反而让问题变得更糟
市场针对无状态智能体的回答是:将记忆作为一种服务附加进来,存储一切,进行嵌入,并按相似度检索。有些方法做得比较干净,另一些则只给你一个带有命名空间的键值存储,剩下的全靠你自己。
更复杂的方案会构建临时知识图谱,跟踪事实发生的时间——这些基础设施都很令人印象深刻,但它们终究只是基础设施。
这种模式在各地如出一辙:记忆被视为存储和检索问题。开发者负责决定什么值得记住,如何组织它,检索结果何时具备足够的置信度以采取行动,以及当两个记忆相互冲突时该怎么办。你的智能体在周一学到了一件事,周五学到了另一件冲突的事。现在它两者都记得。
而且,这些方案都没有问那个真正重要的问题:检索结果是否足以支撑行动?它们都会返回结果,但没有一个会说:“我不确定,让我深入查找一下。”
这就是当你把记忆视为数据而非认知时,在大规模场景下会发生的情况。
记忆即认知,而非存储
人类的记忆工作方式不是存储一切并按相似度搜索,而是选择性地编码,决定什么重要以及它适合放在哪里;它会进行整合,解决已知信息与新学知识之间的冲突。它以自适应的方式检索,有时瞬间完成,有时通过逐步推导已知信息得出结论。并且它会遗忘,这并非意外,而是因为遗忘是保持记忆有效性的关键。
如果你仔细思考,记忆本身就非常像一个智能体系统,这正是我们遵循的模型。CrewAI 的全新“认知记忆”(Cognition Memory)系统围绕五个认知操作构建:编码(encode)、整合(consolidate)、回溯(recall)、提取(extract)和遗忘(forget)。每一个都是一个主动过程,而不是被动的读写。因此,当你存储一段记忆时,系统会分析其内容、分配重要性、检测矛盾,并将其放入一个自组织的层级结构中。当你检索时,系统会评估自身的置信度,并决定是否需要进一步深挖。

结果形成了五个方法。以下是完整的 API。
CrewAI 的认知记忆
CrewAI 全新的认知记忆本身就是一个智能体系统,它在后台使用了 CrewAI Flows,实现了完全的“内嵌”。它可以在你的所有智能体系统中使用。
你可以在单个智能体上使用它。
在 Crew 中开启它,所有的智能体都会自动加载并持久化跨任务的记忆,它们还可以作为工具主动地进行记忆和回溯,以处理重要的上下文。
在 Flow 中使用它,你将获得一个补充状态的持久化层,其中状态(State)处理单次运行中的瞬态数据,而记忆(Memory)处理应该在多次运行中持续积累的内容。
下面实现中另一个很酷的地方是,你可以随身携带它,让不同的智能体访问相同的记忆,同时设置不同的回溯偏好。例如,通过对构成回溯的组件(如记忆的半衰期等)赋予不同的权重来实现。
原生实现包含一个极其简单的 DSL(领域特定语言),延续了 CrewAI 的一贯风格,因此上述五个认知操作映射为五个方法:
from crewai.memory import Memory
# New Coginitive Memory Class
memory = Memory()
# Adding new memories directly
memory.remember("We decided to use PostgreSQL for the user database.")
# Recalling memories directly
results = memory.recall("What database are we using?")
# Extracting memorable facts from a string
facts = memory.extract_memories("Long text with many possible facts")
# Getting the memory tree
memory.tree()
# Forget certain memories
from datetime import datetime, timedelta
memory.forget(scope="/", older_than=datetime.utcnow() - timedelta(days=30))每个方法都会触发其专属的认知流水线。
remember() 不仅仅是存储,它还会分析你正在保存的内容,检测与已有知识的矛盾,并解决它们。
recall() 不仅仅是搜索,它还会评估自身的置信度,并在不确定时深入查找。
记忆系统本身就是智能化的,每一次操作都是一个推理过程,而非简单的读或写。
在 Crew 中,只需一行代码
crew = Crew(
agents=[researcher, analyst],
tasks=[...],
memory=True,
)智能体在执行每个任务前加载相关上下文,并在完成后持久化所学内容。它们还可以将 remember 和 recall 作为工具使用,智能体自身决定何时值得存储或何时需要过往上下文。系统默认处理持久化,当智能体有更好的判断时则由它接管。
在 Flow 中
class ResearchFlow(Flow):
@start()
def research(self):
past = self.recall("previous findings on this topic")
self.remember(f"Found: {findings}", scope="/research")
@listen(research)
def analyze(self):
context = self.recall("all research findings")对于那些本来就应该被记住的事情,不要再过度设计状态了。可以将状态视为当前重要的事情,而记忆视为下次重要的事情。
现在让我们来看看底层究竟发生了什么。
深入记忆底层:两个认知流
有两个主要的智能体系统驱动着这种认知记忆:编码流(Encoding Flow)和回溯流(Recall Flow)。
编码智能体系统
当你调用 remember() 时,CrewAI Flow 会运行一个编码流水线,分析内容并生成一个 MemoryAnalysis。
class MemoryAnalysis(BaseModel):
scope: str # Where this belongs in the hierarchy
categories: list # What this is about
importance: float # How much this matters (0-1)系统会决定记忆属于哪里、它是关于什么的以及它的重要性,完全无需你指定。没有预设的架构,结构实际上是由系统自身产生的。当然,当你想要控制时,也可以覆盖作用域、类别和重要性。

每一个 remember() 调用也会触发针对现有记忆的相似度搜索,这与人类学习新事物并找到将它们聚类在一起的方法、甚至基于此推断出新信息的方式非常相似。
示例演练
上个月你存储了“我们使用 PostgreSQL 作为用户数据库”。现在你正在存储“我们上周迁移到了 MySQL”。
在其他系统中,两者会共存,检索结果像掷硬币。而在认知记忆中,整合逻辑会检测到相似性,识别出矛盾,并生成一个计划:更新旧记录的内容,保留迁移的上下文,删除过时的陈述事实,这样你得到的是一个连贯的记忆,而不是两个竞争的记忆。
在 CrewAI 的记忆中,编码流中的整合步骤检测到相似性,识别出矛盾,并生成一个计划:更新旧记录的内容,保留迁移上下文,删除过时的事实,最终你得到的是一个连贯的记忆,而非两个相互冲突的记忆。

回溯智能体系统
回溯流做了两件其他系统没做的事:它根据真正重要的内容对结果进行评分,并且它知道何时需要深入搜索。
复合评分融合了三个信号,而不仅仅是一个:相似度、时效性和重要性。它为每个信号应用特定的权重(你可以在记忆的访问层完全控制和自定义这些权重,而记忆本身保持不变)。
score = (similarity × w_sim) + (recency × w_rec) + (importance × w_imp)这就是为什么六个月前的一个关键架构决策,优先级会高于昨天的一条随便提到“数据库”的琐碎笔记。纯向量搜索会返回那条琐碎笔记,但认知复合评分会返回那个决策。
它会分析查询,选择搜索的作用域,检索候选结果,然后评估自身的置信度。如果需要,它会深入搜索、扩大搜索范围,并尝试不同的策略,同时将缺失的内容作为 evidence_gaps(证据缺口)进行记录。

原子化记忆
智能体思考的不是干净、独立的事实。例如,一个研究智能体可能会返回 500 字的摘要,而分析师可能会生成一份涵盖六个主题的报告。如果你将这些视为单一记忆进行存储,你就会回到“数据块”的老问题:当你只需要一个事实时,检索会拉取所有内容,而且整合逻辑也无法解决埋在段落里的矛盾。
作为我们全新认知记忆的一部分,我们提供了从智能体执行和更大的文本块中提取记忆的能力。extract_memories() 可以将原始输出分解为自包含的原子事实。
raw = """After reviewing the infrastructure options, the team
recommends PostgreSQL for the user database due to its JSONB
support. Estimated cost is $2,400/month on RDS. The compliance
team flagged that all user data must stay in EU regions.
DevOps prefers managed services over self-hosted to reduce
on-call burden."""
facts = memory.extract_memories(raw)
# → "Team recommends PostgreSQL for user database due to JSONB support"
# → "Estimated database cost is $2,400/month on RDS"
# → "Compliance requires all user data to remain in EU regions"
# → "DevOps prefers managed services over self-hosted"在上面的例子中,每个提取出的事实都独立进入完整的认知流水线。数据库推荐以高重要性编码在 /infrastructure/database 下,而合规性要求则在 /compliance 下拥有自己的作用域。因此,当你后来存储“我们要切换到 MySQL”时,整合逻辑会专门针对 PostgreSQL 的推荐进行处理,而不是针对一个同时包含成本估算和团队偏好的大块文本。
这也是推动 Crew 中自动记忆的功能。当智能体以 memory=True 完成任务时,系统会对输出运行提取程序,将其分解为原子事实,并将每一项喂给编码和整合逻辑。你只需写一个标志,系统为你处理一切。
这带来了什么变革
真正的转变不在于你的智能体能记住事情,而在于你的智能体系统能够产生复利效应。
没有记忆时,每次运行都是独立的,成本、延迟、发现过程和上限大致相同。但使用认知记忆,每一次运行都会让下一次变得更好。一个处理了成千上万张客户工单的智能体,不仅仅是拥有了一千条记忆,它还整合了模式、解决了矛盾、构建了关于什么重要的层级结构。因此,第 1,001 次运行从根本上不同于第 1 次——它更快、更便宜、更可靠,因为系统已经学习并进化了。
这也彻底改变了你能构建的东西。
从纠正中学习的“人在回路”系统。带有 @human_feedback(learn=True) 的 Flow 不仅仅是收集审批,它会将每一次修正提炼成可泛化的经验教训并存储在记忆中。下一次运行,系统会回溯这些经验,并在人类看到输出之前就应用它们。过去需要重写每一份草稿的审查员现在只需批准,因为系统已经学会了他们关心什么。
积累专业知识的研究系统。每周运行一次的研究 Flow 不再每次从零开始,它回溯之前发现的内容,识别发生了什么变化,并专注于增量。经过几次执行后,它做的不再仅仅是研究,而是在维护一个随着每个周期不断完善的动态知识库。
具备共享理解的多智能体团队。智能体共享记忆但回溯方式不同:规划智能体权衡重要性,而执行智能体权衡时效性。因此,你拥有相同的知识,但可以通过不同的视角来利用它。就像一个团队,架构师记住原则,而工程师记住上个冲刺期交付了什么。
从执行转向探索的系统。这可能是最大的飞跃:无状态智能体只能执行——给定输入,产生输出。拥有认知记忆的智能体可以探索、尝试一种方法、记住什么有效、并在下次运行中进行精炼。它们发展策略。它们变得越来越擅长“如何变得更好”。
在这篇文章中描述的每一个认知操作——编码、整合、自适应回溯,本身都是一个 CrewAI Flow。这个记忆系统是一个构建在与你构建自己系统相同的平台上的智能体系统。这太棒了,我们能用自己的产品来构建我们的产品,这证明了当问题难到足以挑战时,架构是经得起考验的。
亲自试一试!
只需简单地
pip install crewai然后你可以在 Python shell 中用单个智能体快速尝试
from crewai import Agent
agent = Agent(
role="Technical Advisor",
goal="Help the team make infrastructure decisions",
backstory="Senior engineer with deep knowledge of agentic systems",
memory=True
)
agent.kickoff("what are the benefits of using CrewAI to build agentic systems?")之后,你就可以在同一目录中导航查看运行生成的所有记忆了
crewai memory