给智能体加上记忆
每开一次新对话,智能体就会把之前聊过的全忘掉。这时就要用到记忆文件。AGENTS.md(或 CLAUDE.md)每一轮都会放进提示词,所以项目怎么运作、你定了哪些规矩,这类要它一直记着的东西都写在这里。
动手
- 点输入,再按 Enter。
/init会让智能体读一遍项目,写出AGENTS.md。选 Yes。 - 加一条规则。可以输入
/memory,在编辑器里加一行,也可以直接告诉它:在 AGENTS.md 里加一条规则:每个按钮都有一个 title 属性,说明它做什么。 - 输入
/clear。对话清空了,记忆文件还在。 - 接着说:
在清单下方加一个“Clear completed”按钮,用来删除已完成的待办。只改 index.html 和 app.js。你完全没提 title,新按钮会带上吗?
在实际工作中: 记忆文件会随着项目慢慢充实,也要像代码一样经过审查。
运行技能
技能就是把某一类活儿的做法写成一份文件,放在 .agents/skills/<name>/SKILL.md。里面是团队自己的规矩,模型本来不知道。技能可以像命令一样,按名字运行。
动手
- 点运行,提交一条留言,内容写
<img src=x onerror=alert(1)>。页面上会出现一张裂开的图片,说明你输入的文字被当成代码执行了。 - 在编辑器里打开
.agents/skills/web-security/SKILL.md,里面只有两步。 - 点输入,再按 Enter。技能会和你的话一起发给智能体。
- 一个一个看改动。修复在
app.js里,技能的第 2 步还会新建SECURITY.md。 - 点运行,再试一次同样的攻击。这次它应该只是普通文字。
- 用
Ann的名字留言<b>Hello</b>。显示的是不是Ann: <b>Hello</b>,而且 Ann 是粗体?修得太匆忙的话,常常会显示成**Ann**或<strong>Ann</strong>。这时就这样提醒它:页面上的名字显示得不对。保持粗体:用 createElement 创建 <strong>,再设置它的 textContent。
在实际工作中: 真正的安全审查要做多得多的检查、用更多工具,还得有懂安全的人把关。技能能帮上忙,但光靠它保证不了页面安全。
写一个技能
技能除了按名字运行,也能自动加载。每一轮,智能体都会看一遍所有技能的描述,你的任务和哪个描述对得上,就把哪个技能带上。
写什么技能都行。没有头绪的话,就写一个 docs 技能,规定这个项目所有文档的写法,不只是 README。
动手
- 点输入,再按 Enter,智能体会原样保存这个技能。你也可以在编辑器里自己写
.agents/skills/<name>/SKILL.md,记得加一行description,写明什么时候用它。 - 输入
/clear。新对话只能看到技能的名字和描述,就跟下次新开会话时一样。 - 提一个描述里涵盖的任务,但别提文件名,比如
在 README.md 里为这个项目写文档。或者给 app.js 加注释(comments)。 - 留意智能体开始干活前有没有出现
● Skill(docs)。出现了,就说明描述对上了,技能已经加载。你自己运行/docs在这里不算数。
在实际工作中: 更大的模型会读描述,自己挑技能。这个小模型做不到,所以这里改成拿你任务里的词去逐个匹配描述。在真实团队里,技能要共享、做版本管理,也要测试。
用上外部工具
模型只认识训练时见过的库,不一定认识你项目里用的库。MCP 服务器可以从项目外部给智能体提供工具。这里用的是一个 docs 服务器,里面存着 lib/pretty-date.min.js 的文档。
动手
- 输入
/mcp。现在还没有服务器,有一个可以添加。 - 输入
/mcp add docs。它会写进.mcp.json,智能体也就有了docs.get_docs这个工具。再输入一次/mcp,会显示 connected。 - 点输入,再按 Enter。留意智能体改文件之前有没有调用
docs - get_docs (MCP)。 - 点运行,发一条留言。显示
just now了吗?
在实际工作中: 真正的 MCP 服务器跑在浏览器之外,要先配置好,也要确认它靠得住,而且它能碰到真实数据。这里的服务器是网站内置的,只会返回固定的答案。
试一试
这里用的模型(Qwen3.5-4B)比较小,最擅长英文,用中文更容易出错。如果回答不对劲,可以改用英文试试。
正在播放录制的会话。只有你在「动手」里完成的操作才计入目标。