尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

smolagents 记忆管理实战:回放、动态修改与分步执行 Agent 的完整指南

smolagents 记忆管理实战:回放、动态修改与分步执行 Agent 的完整指南 人工智能AI AgentAgent 框架工具调用代码智能体MCP ClientsAgent 沙箱【免费下载链接】smolagents smolagents: a barebones library for agents that think in code.项目地址https://gitcode.com/gh_mirrors/smo/smolagents点击查看免费下载记忆是 Agent 的核心组件之一。一个 Agent 可以简单定义为工具 提示词 记忆它不仅拥有调用工具的能力更重要的是具备对过往步骤的记忆能够追溯完整的规划、执行与错误历史。本篇指南围绕 docs/source/zh/tutorials/memory.md 展开结合 smolagents 源码深入讲解如何回放 Agent 的运行记录、如何在运行过程中动态读写与修改记忆以及如何按步step by step手动驱动 Agent——读完你可以在自己的多步 Agent 应用中实现记忆审查、token 优化与长任务断点执行。记忆在 Agent 中的角色从结构看起在动手之前先理解 smolagents 中记忆的底层模型。Agent 的记忆由 src/smolagents/memory.py 中的AgentMemory类承载它包含两个核心属性system_prompt一个SystemPromptStep对象保存系统提示词steps一个列表依次存放 Agent 执行过程中产生的各类步骤对象。所有步骤都继承自MemoryStep基类当前仓库中主要有以下几种步骤类型步骤类字段要点含义TaskSteptask、task_images一个新的任务及其可选图片ActionStepstep_number、timing、model_output、tool_calls、code_action、observations、observations_images、error、token_usage、is_final_answer等Agent 思考、行动、观察结果的一个完整执行步PlanningStepplan、model_input_messages、model_output_message、timing、token_usage规划步骤用于生成/更新计划SystemPromptStepsystem_prompt系统提示词步骤FinalAnswerStepoutput最终答案步骤从 src/smolagents/agents.py 的_run_streamL540-L611可以看到Agent 每完成一步包括规划步骤都会把对应的PlanningStep或ActionStep追加到agent.memory.steps并调用_finalize_step写入时间戳与触发回调。而在每次向模型发起请求之前write_memory_to_messagesL758-L770会把整个记忆转换成消息列表喂给 LLM——这就是记忆决定上下文的直接体现。由于 src/smolagents/init.py 中from .memory import *你可以直接通过from smolagents import ActionStep, TaskStep, ...导入这些步骤类型。回放 Agent 的记忆审查一次运行运行一个 Agent 之后最基础的需求是回顾它到底做了什么。smolagents 提供了两种方式插装instrumentation可视化界面通过 OpenTelemetry 标准将运行过程输出到可视化监控平台支持对特定步骤进行缩放详见 插装指南inspect_runs。agent.replay()命令行回放直接在控制台以结构化文本重放整段记忆。使用 agent.replay()在 Agent 完成运行之后只需一行代码即可回放最近一次运行from smolagents import InferenceClientModel, CodeAgent agent CodeAgent(tools[], modelInferenceClientModel(), verbosity_level0) result agent.run(Whats the 20th Fibonacci number?) # 回放最近一次运行 agent.replay()从源码看agent.replay(detailedFalse)src/smolagents/agents.py L859-L866实际上代理给AgentMemory.replay(logger, detailed)src/smolagents/memory.py L248-L271其行为要点依次打印系统提示词、每个TaskStep、每个ActionStep含步骤号、模型输出以及PlanningStep含计划内容detailedTrue时会额外打印每一步的model_input_messages模型实际接收到的完整消息可精确复现每一步的输入但日志长度会指数级膨胀源码注释明确警告仅用于调试。导出整段代码与步骤数据除回放外AgentMemory还提供两个实用的审查方法return_full_code()src/smolagents/memory.py L273-L277把记忆里所有ActionStep的code_action拼接成一个完整脚本返回方便检查 Agent 实际执行的全部代码对应测试见 tests/test_memory.py 的test_return_all_code_actions。get_full_steps()/get_succinct_steps()前者返回包含model_input_messages的完整步骤字典列表后者剔除模型输入消息、仅保留精简表示适合序列化存档或传给他处。动态修改 Agent 的记忆许多高级应用场景需要对记忆进行动态读写例如注入另一套上下文、清理过时的中间产物以节省 token或在执行中途修正某一步的错误。直接访问记忆对象agent.memory暴露了全部记忆你可以像操作普通 Python 对象一样读取它from smolagents import ActionStep system_prompt_step agent.memory.system_prompt print(The system prompt given to the agent was:) print(system_prompt_step.system_prompt) task_step agent.memory.steps[0] print(\n\nThe first task step was:) print(task_step.task) for step in agent.memory.steps: if isinstance(step, ActionStep): if step.error is not None: print(f\nStep {step.step_number} got this error:\n{step.error}\n) else: print(f\nStep {step.step_number} got these observations:\n{step.observations}\n)注意agent.memory.steps[0]通常是TaskStep由run()在启动时追加ActionStep从第 1 步开始。还可以用agent.memory.get_full_steps()拿到完整的步骤字典数据例如传给监控系统或序列化保存。记忆不仅可读也可写直接对steps列表、某个步骤的字段如observations、observations_images赋值即可。因为后续模型请求会通过write_memory_to_messages重新读取记忆所以任何修改都会立即影响 Agent 的下一步行为。通过步骤回调step callbacks动态修改记忆更强大、更自动化的方式是步骤回调。回调函数可以直接在参数中拿到agent对象因此能够访问任意记忆步骤并按需修改。一个经典场景监控网页浏览 Agent 每一步的屏幕截图只保留最新截图、删除旧步骤的图片从而节省 token 消耗。原文档给出了精炼版示例而仓库中的完整可运行实现位于 src/smolagents/vision_web_browser.pyL66-L84完整版如下import helium import PIL.Image from io import BytesIO from time import sleep def save_screenshot(memory_step: ActionStep, agent: CodeAgent) - None: sleep(1.0) # 等待 JavaScript 动画完成后再截图 driver helium.get_driver() current_step memory_step.step_number if driver is not None: # 删除旧步骤的截图保持日志精简、节省 token for previous_memory_step in agent.memory.steps: if isinstance(previous_memory_step, ActionStep) and previous_memory_step.step_number current_step - 2: previous_memory_step.observations_images None png_bytes driver.get_screenshot_as_png() image PIL.Image.open(BytesIO(png_bytes)) print(fCaptured a browser screenshot: {image.size} pixels) memory_step.observations_images [image.copy()] # 必须 copy确保引用在步骤结束后仍有效 # 把当前 URL 一并写入观测 url_info fCurrent url: {driver.current_url} memory_step.observations ( url_info if memory_step.observations is None else memory_step.observations \n url_info )随后在初始化 Agent 时把回调函数传入step_callbacks参数CodeAgent( tools[WebSearchTool(), go_back, close_popups, search_item_ctrl_f], modelmodel, additional_authorized_imports[helium], step_callbacks[save_screenshot], max_steps20, verbosity_level2, )回调机制的源码原理step_callbacks的底层实现是 src/smolagents/memory.py 中的CallbackRegistry初始化逻辑位于 src/smolagents/agents.py 的_setup_step_callbacksL416-L434传入列表[callback1, callback2, ...]时全部注册到ActionStep上向后兼容传入字典{step_cls: callback}时可以针对TaskStep、PlanningStep等具体步骤类分别注册回调无论是否显式传入Monitor.update_metrics都会被默认注册到ActionStep上用于指标采集。回调在_finalize_stepL620-L623中通过self.step_callbacks.callback(memory_step, agentself)触发。CallbackRegistry.callback还做了签名兼容处理只接收一个参数的回调只拿到memory_step接收多个参数的回调则额外拿到agentself等关键字参数。分步运行 Agent手动驱动每一步某些场景下你希望完全掌控执行节奏——例如某个工具调用可能耗时数天、需要断点续跑或者你想在每一步之间更新记忆。smolagents 允许你逐步执行 Agentfrom smolagents import InferenceClientModel, CodeAgent, ActionStep, TaskStep agent CodeAgent(tools[], modelInferenceClientModel(), verbosity_level1) print(agent.memory.system_prompt) task What is the 20th Fibonacci number? # 你甚至可以在这里加载另一个 Agent 的记忆作为初始上下文 # agent.memory.steps previous_agent.memory.steps # 开启一个新任务 agent.memory.steps.append(TaskStep(tasktask, task_images[])) final_answer None step_number 1 while final_answer is None and step_number 10: memory_step ActionStep( step_numberstep_number, observations_images[], ) # 运行一步思考 - 行动 - 观察 final_answer agent.step(memory_step) agent.memory.steps.append(memory_step) step_number 1 # 每一步之后都可以随意修改记忆 # 例如更新刚刚完成的那一步 # agent.memory.steps[-1] ... print(The final answer is:, final_answer)关键点解读agent.step(memory_step)src/smolagents/agents.py L782-L787执行 ReAct 框架中的一步Agent 思考、行动、观察结果返回None表示这一步不是最终步返回最终答案则循环结束。手动构造ActionStep并传入step_number因为自动运行时这一步号由_run_stream内部维护手动模式下需要自己递增。手动追加TaskStep告诉 Agent 新任务已经开始这与run()内部行为一致见 L488。每步结束后你都能自由改写agent.memory.steps这是实现跨步骤记忆注入、长任务恢复执行的基础能力。注意你还需要手动维护循环上限示例中为 10与自动模式下的max_steps语义对应。该模式尤其适合工具调用耗时极长如数天的任务跑完一步即可保存记忆状态下次从断点继续。小结与进一步阅读回放agent.replay()一行回放整段记忆detailedTrue可查看每步模型输入仅限调试。审查agent.memory.system_prompt/agent.memory.steps直接读取get_full_steps()/get_succinct_steps()/return_full_code()导出结构化数据。动态修改直接改steps中的字段或通过step_callbacks在每步结束后自动清理/注入内容完整示例见 src/smolagents/vision_web_browser.py。分步运行agent.step(memory_step)手动驱动配合TaskStep/ActionStep手动追加实现断点续跑。若要更深入地验证这些行为可阅读 tests/test_memory.py——它覆盖了AgentMemory初始化、return_full_code()拼接逻辑、ActionStep.dict()与to_messages()的消息转换、以及各步骤类的 JSON 序列化等关键行为。如果你需要将运行过程输出到可视化监控平台OpenTelemetry / Phoenix / Langfuse请继续阅读 插装指南inspect_runs。赞分享人工智能AI AgentAgent 框架工具调用代码智能体MCP ClientsAgent 沙箱【免费下载链接】smolagents smolagents: a barebones library for agents that think in code.项目地址https://gitcode.com/gh_mirrors/smo/smolagents点击查看免费下载相关推荐smolagents 记忆管理完全指南回放、动态修改与逐步执行 Agentsmolagents 记忆管理完全指南回放、动态修改与逐步执行 Agent Agent 本质上由几个简单组件构成工具tools、提示词prompts人工智能AI AgentAgent 框架工具调用代码智能体MCP ClientsAgent 沙箱smolagents 智能体记忆管理实战重放、动态改写与逐步执行smolagents 智能体记忆管理实战重放、动态改写与逐步执行 smolagents 将智能体定义为“工具 提示词 记忆”的组合其中 记忆 me人工智能AI AgentAgent 框架工具调用代码智能体MCP ClientsAgent 沙箱Agno × SurrealDB 记忆管理实战从零实现 Agent 持久化记忆的完整指南Agno × SurrealDB 记忆管理实战从零实现 Agent 持久化记忆的完整指南 Agno原 Phidata将 SurrealDB 作为 Agen人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表