呼和浩特网站建设小程序,网站建设订制版合同模板,石家庄百度首页,网站 盈利模式前言在前几篇中#xff0c;我们的 Agent 已经具备了身体#xff08;架构#xff09;、眼睛#xff08;视觉#xff09;、大脑#xff08;推理#xff09;和双手#xff08;执行#xff09;。但如果它记不住 5 分钟前刚做过什么#xff0c;或者忘记了最初的任务目标我们的 Agent 已经具备了身体架构、眼睛视觉、大脑推理和双手执行。但如果它记不住 5 分钟前刚做过什么或者忘记了最初的任务目标那么它在《荒野大镖客 2》里永远走不出新手村。LLM 本质上是无状态 (Stateless)的。为了让 Agent 拥有连贯的行为Cradle 设计了一套完善的 Memory 系统模拟了人类的短期记忆 (Short-term)和长期记忆 (Long-term)机制。本篇将深入cradle/memory/模块剖析它是如何利用向量数据库和RAG (检索增强生成)技术让 Agent 真正“拥有过去”。1. 记忆的分层架构在阅读源码时你会发现 Cradle 的记忆不是一锅粥而是分层的。这与认知心理学中的模型非常相似短期记忆 (Short-term Memory)作用存储最近 N 步的操作历史。位置直接存在 LLM 的 Context Window (Prompt) 中。形式[(Obs_t-1, Action_t-1), (Obs_t, Action_t), ...]长期记忆 (Long-term Memory)作用存储过去的成功经验、游戏知识、地图信息。位置外部向量数据库 (Vector Database)。形式Embedding(Text Description)-Vector Index2. 短期记忆滑动窗口与 Context 管理由于 GPT-4 的 Context Window 是昂贵且有限的Cradle 不能把几个小时的游戏日志全塞进去。在cradle/agent/agent.py的主循环中Cradle 维护了一个有限长度的队列通常是最近 5-10 步。Python# 伪代码示意短期记忆管理 class Agent: def __init__(self, history_len10): self.short_term_memory collections.deque(maxlenhistory_len) def update_history(self, reasoning, action, result): # 将这一步的“思考-行动-结果”三元组存入 entry { step: self.current_step, reasoning: reasoning, action: action, feedback: result # 比如 action 是否执行成功的 flag } self.short_term_memory.append(entry) def construct_prompt(self): # 组装 Prompt 时只把这 10 步历史转成文本 history_text format_history(self.short_term_memory) return fRecent History:\n{history_text}关键点防止循环死锁 (Loop Deadlock)。如果 Agent 发现自己在最近 5 步一直在重复“撞墙 - 后退 - 撞墙”短期记忆会立刻暴露这个问题触发 LLM 进行Self-Reflection反思并改变策略。3. 长期记忆与 RAG向量检索的魔法这是 Cradle 能够越玩越聪明的核心。随着游戏时间的增加数据量会爆炸。Cradle 使用Embedding (嵌入)技术将文本转化为向量并利用RAG技术按需检索。在cradle/memory/vector_store.py中我们可以看到类似 ChromaDB 或 FAISS 的封装。3.1 技能与知识检索 (Skill Knowledge Retrieval)当 Agent 接到任务“去商店买枪”时它不需要把所有游戏的攻略都加载进内存。检索流程Query: How to buy a gun in RDR2? / Current Task: Buy GunEmbedding: 将 Query 转化为向量。Search: 在数据库中查找与该向量余弦相似度最高的 K 条记录。Result: 检索到相关技能说明比如“与店主对话按右键”。Inject: 将这 K 条技能说明插入 Prompt 的Context部分。3.2 情景记忆 (Episodic Memory)如果 Agent 以前来过这个场景并成功完成过任务它会把当时的成功路径存入长期记忆。当它再次遇到相似场景比如又是这个 UI 界面时RAG 机制会告诉它“嘿上次你在这种界面下点击了右下角的按钮就成功了。”4. 避免“目标遗忘”Goal Drift 的克星在长达数小时的任务中LLM 很容易出现Goal Drift (目标漂移)——做着做着就忘了最初是要干嘛开始被路边的野花吸引。Cradle 在源码层面做了两层锚定Global Goal (全局目标)在 config 或 agent 初始化时设定作为一个常量 (Constant)在每一轮 Prompt 的最顶端System Prompt强制重复。无论发生什么你的终极目标都是完成主线任务‘第二章美国田园诗’。Sub-goal Stack (子目标栈)Cradle 往往维护一个简单的栈结构。Global: 买枪Current Sub: 骑马去镇上Current Atomic: 按 W 上马只有当子目标完成后才会 Pop 出栈Agent 永远聚焦于栈顶任务从而保证执行逻辑的线性与收敛。5. 源码实战Memory 接口定义在cradle/memory/base.py中我们通常能看到这样的抽象接口定义方便开发者替换不同的后端比如从本地 JSON 换成云端的 PineconePythonclass MemoryProvider(ABC): abstractmethod def add(self, content: str, metadata: dict): Embedding content and store it. pass abstractmethod def search(self, query: str, top_k: int 3): Retrieve relevant memories based on similarity. pass abstractmethod def load(self, path: str): Load memory from disk (Persistence). pass6. 总结Cradle 的 Memory 模块展示了 AI Agent 是如何克服“健忘症”的短期记忆利用 Sliding Window 保持对话连贯检测重复错误。长期记忆 (RAG)利用 Vector Store 扩展知识边界实现经验的复用。目标管理利用 Prompt 强化与栈结构防止行为发散。正是这些机制让 Cradle 不再是一个只会条件反射的脚本而是一个随着时间推移经验越来越丰富、操作越来越熟练的“老玩家”。下一篇预告 (大结局)所有的模块都已经拆解完毕。在最后一篇 【Cradle 源码解析六】实战复盘从《荒野大镖客2》看 Agent 的实际运行流 中我们将把之前的拼图全部拼起来通过一次完整的游戏任务流程Trace Log从头到尾复盘数据是如何在这些模块间流转的。