不更新参数的动态代码重写机制
Memento-Skills 实现不更新参数的动态代码重写其核心在于将学习过程从模型权重更新转移到外部技能库的代码文件更新上。这是一种架构上的根本性转变使得系统能够在保持基础大语言模型LLM参数完全冻结的前提下通过修改和增删外部存储的、可执行的代码片段即“技能”来持续进化和适应新任务 。实现原理Read-Write 反思学习循环Memento-Skills 的动态代码重写机制围绕一个核心的Read-Write 反思学习循环展开。这个循环将任务执行、失败分析、技能生成和验证整合为一个自洽的流程 。阶段核心动作与动态代码重写的关联Read (读取)系统根据当前任务从外部技能库中检索最相关的现有技能。为代码重写提供基线或起点。系统不是从零开始而是基于最相关的历史经验代码进行改进。Execute (执行)执行检索到的技能代码并观察结果。产生反馈信号。执行成功或失败以及具体的错误信息、环境反馈是触发重写的直接原因。Reflect (反思)分析执行结果。如果失败LLM被要求诊断原因并规划解决方案。这是代码重写的决策与规划中枢。LLM基于其固有的推理和代码理解能力分析现有代码为何不适用并构思如何修改或重写。Write (写入)根据反思结论生成新的或修改后的技能代码并将其作为新的记忆单元存入技能库。动态代码重写的具体执行步骤。生成的新代码文件覆盖或补充了旧的技能逻辑实现了系统能力的更新而LLM的参数本身未被改变。关键技术支撑与具体实现1. 技能作为结构化外部记忆技能被定义为包含可执行代码、自然语言描述Prompt和元数据如使用场景、成功记录的独立文件通常为Markdown格式。这构成了代码重写的操作对象 。!-- 技能库中的一个技能文件: skill_fetch_weather.md -- ## Skill: 获取城市天气 **Description**: 通过调用公开API获取指定城市的当前天气信息。 **Usage Scenario**: 用户询问天气时。 **Success Rate**: 92% python import requests def get_weather(city: str) - str: 获取城市天气 # 旧代码使用一个可能已失效的API端点 api_url fhttps://old-weather-api.com/data?city{city} try: response requests.get(api_url, timeout5) data response.json() return f{city}的天气是{data[weather]}温度{data[temp]}°C。 except Exception as e: return f获取天气失败{str(e)}Last Updated: 2023-10-01#### 2. 行为对齐的技能路由 当任务到来时系统不是随机或仅基于语义搜索选择技能而是通过一个经过**对比学习**训练的路由器一个独立的嵌入模型来检索与当前任务**行为最相似**的历史技能 。这确保了重写通常从一个高质量、高相关性的基线代码开始。 python # 伪代码技能路由检索 def retrieve_skill_for_task(task_description, skill_library, router_model): # 1. 将任务描述和所有技能描述编码为向量 task_embedding router_model.encode(task_description) skill_embeddings [router_model.encode(s.desc) for s in skill_library] # 2. 计算行为相似度余弦相似度而非纯粹语义相似度 similarities cosine_similarity(task_embedding, skill_embeddings) # 3. 返回最相关的技能代码 best_skill_idx np.argmax(similarities) return skill_library[best_skill_idx].code3. 基于LLM的代码诊断与生成Reflect Write 阶段这是动态重写的核心。当执行失败或效果不佳时系统将失败上下文任务、使用的旧代码、错误信息/输出提交给LLM要求其进行诊断并生成修正后的代码。# 伪代码反射与重写过程 def reflect_and_rewrite(task, old_skill_code, execution_error, llm): reflection_prompt f 任务: {task} 我们尝试使用了以下技能代码但执行失败了 python {old_skill_code} 错误信息: {execution_error} 请分析代码失败的原因并直接输出修正后的完整Python函数代码。只输出代码块。 # 关键调用LLM。此处LLM参数是冻结的它仅作为一个代码生成器工作。 new_skill_code llm.generate(reflection_prompt) # 新代码被写入技能库替代或与旧代码并存 save_to_skill_library(new_skill_code, metadata{ derived_from: old_skill_code.id, failure_context: execution_error }) return new_skill_code4. 模块化架构与版本管理技能库是一个版本化的文件系统或数据库。重写不是原地覆盖而是可以创建新版本技能。路由机制可以评估新旧技能的有效性并动态选择更优者执行实现了grant_right_to_overthrow的理念 。# 技能库的元数据管理示意 skills: - id: fetch_weather_v1 code: “旧代码” success_rate: 0.65 is_active: false - id: fetch_weather_v2 # 动态重写后生成的新技能 code: “修正后的新代码” success_rate: 0.98 is_active: true parent: fetch_weather_v1工作流程示例假设一个已部署的客服Agent遇到一个新问题“查询A公司股票的最新分红率”但技能库中没有完全匹配的技能。Read路由器检索到最相似技能fetch_stock_price用于查询股价。ExecuteAgent执行该技能代码但代码只能返回股价无法返回分红率任务“失败”。ReflectLLM分析失败诊断出原因是“原技能代码的API调用和数据解析逻辑不包含分红字段”。WriteLLM基于原代码重写了一个新的fetch_stock_dividend技能。它修改了API查询参数并更新了数据解析逻辑以提取分红信息。更新系统新技能被存入库。下次遇到类似任务时路由器可能优先检索到这个新的、更匹配的技能。总结不更新参数的重写何以可能Memento-Skills 的动态代码重写之所以能不更新模型参数是因为它进行了一个关键的能力分层基础能力层冻结的LLM提供通用的代码理解、生成和推理能力。这部分参数固定是系统的“先天智力”。应用技能层可写的技能库存储了针对具体任务的、可执行的程序逻辑。这部分是“后天习得的经验与技能”以代码文件的形式存在可以随时被读取、修改和写入。当需要适应新情况时系统利用第一层LLM的固定能力去修改第二层技能库的内容。学习发生的“位置”从LLM的权重矩阵转移到了外部的代码存储系统中。这实现了“零参数更新”的持续学习同时具备了抗灾难性遗忘、可解释性强技能即代码和可安全回滚版本管理的优势 。参考来源Memento-Skills: 找到了比语义搜索更聪明的解法让Agent自己造Agent非常详细自动化构建从入门到精通收藏这一篇就够了Agent 自己设计 Agent 全解析非常详细从原理到实战收藏这一篇就够了Memento实验实战Agent的记忆能力最佳实践指南从底层逻辑搞懂Agent自动化设计非常详细收藏这篇就够了Agent SkillsAI 正在学会自己进化这意味着什么