不更新参数的动态代码重写机制
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 = f"https://old-weather-api.com/data?city={city}"
try:
response = requests.get(api_url, timeout=5)
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].code
3. 基于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_code
4. 模块化架构与版本管理
技能库是一个版本化的文件系统或数据库。重写不是原地覆盖,而是可以创建新版本技能。路由机制可以评估新旧技能的有效性,并动态选择更优者执行,实现了 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(用于查询股价)。 - Execute:Agent执行该技能代码,但代码只能返回股价,无法返回分红率,任务“失败”。
- Reflect:LLM分析失败,诊断出原因是“原技能代码的API调用和数据解析逻辑不包含分红字段”。
- Write:LLM基于原代码,重写了一个新的
fetch_stock_dividend技能。它修改了API查询参数,并更新了数据解析逻辑以提取分红信息。 - 更新系统:新技能被存入库。下次遇到类似任务时,路由器可能优先检索到这个新的、更匹配的技能。
总结:不更新参数的重写何以可能
Memento-Skills 的动态代码重写之所以能不更新模型参数,是因为它进行了一个关键的能力分层:
- 基础能力层(冻结的LLM):提供通用的代码理解、生成和推理能力。这部分参数固定,是系统的“先天智力”。
- 应用技能层(可写的技能库):存储了针对具体任务的、可执行的程序逻辑。这部分是“后天习得的经验与技能”,以代码文件的形式存在,可以随时被读取、修改和写入。
当需要适应新情况时,系统利用第一层(LLM)的固定能力,去修改第二层(技能库)的内容。学习发生的“位置”从LLM的权重矩阵,转移到了外部的代码存储系统中。这实现了“零参数更新”的持续学习,同时具备了抗灾难性遗忘、可解释性强(技能即代码)和可安全回滚(版本管理)的优势 。
参考来源
- Memento-Skills: 找到了比语义搜索更聪明的解法
- 让Agent自己造Agent(非常详细),自动化构建从入门到精通,收藏这一篇就够了!
- Agent 自己设计 Agent 全解析(非常详细),从原理到实战,收藏这一篇就够了!
- Memento实验实战:Agent的记忆能力,最佳实践指南!
- 从底层逻辑搞懂Agent自动化设计(非常详细),收藏这篇就够了!
- Agent Skills:AI 正在学会自己进化,这意味着什么?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)