oh-my-pi learn 工具:开启 autolearn 让 agent 沉淀可复用经验并生成托管技能
2026/9/12 23:59:00 网站建设 项目流程

oh-my-pi learn 工具:开启 autolearn 让 agent 沉淀可复用经验并生成托管技能

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

在 oh-my-pi(omp)里,learn工具负责把一条可复用的经验写进长期记忆,并可选地在同一次调用中创建或更新一个托管技能(managed skill)。这两个能力默认都是关闭的:autolearn.enabledmemory.backend的默认值分别是falseoff,不配置时learn工具根本不会注册到会话里。本文的任务是:在配置中启用 autolearn 和一个受支持的 memory backend,让 agent 在工作结束后把「非显而易见的修复、项目约定、可复用流程」沉淀下来,并验证落盘的learned.mdSKILL.md产物。

前提与配置位置

learn工具的注册条件是(见 docs/tools/learn.md):

  • autolearn.enabled = true(默认false);
  • memory.backend"hindsight""mnemopi""local"三者之一。

manage_skill工具只要求autolearn.enabled = true,与 memory backend 无关(见 docs/tools/manage_skill.md)。

omp 的设置存放在 plain YAML 中(见 docs/settings.md):

作用域路径
全局~/.omp/agent/config.yml(若已存在config.yaml也会就地加载更新)
项目级<cwd>/.omp/config.yml

全局文件还受PI_CODING_AGENT_DIR环境变量影响——设置它之后,config.yml、auth store 以及 agent 目录下的所有内容都会跟着迁移。可以用omp config path打印当前生效的 agent 目录。

开启 autolearn 与本地记忆后端

最短主路径是使用文档推荐的localbackend(见 docs/memory.md)。在~/.omp/agent/config.yml(或项目级<cwd>/.omp/config.yml)中加入:

memory: backend: local autolearn: enabled: true

也可以在 shell 里用omp config set写入全局配置:

omp config set memory.backend local omp config set autolearn.enabled true

两个可选行为开关(见 docs/settings.md):

默认作用
autolearn.autoContinuefalsetrue时,agent 停止后自动跑一轮 capture turn(消耗额外 token);为false时只会在你下一轮输入时附带一条被动提醒
autolearn.minToolCalls5只有单轮使用了不少于该数量的工具时,停止后才触发 nudge

启用后,顶层会话的工具列表中会自动包含learnmanage_skill;子代理(subagent)不会自动获得它们,只有在其 requested-tools/frontmatter 列表显式包含时才能使用。

验证配置是否生效

omp config get确认生效值:

omp config get autolearn.enabled omp config get memory.backend omp config path # 打印当前 agent 目录,后续验证产物路径要用

如果autolearn.enabledtruememory.backend仍是offlearn不会注册,会话里只有manage_skill可用。

agent 如何调用 learn

learn由模型在会话中调用,不是用户直接敲的命令。它的触发路径(见 docs/tools/learn.md 与 controller 源码):

  1. 一轮实质性对话结束后(工具调用数达到autolearn.minToolCalls,且该轮不是 aborted、不在 plan 模式审查中、不处于 goal 循环),controller 触发 capture:
    • autoContinue: true时自动跑一个合成 capture turn;
    • autoContinue: false时是一条被动提醒,附着在你的下一轮输入上。
  2. capture 轮里 agent 自行判断:可重复流程 →manage_skill;持久事实/约定/非显而易见的修复 →learn;两者兼有 → 同一次learn调用里带上skill字段;没有值得保留的就什么都不做。

learn的入参:

字段类型必填说明
memorystring要记住的持久教训:what / when / why
contextstring教训的来源上下文
skill{ action: "create" \| "update"; name; description; body }教训写入成功后创建或增强的托管技能;body是不含 frontmatter 的 Markdown

执行顺序是先落记忆、再动技能:local backend 下调用localBackend.save(...)写项目级learned.mdstored === 0视为失败;Hindsight 入队 retention;Mnemopi 以source: "coding-agent-learn"importance: 0.8scope: "bank"调用rememberScoped(...),未返回 id 视为失败。技能写入失败时,由于教训已经落盘,结果会报告为部分成功。

返回文本(文档定义的字面输出,可直接用于判断调用是否成功):

  • 仅教训:"Lesson stored.""Lesson queued for retention."details = { skill: null });
  • 教训 + 技能:"<lesson result>. Created managed skill \"<name>\".""... Updated ..."details = { skill: "<name>" })。

验证落盘产物

按 backend 不同,验证位置不同。以localbackend 为例:

  1. 教训文件:写入<agent-dir>/memories/<encoded-cwd>/learned.md<agent-dir>默认为~/.omp/agent)。lesson 按新到旧排列、按规范化行去重、上限 100 条;单条 content 上限 2,000 字符,context 上限 400 字符,写入前会做 secret redaction。
  2. 托管技能文件:写入<agent-dir>/managed-skills/<sanitized-name>/SKILL.md。frontmatter 由namedescription生成,body里不要自己写 frontmatter。
  3. 会话内读取:agent 可以用read工具直接读memory://root/learned.md(learn 捕获的教训)和memory://root/skills/<name>/SKILL.md(技能 playbook);/memory view可查看当前 backend 的注入负载(见 docs/memory.md)。

注入时机要注意两条:

  • local lesson 从下一个会话开始注入到 system prompt 的 Memory Guidance 块,learn调用本身不会修改当前会话的 prompt-cache 前缀;
  • 通过learn写的托管技能不会立刻注入当前技能列表,而是在后续 skill refresh / 新会话中被发现。这与manage_skill不同——后者在写入成功后会立即刷新活跃技能列表,所以「当前会话必须立刻可用」的变更应改用manage_skill

托管技能在发现流水线中走omp-managedprovider(priority 5,最低),同名时 authored skill 永远优先,托管技能只做兜底(见 docs/skills.md)。

限制与已知边界

来自 docs/tools/learn.md 的硬性限制:

  • 托管技能名会被 trim、lowercase 后必须匹配[a-z0-9][a-z0-9-]{0,63}
  • 最终SKILL.md(含生成的 frontmatter 和 description)上限 64,000 UTF-8 字节;
  • create在技能文件已存在时失败,update在文件不存在时失败;
  • local backend 不提供结构化记忆检索,recallretainreflectmemory_edit均不可用;
  • Hindsight 的 retain 队列会稍后 flush 到配置的服务器,Mnemopi 可能在同步写入后继续跑配置的 embedding / fact-extraction 任务。

常见报错对照

报错原因
Mnemopi backend is not initialised for this session.会话缺少 Mnemopi 状态
Mnemopi did not store the lesson (no memory id returned).本地 Mnemopi 写入未返回 id,可选技能不会尝试
Lesson was empty after sanitization; nothing stored.local backend 规范化后教训为空,可选技能不会尝试
Hindsight backend is not initialised for this session.会话缺少 Hindsight 状态
isError: true+details = { skill: null, shadowed: true }skill.action = "create"时与活跃 authored skill 重名;教训已写入/入队,技能未写
<lesson result>, but the managed skill could not be written: <reason>技能校验、创建/更新、安全检查或体积失败

如果create报 shadowed,说明该名字已被你自己编写的技能占用——托管技能永远不会覆盖 authored skill,换名或改用update已有的托管技能即可。

下一步

  • 想让当前会话立即发现技能变更,改用manage_skillcreate/update/delete(输出形如Created managed skill "<name>" (managed-skills/<name>/SKILL.md).);
  • 想调整记忆流水线的扫描、去重与注入 token 上限,参考 docs/memory.md 中的memories.*配置表;
  • 想清空当前 backend 的记忆数据/产物,使用/memory clear(注意:Hindsight 下它只清本地会话状态与 recall 缓存,不删服务器端 bank)。

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询