引言
让智能体从自身历史交互记录里自主沉淀、生成全新可复用技能,是Nous Research推出的Hermes Agent框架最具代表性的核心能力,也是当前Agent工程领域重点探索的方向。传统智能体的工具集大多由开发者提前硬编码定义,模型只能调用预设能力,无法在任务执行过程中自主总结经验、扩充能力边界。而Hermes学习循环的核心思路,就是依托大模型的推理归纳能力,在任务完成后自动复盘会话过程,提炼可复用的标准化技能。
本文将完整拆解这套学习机制如何落地在DeepSeek Harness(下文简称DSH)平台。内容会覆盖DSH原生Skill系统的文件规范、接入方式,可动态调控的技能管理器设计,以及一套后台异步反思蒸馏循环,这套循环集成了水位线、冷却触发门槛、严格JSON契约与原子写入等工程约束;同时配套可直接部署的开源实现dsh-memory-skills,为工程团队落地自进化Agent提供可复用的实践方案。在多模型调度场景中,Treerouter这类API网关可以简化不同大模型的接入与流量治理,适配智能体持续迭代过程中的模型切换需求。
1 基础认知:DSH原生Skill系统架构
DSH平台内置了一套成熟的原生技能体系,由dsh-skill-filesystem与dsh-tool-skill两大基础组件共同支撑,所有技能本质上以文本文件形式存储,具备极强的可移植性。
技能文件采用Markdown格式,文件头部附带YAML前置元信息,支持两种存储布局:目录式管理,单技能独立文件<name>/SKILL.md;平铺式管理,直接以<name>.md作为技能文件。
YAML前置元信息包含多组可配置字段:技能名称(kebab-case命名规范)、描述文本、触发条件whenToUse、用户可调用标识user-invocable,同时支持优先级、模型调用开关disable-model-invocation等配置项,单个技能文件上限约600字符,打包总容量上限为400个技能。
文件的加载优先级遵循固定规则:项目目录内.dsh/skills下的技能优先级最高(权重100),其次是用户全局目录$DSH_HOME/skills下的技能文件。模型会调用原生skill工具,读取并解析技能正文,完成能力加载。
---
name: "pnpm-recovery"
description: "Fix lockfile mismatch"
whenToUse: "当pnpm install失败时"
user-invocable: true
---
Run `pnpm install --no-frozen-lockfile`, then rebuild.
这套设计最关键的特性在于:技能本身是纯文本,不存在复杂插件状态。也就是说,Agent自主新增技能的本质,就是自动生成符合规范的Markdown技能文件,无需编译、无需注册插件,降低了自进化功能的落地门槛。
2 技能管理器:赋予模型增删查技能的能力
想要让模型自主管理技能,就需要封装标准化工具接口,本文方案dsh-memory-skills向外暴露三组原子工具,供模型直接调用完成技能生命周期管理:
| 工具 | 功能说明 |
|---|---|
| skill_write(name, description, whenToUse?, content) | 创建或者更新技能,输出符合DSH原生规范的技能文件 |
| skill_delete(name) | 删除已经托管的技能 |
| skill_list() | 列出当前所有可用技能,区分原生目录技能与自动托管技能,增加managed标记 |
这套管理器的核心亮点是原子写入机制:写入文件时先生成临时文件,内容校验通过后再重命名替换正式文件,一旦过程异常直接丢弃临时文件,不会残留损坏、不完整的技能文件,避免DSH加载异常文件引发任务故障。
write({name, description, whenToUse, content}) {
const skillFile = this.pathFor(input.name);
const tmp = `${file}.${randomUUID()}.tmp`;
writeFileSync(tmp, renderSkillFile(input), "utf8");
renameSync(tmp, file); // 原子替换
return { created, path: file };
}
写入完成后,技能会直接落地到默认路径$DSH_HOME/skills,这个目录自带文件监听watcher,会自动刷新DSH的技能缓存,不需要重启DSH服务。新写入的技能会立刻加入会话可用工具集,模型在下一轮任务中就可以直接调用。
3 后台自我进化链路:反思 → 蒸馏 → 写入技能
这套自进化机制采用后台异步触发模式,属于fire-and-forget设计。它不会嵌入主任务请求链路,不会阻塞当前会话执行,不会污染对话历史,也不会篡改KV缓存,保障主任务的稳定性。
3.1 触发策略:定时扫描 + 水位线控制
系统会按照固定时间轮询扫描会话记录,默认扫描间隔60秒。同时增加多层阈值控制,避免无意义的重复反思,控制LLM调用成本:
- 水位线机制:同一段会话记录只会触发一次反思,防止重复蒸馏生成冗余技能;
- 冷却机制:单会话设置冷却窗口,窗口内不会重复启动进化流程;
- 启动门槛:只有会话内有效交互消息达到最低数量阈值时,才会调用大模型做反思归纳,过滤掉短、无价值的对话。
// 定时循环执行进化任务
setInterval(() => this._evolveTick().catch(...), this.config.evolveIntervalMs);
async _evolveTick() {
for (const session of this.ctx.sessions.list(...)) {
const state = db.prepare("SELECT last_seq FROM skill_evolve_state WHERE session_id=?").get(session.id);
const fresh = session.events.filter(e => e.seq > (state?.last_seq ?? -1));
// 过滤:满足启动门槛、冷却期校验后,才进入LLM蒸馏
}
}
3.2 上下文约束:严格JSON契约的大模型调用
进入反思阶段后,系统会向LLM推送固定的系统提示词,也就是背景技能蒸馏指令,强制模型仅输出标准JSON结构,不额外生成自然语言解释。
{"evolve": true, "name": "kebab-case技能名", "description": "一句话概括能力", "whenToUse": "触发场景", "content": "Markdown正文", "reason": "为何值得留存"}
{"evolve": false, "reason": "一次性内容,不构成可复用技能"}
解析层会自动剥离markdown的json围栏标记,使用正则匹配提取首个合法JSON;如果格式不达标、字段缺失,会直接降级标记为skipped,不会中断整体流程。
const parsed = parseEvolutionResponse(text);
if (!parsed.evolve) return { kind: "skipped" };
if (!isValidName(parsed.name) || !parsed.description || !parsed.content)
return { kind: "invalid" };
this.writeSkill({name: parsed.name, description: parsed.description, content: parsed.content, }, sessionId);
3.3 记录与容量管控
为防止技能无限制膨胀,工程层面增加容量约束:
- 所有技能变更动作写入
skill_events日志表,记录创建、更新、跳过、格式错误、容量超限等事件,支持后续审计排查; - 托管技能数量默认上限50个,达到上限后不再新增技能,标记cap状态,避免持续消耗LLM资源;
- 技能文件始终保持纯Markdown格式,后续即便卸载本插件,已经沉淀的技能依旧可以被原生DSH识别加载,不存在绑定锁定问题。
4 方案取舍:dsh-memory-evolve 与 dsh-memory-skills 的差异化定位
社区已经存在功能更全面的dsh-memory-evolve方案,这套方案集成五轨记忆、完整自进化、COI调度和WebUI,整体包体积约700行代码,依赖组件较多;而本文dsh-memory-skills刻意做精简聚焦,核心设计思路有明确取舍:
- 只聚焦技能管理器+后台反思蒸馏单一能力,代码量仅205行,零额外运行时依赖;
- 直接复用DSH原生技能体系,完全兼容官方skill协议,不自定义私有存储格式;
- 可和CJK检索、混合向量检索、去重模块等其他记忆组件自由组合,搭建完整Agent记忆底座。
而Web可视化面板、多人协同、Git分支感知这类能力,不属于核心链路,被规划为后续可选扩展功能,团队可以根据业务需求按需叠加,避免核心组件过度臃肿。
5 真机验证与落地踩坑总结
整套闭环已经在headless模式的真实DSH环境完成端到端验证,完整流程为:调用skill_write生成合规技能文件 → skill_list读取并识别托管标记 → skill_delete删除文件 → 日志自动记录全流程事件。
skill_write → 生成 $DSH_HOME/skills/verify-tool.md,正确写入frontmatter,实时同步会话目录
skill_list → verify-tool (managed): verification skill for testing
skill_delete → 文件删除,目录实时清空
skill_events → 记录 created / deleted 事件
落地过程中遇到一个高频坑点:cordis插件加载的会话ID传递问题。如果插件同时使用export default apply导出,加载器会把回调函数注入inject列表,出现启动报错cannot get property "tools" on null。解决方案是:当插件使用export default apply时,需要手动处理加载器注入逻辑,做兼容适配。
6 总结
整套Hermes式Agent自进化方案的核心逻辑可以概括为两点: 第一,技能本质是DSH原生Markdown文本,模型通过skill_write、skill_delete、skill_list完成生命周期管理,目录变更自动生效; 第二,自进化依托后台定时水位扫描、强JSON格式反思、原子写入与日志容量管控,整个流程脱离主请求链路,不影响线上任务稳定性。
真机测试验证,自动写入的技能可以实时被DSH识别调用,技能增删闭环完整,全流程日志可追溯。项目开源仓库地址:https://github.com/QIANLING-0831/dsh-memory-plus,核心包packages/dsh-memory-skills采用MIT协议,开发者可以直接基于该仓库二次开发。对于大规模部署多套自进化Agent集群的团队,统一接入API网关能够简化模型路由与流量管控。
了解更多:https://treerouter.com






