![[Question]: How to make multi_agents have separate Memoreis while share the same Context?](https://www.chat-gpts.plus/wp-content/uploads/2026/06/21888-297ef423.jpg)
[Question]: How to make multi_agents have separate Memoreis while share the same Context?
快速结论: 在 LlamaIndex 的 AgentWorkflow 中,所有代理默认共享同一个 Memory 实例,无法直接实现“每个代理各自独立的 Memory + 共享全局 Context”。如果确实需要这一模式,推荐改用“代理作为工具(Agents as Tools)”或者自定义 Workflow。
问题场景
用户参考 LlamaIndex 官方文档 中 Pattern 1 – AgentWorkflow 实现多代理系统时,发现所有代理共享相同的 Memory 与 Context。用户期望每个代理能拥有独立的对话记忆,同时在同一个 Workflow 内共享全局上下文(例如任务状态、共享变量)。
报错原文
在 AgentWorkflow 中这不是一个报错,而是设计限制。核心设计逻辑:
— Memory 配置在 Workflow 层级,而非代理层级
— 单个 ChatMemoryBuffer 存储在共享的 Context Store 中
— FunctionAgent 通过 scratchpad_key 维护自己的中间状态
— ReActAgent 通过 reasoning_key 维护自己的推理过程
原因分析
这是 AgentWorkflow 的现有设计,不是一个 Bug。在 llama-index-core/llama_index/core/agent/workflow/multi_agent_workflow.py 第 235–242 行可以看到,Memory (ChatMemoryBuffer) 在整个 Workflow 中是单例的,所有代理的上下文共享同一个缓冲区。每个 FunctionAgent 或 ReActAgent 虽然有自己的内部状态键(例如 scratchpad_key/reasoning_key),但它们仅用于存放该代理执行过程中的中间思考结果,而不实现隔离的对话历史。
环境排查
- LlamaIndex 版本:确认是否使用了包含
AgentWorkflow的版本(约 0.12+)。 - Workflow 模式:确认当前使用的是
AgentWorkflow(Pattern 1),而非其他多代理模式(如 Agents as Tools)。 - Memory 配置位置:检查代码中是否将
ChatMemoryBuffer传递给了 Workflow 整体,而非每个 Agent 单独设置。
解决步骤
- 确认需求是否真的需要:如果只是想让每个代理拥有不同的 中间推理过程(例如各自的 scratchpad 或 reasoning),那么 AgentWorkflow 已经可以满足——每个代理的内部状态键是隔离的。
- 如果需要真正隔离的对话历史(例如 Agent A 的记忆不应被 Agent B 看到),官方推荐以下两种替代方案:
a. Agents as Tools:将独立的 Agent 封装成一个工具,由另一个主 Agent 调用。这样每个子 Agent 可以有自己的 Memory 配置。
b. 自定义 Workflow:继承或自定义一个 Workflow,在Context Store中为每个 Agent 创建独立的ChatMemoryBuffer(例如ctx.store.set("memory_agent_a", ChatMemoryBuffer())),然后在代理执行前手动切换当前使用的 Memory,同时保留共享状态键(如ctx.store.set("state", ...))。 - 对于自定义 Workflow 的简易实现思路(可优先尝试):
- 在
__init__中定义多个ChatMemoryBuffer。 - 在 Workflow 主循环中,根据当前执行的代理 key,从 Context Store 中取出对应的 Memory 并注入到该代理。
- 确保每个代理的步骤间可以读写同一份共享 Context(例如任务列表、全局变量)。
- 在
验证方法
执行一个简单的多轮对话测试:Agent A 说出一个秘密(例如“我的密码是 123”),Agent B 在后续对话中是否能看到该秘密。如果 Agent B 无法读取 Agent A 的历史消息,则说明 Memory 隔离生效。同时检查共享 Context 中的全局状态(如任务进度)是否在所有代理间保持一致。



