本节约处在第四章第一站。没有记忆的多智能体,每跑一个新任务都像失忆重启:前面刚定好的口径、刚查到的背景,下一步全忘。CrewAI 把记忆拆成三种,对应三种不同的"记住什么"。先画清楚三者存什么,才不会被一个 memory=True 误导。

三种记忆的职责边界:
memory=True 即默认启用。最基础的开启方式,给 Agent 和 Crew 都打开 memory:
from crewai import Agent, Task, Crew, Process analyst = Agent( role="分析师", goal="跨任务保持口径一致", backstory="严谨", memory=True, # 开启短期记忆 verbose=True, ) t1 = Task(description="确定 {topic} 的分析口径", expected_output="口径说明", agent=analyst) t2 = Task(description="按口径写分析报告", expected_output="报告", agent=analyst, context=[t1]) crew = Crew(agents=[analyst], tasks=[t1, t2], process=Process.sequential, memory=True) # 4.1 Agent Memory 与状态管理
这里 t2 借助短期记忆知道 t1 定的口径,不用你再把口径文本塞进 context。但注意:短期记忆只在"同一次 kickoff"内有效,两次独立 kickoff 之间不共享。需要跨运行记忆,得上长期记忆后端。
接长期与实体记忆,需要指定存储与嵌入。下面给一个指向向量库的写法(后端名按你实际部署填):
from crewai import Agent, Crew from crewai.memory.long_term.long_term_memory import LongTermMemory from crewai.memory.storage.rag_storage import RAGStorage # 长期记忆后端:用向量库存经验 ltm = LongTermMemory( storage=RAGStorage(embedder_config={"provider": "openai"}, type="long_term"), ) agent = Agent( role="分析师", goal="积累并复用经验", backstory="严谨", memory=True, long_term_memory=ltm, # 注入长期记忆 verbose=True, )
这种写法让 Agent 在多次运行间记住"用户要短句""数据要带来源"等偏好。我们提醒:长期记忆是把双刃剑——它也会记住错误信息并复用。所以后端要能审计、能清空,别让过时经验默默污染新任务。
实体记忆对"同一对象多任务引用"的场景特别有用,比如调研报告里反复提到某公司,实体记忆保证每次提到的属性不矛盾:
from crewai.memory.entity.entity_memory import EntityMemory from crewai.memory.storage.rag_storage import RAGStorage em = EntityMemory(storage=RAGStorage(embedder_config={"provider": "openai"}, type="entity")) agent = Agent(role="研究员", goal="保持一致表述", backstory="细致", memory=True, entity_memory=em, verbose=True)
工程取舍上我们给三条:第一,短期记忆默认开,几乎无副作用;第二,长期记忆只在"确有跨运行复用价值"时开,且后端要可控;第三,实体记忆在涉及多对象、长文本时开,短任务没必要。
一个常见误区是把记忆当"万能补丁",以为开了就不需要 context。不是。context 是显式、确定的数据通路,记忆是隐式、概率的缓存。关键链路永远用 context 钉死,记忆只用来补那些"说不清该传给谁"的软上下文。
收尾提醒:状态管理的本质是"让系统在时间维度上连续"。短期记忆解决一次运行内的连续,长期/实体解决跨运行的连续。第四章后面的持久化(4.5)则解决"运行中断后怎么续",三者层次不同,别混为一谈。
CrewAI 的 memory 分几类:短期记忆(本轮对话)、长期记忆(跨会话)、实体记忆(抽取的关键事实)。开启后 Agent 能引用之前任务里出现过的对象,适合多轮递进的分析。
| 记忆类型 | 作用 | 何时开 |
|---|---|---|
| 短期 | 本轮任务内连贯 | 默认行为,无需特开 |
| 长期 | 跨 kickoff 记住偏好 | 用户画像、持续项目 |
| 实体 | 记住关键实体事实 | 研究类长链路 |
⚠️ 常见坑:开了 memory 却没配 embedder,启动会报嵌入模型缺失。另一个坑是长期记忆不加清理,跑久了存了一堆过期事实,反而误导 Agent。我们按会话维度定期重置。
from crewai import Agent, Crew, Process from crewai.llm import LLM llm = LLM(model="gpt-4o-mini", temperature=0.2) agent = Agent(role="顾问", goal="持续服务同一客户", backstory="记得客户偏好", llm=llm, verbose=True, memory=True) # 开启记忆 crew = Crew(agents=[agent], tasks=[], process=Process.sequential, memory=True, embedder={"provider": "openai"}) # 需配 embedder print(agent.memory is not None)
💡 关键直觉:记忆是"经验",不是"缓存"。它让 Agent 第二趟活儿比第一趟更顺,但经验会过期。把记忆当成会生锈的零件,定期保养(清理/重置)比一直开着更重要。
# 多轮递进:第二轮能引用第一轮抽出的实体 facts = ["客户偏好保守型投资"] agent.memory = True print("记忆开关:", agent.memory)