资讯中心

第 7 篇(13-14 章):AI Agent 的记忆与探索 Microsoft Agent Framework

📅 2026/8/6 14:53:41
第 7 篇(13-14 章):AI Agent 的记忆与探索 Microsoft Agent Framework
第 7 篇13-14 章AI Agent 的记忆与探索 Microsoft Agent Framework文章目录第 7 篇13-14 章AI Agent 的记忆与探索 Microsoft Agent Framework一、第 13 章AI Agent 的记忆1. 理解 AI Agent 记忆2. 记忆的实现与存储3. 使 AI Agent 自我改进二、第 14 章探索 Microsoft Agent 框架1. 了解 Microsoft Agent 框架2. Microsoft Agent 框架核心概念3. 高级 MAF 模式4. 在 Microsoft Foundry 上托管 LangChain / LangGraph 代理三、代码示例讲解记忆与框架如何真实落地示例一长期记忆第 13 章① 工作记忆会话线程② 实际运行结果短期记忆译为中文节选③ 长期记忆工具 持久存储④ 实际运行结果长期记忆译为中文节选⑤ 机制总结长期记忆如何跨会话存活⑥ 完整代码示例一示例二MAF 顺序工作流第 14 章① 用 WorkflowBuilder 串联专职代理② 实际运行观察工作流执行译为中文要点③ 机制总结顺序工作流如何组织多代理④ 完整代码示例二本系列「微软《AI Agents for Beginners》实战解读」基于微软官方课程逐章讲解并结合实践扩展。本篇覆盖第 13 章《AI Agent 的记忆》与第 14 章《探索 Microsoft Agent 框架》。文中子标题沿用官方课程原文示例基于 Microsoft Agent FrameworkMAF模型后端为 DeepSeekOpenAI 兼容协议。本篇代码讲解基于真实运行结果结果已译为中文每个示例末尾附完整可运行代码。一、第 13 章AI Agent 的记忆AI 代理的独特优势源于两点调用工具完成任务的能力以及随时间推移的改进能力。记忆是创建能自我改进、为用户创造更好体验的代理的基础。1. 理解 AI Agent 记忆AI Agent 的记忆指允许其保留和回忆信息的机制——对话细节、用户偏好、过往行为、学习到的模式。没有记忆的 AI 应用是无状态的每次交互从零开始导致重复且令人沮丧的体验代理会忘记之前的上下文与偏好。为什么记忆很重要代理的智能与其回忆并利用过去信息的能力密切相关。记忆使代理能够反思从过去行为中学习、互动维持持续对话上下文、主动和反应基于历史预判需求、自主调用存储知识独立操作。目标是让代理更可靠且有能力。记忆类型。课程区分多种记忆类型工作记忆单次任务或思考过程的草稿纸保存执行下一步所需的即时信息。短期记忆会话或会话期间的信息允许代理引用对话中的先前轮次。长期记忆跨多个会话持续保存的信息用户偏好、历史交互、一般知识对个性化至关重要。角色记忆帮助代理发展一致的个性或角色。工作流程/情节记忆保存复杂任务中采取的步骤序列成功与失败用于从经验中学习。实体记忆从对话中提取并记忆具体实体人物、地点、事物与事件。结构化 RAG从各种来源提取密集结构化信息并用以提升回答精度依赖信息固有结构而非仅语义相似性。理论扩展记忆与认知模型。上述分类对应认知科学的三层记忆模型——工作记忆短暂、容量有限、短期记忆会话期、长期记忆持久。工程上前两者对应会话上下文与线程后者需外部持久存储数据库、向量库并通过工具暴露给代理。2. 记忆的实现与存储为代理实现记忆涉及系统化的记忆管理过程生成、存储、检索、整合、更新甚至遗忘。检索尤为关键。专用记忆工具。Mem0。作为持久记忆层使代理回忆相关交互、保存用户偏好通过两阶段流水线提取与更新工作先总结对话历史并提取新记忆再基于 LLM 决定添加/修改/删除存储于向量、图与键值混合数据存储。Cognee。开源的 AI 代理语义记忆将结构化与非结构化数据转换为嵌入支持的可查询知识图谱。双存储架构结合向量相似性搜索与图关系支持混合检索——既理解信息相似性又理解概念间关联。理论扩展检索-增强记忆。长期记忆的工程实现本质是 RAG——将记忆写入向量库检索时按语义相关度召回并注入上下文与第 05 章 RAG 管线同构。Mem0 与 Cognee 的区别在于记忆结构化程度前者以混合存储为主后者以知识图谱显式建模实体关系。3. 使 AI Agent 自我改进自我改进代理的常见模式是引入知识代理独立代理观察用户与主代理的对话其职责为识别有价值信息判断对话中是否有值得保存的内容通用知识或用户偏好。提取和总结萃取关键学习或偏好。存入知识库持久化到向量数据库以便后续检索。增强未来查询新查询时检索相关内容并附加到提示类似 RAG。理论扩展延迟与成本优化。自我改进需控制开销先以廉价快速的模型判断信息是否有存储价值仅在必要时调用复杂的提取/检索流程对增长的知识库可将较少使用的信息迁移至冷存储以控制成本。二、第 14 章探索 Microsoft Agent 框架Microsoft Agent FrameworkMAF是微软用于构建 AI 代理的统一框架兼顾生产与研究场景。1. 了解 Microsoft Agent 框架MAF 支持多种编排场景顺序代理编排逐步工作流、并发编排代理同时完成任务、群聊编排代理协同完成单一任务、交接编排代理完成子任务后相互交接、磁性编排主管代理创建修改任务列表并协调子代理。为在生产中交付代理MAF 提供可观测性OpenTelemetry 追踪每个动作、安全性角色访问控制、私有数据处理、内容安全、持久性线程与工作流可暂停、恢复、从错误恢复、控制权人机协同工作流任务可标记需人工审批。MAF 注重互操作性云无关容器/本地/多云、提供商无关Azure OpenAI、OpenAI 等 SDK、集成开放标准A2A、MCP、插件与连接器Fabric、SharePoint、Pinecone、Qdrant 等数据与内存服务。理论扩展框架的能力维度。MAF 的能力可归纳为四个维度——编排组织多代理拓扑、运维可观测性、持久性、安全、互操作开放标准与跨提供商、扩展插件与连接器。这构成生产级代理框架的完整能力模型。2. Microsoft Agent 框架核心概念代理。代理通过定义推理服务LLM 提供商、指令与name创建。可用多种服务创建Azure OpenAI、OpenAI、兼容端点并支持基于 A2A 协议的远程代理。代理通过.run或.run_stream运行。工具。工具在定义代理时指定也可在运行时指定仅对单次运行生效。代理线程。线程处理多轮对话可通过get_new_thread()创建并被序列化存储、反序列化恢复。代理中间件。中间件允许在代理与工具/LLM 交互时执行操作函数中间件在函数调用前后执行如日志记录、聊天中间件在发送请求给 LLM 前后执行。代理记忆。MAF 提供多种记忆内存存储应用运行期间线程内、持久消息跨会话存储对话历史、动态记忆运行前添加到上下文可存储于 Mem0 等外部服务。代理可观测性。MAF 集成 OpenTelemetry提供跟踪与计量。工作流。MAF 提供由预定义步骤组成的工作流以 AI 代理作为组件。核心组件包括执行器接收输入、执行、输出与边定义消息流向——直接边、条件边、开关-条件边、分发边、合并边并提供内置执行事件启动、输出、错误、执行器调用/完成等。理论扩展工作流与 DAG。工作流将代理组织为有向无环图DAG——执行器为节点边为数据流。条件边、分发边、合并边分别对应条件路由、扇出、扇入拓扑构成复杂编排的基础原语。3. 高级 MAF 模式构建复杂代理时可考虑的高级模式中间件组合链式连接多个中间件实现日志、认证、限流、工作流检查点利用事件与序列化保存/恢复长时运行进程、动态工具选择结合工具描述的 RAG 与工具注册仅展示相关工具、多代理交接利用工作流边与条件路由协调专职代理交接。4. 在 Microsoft Foundry 上托管 LangChain / LangGraph 代理MAF 具备框架互操作性——已有用 LangChain/LangGraph 构建的代理可作为 Foundry 托管代理运行由 Foundry 管理运行时、会话、扩展、身份与协议端点代理逻辑仍保持于 LangGraph。这通过langchain_azure_ai.agents.hosting包实现暴露编译后的 LangGraph 图通过 Foundry 托管代理使用的协议通信。理论扩展托管抽象。该能力体现框架无关设计——代理的业务逻辑图、工具、状态与运行基础设施托管、身份、协议端点解耦。开发者可用惯用框架构建逻辑再交由统一平台承载运维关注点。三、代码示例讲解记忆与框架如何真实落地以下代码取自课程官方示例已适配 DeepSeek 后端并附实际运行结果译为中文。重点回答长期记忆如何让代理跨会话记住用户工作流又如何组织多代理协作示例一长期记忆第 13 章① 工作记忆会话线程先用会话线程演示短期记忆——同一session传入多次run代理保持多轮上下文sessionagent.create_session()print(awaitagent.run(我喜欢海滩目的地预算3000美元,sessionsession))print(awaitagent.run(我刚才说的预算是多少,sessionsession))② 实际运行结果短期记忆译为中文节选用户我喜欢海滩目的地预算3000美元 代理已记入你的档案海滩目的地是你的偏好总旅行预算 3000 美元。 为了推荐完美海滩能否帮我缩小范围出行日期从哪飞单人/情侣/家庭全包度假村还是精品酒店 用户我刚才说的预算是多少 代理你提到本次旅行的预算是 3000 美元。要我据此继续规划还是有需要调整的③ 长期记忆工具 持久存储短期记忆随会话结束而消失。长期记忆通过工具把偏好写入外部存储跨会话可用preference_store:dict[str,list[str]]{}tool(approval_modenever_require)defsave_preference(user_id:Annotated[str,用户标识],preference:Annotated[str,要记住的偏好])-str:保存用户偏好到长期记忆。preference_store.setdefault(user_id,[]).append(preference)returnf已存储{preference}tool(approval_modenever_require)defget_preferences(user_id:Annotated[str,用户标识])-str:读取用户已保存的偏好。prefspreference_store.get(user_id,[])return保存的偏好\n- \n- .join(prefs)ifprefselsef无{user_id}的偏好记录④ 实际运行结果长期记忆译为中文节选会话1我是 Sarah正在规划 10 周年结婚纪念旅行喜欢浪漫目的地、精致餐饮与水疗 丈夫行动不便需要无障碍住宿预算每晚 700-800 美元 代理提前祝你周年快乐已保存你的全部偏好 - 场合10 周年结婚纪念 - 风格浪漫目的地 - 餐饮精致餐饮 - 放松水疗体验 - 无障碍需要无障碍住宿行动需求 - 预算约 700-800 美元/晚 会话1续我们素食且有严重坚果过敏请记录 代理已记录Sarah素食与严重坚果过敏未来所有推荐都会注意。 查看存储内容用户 sarah_johnson_123 的偏好 10周年结婚纪念 / 浪漫目的地 / 精致餐饮 / 水疗体验 / 无障碍住宿丈夫行动不便/ 每晚700-800美元 / 素食 / 严重坚果过敏 会话2全新对话线程——你好我和丈夫要规划另一趟旅行能推荐酒店吗 代理很高兴帮你规划下一次旅行我从你的档案中看到——这是 10 周年结婚纪念 你喜欢浪漫目的地、精致餐饮与水疗我会优先考虑无障碍住宿并控制在 700-800 美元/晚预算内。 请问目的地和日期 即使这是全新的对话线程代理仍从长期记忆取回了 Sarah 的偏好。⑤ 机制总结长期记忆如何跨会话存活结合代码与运行结果会话1线程A→ save_preference 工具 → 偏好写入持久存储 → 会话结束线程A 短期记忆消失 会话2全新线程B→ get_preferences 工具 → 从存储读回偏好 → 注入上下文 → 代理记得Sarah即使线程已换三个关键机制工具即接口长期记忆不依赖会话而是通过save_preference/get_preferences工具访问外部存储——工具是代理与持久层之间的桥。存储独立于会话偏好存于preference_store生产为 Mem0/向量库线程结束不丢失因此全新线程仍记得。注入时机系统提示要求代理会话开始先调get_preferences检查——记忆在需要时被主动检索并注入上下文类似 RAG。⑥ 完整代码示例一importasynciofromtypingimportAnnotatedfromagent_frameworkimporttoolfrom_deepseekimportmake_client preference_store:dict[str,list[str]]{}tool(approval_modenever_require)defsave_preference(user_id:Annotated[str,用户标识],preference:Annotated[str,要记住的偏好])-str:保存用户偏好到长期记忆。preference_store.setdefault(user_id,[]).append(preference)returnf已存储{preference}tool(approval_modenever_require)defget_preferences(user_id:Annotated[str,用户标识])-str:读取用户已保存的偏好。prefspreference_store.get(user_id,[])return保存的偏好\n- \n- .join(prefs)ifprefselsef无{user_id}的偏好记录asyncdefmain():agentmake_client().as_agent(tools[save_preference,get_preferences],name记忆代理,instructions用户告知偏好时用 save_preference 保存会话开始先用 get_preferences 检查已存偏好。,)# 会话1保存 Sarah 的偏好session_1agent.create_session()print(awaitagent.run(我是Sarah正在规划10周年结婚纪念旅行喜欢浪漫目的地、精致餐饮与水疗丈夫行动不便需无障碍住宿预算每晚700-800美元。,sessionsession_1))print(awaitagent.run(我们素食且有严重坚果过敏请记录。,sessionsession_1))# 会话2全新线程验证长期记忆session_2agent.create_session()print(awaitagent.run(你好我和丈夫要规划另一趟旅行能推荐酒店吗,sessionsession_2))if__name____main__:asyncio.run(main())示例二MAF 顺序工作流第 14 章① 用 WorkflowBuilder 串联专职代理WorkflowBuilder把多个专职代理串成流水线前一代理输出自动流入后一代理fromagent_frameworkimportWorkflowBuilder front_deskclient.as_agent(namefront-desk-agent,instructions推荐一座城市的最佳景点。)conciergeclient.as_agent(nameconcierge-agent,instructions审查景点并给出评分与建议。)workflow(WorkflowBuilder(start_executorfront_desk).add_edge(front_desk,concierge).build())② 实际运行观察工作流执行译为中文要点 处理斯德哥尔摩的景点推荐 [前端代理] 推荐瓦萨博物馆Vasa Museum—— 一座海事博物馆馆内陈列着近乎完整打捞的 17 世纪战舰1628 年沉没、1961 年打捞。 [礼宾代理] 审查瓦萨博物馆—— 专业评估斯德哥尔摩最具标志性的必看景点战舰的规模与工艺令人叹为观止 建议至少预留两小时从多个楼层欣赏清晨到访可避开人流 备选景点斯德哥尔摩老城…… 信息交接 流程分析用户 → 前端代理推荐→ 礼宾代理审查评分共 2 个代理信息从前端推荐交接给礼宾输入。真实运行观察本次运行中工作流执行成功前端代理 → 礼宾代理完成交接与审查但结构化输出的 Pydantic 校验出现失败——模型输出的 JSON 字段name/description与定义的 Schemaattraction_name/city不匹配。这揭示了真实生产的常见问题模型并不总能严格遵循输出 Schema结构化输出需要兜底与容错对应第 10 章评估与第 12 章上下文验证。③ 机制总结顺序工作流如何组织多代理结合代码与运行观察WorkflowBuilder(start_executor前端) → add_edge(前端, 礼宾) → build() → 前端输出自动流入礼宾信息交接 → 两个代理各司其职推荐 vs 审查指令聚焦 → 结构化输出需要容错Schema 可能不被严格遵循三个关键机制有向图编排节点为代理、边为数据流add_edge声明前端 → 礼宾信息自动交接。职责隔离前端专注推荐礼宾专注审查——每个代理指令简单质量高于全能代理。容错意识真实运行暴露了结构化输出的脆弱性——生产系统必须对 Schema 校验失败设计回退如重新生成、宽松解析、人工复核。④ 完整代码示例二importasynciofromagent_frameworkimportWorkflowBuilderfrom_deepseekimportmake_clientasyncdefmain():clientmake_client()front_deskclient.as_agent(namefront-desk-agent,instructions你是知识渊博的酒店前台当客人询问某城市景点时推荐一个热门旅游景点并说明亮点。,)conciergeclient.as_agent(nameconcierge-agent,instructions你是精通全球景点的礼宾。对收到的景点推荐给出专家审查与评分并建议替代景点。,)workflow(WorkflowBuilder(start_executorfront_desk).add_edge(front_desk,concierge).build())asyncforeventinworkflow.run(I want to visit an attraction in Stockholm,streamTrue):ifevent.typeoutput:print(getattr(event.data,text,event.data),end,flushTrue)print()if__name____main__:asyncio.run(main())运行前提已按第 1 篇完成环境配置——创建.envDEEPSEEK_API_KEY填入开发者自有密钥与_deepseek.py共享客户端并执行pip install agent-framework python-dotenv openai。