一开始的思路其实不对#
一开始我想做的学习链路是比较“技术视角”的。比如:Java 积分系统对应 ERC20,账户余额对应 Token balance,管理员发积分对应 mint,然后再用 OpenZeppelin 生成一个 ERC20 模板,最后用 Foundry 跑测试。
3ba82133988ace37878d067622b786d1
从技术角度看,这条链路没有问题。因为 ERC20 确实是 Web3 开发里非常常见的内容,mint 也是 Token 合约里常见的操作,OpenZeppelin 也是写标准合约时经常使用的安全组件库。问题在于,这条路线默认学习者已经知道很多背景知识。
对于一个完全小白来说,他可能并不知道什么是 Token,也不知道为什么需要 ERC20。如果一开始就把这些词丢给他,其实很容易让人产生一种感觉:这东西是不是离我太远了?
这和我们学习 Java 时是一样的。一个刚接触 Java 的人,你不能上来就讲 JVM 调优、AQS、分布式事务、Netty、线程池参数调优。虽然这些东西很重要,但它们不是入口。真正的入口应该是变量、方法、类、对象、集合、数据库、接口调用。只有这些基础概念建立起来以后,再去看高级内容才不会那么痛苦。
所以我后来把学习链路重新拆了一遍。第一步不是 ERC20,而是公开账本。第二步不是 mint,而是账号地址。第三步不是合约模板,而是链上的小程序。再往后才是最小代码、本地实验、多人数据、权限控制等内容。
也就是说,我希望这个智能体先回答这样的问题:
Web3 的“账本”到底像 Java 系统里的什么?
Web3 里的“地址”是不是类似用户 ID?
智能合约是不是可以理解成链上的 Service?
这些问题看起来很基础,但对于小白来说非常重要。因为只有这些概念先对齐了,后面学习 Solidity、Foundry、OpenZeppelin 才有意义。
先给智能体定身份#
在真正添加 Skill 之前,我先给智能体定了身份。这里不是简单改一个名字,而是把它的角色、语言风格和用户偏好都写清楚。
我给它设置的方向是 Java 转 Web3 学习助手,目标用户是 Java 后端背景,但 Web3 基础比较弱的人。它不能上来就讲一大堆陌生术语,也不能把内容写成官方文档翻译。它需要用 Java 后端熟悉的东西解释 Web3,例如数据库表、Service、Map、用户 ID、测试工具等。
2a77404605543f51f24e4605d1409aad
这一步非常关键。因为如果不先给智能体一个稳定身份,它很容易变成一个泛泛而谈的问答机器人。你问它什么是区块链,它可能回答一堆概念;你问它什么是智能合约,它可能直接搬一段百科式解释;你问它怎么学习,它可能给出一个很长的路线图,看起来很完整,但用户还是不知道下一步该干什么。
我希望它保持一个简单原则:每次只讲一个小概念,先用 Java 类比,再讲 Web3 里的含义。如果出现用户还没有学过的新词,就放到“以后再学”,不要展开。
这个要求看起来很简单,但实际很重要。因为模型最容易出现的问题就是:它知道很多词,但不知道哪些词当前不该讲。比如在讲账号地址时,它可能顺手提到私钥、签名、助记词、钱包、交易、Gas。如果学习者已经有基础,这些补充是好的;但如果学习者完全小白,这些补充反而会制造新的负担。
所以身份文件的作用,不是让智能体显得更聪明,而是让它更稳定。它需要知道自己不是百科全书,而是一个循序渐进的学习助手。
为什么必须加 Skill#
刚开始我也以为,只要主提示词写得足够详细,这个智能体就能按预期工作。后来发现并不是这样。
提示词能约束回答风格,但它很难保证智能体每次都按固定流程工作。尤其是模型能力一般时,它往往会顺着当前问题直接回答,而不是主动判断“现在应该查官方文档”“现在应该用 Java 类比”“现在应该更新学习笔记”。
这也是我后来决定加 Skill 的原因。Skill 的价值不是让智能体多会一个概念,而是把一类任务的处理方式固定下来。比如,查官方资料就是一个 Skill;用 Java 类比解释 Solidity 是一个 Skill;运行 Foundry 实验是一个 Skill;分析 Solidity 报错也是一个 Skill。
如果没有 Skill,智能体可能会这样回答:
Solidity 的 contract 类似 Java 中的 class,可以保存状态变量,也可以定义 function。
这句话本身没错,但太薄了。它没有要求查官方文档,也没有要求给 Java 示例,也没有要求给 Solidity 示例,更没有要求给出小白容易误解的点。
如果有了 Skill,就可以强制它按固定格式输出:
先说明使用了哪个 Skill;
再给 Java 写法;
再给 Solidity 写法;
再列出对应关系;
最后补充容易误解的点。
这样就算模型能力一般,它也有一个固定轨道,不容易跑偏。
fb9ec9d9d1396f2c9ecb804bc94b2c45
我第一个加的 Skill 是官方文档优先。原因很简单,Web3 领域概念多、工具多、版本变化也比较快,如果模型完全靠记忆回答,很容易讲错。比如 Solidity 的版本、Foundry 的命令、OpenZeppelin 的合约继承方式,这些都应该优先参考官方资料。
所以我让这个 Skill 负责强制查阅官方资料。它的目标是避免模型凭印象乱讲。
67875686d81834724d6207cdbaa7c04a
第二个 Skill 是 Java 和 Solidity 的类比。这个 Skill 是整个学习助手的核心。因为目标用户是 Java 后端,如果解释不能落到 Java 经验上,那学习成本就会高很多。
比如我们可以这样类比:
Java class 类似 Solidity contract;
Java field 类似 Solidity state variable;
Java method 类似 Solidity function;
Java Map 类似 Solidity mapping;
Java 用户 ID 可以类比 Web3 地址;
JUnit 测试可以类比 Foundry test。
当然,这些类比不是完全等价。比如 Java 的对象一般运行在服务器内存里,而 Solidity 合约部署到链上以后,它的状态变化会被记录下来,不能像普通数据库一样随便改。类比只是入口,不是最终结论。这个 Skill 的作用就是先帮小白建立入口,再补充差异。
Skill 体系总览#
最后我整理了一套完整 Skill 体系,不是为了把数量堆多,而是让学习过程能闭环。
16cd1c982927e52fdd1aecbc9a19e0ca
web3-official-docs-first#
这个 Skill 的作用是优先查官方资料。它负责把学习内容限制在可靠来源里,避免智能体凭印象讲。对于 Web3 来说,这一点很重要。因为很多教程会混杂各种版本、各种工具链和各种实践习惯,如果一开始就看太杂,反而容易混乱。
这个 Skill 主要处理的问题是:当用户问 Solidity、Ethereum、Foundry、Hardhat、OpenZeppelin 相关内容时,先基于官方资料整理,再用中文解释。这样可以减少“模型说得很顺,但其实不准确”的情况。
java-solidity-bridge#
这个 Skill 是学习助手最常用的 Skill。它负责把 Java 后端概念翻译成 Web3 概念。
比如用户问区块链账本是什么,它不会直接讲分布式账本、共识算法、节点验证,而是先从转账系统讲起。Java 系统里可能有账户余额表和交易流水表。账户余额表可以被更新,交易流水表一般用于审计。区块链的账本更像一套公开且不容易被随便修改的记录系统。
这种解释方式对小白更友好。
foundry-lab-runner#
这个 Skill 用来做本地实验。学习 Web3 不能只停留在概念解释上,后面一定要进入代码和测试。Foundry 是一个常用的智能合约开发工具链,里面的 forge 可以用来构建和测试,cast 可以做链上交互,anvil 可以启动本地节点。
不过在小白阶段,我不会让它直接进入复杂项目,而是先用最小实验。比如 Counter,只包含加一和查询。这样学习者不会一开始就被项目结构、依赖、部署脚本等内容干扰。
4bcaa5d5682c3f41117ff0fe572fd976
openzeppelin-template-builder#
这个 Skill 是为后续进阶准备的。因为当用户开始写标准化合约时,不应该手搓危险代码。OpenZeppelin 提供了很多经过验证的合约组件,比如权限控制、标准 Token、NFT 等。
但这个 Skill 不会在第一课就使用。它的定位是“以后再学”。只有当用户已经理解了基本合约、状态、调用、测试之后,再进入标准模板。这样不会让小白一上来就被继承关系、接口标准、权限模块吓到。
217d759e5dca6b8e12a6ab69a5070573
solidity-error-diagnoser#
这个 Skill 用来处理报错。学习编程最容易卡住的地方不是看概念,而是跑代码报错。尤其是 Solidity 和 Foundry 的错误信息,对初学者来说并不直观。
所以我专门加了一个报错诊断 Skill。它要求固定输出:
错误原文;
错误类型;
小白解释;
根因;
最小修复;
重新运行命令。
这个固定流程可以避免模型乱改代码。这个 Skill 强调“最小修复”,也就是只改必要的地方,让学习者能看到问题和修复之间的关系。
fb333f4ccb6c0094f5aff8c519938111
web3-study-note-keeper#
这个 Skill 负责学习笔记。是为了让学习者以后能复习。
它会把本次学习内容整理成几个固定部分:
今天学了什么;
一句话结论;
Java 类比;
Web3 正确认知;