313 分钟

Agent 记忆系统 + 多智能体协作

理解三类记忆及工程实现、掌握摘要记忆模式、了解多 Agent 协作四种模式与主流框架对比(AutoGen/CrewAI/LangGraph)。

AgentMemory多智能体AutoGenCrewAILangGraph
进度保存在本机浏览器;验收通过后再点更稳妥

第16课:Agent 记忆系统 + 多智能体协作

本节目标:理解三类记忆(工作/短期/长期)及工程实现、掌握摘要记忆模式、了解多 Agent 协作四种模式与主流框架对比。

上篇的 Agent 每次对话都是"失忆"的。这一课给它装上记忆系统,再让它学会和别的 Agent 协作。


1. 三类记忆

code
Working Memory   (工作记忆) ← 当前对话上下文(Prompt 里的消息)
Short-term Memory(短期记忆) ← 本次会话历史(滑窗/摘要)
Long-term Memory (长期记忆) ← 跨会话的持久知识(向量化)

2. 短期记忆的三种实现

① 滑窗记忆

java
ChatMemory memory = MessageWindowChatMemory.withMaxMessages(20);
// 永远保留最近 20 条

问题:早期信息丢失。

② Token 限制记忆

java
ChatMemory memory = TokenWindowChatMemory.builder()
    .maxTokens(4000, tokenizer)
    .build();

优势:精确控制成本,但同样丢早期信息。

③ 摘要记忆(推荐 )

code
触发条件:消息超过 N 条或 token 超过阈值
动作:
  1. 取最早的 K 条
  2. LLM 生成摘要:"用户问了 X,助手回答了 Y"
  3. 用摘要替换原消息
  4. 摘要 + 最近消息 = 新的 context
java
public class SummaryChatMemory implements ChatMemory {
    private List<ChatMessage> messages = new ArrayList<>();
    private String summary = "";

    public void add(ChatMessage msg) {
        messages.add(msg);
        if (countTokens(messages) > THRESHOLD) {
            // 前一半消息做摘要
            List<ChatMessage> toSummarize = messages.subList(0, messages.size()/2);
            summary = llm.summarize(summary, toSummarize);
            messages = new ArrayList<>(messages.subList(messages.size()/2, messages.size()));
        }
    }

    public List<ChatMessage> messages() {
        List<ChatMessage> result = new ArrayList<>();
        if (!summary.isEmpty()) {
            result.add(SystemMessage.from("之前对话摘要:" + summary));
        }
        result.addAll(messages);
        return result;
    }
}

3. 长期记忆:向量化用户事实

Code
用户对话历史
  → LLM 提取关键事实:"用户偏好疏肝解郁的方剂"
  → 向量化存入数据库
  → 新对话 → 检索相关事实 → 注入 system prompt

这和 ChatGPT 的 Memory 功能是一模一样的原理。

java
public void extractAndStore(Long userId, List<ChatMessage> conversation) {
    String facts = llm.generate("""
        从以下对话中提取关于用户的关键事实(偏好、症状等),每条一行:
        %s
        """.formatted(format(conversation)));

    for (String fact : facts.split("\n")) {
        float[] embedding = embedding.embed(fact);
        memoryRepo.save(userId, fact, embedding);
    }
}

记忆设计的反模式

Code
把所有历史无脑塞 context  → token 爆炸
完全靠摘要 → 细节丢失
长期记忆不更新 → 用户信息过时

正确做法:
  - 工作记忆:滑窗 + 摘要混合
  - 长期记忆:向量化 + 时间衰减 + 定期归并

4. 多智能体协作

为什么需要多 Agent?

单 Agent 局限:一个 LLM 既思考又决策又执行,能力天花板低。多 Agent 优势:专业分工、并行执行、互相纠错、可扩展。

四种协作模式

Code
模式 1:层级式(Hierarchical)
       Manager Agent
      /      |      \
   Worker  Worker  Worker
  → 适用:复杂任务编排

模式 2:流水线式(Sequential)
  Agent A → Agent B → Agent C → Output
  → 适用:步骤明确的流程

模式 3:辩论式(Debate)
  Agent A 提出 → Agent B 反驳 → Agent A 修正 → Judge 裁决
  → 适用:需要严谨推理

模式 4:群体讨论式(Group Chat)
  [Manager] 问题 → [Expert A] 我认为... → [Critic] 你们有漏洞...
  → 适用:开放式问题

主流框架对比

框架出品方抽象难度推荐度
AutoGen微软对话驱动推荐
CrewAI社区角色+任务推荐
LangGraphLangChain图编排推荐
MetaGPT社区SOP+角色推荐
SwarmOpenAI函数移交极低推荐

选型建议

Code
原型/业务 → CrewAI(5分钟上手)
复杂研究 → AutoGen(灵活强大)
生产工作流 → LangGraph(最可控)
教学/轻量 → Swarm

5. Agent 设计八大原则

  1. 单一职责——每个 Agent/Tool 只做一件事
  2. 最小工具集——工具越多选错率越高
  3. 明确终止条件——max_iterations + 退出逻辑
  4. 错误优雅降级——工具失败告诉 LLM 原因
  5. 可观测性优先——每一步都要有日志
  6. 成本意识——简单问题别上 Agent,分层路由
  7. 安全边界——危险操作必须 HITL 人工确认
  8. 评估驱动——先有评估集再优化

核心要点

  1. 三类记忆:工作(滑窗)→ 短期(摘要)→ 长期(向量化)
  2. 摘要记忆是性价比之王:兼顾完整性和成本
  3. 多 Agent 协作四模式:层级/流水线/辩论/群体讨论
  4. 框架选型:原型用 CrewAI,生产用 LangGraph
  5. 八大设计原则——特别是"最小工具集"和"可观测性优先"

下一课:GraphRAG —— 知识图谱增强 RAG。