和AI一起搞事情#2:边剥龙虾&边做个中医技能来起号
<p>春节前,科技圈被一只“龙虾(OpenClaw)”突袭了。</p><p>朋友圈里的各类标题党简直不忍直视:“AGI降临!”“最强记忆管理!”“打工人的终结者!”</p>
<p>看了看底层代码,第一感受是:“确实是一次很棒的产品级创新,但要说技术上的颠覆?uh<span class="math inline">\(#&en!%\)</span>#^感觉好像也没有</p>
<p>但是!只有用了才有发言权。所以这篇文章分两部分:</p>
<ul>
<li>实战环节:用OpenClaw创建一个新技能——"中医方剂卡片生成"</li>
<li>原理拆解:分析OpenClaw到底戳中了用户的哪些爽点</li>
</ul>
<p><img alt="image" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073636132-947765696.jpg" class="lazyload"></p>
<p>先看看最终效果,这是我和龙虾折腾大半天的最终成果,<strong>完整技能详见ark_of_mind</strong></p>
<p><img alt="图片" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073635920-16163337.jpg" class="lazyload"></p>
<h2 id="动手篇用龙虾捏一个老中医智能体">动手篇:用龙虾捏一个“老中医”智能体</h2>
<p>在动手之前,先聊聊"技能"到底是什么。大致上可以分两类:</p>
<table>
<thead>
<tr>
<th>类型</th>
<th>举例</th>
<th>本质</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>操作手册类</strong></td>
<td>如何写入PPTX</td>
<td>工具的使用说明书</td>
</tr>
<tr>
<td><strong>任务完成类</strong></td>
<td>个股财报分析</td>
<td>端到端的工作流SOP</td>
</tr>
</tbody>
</table>
<p>我们普通开发者要干的,就是把业务里那些恶心、重复、不想再干第二次的SOP,沉淀成后者的“技能(Skill)”。而龙虾的特点就是把“Skill”做到了极致,万物皆Skill。</p>
<p>但如果说skill一定是Agent的未来么?对这一点我个人并不完全看好。Skill的优点很明显,上手成本低,并且可以随模型对话进行持续改进优化,似乎有了进化的潜力。但本身它不具备任何约束效力,每一步指令都是软约束。这在高精密场景又似乎是个bug。所以要拥抱,但同时也对新的形态保持open mind吧。</p>
<p>下面我们进入“中医方剂卡片”技能的正式制作过程</p>
<h3 id="第一步该独立时要独立创建独立智能体">第一步:该独立时要独立(创建独立智能体)</h3>
<p>让我们先创建一个独立智能体,一个独立的智能体拥有独立的</p>
<ul>
<li>workspace:存储后面会提到的所有记忆文件</li>
<li>agentDir:模型配置,鉴权信息等等</li>
</ul>
<pre><code class="language-bash">openclaw agents add card-maker
</code></pre>
<p><img alt="图片" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073635888-1311454476.jpg" class="lazyload"></p>
<p>为什么要单开一个Agent?<br>
如果在代码编辑器里,一个项目一个Agent很正常(需要独立环境和Git仓)。但在龙虾里,问题有点模糊,因为龙虾有“全局记忆”。</p>
<p>如果只是临时的系统或任务,用主Agent(主进程)就行。但如果你要做一个长期迭代的复杂项目,强烈建议单开一个独立的Agent。这就好比你不会让你的“私人生活助理”和“无情的写Bug机器”共用一个大脑一样。独立的Agent拥有干净的上下文,不会因为你昨晚让它查了菜谱,今天就在代码里给你加两勺盐。</p>
<h3 id="第二步用魔法创建魔法善用skill-creator">第二步:用魔法创建魔法(善用skill-creator)</h3>
<p>身边朋友问:"做个啥技能呀?"一拍脑门啥也想不出来。</p>
<p>这里给两个思路:</p>
<ul>
<li>Demo反推:把你原来干的活(未来再不想干的)拿来,逆向工程</li>
<li>Histroy压缩:把过往你和模型对话中重复过很多次的对话拿来,压缩抽象</li>
</ul>
<p>至于怎么写这个Skill的代码?千万别自己手搓!如果你足够了解它,你就不想手搓了。直接召唤 Claude 官方的<code>skill-creator</code>技能:</p>
<p><img alt="截图_选择区域_20260313075854" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073636088-1217764739.png" class="lazyload"></p>
<p><code>skill-creator</code>会引导模型一步步获取创建技能所需的信息。</p>
<h3 id="第三步反复拉扯进化技能持续优化">第三步:反复拉扯=进化?(技能持续优化)</h3>
<p>技能搭好后,就是反反复复的测试。这里你能明显感受到国内外模型的“脑回路差异”。国内有些模型因为缺乏AI相关的训练数据,一上来就喜欢用传统后端开发的思维去搭框架,动不动就给你搞个复杂的类、加一堆后处理,完全偏离了 Skill 轻量化的设计初衷。</p>
<p><strong>分享2个开发tips</strong>:</p>
<ul>
<li><strong>系统级施压</strong>:在 Agent.md 里把最核心的SKILL设计原理写进去,别让它放飞自我。</li>
<li><strong>重要的事情说三遍</strong>:每一次大的优化和调整指令后,都反复强调要follow<code>skill-creator</code>的说明</li>
</ul>
<p>最重要的一点,在和Agent合作的过程中积累的经验一定要记下来</p>
<blockquote>
<p>🗣️ “Note it Down(记在你的小本本上)!”</p>
</blockquote>
<p>这句指令是当前 Agent 框架下让 AI 进化的核心。我让这个做卡片的 Agent 把踩过的坑全写进了它的长期记忆里(后面会细讲这个机制)。</p>
<p><img alt="截图_选择区域_20260313191446" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073635944-386827404.png" class="lazyload"></p>
<p>技能搭建虽然充满艺术性和想象力,但最终是要变成生产力的。所以验证和量化评估非常重要。</p>
<p>这一章我只尝试了“AI测试->我来反馈->AI修改->记笔记”的循环,量化评估等我试了Claude新版skill-creator后再来补充。<br>
我的做法是:</p>
<ul>
<li>清空上下文(注意这一点很重要)</li>
<li>让模型基于技能进行批量测试</li>
<li>每个卡片给出反馈</li>
<li>让模型基于反馈优化,再更新到Skill中</li>
</ul>
<p>3个版本迭代后,我就拥有了基本符合我审美的技能效果(哈哈前几个版本不要太浮夸)</p>
<p><img alt="小青龙汤" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073635900-1298723766.jpg" class="lazyload"></p>
<p><img alt="桂枝汤" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073636111-1699237424.jpg" class="lazyload"></p>
<p><img alt="图片" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073636354-945743341.jpg" class="lazyload"></p>
<h2 id="架构拆解篇龙虾到底凭什么火">架构拆解篇:龙虾到底凭什么火?</h2>
<p>玩完了Demo,我们来扒一扒龙虾的底层逻辑。它为什么能给用户带来所谓的“AGI体感”?</p>
<h3 id="-环境变了从云端仙女变成了本地牛马">🌍 【环境变了】从云端“仙女”变成了本地“牛马”</h3>
<p><strong>Agent部署环境的变化其实才是我认为最核心的变化。</strong></p>
<p>以前的Agent基本都是云端部署——Agent住在一个空空如也的Docker里,对用户、对用户环境一无所知。所以以前的Agent都是"任务型"的:写文档、做PPT、生成网页。</p>
<p>而OpenClaw能干什么?</p>
<ul>
<li>帮你自动分类邮箱</li>
<li>帮你回复钉钉消息</li>
<li>帮你整理桌面文件夹</li>
<li>帮你在日历上订阅日程并提醒</li>
</ul>
<p>核心不是能力变了,而是这只龙虾从云端落了地。<strong>飞在空中的龙虾,怎么能碰到地面上形形色色的人呢?</strong></p>
<p>但代价是什么?极度危险。<br>
它有了你的操作权限,这意味着它能帮你回消息,也能一键删掉你的毕业论文。现在网上甚至有个openclaw.allegro.earth的网站,展示了20多万个在公网未加防护的 OpenClaw 示例。</p>
<p>所以说这在安全和企业使用上还有一段路要走。</p>
<h2 id="-core交互体感变了task-oriented---user-oriented">✅ 【CORE】交互体感变了:Task Oriented -> User Oriented</h2>
<p>环境变化带来的是工作内核的变化。因为拥有了更多"人"的信息维度,交互体验上的"AGI"味道更浓了。</p>
<p>而真正赋予OpenClaw用户维度理解能力的,是它的记忆机制。</p>
<h2 id="-memory养龙虾的核心什么信息随使用变化">🧠 【Memory】养龙虾的核心:什么信息随使用变化?</h2>
<p>养龙虾的核心在两点:记忆和技能。</p>
<p>技能偏项目化,而记忆系统更有AGI色彩。来看看它的设计原理:</p>
<ul>
<li>所有记忆都存储在Markdown中,文件是唯一形式</li>
<li>模型不记忆对话Session之外的任何信息,只读写文件</li>
<li>采用最简单的文本格式,方便人类阅读和编辑</li>
</ul>
<h3 id="身份记忆">身份记忆</h3>
<p>Openclaw提供了以下几种身份记忆信息,默认保存在每个agent的工作目录下,包括</p>
<ul>
<li><code>USER.md</code>:你是谁(我不说,你懂的,各种你的喜好和八卦)。</li>
<li><code>IDENTITY.md</code>:它是谁。</li>
<li><code>SOUL.md</code>:这个最有趣,它是AI的“灵魂和底线”。</li>
</ul>
<p>更新方式有两种:</p>
<ol>
<li>初始化更新:首次通过openclaw onboard进入时,会根据BOOTSTRAP.md的指令引导用户更新。我的“一卦”长这样(USER.md就不给你们看了哈哈):</li>
</ol>
<p><img alt="截图_选择区域_20260309141426" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073635933-1820937999.png" class="lazyload"></p>
<ol start="2">
<li>手动更新:所有.MD文件可以手工编辑,所以不用工具、不用模型,你自己可以编辑所有以上的记忆文件。</li>
</ol>
<p>三个文件的定位:</p>
<ul>
<li>USER + IDENTITY:让Agent更懂你,也让Agent更像人</li>
<li>SOUL:需要长期打磨,把你的人生哲学和处事原则灌输给它</li>
</ul>
<blockquote>
<p>💡 有趣的灵魂万中无一,所以SOUL是龙虾行为模式的核心。</p>
</blockquote>
<p>官方自带的SOUL文件其实非常有趣,白话翻译几条核心原则:</p>
<pre><code class="language-txt">别说废话:少给我来“好问题!”、“我很乐意帮忙!”这套虚的,直接干活。
允许有脾气:你可以觉得这事很无聊。一个没个性的助手就是个搜索引擎。
别做伸手党:自己先看文档、搜上下文。实在搞不定再问我。带答案来,别带问题来。
懂点规矩:你主人的家底都给你看了,处理对外事务(发推、发邮件)长点心。
</code></pre>
<h3 id="行为记忆">行为记忆</h3>
<p><strong>如果说身份记忆是人格化的核心,那行为记忆是让龙虾成为你助手的核心。</strong><br>
龙虾设计了一长,一短两种行为记忆</p>
<table>
<thead>
<tr>
<th>类型</th>
<th>文件</th>
<th>作用</th>
<th>加载时机</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>短期/日常记忆</strong></td>
<td>memory/YYYY-MM-DD.md</td>
<td>按天组织的日志,知道你每天干什么</td>
<td>只加载最近两天,剩余按需加载</td>
</tr>
<tr>
<td><strong>长期/核心记忆</strong></td>
<td>MEMORY.md</td>
<td>决策和持久化事实,Agent进化的核心</td>
<td>每次主对话都加载</td>
</tr>
</tbody>
</table>
<p><strong>短期记忆的更新机制:</strong> 只提供append模式,自动触发条件:</p>
<ul>
<li>当前对话上下文长度超过阈值</li>
<li>用户输入<code>/new</code>开启新对话</li>
</ul>
<p>触发后,OpenClaw会启动独立Agent,对最近15条对话进行摘要总结。下面是我配置龙虾第一天、接入钉钉插件后,在重启对话时模型保存的当日memory:</p>
<p><img alt="截图_选择区域_20260313161353" loading="lazy" src="https://img2024.cnblogs.com/blog/1326688/202603/1326688-20260326073636189-76892136.png" class="lazyload"></p>
<p>而短期记忆的摘要指令非常简单,并没有之前我们看过的很多记忆项目中反复的分类,但效果现在确实缺少有效的评估机制,比较见仁见智。<br>
“”<br>
<strong>长期记忆的更新:</strong></p>
<p>老实说,当前版本的OpenClaw对长期记忆的管理有些混乱——记什么、什么时候触发,完全靠Agent自主控制。</p>
<blockquote>
<p>感兴趣的朋友可以看看这个Git Issue,大佬们在讨论如何在文档中明确Memory机制对长期记忆的定位。</p>
</blockquote>
<p>但好消息是:所有文件都可以通过指令更新。你可以说:</p>
<ul>
<li>"请把这些记下来"</li>
<li>"请更新到你的长期记忆中"</li>
</ul>
<p>就像前面我在SKILL制作过程中把多轮调优积累的经验都放到了MEMORY里面。但当前龙虾的长期记忆确实比较粗浅。何时更新、何时失效、究竟压缩什么经验,并说不清除。</p>
<p>再有就是记忆搜索功能,需要你接入OpenAI的向量模型才能使用,方案也比较常规就是BM25(0.3)+向量(0.7),也都支持用户自行配置,这里就不多展开了。</p>
<h3 id="gateway交互形式简化从对话中来回到对话中去">【GateWay】交互形式简化:从对话中来回到对话中去</h3>
<p>这块技术细节暂时不展开,后面会有一章借着多智能体群聊,细说Gateway和钉钉、飞书、Slack这些聊天软件的接入。</p>
<p>但我个人认为Gateway层的加入有点<strong>返璞归真</strong>的感觉:</p>
<p>从ChatGPT最初爆火就是简单的对话框,但这两年随着任务复杂化,大家把功能做得越来越复杂——Workflow、Canvas、CLI……</p>
<p>可是最初想象中的Jarvis,其实就是简单的对话啊。</p>
<p>当然不同场景,最趁手的工具可能有不同形态。但最能击中大众的,可能还是对话。</p>
<h3 id="-hearbeat简单却有趣的新技能心跳定时任务">💓 【HearBeat】简单却有趣的新技能:心跳&定时任务</h3>
<p>最后再说下龙虾的心跳机制,很有趣的实现思路。不大的功能,造就了无数博主博人眼球的标题,AI帮我盯盘!AI帮我自动下单!每周AI自动写周报!</p>
<p>毕竟原来AI都是被动响应人类的提问,而有了心跳机制,<strong>AI可以主动向人类发问</strong></p>
<p>这背后其实是两个机制,OpenClaw巧妙地将两种调度模式结合:</p>
<table>
<thead>
<tr>
<th>特性</th>
<th>心跳</th>
<th>Cron</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>定时精度</strong></td>
<td>近似(可漂移)</td>
<td>精确</td>
</tr>
<tr>
<td><strong>会话上下文</strong></td>
<td>主会话</td>
<td>主会话或隔离会话</td>
</tr>
<tr>
<td><strong>批处理能力</strong></td>
<td>强(可批量检查多项)</td>
<td>弱(独立任务)</td>
</tr>
<tr>
<td><strong>成本效率</strong></td>
<td>高(批量检查)</td>
<td>低(独立调用)</td>
</tr>
<tr>
<td><strong>智能决策</strong></td>
<td>强(基于上下文)</td>
<td>弱(预设逻辑)</td>
</tr>
</tbody>
</table>
<p>Cron很好理解是精准的后端定时,在几点几点,触发一个独立的定时任务。而心跳的设计很巧妙,为了和当前用户的状态无缝衔接,心跳的触发是放在当前主对话中的,可以直接关联前后对话的上下文,整个触发机制如下</p>
<pre><code class="language-txt">系统定时器触发(every 30 min可配置)
↓
后端发送用户消息: "Read HEARTBEAT.md if it exists..."
↓
模型看到:常规系统提示词 + 这条特殊用户消息
↓
模型执行:读取HEARTBEAT.md文件(使用`read`工具)
↓
模型根据HEARTBEAT.md内容决定回复:
- 有需要关注的事项 → 回复具体内容
- 无事项 → 回复"HEARTBEAT_OK"
</code></pre><br><br>
来源:https://www.cnblogs.com/gogoSandy/p/19773489
頁:
[1]