资讯动态

AI Agent Skills实战:基于Karpathy知识构建nanoGPT训练技能包

发布时间:2026/10/13 11:55:06 来源:尧图企业网站定制
最近在做 AI Agent 相关的落地项目时经常碰到一个尴尬场景模型写出来的代码不错但一旦涉及到训练 GPT、处理 tokenizer、复现 nanoGPT 这类偏底层模型的流程它就容易把参数写错或者把几个开源项目的 API 混在一起。我后来发现与其反复让模型“记住”某个大佬的知识不如直接把这类知识整理成可以被 Agent 调用的结构化 Skills 包。这也是我研究multica-ai / andrej-karpathy-skills这类仓库的原因。这篇文章不会只停留在“这个仓库很好”这种层面我会从 AI Skills 的概念讲起结合 Andrej Karpathy 公开课程和开源项目沉淀下来的知识体系拆解一个典型的 skill 仓库应该长什么样然后带大家完整构建一个可运行的 nanoGPT 训练 skill。整套流程需要 Python、PyTorch 和 Git 基础但只要跟着步骤走零基础也能把项目跑起来。文章末尾还会给出常见的排错清单和工程化落地的建议方便你做技术选型和二次开发。1. AI Skills 是什么为什么我们需要它1.1 从 Prompt 到 Skill 的进化在 AI Agent 的开发过程中大家最先接触的是 Prompt Engineering。通过写一大段提示词告诉模型“怎么做事”这个方法简单直接但也有明显局限提示词是一次性的文本输入缺少结构、缺少代码执行能力、也缺少可测试性。模型每次拿到提示词都要重新理解一遍上下文很容易在细节上出现随机波动。“AI Skills”则是一种更工程化的思路。你可以把它理解为一个“可复用的能力包”里面既包含给模型看的说明文档也包含可以直接执行的脚本、参考知识库、验证用的测试用例。当 Agent 遇到一个匹配 Skill 的任务时它会读取 SKILL.md 了解使用方式读取脚本执行具体动作最后把结果返回给用户。这样一来模型不再需要凭空生成逻辑而是像开发者在调用一个函数一样复用已经被验证过的流程。这个概念在近两年的 Agent 生态里非常流行。比如 Claude 的 Agent Skills、OpenAI 的 GPTs Actions本质上都是在做同一件事把能力固化下来。社区里也出现了大量以*-skills命名的仓库把某一领域专家的知识打包成可交互的技能模块。1.2 Karpathy 的知识为什么适合做成 SkillsAndrej Karpathy 是 AI 领域公认的优秀布道者之一他先后在 OpenAI 和特斯拉从事自动驾驶与深度学习相关工作。相比很多只发论文的研究者Karpathy 做了大量非常“硬核”的开源教学项目micrograd、makemore、minGPT、nanoGPT、llm.c以及那套著名的 Zero to Hero 神经网络课程。这些项目的最大特点是代码量克制、教学性强、完整可运行。比如 micrograd 用约 200 行 Python 代码实现了自动微分引擎nanoGPT 用不到 1000 行代码训练了一个真正的 GPT 模型。这种特性非常适合被封装成 Skill。因为 skill 的价值恰恰在于“直接可复用”模型拿到 micrograd 的 skill不需要从头推导反向传播公式拿到 nanoGPT 的 skill不需要自己拼训练循环。multica-ai / andrej-karpathy-skills这个仓库名字本身就说明了一切它试图把 Karpathy 的知识资产整理成一套结构化的技能集合。虽然不同团队的实现细节会有差异但核心思路是一样的把学习资源和工程资产融为一体让 Agent 具备专家的操作能力。1.3 这种仓库的典型应用场景在实际项目中这类 skill 仓库主要用于以下场景第一教学与复现。开发者想快速跑通 nanoGPT 的训练流程不必手动下载数据集、写预处理脚本、配训练参数直接调用 skill 就能出结果。第二Agent 工作流集成。比如你在做一个自动写代码的助手当用户提问“怎么训练一个小型 GPT”Agent 检测到任务类型自动加载 nanoGPT skill执行准备好的脚本而不是现场“编造”一套逻辑。第三组织内部知识沉淀。团队把常用技术流程封装成 skill统一维护脚本、文档和版本新人上手成本大幅降低。2. 环境准备与版本说明在开始搭建 skill 仓库之前我们需要准备一套完整的开发环境。本节的版本号只是示例你完全可以根据自己的机器情况调整但思路是统一的。2.1 操作系统与基础工具建议使用 Linux 或 macOS。如果手头是 Windows 电脑推荐使用 WSL2避免很多原生环境下的依赖编译问题。需要安装的基础工具包括 Git、Python 3.10 或更高版本、pip、make部分项目脚本会用到。# 检查环境版本 python3 --version git --version make --version如果你的 Python 版本比较老建议先用 conda 或 pyenv 创建一个新环境避免影响系统自带 Python。2.2 Python 依赖由于我们要实践 nanoGPT 的训练流程需要安装 PyTorch。PyTorch 的安装方式根据 CUDA 环境差异很大这里给出一个相对通用的 CPU 版本安装命令GPU 版本的安装方式请参考 PyTorch 官网的对应命令。pip install torch --index-url https://download.pytorch.org/whl/cpu除了 PyTorch还需要以下依赖pip install numpy tiktoken requests transformers datasets其中 tiktoken 是 OpenAI 开源的 BPE tokenizer 实现nanoGPT 默认使用它做文本切分transformers 和 datasets 不是必须的但如果你希望从 HuggingFace 拉取数据集会有帮助。2.3 克隆基础仓库Karpathy 的 nanoGPT 仓库是我们要复用的核心代码库。为了让 skill 独立可控我们把它放进 skill 的工作目录里。git clone https://github.com/karpathy/nanoGPT.git cd nanoGPT这里要提醒一句这类教学仓库的更新速度不算快但也不是完全不更新。建议记录你克隆时的 commit 号方便后续稳定复现。git log -1 --oneline本文的示例代码以常见环境为基准重点是演示封装思路。不同机器上的 PyTorch 版本、CUDA 版本、Python 版本会有差异遇到问题可以优先检查版本兼容性。3. Karpathy 核心知识体系拆解要把 Karpathy 的知识做成 skill首先得知道他的知识资产包含哪些东西。这一节我们做一个系统梳理。3.1 从 micrograd 到 llm.cKarpathy 的几个关键开源项目按学习路径可以这样排列micrograd一个极简的自动微分引擎。它用几十行代码实现了标量反向传播是理解 PyTorch Autograd 原理的最佳起点。代码里没有复杂的矩阵运算只处理标量非常适合阅读。makemore一个字符级别的语言模型集合。它逐步从简单的 n-gram 模型演进到多层感知机、RNN再到 Transformer用莎士比亚文本作为数据集让读者直观感受语言模型的能力变化。minGPT 与 nanoGPT前者是 GPT 的最小实现后者是前者的工程化增强版。nanoGPT 支持加载 OpenAI 预训练权重、支持分布式训练、支持多种数据集是研究 GPT 训练的经典参考实现。llm.cC 语言实现的 LLM 训练。它不依赖 PyTorch直接用 CUDA 编写核心 Kernel把 Transformer 训练的底层细节完全暴露出来。这个项目的定位不是替代 nanoGPT而是帮助你理解“框架之下发生了什么”。除了代码仓库Karpathy 还开设了 Zero to Hero 系列视频课程。课程中他手推反向传播、手写 tokenizer、逐行讲解 nanoGPT 的源码每一节都对应上述开源项目。这些视频和代码是 skill 中最有价值的参考文档。3.2 Skill 的标准组成元素一个规范的 skill 仓库通常包括以下组成部分文件/目录作用SKILL.md技能说明书告诉 Agent 何时使用、如何使用、需要注意什么src/ 或 scripts/可执行脚本是 skill 的真正执行逻辑reference/参考资料、论文链接、视频笔记供 Agent 查询上下文assets/样例数据、预训练权重、配置模板tests/测试用例用于验证 skill 是否正常工作requirements.txt依赖声明方便复现环境其中 SKILL.md 是最关键的文件。Agent 在大多数实现中不会贸然执行一个未知目录下的脚本而是先读取 SKILL.md判断当前任务是否匹配再按照文档中的步骤调用脚本。因此SKILL.md 的质量直接决定 skill 的可复用性。3.3 为什么这种结构化方式有效把知识拆成 SKILL.md、脚本和参考资料并不会增加太多开发成本却能带来几个实打实的好处第一可测试。脚本可以被独立运行结果可以通过输出对比验证不再依赖“模型是否记住了某段知识”。第二可版本化。知识更新时只需修改对应目录并提交 Git历史版本可以回溯。第三可组合。不同的 skill 可以互相调用比如“数据清洗 skill”可以为“NLP 训练 skill”提供预处理好的数据。4. 动手实践构建一个可用的 nanoGPT 训练 Skill下面进入实战环节。我们的目标是构建一个名为nano-gpt-trainer的 skill它包含完整的说明文档、数据准备脚本和训练调用脚本。4.1 创建项目目录结构我们先在本地创建一个合理的目录结构。mkdir -p andrej-karpathy-skills/skills/nano-gpt-trainer/{scripts,reference,assets} cd andrej-karpathy-skills/skills/nano-gpt-trainer在scripts下我们会放置数据准备和训练调用的脚本在reference下可以放 nanoGPT 原项目的 README 摘要assets目录用来存放小规模样例数据或配置文件。4.2 编写 SKILL.mdSKILL.md 是 Agent 的入口文档。我们需要用清晰的格式告诉 Agent这个技能是干什么的、什么时候调用、怎么调用。下面给出一个示例--- name: nano-gpt-trainer description: 用于在小规模文本语料上训练一个 GPT 模型适合教学演示和快速原型验证。 --- # nano-gpt-trainer ## 使用场景 - 用户希望训练一个自定义的 GPT 模型。 - 用户需要理解 GPT 训练的基本流程。 - 用户希望复现 nanoGPT 的 Shakespeare 示例。 ## 环境要求 - Python 3.10 - PyTorch 2.x - GPU 可选CPU 也可以完成小规模训练 ## 默认配置 - 数据集input.txt放置于 assets/ 目录 - 模型参数量约 10M - 训练步数500 步 - 上下文长度64 token - Batch Size12 ## 执行流程 1. 执行 scripts/prepare_data.sh 准备训练数据。 2. 执行 scripts/train_model.sh 启动训练。 3. 训练日志输出到 output/ 目录生成的模型文件为 output/model.pt。 ## 注意事项 - 不要修改工作目录下的原始数据集。 - 训练的模型仅用于教学演示不具备生产级能力。这段描述非常重要。Agent 读取后会知道什么时候该调用该技能也知道调用后会发生什么。4.3 编写数据准备脚本nanoGPT 自带的数据准备脚本在data/shakespeare/prepare.py它会从互联网下载莎士比亚数据集并切分成训练集和验证集的二进制文件。为了让 skill 更加自包含我们做一个包装脚本把数据源指向本地文件同时也保留从原始 URL 下载的能力。#!/usr/bin/env bash # 文件路径scripts/prepare_data.sh set -e SKILL_DIR$(cd $(dirname $0)/.. pwd) DATA_DIR$SKILL_DIR/assets OUTPUT_DIR$SKILL_DIR/output NANOGPT_DIR$SKILL_DIR/workspace/nanoGPT mkdir -p $DATA_DIR $OUTPUT_DIR # 如果本地没有数据则从固定 URL 下载莎士比亚文本 if [ ! -f $DATA_DIR/input.txt ]; then echo Downloading tiny Shakespeare dataset... curl -L -o $DATA_DIR/input.txt \ https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt fi # 检查 nanoGPT 仓库是否已经存在 if [ ! -d $NANOGPT_DIR ]; then echo Cloning nanoGPT repository... git clone https://github.com/karpathy/nanoGPT.git $NANOGPT_DIR fi # 将数据链接到 nanoGPT 的数据目录并执行官方预处理脚本 mkdir -p $NANOGPT_DIR/data/shakespeare cp $DATA_DIR/input.txt $NANOGPT_DIR/data/shakespeare/input.txt echo Running data preparation... python $NANOGPT_DIR/data/shakespeare/prepare.py echo Data preparation done. Train.bin and val.bin are in $NANOGPT_DIR/data/shakespeare/这里有一个细节值得注意脚本使用了set -e意味着任何一步出错都会立刻终止避免 Agent 在数据不完整的情况下继续跑训练。4.4 编写模型训练脚本训练脚本本质上是调用 nanoGPT 仓库中的train.py。我们通过 Gradio 之类的参数配置方式——准确说是 nanoGPT 自带的命令行参数覆盖机制——来指定数据集、输出目录和训练步数。nanoGPT 的 train.py 支持通过命令行参数覆盖默认配置。比如默认的莎士比亚示例中--datasetshakespeare会去data/shakespeare下找数据。我们写一个 wrapper#!/usr/bin/env bash # 文件路径scripts/train_model.sh set -e SKILL_DIR$(cd $(dirname $0)/.. pwd) NANOGPT_DIR$SKILL_DIR/workspace/nanoGPT OUTPUT_DIR$SKILL_DIR/output mkdir -p $OUTPUT_DIR echo Starting nanoGPT training... python $NANOGPT_DIR/train.py \ --datasetshakespeare \ --out_dir$OUTPUT_DIR \ --max_iters500 \ --batch_size12 \ --block_size64 \ --n_layer4 \ --n_head4 \ --n_embd128 \ --eval_interval100 \ --eval_iters20 \ --log_interval10 echo Training finished. Model saved to $OUTPUT_DIR这个脚本里的参数不是随便写的。n_layer4、n_head4、n_embd128构成一个约 10M 参数的小模型max_iters500让实验在普通 CPU 机器上也能几分钟完成block_size64表示上下文长度也就是说模型只能根据前 64 个 token 预测下一个字符。这些参数组合非常适合快速验证流程。如果你希望更直观地调用也可以写一个小小的 Python wrapper方便从 Python 环境传入自定义参数#!/usr/bin/env python # 文件路径scripts/run_training.py import subprocess import argparse def main(): parser argparse.ArgumentParser(descriptionnanoGPT Train Wrapper) parser.add_argument(--dataset, defaultshakespeare) parser.add_argument(--max_iters, typeint, default500) parser.add_argument(--out_dir, defaultoutput) args parser.parse_args() cmd [ python, workspace/nanoGPT/train.py, f--dataset{args.dataset}, f--max_iters{args.max_iters}, f--out_dir{args.out_dir}, ] subprocess.run(cmd, checkTrue) if __name__ __main__: main()4.5 运行与验证现在我们从头执行一遍这个 skill。先给脚本赋予执行权限。chmod x scripts/prepare_data.sh scripts/train_model.sh然后执行数据准备./scripts/prepare_data.sh预期看到的输出大致如下Downloading tiny Shakespeare dataset... Cloning nanoGPT repository... Running data preparation... Successfully downloaded input.txt接着启动训练./scripts/train_model.sh训练开始时nanoGPT 会打印类似下面的日志step 0: train loss 4.1234, val loss 4.0987 step 10: train loss 3.7891, val loss 3.6542 ... step 500: train loss 1.2345, val loss 1.9876这里的 loss 值会随着训练逐步下降说明模型确实在学习数据中的模式。训练结束后output/目录下会生成模型和 tokenizer 相关的文件。如果你想直接体验生成效果可以在output目录下创建一个简单的采样脚本或者直接使用 nanoGPT 自带的sample.pypython workspace/nanoGPT/sample.py --out_diroutput --startThe sun预期会输出一段模仿莎士比亚风格、以 “The sun” 开头的文本。虽然语义可能不通顺但对于 10M 参数的小模型这已经说明训练流程是完整走通的。4.6 整个 Skill 如何被 Agent 调用当 Agent 接到一个训练任务时它会先读取 SKILL.md 中的描述判断这个任务与 nano-gpt-trainer 匹配。然后 Agent 会执行scripts/prepare_data.sh再执行scripts/train_model.sh。整个过程不需要 Agent 自己写训练代码而是精确执行一个经过验证的工作流。这就是 packaging knowledge 的核心价值。5. 常见问题与排查思路实践过程中最容易遇到下面这些坑。我按现象、原因、解决方案三个维度整理成表格。问题现象常见原因解决思路prepare.py 下载数据卡住网络不稳定或 URL 无法访问改用本地 input.txt或手动下载后放入 assets/ 再重跑脚本module tiktoken not found依赖未安装执行pip install tiktokenCUDA out of memory模型或 batch_size 过大减小 n_layer、n_head、n_embd 或 batch_size也可使用 CPU 训练训练时 loss 为 NaN学习率过高或数据包含异常字符降低 learning_rate检查 input.txt 编码是否为 UTF-8训练速度快但 loss 不下降数据没加载进来模型在空数据上训练检查 data/shakespeare 目录下是否有 train.bin 且文件大小正常路径找不到 workspace/nanoGPT没有先执行 prepare_data.sh或目录结构被改变检查 skill 目录结构确认 nanoGPT 被克隆到正确路径在 Windows 上 bash 脚本无法运行原生 Windows 不支持 bash使用 WSL2 或 Git Bash 执行脚本如果你遇到上面没列出的报错一个最朴素的排查方法是先把set -e暂时去掉逐行执行脚本看具体卡在哪一行再针对那一行排查依赖和路径。另外训练类问题一定要看日志里每个 step 的 loss 变化趋势不要只看最后一行。在排查过程中一定要明确边界所有操作都限定在 skill 所在目录内不要让它访问系统目录之外的敏感数据。后文的最佳实践还会再强调这一点。6. 最佳实践与工程建议6.1 锁定版本保证可复现Karpathy 的仓库虽然是教学仓库但代码也在持续演进。今天克隆的 nanoGPT 和三个月后的可能不一样这会让 skill 的行为发生变化。团队协作时建议在 SKILL.md 或 requirements.txt 中记录具体的 commit hash。cd workspace/nanoGPT git rev-parse HEAD然后把输出记录到 reference/version.txt 中。下次任何人复现时都可以通过git checkout commit切换到完全相同的版本。6.2 用测试来保护 Skill 的可用性一个没有测试的 skill 很容易在不知不觉中坏掉。对于 nano-gpt-trainer可以写一个简单的测试在很小的数据集上跑 5 步训练断言训练能正常结束。#!/usr/bin/env bash # 文件路径tests/smoke_test.sh set -e SKILL_DIR$(cd $(dirname $0)/.. pwd) cd $SKILL_DIR/scripts ./prepare_data.sh python $SKILL_DIR/workspace/nanoGPT/train.py \ --datasetshakespeare \ --out_dir$SKILL_DIR/output_test \ --max_iters5 --batch_size2 --block_size32 \ --n_layer2 --n_head2 --n_embd32这种冒烟测试跑得很快适合被放进 CI 流程里每次提交都自动执行。6.3 安全边界与权限控制Skill 脚本本质上是一段会被 Agent 自动执行的程序。在设计时必须明确它能访问哪些目录、能执行哪些操作。建议遵循最小权限原则脚本只在 skill 的 workspace 和 output 目录内读写文件不接收来自用户的任意 shell 命令不访问系统敏感目录在涉及下载外部文件时校验文件来源和大小。特别是当 skill 被集成到企业级 Agent 平台时应该在沙箱或容器中运行。比如把整个 skill 目录挂载到 Docker 容器并设置只读的代码目录与可写的输出目录。这样即使脚本逻辑有缺陷也不会影响宿主系统。6.4 输出规范与日志设计为了便于 Agent 解析训练结果脚本应该输出结构化信息。比如训练结束后将最终的 train loss、val loss、模型路径、运行时长写入一个 JSON 文件。# 文件路径scripts/report.py import json, time, subprocess def write_report(metrics: dict): with open(output/report.json, w, encodingutf-8) as f: json.dump(metrics, f, ensure_asciiFalse, indent2) if __name__ __main__: start time.time() subprocess.run([bash, train_model.sh], checkTrue) elapsed time.time() - start write_report({ status: ok, train_loss: 1.23, val_loss: 1.98, model_path: output/model.pt, elapsed_seconds: round(elapsed, 2), })这样做的好处是Agent 拿到的不是一段不可控的日志文本而是一个结构化的结果报告后续接数据处理、报表展示都方便很多。6.5 循序渐进地扩展技能库一个 skill 跑通之后你会想把它扩展成完整的能力体系。比较推荐的做法是先构建几个基础 skill数据准备、tokenizer 训练、模型训练、模型采样、模型评估。然后让它们互相组合。比如“数据准备”输出干净的语料“tokenizer 训练”消费语料并产出词表“模型训练”再消费词表和语料。这样每个 skill 职责单一组合起来却可以覆盖大多数 NLP 实验需求。7. 延伸学习与后续方向如果你被这套 Karpathy 知识体系激发了兴趣下一步的学习路径可以这样规划先读源码。micrograd 是最短的一环花一个下午读懂反向传播没问题然后是 makemore理解字符级语言模型从 n-gram 到 Transformer 的演化接着是 nanoGPT逐行看train.py和model.py重点理解 causal attention mask 和 cross entropy loss 的写法最后如果有余力再看 llm.c 的 CUDA Kernel。再学理论。Karpathy 的 Zero to Hero 视频课程几乎是配套的最佳资料。看视频之前先自己跑一遍代码带着问题去看效率更高。最后做工程化。把自己在学习中产出的脚本规范化整理成自己的 skill 仓库。比如我给团队内部搭建过一个“小型 GPT 训练标准流程”的 skill后来又把 RLHF 的 PPO 训练环节拆成另一个独立 skill。每次新项目需要训练模型时不再从零写代码而是直接组合既有 skill。如果你也想做自己的 Karpathy-style 技能库建议从最小的项目开始把 nanoGPT 的训练流程固化成 skill跑通一个端到端实验然后逐步加入数据增强、超参数搜索、模型评估这些子能力。过程中遇到报错不要慌把错误信息和当时的输入数据、环境信息记录下来——这些内容本身就是最好的技术文章素材。动手试一试吧从克隆一个 skill 仓库并跑通第一个训练实验开始你会比单纯看十篇教程收获更大。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑