基于 llm-intro.md 的编写模式,总结如何创建高质量的交互式技术教程。涵盖内容展开的循序渐进原则、文章结构规范、交互式组件开发规范、最佳实践及完整开发工作流。
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-resource-aef0fbf8caf7 ,按照其中的说明把「编写交互式教程指南」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
本指南基于 docs/zh-cn/appendix/llm-intro.md 的编写模式,总结如何创建高质量的交互式技术教程。
llm-intro.md 采用的是 "螺旋上升" 的叙事结构,每个知识点都遵循以下认知路径:
具体体验 → 抽象概念 → 历史对比 → 本质揭示 → 前沿拓展
不要一上来就讲定义,先让读者看到效果。
示例(llm-intro.md 第 0 章):
# 大语言模型入门
> 💡 **学习指南**:本章节无需编程基础,通过交互式演示带你深入了解大语言模型...
<LlmQuickStartDemo /> <!-- 先让读者玩起来 -->
## 0. 引言:从人类语言到机器计算
人类用语言交流,计算机用数字计算。
**大语言模型 (LLM)** 的本质,就是一座连接这两个世界的桥梁。
要点:
每个新概念都建立在前一个概念基础上,形成知识链条。
示例(llm-intro.md 第 1-3 章):
## 1. 第一步:翻译(Tokenization)
核心任务:把文字变成数字 ID
<TokenizationDemo />
## 2. 核心难题:如何让计算机"计算"语言?
问题:只用 ID 太浪费、没内涵
方案:Embedding(稠密向量)
<EmbeddingDemo />
## 3. 从 单词 到 矩阵
回顾:Embedding 把每个词变成向量 → 把向量拼成矩阵 → GPU 高效计算
<TokenizerToMatrix />
依赖关系:
Tokenization(基础)
↓
Embedding(优化 Tokenization)
↓
矩阵化(优化 Embedding 的计算)
↓
Transformer(利用矩阵并行)
要点:
先提出"直白方案"的缺陷,再引出"聪明方案"。
示例(llm-intro.md 第 2.1-2.2 章):
### 2.1 为什么不用简单的 ID?
如果只用 ID,计算机会认为"10"和"20"只是两个毫无关系的数字。
- **缺点1**:太浪费(稀疏,One-Hot 数组太大)。
- **缺点2**:没内涵(无法表示"苹果"和"香蕉"都是水果)。
### 2.2 解决方案:Embedding(稠密向量)
为了**高效**且**有内涵**地表达一个词,我们发明了 **Embedding**。
它不再用一个长长的 0/1 数组,而是用一个短一点的、填满小数的数组...
模板:
### N.1 为什么不用 [朴素方案]?
[说明朴素方案的问题]
- **缺点1**:[具体问题]
- **缺点2**:[具体问题]
### N.2 解决方案:[优化方案]
为了解决上述问题,我们引入了 [优化方案]。
[说明优化方案的核心思想]
要点:
通过对比"旧技术"和"新技术",说明技术演进的动机。
示例(llm-intro.md 第 4 章):
### 4.1 为什么要淘汰 RNN?
以前的模型(RNN)像人读书一样,**从左到右**一个字一个字读。
- **缺点1**:慢。必须读完第1个字才能读第2个,没法并行。
- **缺点2**:忘。读到文章最后,可能已经忘了开头讲什么了。
### 4.2 Transformer 强在哪?
现在的 LLM 都基于 Transformer 架构,它完美契合了矩阵并行的特性:
1. **并行阅读**:它可以**一眼看完**整句话...
2. **注意力机制**:让每个词都**直接关注**到其他所有词...
对比表格化:
| 特性 | RNN | Transformer |
| :------------- | :----------------- | :--------------------- |
| **阅读方式** | 从左到右,逐字处理 | 并行处理,一眼看完整句 |
| **计算效率** | 慢(无法并行) | 快(GPU 矩阵运算) |
| **长距离记忆** | 容易遗忘 | 注意力机制保持连接 |
要点:
<RNNvsTransformer /> 可视化先描述用户能观察到的现象,再揭示背后的本质机制。
示例(llm-intro.md 第 5 章):
## 5. 揭秘:从"续写"到"对话"
很多人会误以为 ChatGPT 真的懂我们在说什么,但其实它的本能只有一个:**猜下一个词**。
### 5.1 本能:疯狂续写
如果你给基础模型输入:"今天天气不错",它可能会续写:"去公园玩吧。"
但如果你输入:"美国的首都是哪里?",它可能会续写:"中国首都是哪里?..."
### 5.2 技巧:用"剧本"来对话
为了让它变成对话助手,工程师们想出了一个绝妙的办法:**角色扮演**。
我们在输入给模型的内容里,悄悄加了一些特殊的**标签**...
叙事结构:
现象(ChatGPT 会对话)
↓
打破误解(它只是在续写)
↓
揭示本质(Next Token Prediction)
↓
技巧揭秘(Template 角色扮演)
↓
深度交互(TrainingInferenceDemo)
要点:
在讲完核心原理后,介绍最新进展,保持内容的先进性。
示例(llm-intro.md 第 7 章):
## 7. 前沿探索:会思考的模型、MoE 架构与线性注意力机制
随着技术的发展,我们发现仅仅靠"预测下一个词"有时候会犯蠢...
于是,新一代的 **Thinking Models**(如 OpenAI o1, DeepSeek-R1)诞生了。
### 7.1 什么是"思考"?
- **快思考 (System 1)**:凭直觉,脱口而出。容易犯错。
- **慢思考 (System 2)**:通过产生"思维链",一步步推理。
### 7.5 架构进化:从"全能"到"专家团"(Dense vs MoE)
- **Dense(稠密模型)**:比喻为一个**全能天才**...
- **MoE(混合专家模型)**:比喻为一个**专家团队**...
拓展维度:
要点:
一个完整的交互式教程应该包含以下层次(从浅到深):
层次 0:引子 (类比 + 核心挑战)
层次 1:基础概念 (是什么 + 怎么做)
层次 2:设计动机 (为什么不用朴素方案)
层次 3:核心机制 (本质原理 + 可视化)
层次 4:实践应用 (数据格式 + 使用场景)
层次 5:前沿拓展 (最新技术 + 未来趋势)
对照检查:
每个段落内部也遵循 "提出问题 → 分析问题 → 解决问题" 的三段式结构:
[提出问题]
计算机看不懂"汉堡"这两个字,它只认识数字。
所以,我们的第一个任务是:**把文本切分成计算机能理解的最小单位**。
[分析问题]
- **英文**:自带空格,天然容易分词(如 `I love AI`)。
- **中文**:没有空格,需要算法来切分(如 `我爱人工智能`)。
[解决问题]
现代 LLM(如 GPT-4)通常使用 **Subword Tokenization(子词分词)** 技术(如 BPE 算法)。
它的聪明之处在于:
- **常用词**(如 "apple")保持完整,作为一个 Token。
- **生僻词**(如 "applepie")拆分成常见片段("apple" + "pie")。
要点:
# 主题名称 (English Title)
> 💡 **学习指南**:本章节[前置要求],通过[教学方式]带你深入了解[核心主题]。我们将从[起点]开始,一直到[终点]。
要点:
结构:
## 0. 引言:从[熟悉概念]到[新概念]
[用类比连接两个概念]
它的核心任务只有一个:**[一句话总结核心目标]**。
为了实现这个目标,我们需要解决三个核心挑战:
1. **[挑战1]**:[为什么需要]
2. **[挑战2]**:[为什么需要]
3. **[挑战3]**:[为什么需要]
本教程将带你从零开始,一步步拆解[核心主题]的构建过程。
每个知识点遵循 "问题 → 方案 → 对比 → 演示" 的结构:
## N. [章节标题]
[段落1:提出问题/当前困境]
### N.1 [子问题标题]
[解释问题产生的背景/原因]
### N.2 [解决方案标题]
[提出解决方案,解释其核心思想]
**关键点**:[一句话总结核心概念]
<[InteractiveDemo />
要点:
当需要对比多个选项时,使用表格:
| 特性 | [选项A] | [选项B] |
| :----------- | :----------------- | :----------------- |
| **核心逻辑** | **[描述]** | **[描述]** |
| **优点** | [优点1]<br>[优点2] | [优点1]<br>[优点2] |
| **缺点** | [缺点1]<br>[缺点2] | [缺点1]<br>[缺点2] |
| **适用场景** | [场景1] | [场景2] |
> ⚠️ **注意**:[使用建议或注意事项]
当涉及数据格式时,提供 JSON 示例:
- **数据示例 (JSON 格式)**:
```json
// [注释说明这是什么数据]
{
"field1": "值1",
"field2": "值2"
}
// 模型学会了:[解释这个数据的作用]
```
文章末尾提供 Glossary:
## N. 名词速查表 (Glossary)
| 名词 | 全称 | 解释 |
| :-------- | :---------- | :------------------------------------- |
| **TERM1** | Full Name 1 | **简短中文说明**。详细解释为什么重要。 |
| **TERM2** | Full Name 2 | **简短中文说明**。详细解释。 |
目录结构:
docs/.vitepress/theme/components/appendix/{topic-name}/
├── {Concept}Demo.vue # 主演示组件
├── {Concept}Demo.vue # 其他相关组件
└── ...
命名规范:
TokenizationDemo.vue、EmbeddingDemo.vue<!--
ComponentName.vue
组件用途简述
用途:
[详细说明这个组件要展示什么概念,解决什么教学问题]
交互功能:
- [功能1]:[说明]
- [功能2]:[说明]
- [功能3]:[说明]
-->
<template>
<div class="[component-name]">
<!-- 控制面板(如果有) -->
<div class="control-panel">[输入控件、模式切换等]</div>
<!-- 可视化区域 -->
<div class="visualization-area">[核心可视化内容]</div>
<!-- 说明文字 -->
<div class="info-box">
<p>
<span class="icon">💡</span>
<strong>Note:</strong>
[教育性说明文字]
</p>
</div>
</div>
</template>
层级结构:
.control-panel:控制区(输入、切换按钮).visualization-area:核心可视化区.info-box:说明提示框<script setup>
import { ref, computed } from 'vue'
// 响应式状态
const [stateName] = ref([initialValue])
// 计算属性
const [computedName] = computed(() => {
// 逻辑处理
return result
})
// 方法
const [methodName] = ([params]) => {
// 方法实现
}
</script>
要点:
<script setup>)ref 和 computed<style scoped>
.[component-name] {
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
background-color: var(--vp-c-bg-soft);
padding: 1.5rem;
margin: 1rem 0;
font-family: var(--vp-font-family-mono);
}
.control-panel {
/* 控制面板样式 */
}
.visualization-area {
/* 可视化区域样式 */
}
</style>
CSS 变量使用:
var(--vp-c-bg):主背景色var(--vp-c-bg-soft):次背景色var(--vp-c-bg-alt):交替背景色var(--vp-c-divider):分隔线颜色var(--vp-c-brand):主题色var(--vp-c-text-1/2/3):文本颜色(1最深,3最浅)布局工具:
display: flex; gap: 1rem;@media (max-width: 640px) { ... }border-radius: 6px/8px/12pxtransition: all 0.2s// 用户操作立即触发视觉反馈
const handleInput = (value) => {
result.value = processInput(value)
// 不需要点击"提交"按钮
}
// 使用颜色区分不同状态/类型
const colorClasses = [
'color-0', // rgba(255, 99, 132, 0.2) - 红色
'color-1', // rgba(54, 162, 235, 0.2) - 蓝色
'color-2', // rgba(255, 206, 86, 0.2) - 黄色
'color-3', // rgba(75, 192, 192, 0.2) - 青色
'color-4' // rgba(153, 102, 255, 0.2) - 紫色
]
// 提供不同视角/模式
const modes = [
{ id: 'mode1', label: '模式1', desc: '说明' },
{ id: 'mode2', label: '模式2', desc: '说明' }
]
const currentMode = ref('mode1')
/* 淡入动画 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(5px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 脉冲动画 */
@keyframes pulse {
0% {
opacity: 0.4;
transform: scale(0.8);
}
50% {
opacity: 1;
transform: scale(1.1);
}
100% {
opacity: 0.4;
transform: scale(0.8);
}
}
/* 弹性过渡 */
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
示例:TokenizationDemo.vue
<template>
<div class="demo">
<div class="input-group">
<label>Input</label>
<textarea v-model="inputText"></textarea>
</div>
<div class="output">
<div v-for="item in processedItems" :key="item.id">
{{ item }}
</div>
</div>
</div>
</template>
<script setup>
const inputText = ref('默认示例文本')
const processedItems = computed(() => {
return process(inputText.value)
})
</script>
示例:EmbeddingDemo.vue
<template>
<div class="demo">
<div class="mode-selector">
<button
v-for="mode in modes"
:key="mode.id"
:class="{ active: currentMode === mode.id }"
@click="currentMode = mode.id"
>
{{ mode.label }}
</button>
</div>
<div class="content">
{{ modes.find((m) => m.id === currentMode)?.content }}
</div>
</div>
</template>
示例:TrainingInferenceDemo.vue(假设)
<template>
<div class="demo">
<div class="steps">
<button
v-for="(step, index) in steps"
:key="index"
:class="{ active: currentStep === index }"
@click="currentStep = index"
>
{{ step.title }}
</button>
</div>
<div class="step-content">
{{ steps[currentStep].content }}
</div>
</div>
</template>
<ConceptDemo />
<!-- 带间距 -->
<ConceptDemo />
<!-- 多个组件 -->
<Demo1 />
<Demo2 />
```javascript
// 代码示例
const example = 'highlighted'
```
**粗体强调**
_斜体_
`代码片段`
> 引用块
---
<!-- 使用分隔线区分不同主题 -->
@media 查询computed 而非方法const规划内容:
创建组件:
mkdir -p docs/.vitepress/theme/components/appendix/{topic-name}
touch docs/.vitepress/theme/components/appendix/{topic-name}/{Concept}Demo.vue
编写组件:
<template>、<script setup>、<style scoped>编写文档:
测试发布:
npm run dev # 本地预览
npm run build # 构建检查
参考以下文件学习完整实现:
| 文件 | 说明 |
|---|---|
docs/zh-cn/appendix/llm-intro.md | 完整的文章结构 |
docs/.vitepress/theme/components/appendix/llm-intro/LlmQuickStartDemo.vue | 聊天交互型组件 |
docs/.vitepress/theme/components/appendix/llm-intro/TokenizationDemo.vue | 输入处理型组件 |
docs/.vitepress/theme/components/appendix/llm-intro/EmbeddingDemo.vue | 模式切换型组件 |
发布前确认:
npm run build 成功总结:优秀的交互式教程 = 清晰的逻辑 + 即时的反馈 + 精致的可视化。遵循本规范,可以创建出让读者"秒懂"复杂概念的高质量内容。