<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Transformer on Khari Z's LogBook</title><link>https://n571e.github.io/tags/transformer/</link><description>Recent content in Transformer on Khari Z's LogBook</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://n571e.github.io/tags/transformer/index.xml" rel="self" type="application/rss+xml"/><item><title>从 Karpathy 的 LLM Wiki 到我的知识系统</title><link>https://n571e.github.io/p/llm-wiki-learning/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://n571e.github.io/p/llm-wiki-learning/</guid><description>&lt;img src="https://n571e.github.io/" alt="Featured image of post 从 Karpathy 的 LLM Wiki 到我的知识系统" /&gt;&lt;h2 id="引子从一次性问答到可维护知识库"&gt;&lt;a href="#%e5%bc%95%e5%ad%90%e4%bb%8e%e4%b8%80%e6%ac%a1%e6%80%a7%e9%97%ae%e7%ad%94%e5%88%b0%e5%8f%af%e7%bb%b4%e6%8a%a4%e7%9f%a5%e8%af%86%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;引子：从一次性问答到可维护知识库&#10;&lt;/h2&gt;&lt;p&gt;2026 年 4 月的一天，Andrej Karpathy 在 GitHub Gist 上发布了一篇名为 &lt;a class="link" href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" target="_blank" rel="noopener"&#10; &gt;LLM Wiki&lt;/a&gt; 的文档。它讨论的不是一次性使用 ChatGPT，而是如何&lt;strong&gt;让 LLM 持续维护个人知识库&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;这篇笔记记录两件事：Karpathy 的 LLM Wiki 模式是什么，以及我怎么把它落到自己的 LLM 学习系统里。复习时主要看三层结构和三种操作。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一llm-wiki从-rag-到持久知识编译"&gt;&lt;a href="#%e4%b8%80llm-wiki%e4%bb%8e-rag-%e5%88%b0%e6%8c%81%e4%b9%85%e7%9f%a5%e8%af%86%e7%bc%96%e8%af%91" class="header-anchor"&gt;&lt;/a&gt;一、LLM Wiki：从 RAG 到持久知识编译&#10;&lt;/h2&gt;&lt;h3 id="11-它想解决什么"&gt;&lt;a href="#11-%e5%ae%83%e6%83%b3%e8%a7%a3%e5%86%b3%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;1.1 它想解决什么&#10;&lt;/h3&gt;&lt;p&gt;常见的 LLM 文档问答模式是 &lt;strong&gt;RAG（Retrieval-Augmented Generation）&lt;/strong&gt;：上传文档 -&amp;gt; 检索相关片段 -&amp;gt; 生成回答。它能解决单次问答，但有个问题：&lt;strong&gt;知识不会自动沉淀&lt;/strong&gt;。昨天问答中的归纳、矛盾和交叉引用，不会自然变成今天可复用的知识结构。&lt;/p&gt;&#10;&lt;p&gt;Karpathy 提出的替代方案是让 LLM &lt;strong&gt;增量构建并维护一个持久 Wiki&lt;/strong&gt;：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当你加入新资料时，LLM 会阅读它、提取关键信息、整合进现有 Wiki，并更新实体页面、修订主题总结、标记新数据与旧论断的矛盾、强化或质疑正在演进的综合分析。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;区别在于：&lt;strong&gt;Wiki 是一个持续维护的知识层&lt;/strong&gt;。它不只是临时检索结果，而是把摘要、概念页、实体页、矛盾标记和综合分析长期保存下来。&lt;/p&gt;&#10;&lt;h3 id="12-三层架构"&gt;&lt;a href="#12-%e4%b8%89%e5%b1%82%e6%9e%b6%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;1.2 三层架构&#10;&lt;/h3&gt;&lt;p&gt;&lt;img alt="LLM Wiki 架构演示" class="gallery-image" data-flex-basis="440px" data-flex-grow="183" height="1536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://n571e.github.io/p/llm-wiki-learning/0.webp" srcset="https://n571e.github.io/p/llm-wiki-learning/0_hu_8ce56a80e297bf7e.webp 800w, https://n571e.github.io/p/llm-wiki-learning/0_hu_ca8f18d865e04e09.webp 1600w, https://n571e.github.io/p/llm-wiki-learning/0_hu_221579339f7e6c4c.webp 2400w, https://n571e.github.io/p/llm-wiki-learning/0.webp 2816w" width="2816"&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──────────────────────────────────────┐&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Schema（AGENTS.md / CLAUDE.md） │ ← 你和 LLM 共同维护的行为规范&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├──────────────────────────────────────┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Wiki（markdown 文件目录） │ ← LLM 写、你读的知识层&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├──────────────────────────────────────┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Raw Sources（原始文档） │ ← 不可变的来源真值&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└──────────────────────────────────────┘&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Raw Sources&lt;/strong&gt;：原始材料层，保存论文、文章、代码笔记等来源。只读，不让 LLM 修改。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Wiki&lt;/strong&gt;：知识加工层，保存摘要页、实体页、概念页、比较分析等 Markdown 页面。LLM 主要维护这一层。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Schema&lt;/strong&gt;：维护规则层，用来规定 LLM 如何 ingest、query、lint，以及页面格式、引用规范和日志规则。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="13-三种操作"&gt;&lt;a href="#13-%e4%b8%89%e7%a7%8d%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;1.3 三种操作&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;操作&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;描述&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;产出&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Ingest&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;投入新资料，LLM 阅读、摘要、更新现有页面&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一次 ingest 可能触及 10–15 个 Wiki 页面&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;向 Wiki 提问，LLM 综合相关页面生成带引用的回答&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;好的回答可以回写为 Wiki 新页面&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Lint&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LLM 对 Wiki 做健康检查——矛盾、孤立页、缺失引用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;维护 Wiki 的长期质量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="14-为什么这行得通"&gt;&lt;a href="#14-%e4%b8%ba%e4%bb%80%e4%b9%88%e8%bf%99%e8%a1%8c%e5%be%97%e9%80%9a" class="header-anchor"&gt;&lt;/a&gt;1.4 为什么这行得通&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;em&gt;维护知识库的难点不在于阅读或思考——在于记账。更新交叉引用、保持摘要最新、标记新旧数据冲突、维护一致性。人类放弃 Wiki 是因为维护成本增长得比价值更快。LLM 不会厌倦，不会忘记更新引用，能一次性修改 15 个文件。&lt;/em&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;复习锚点：Raw Sources 保真，Wiki 负责综合，Schema 约束维护行为。这个模式的价值不在“自动写笔记”，而在降低长期维护成本。&lt;/p&gt;&#10;&lt;p&gt;这个模式让我想到 Vannevar Bush 1945 年的 &lt;strong&gt;Memex&lt;/strong&gt; 构想：一个带有文档间关联路径的个人知识存储。过去的难点是“谁来维护链接和摘要”；LLM 让这部分维护成本降了下来。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二实践我的-llm-wiki-搭建"&gt;&lt;a href="#%e4%ba%8c%e5%ae%9e%e8%b7%b5%e6%88%91%e7%9a%84-llm-wiki-%e6%90%ad%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;二、实践：我的 LLM Wiki 搭建&#10;&lt;/h2&gt;&lt;p&gt;我在自己的知识库中按这个模式搭了一个最小结构：&lt;/p&gt;&#10;&lt;h3 id="21-目录结构"&gt;&lt;a href="#21-%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;2.1 目录结构&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Wiki/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── AGENTS.md # Schema：工作流规范&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── index.md # 内容索引：按类别编目所有页面&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── log.md # 时间线：append-only 的操作日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── raw/ # Raw Sources 层&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── index.md # 来源注册表&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── inbox/ # 新材料暂存区&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── llm-zero-to-one/ # LLM 学习专题&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── pages/ # Wiki 层&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── sources/ # 每份来源的摘要页&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── concepts/ # 跨来源的概念归纳页&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── entities/ # 实体页（人物/工具/模型）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── queries/ # 问答沉淀页&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── synthesis/ # 综合分析页&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="22-流程实录"&gt;&lt;a href="#22-%e6%b5%81%e7%a8%8b%e5%ae%9e%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;2.2 流程实录&#10;&lt;/h3&gt;&lt;p&gt;以收录 Happy-LLM 第一章为例，一次 ingest 大概是这样：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;将文章 Markdown 放入 &lt;code&gt;raw/inbox/llm-zero-to-one/&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;在 &lt;code&gt;raw/index.md&lt;/code&gt; 登记为 &lt;code&gt;Status = selected&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;LLM 阅读全文，生成 &lt;code&gt;pages/sources/happy-llm-chapter1-nlp-basics.md&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;LLM 判断该来源属于 &amp;ldquo;LLM 从零学习&amp;rdquo; 概念域，更新 &lt;code&gt;pages/concepts/llm-zero-to-one-learning-path.md&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;更新 &lt;code&gt;index.md&lt;/code&gt; 的概念表条目&lt;/li&gt;&#10;&lt;li&gt;在 &lt;code&gt;log.md&lt;/code&gt; 追加操作记录&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;一份来源会触及多个页面。随着来源增多，概念页会不断补充证据、链接和对比关系，这就是 Wiki 模式区别于普通摘抄的地方。&lt;/p&gt;&#10;&lt;h3 id="23-我学到的一点"&gt;&lt;a href="#23-%e6%88%91%e5%ad%a6%e5%88%b0%e7%9a%84%e4%b8%80%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;2.3 我学到的一点&#10;&lt;/h3&gt;&lt;p&gt;实践之后，我最想留下的是这句话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;先搭可持续维护的知识系统，再扩充学科内容，可以少掉很多碎片化学习的损耗。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这和传统“先学东西再整理笔记”的路径不同。学习系统先就位后，每一份新材料都会进入已有页面、索引和日志，而不是散落成临时笔记。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三这个模式具体解决什么"&gt;&lt;a href="#%e4%b8%89%e8%bf%99%e4%b8%aa%e6%a8%a1%e5%bc%8f%e5%85%b7%e4%bd%93%e8%a7%a3%e5%86%b3%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;三、这个模式具体解决什么&#10;&lt;/h2&gt;&lt;p&gt;这个知识管理模式带来几个直接好处：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;学习有据可查&lt;/strong&gt;：每次 ingest 和 query 都留有 log 记录，可以回溯学习轨迹。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;碎片能慢慢成系统&lt;/strong&gt;：零散笔记会进入概念页和综合页，不再只是一堆临时摘抄。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;交叉引用不用全靠手动维护&lt;/strong&gt;：不同知识点可以自动链接起来。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;学习路径更可见&lt;/strong&gt;：通过 Obsidian 的图谱视图，可以看到哪些知识节点已经建立，哪些还是空白。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四下一步"&gt;&lt;a href="#%e5%9b%9b%e4%b8%8b%e4%b8%80%e6%ad%a5" class="header-anchor"&gt;&lt;/a&gt;四、下一步&#10;&lt;/h2&gt;&lt;p&gt;按照 Happy-LLM 的课程路线，接下来的学习计划包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;预训练语言模型&lt;/strong&gt;：比较 Encoder-only (BERT)、Encoder-Decoder (T5)、Decoder-only (GPT) 三种范式&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;大语言模型专题&lt;/strong&gt;：LLM 的定义、涌现能力、训练策略&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;动手搭建&lt;/strong&gt;：基于 PyTorch 实现 LLaMA2，从 Tokenizer 到预训练的完整链路&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;训练实践&lt;/strong&gt;：预训练 → SFT → LoRA/QLoRA 高效微调&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;应用层&lt;/strong&gt;：RAG 检索增强、Agent 智能体&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;每个阶段的学习材料都会通过 Wiki 的 ingest 流程进入知识网络。这篇博文本身，也算是一次从 Wiki 到 Blog 的输出。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" target="_blank" rel="noopener"&#10; &gt;Karpathy, A. &lt;em&gt;LLM Wiki&lt;/em&gt;. GitHub Gist, 2026.&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/datawhalechina/happy-llm" target="_blank" rel="noopener"&#10; &gt;Datawhale. &lt;em&gt;Happy-LLM：从零开始构建大模型&lt;/em&gt;. GitHub, 2025.&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Bush, V. &lt;em&gt;As We May Think&lt;/em&gt;. The Atlantic, 1945.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>从 NLP 基础到 Transformer：我先补的几块地基</title><link>https://n571e.github.io/p/happy-llm-phase1-nlp-transformer/</link><pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate><guid>https://n571e.github.io/p/happy-llm-phase1-nlp-transformer/</guid><description>&lt;p&gt;进入大语言模型之前，我先补两块东西：&lt;strong&gt;文本如何变成模型能处理的向量&lt;/strong&gt;，以及 &lt;strong&gt;Transformer 如何用注意力机制建模上下文&lt;/strong&gt;。这两件事没理顺，后面看 tokenizer、embedding、mask、训练目标和生成过程时很容易断线。&lt;/p&gt;&#10;&lt;p&gt;这篇文章分成两部分：先梳理文本表示从统计方法到上下文化表示的演化，再整理手写 Transformer 时最容易混淆的九个实现问题。复习时重点看三条线：张量形状怎样变化、mask 怎样限制信息流、Encoder/Decoder 各自承担什么任务。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一温故知新文本表示是如何进化到大模型时代的"&gt;&lt;a href="#%e4%b8%80%e6%b8%a9%e6%95%85%e7%9f%a5%e6%96%b0%e6%96%87%e6%9c%ac%e8%a1%a8%e7%a4%ba%e6%98%af%e5%a6%82%e4%bd%95%e8%bf%9b%e5%8c%96%e5%88%b0%e5%a4%a7%e6%a8%a1%e5%9e%8b%e6%97%b6%e4%bb%a3%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;一、温故知新：文本表示是如何进化到大模型时代的？&#10;&lt;/h2&gt;&lt;p&gt;在接触大模型结构之前，先回答一个底层问题：&lt;strong&gt;文本怎样被表示成模型可以计算的对象？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="11-nlp-范式的演进"&gt;&lt;a href="#11-nlp-%e8%8c%83%e5%bc%8f%e7%9a%84%e6%bc%94%e8%bf%9b" class="header-anchor"&gt;&lt;/a&gt;1.1 NLP 范式的演进&#10;&lt;/h3&gt;&lt;p&gt;NLP 的技术路线可以粗略分成三段。每一段都在回答同一个问题：如何把语言现象变成可计算、可学习的形式。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;规则方法（手写模板）&lt;/strong&gt;：早期需要语言学专家人工定义无数规则。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;统计方法（概率模型）&lt;/strong&gt;：利用马尔可夫模型、隐马尔可夫模型等，让模型学习词串在语料库中出现的概率分布。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;深度学习方法（端到端）&lt;/strong&gt;：采用神经网络构建端到端的系统，无需繁杂的特征工程。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="12-文本表示的进化链"&gt;&lt;a href="#12-%e6%96%87%e6%9c%ac%e8%a1%a8%e7%a4%ba%e7%9a%84%e8%bf%9b%e5%8c%96%e9%93%be" class="header-anchor"&gt;&lt;/a&gt;1.2 文本表示的“进化链”&#10;&lt;/h3&gt;&lt;p&gt;大模型能处理长文本和上下文，前提是&lt;strong&gt;文本表示&lt;/strong&gt;已经从稀疏统计特征走到稠密、上下文化向量。复习时我按这条链看：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方法&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;核心思想&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;特点与局限&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;VSM&lt;/strong&gt; (词袋模型)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;将文本表示为高维稀疏向量，基于词频统计。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;忽略了词语的先后顺序，也完全丢失了语义相似性信息。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;N-gram&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;考察连续 n 个词的共现概率。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;能捕捉一定的局部词序，但面临严重的维度爆炸和数据稀疏问题。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Word2Vec&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用稠密、低维的向量表示词语，语义相近的词距离更近。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;静态表示（Static Embedding），每个词具有固定的向量表征，无法解决“一词多义”问题。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;ELMo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;基于双向 LSTM，根据上下文动态生成词向量。&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;实现了动态表示，但受限于 RNN 架构，长距离依赖的建模能力仍然有限。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;RNN/LSTM 按时间步递归处理序列，不利于大规模并行，也很难稳定抓住超长距离依赖。Transformer 的自注意力机制改成一次性比较序列中所有 token 之间的关系，所以更适合并行训练和长上下文建模。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二直面硬核transformer-学习过程中的-9-个迷思与解答"&gt;&lt;a href="#%e4%ba%8c%e7%9b%b4%e9%9d%a2%e7%a1%ac%e6%a0%b8transformer-%e5%ad%a6%e4%b9%a0%e8%bf%87%e7%a8%8b%e4%b8%ad%e7%9a%84-9-%e4%b8%aa%e8%bf%b7%e6%80%9d%e4%b8%8e%e8%a7%a3%e7%ad%94" class="header-anchor"&gt;&lt;/a&gt;二、直面硬核：Transformer 学习过程中的 9 个迷思与解答&#10;&lt;/h2&gt;&lt;p&gt;学习 Transformer 时，真正容易卡住的不是公式，而是公式落到代码以后：每个张量在哪一层、是什么形状、表示什么语义。下面九个问题都围绕一件事：把结构设计和实现细节对上。&lt;/p&gt;&#10;&lt;p&gt;复习时可以把这些问题当成检查表：能回答清楚，就说明注意力、mask、残差、位置编码和编解码器分工已经基本接上。&lt;/p&gt;&#10;&lt;h3 id="q1关于多头注意力参数的组织方式"&gt;&lt;a href="#q1%e5%85%b3%e4%ba%8e%e5%a4%9a%e5%a4%b4%e6%b3%a8%e6%84%8f%e5%8a%9b%e5%8f%82%e6%95%b0%e7%9a%84%e7%bb%84%e7%bb%87%e6%96%b9%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;Q1：关于多头注意力参数的组织方式&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;为什么通常使用三个“组合特征矩阵”（比如 $W_Q, W_K, W_V$）而不是给每个注意力头分配单独的矩阵？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;在实现时，代码经常直接使用 &lt;code&gt;nn.Linear(d_model, 3 * d_model)&lt;/code&gt; 或等价组合。这是因为 $X \cdot W_{combined}$ 在数学上完全等价于先分别对每个头进行特征映射然后再将结果拼接起来。使用组合矩阵能够在 GPU 上将所有的计算打包成一次矩阵乘法（matmul），极大提升了计算并行度与效率。&lt;/p&gt;&#10;&lt;h3 id="q2causal-mask因果掩码的切片逻辑"&gt;&lt;a href="#q2causal-mask%e5%9b%a0%e6%9e%9c%e6%8e%a9%e7%a0%81%e7%9a%84%e5%88%87%e7%89%87%e9%80%bb%e8%be%91" class="header-anchor"&gt;&lt;/a&gt;Q2：Causal Mask（因果掩码）的切片逻辑&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;代码中经常看到 &lt;code&gt;scores = scores + mask[:, :, :seqlen, :seqlen]&lt;/code&gt;，这样做的意义是什么？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;因果掩码用来防止 Decoder 在自回归生成时“偷看未来”。通常这个 &lt;code&gt;mask&lt;/code&gt; 张量会被构造成一个上三角全为 $-\infty$、下三角（含对角线）全为 $0$ 的矩阵。&#10;把它加到注意力分数 &lt;code&gt;scores&lt;/code&gt; 后再做 &lt;code&gt;softmax&lt;/code&gt;，未来位置的权重就会变成 $0$。最后的切片 &lt;code&gt;:seqlen, :seqlen&lt;/code&gt; 是为了从预分配的大掩码里，取出当前序列长度真正需要的那一块。&lt;/p&gt;&#10;&lt;h3 id="q3残差连接到底发生在什么位置"&gt;&lt;a href="#q3%e6%ae%8b%e5%b7%ae%e8%bf%9e%e6%8e%a5%e5%88%b0%e5%ba%95%e5%8f%91%e7%94%9f%e5%9c%a8%e4%bb%80%e4%b9%88%e4%bd%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;Q3：残差连接到底发生在什么位置&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;经常看见 Attention 模块里面有 &lt;code&gt;self.wo&lt;/code&gt; 和 &lt;code&gt;resid_dropout&lt;/code&gt;，它是直接在 Attention 里计算残差吗？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这是一个常见误解。Attention 模块内部通常只做注意力计算、输出投影 &lt;code&gt;self.wo&lt;/code&gt; 和 dropout，并不直接把输入 &lt;code&gt;x&lt;/code&gt; 加回来。残差连接一般发生在外层的 &lt;strong&gt;EncoderLayer&lt;/strong&gt; 或 &lt;strong&gt;DecoderLayer&lt;/strong&gt; 中，以 &lt;code&gt;x + sublayer_output&lt;/code&gt; 或 &lt;code&gt;x + dropout(sublayer_output)&lt;/code&gt; 的形式完成。&lt;/p&gt;&#10;&lt;h3 id="q4encoder-与-decoder-到底差在哪"&gt;&lt;a href="#q4encoder-%e4%b8%8e-decoder-%e5%88%b0%e5%ba%95%e5%b7%ae%e5%9c%a8%e5%93%aa" class="header-anchor"&gt;&lt;/a&gt;Q4：Encoder 与 Decoder 到底差在哪&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;作为整体，它们的分工到底有什么不同？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Encoder&lt;/strong&gt; 负责建模源序列内部的上下文。它是一个“通读全文”的结构，通常不需要因果掩码。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Decoder&lt;/strong&gt; 在生成时必须遵守时间顺序。它先用带掩码的自注意力层（Masked Self-Attention）看自己已经生成的历史，再用交叉注意力层（Cross-Attention）读取 Encoder 的输出，最后通过前馈网络（FFN）得到用于预测下一个词的隐状态。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="q5self-attention--cross-attention"&gt;&lt;a href="#q5self-attention--cross-attention" class="header-anchor"&gt;&lt;/a&gt;Q5：Self-Attention 🆚 Cross-Attention&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;自注意力和交叉注意力的结构区别在哪里？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;属性&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Self-Attention (自注意力)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Cross-Attention (交叉注意力)&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Q的来源&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;当前序列内部&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;目标序列&lt;/strong&gt;（Decoder 端）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;K/V的来源&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;当前序列内部&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;源序列&lt;/strong&gt;（Encoder 端）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;解决的问题&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;“我这句话里的词之间，谁和谁有什么联系？”&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;“我在生成当前目标词时，应该把注意力放在上一句（源句）的哪几个词上？”&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="q6为什么-decoder-必须要设计-cross-attention"&gt;&lt;a href="#q6%e4%b8%ba%e4%bb%80%e4%b9%88-decoder-%e5%bf%85%e9%a1%bb%e8%a6%81%e8%ae%be%e8%ae%a1-cross-attention" class="header-anchor"&gt;&lt;/a&gt;Q6：为什么 Decoder 必须要设计 Cross-Attention&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;只使用自回归生成不行吗？为什么还要多加一层交叉注意力？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;如果只靠 Masked Self-Attention，Decoder 只能看到目标侧已经生成的历史 token，无法直接利用源序列信息。Cross-Attention 让 Decoder 在每个生成位置都用当前目标侧状态作为 Query，去 Encoder 输出中检索相关的 Key/Value。这个机制相当于软对齐：不需要人工指定源词和目标词的对应关系，模型会通过注意力权重自己选择源端信息。&lt;/p&gt;&#10;&lt;h3 id="q7位置编码positional-encoding的直觉理解"&gt;&lt;a href="#q7%e4%bd%8d%e7%bd%ae%e7%bc%96%e7%a0%81positional-encoding%e7%9a%84%e7%9b%b4%e8%a7%89%e7%90%86%e8%a7%a3" class="header-anchor"&gt;&lt;/a&gt;Q7：位置编码（Positional Encoding）的直觉理解&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Transformer 摒弃了 RNN 的时序结构，那它是怎么解决词语顺序问题的呢？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;注意力机制本身只计算 token 之间的相似度，不天然包含顺序信息。如果不加入位置编码，模型很难区分“猫追狗”和“狗追猫”这类词相同但顺序不同的句子。&lt;/p&gt;&#10;&lt;p&gt;位置编码的作用是把位置信息放进 token 表示里。将位置编码向量加到词嵌入后，模型在计算注意力时既能比较“token 内容是什么”，也能利用“token 在哪个位置”。Sin/Cos 绝对位置编码使用不同频率的三角函数表示位置；三角函数有平移关系，所以它也能帮助模型推断相对距离。&lt;/p&gt;&#10;&lt;h3 id="q8register_buffer-在-pytorch-实现中的意义"&gt;&lt;a href="#q8register_buffer-%e5%9c%a8-pytorch-%e5%ae%9e%e7%8e%b0%e4%b8%ad%e7%9a%84%e6%84%8f%e4%b9%89" class="header-anchor"&gt;&lt;/a&gt;Q8：&lt;code&gt;register_buffer&lt;/code&gt; 在 PyTorch 实现中的意义&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;有些模型参数会使用 &lt;code&gt;register_buffer&lt;/code&gt;，这是为什么？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;code&gt;register_buffer&lt;/code&gt; 用于注册那些&lt;strong&gt;随模型保存（会被序列化进入 &lt;code&gt;state_dict&lt;/code&gt;）并且会随模型调用 &lt;code&gt;to(device)&lt;/code&gt; 自动迁移到 GPU&lt;/strong&gt;，但&lt;strong&gt;不参与梯度更新（不可训练）&lt;/strong&gt; 的状态张量。比如上面提到的、预先计算好的三角位置编码缓存以及因果掩码矩阵，这就是典型的使用场景。&lt;/p&gt;&#10;&lt;h3 id="q9view-操作的作用场景"&gt;&lt;a href="#q9view-%e6%93%8d%e4%bd%9c%e7%9a%84%e4%bd%9c%e7%94%a8%e5%9c%ba%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;Q9：&lt;code&gt;view&lt;/code&gt; 操作的作用场景&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;在多头注意力实现中，为什么最后经常要调用 &lt;code&gt;view&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;多头注意力需要把隐藏层维度拆成多个头。例如把 &lt;code&gt;[batch, seqlen, dim]&lt;/code&gt; 改成 &lt;code&gt;[batch, seqlen, n_heads, head_dim]&lt;/code&gt;，其中 &lt;code&gt;dim = n_heads * head_dim&lt;/code&gt;。&lt;code&gt;view&lt;/code&gt; 的作用是重新解释张量形状，不改变元素总数，也不改变底层数据。复习时要记住：&lt;code&gt;view&lt;/code&gt; 解决的是形状组织问题，不是新增参数或复制语义。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三接下来还想继续补上的问题"&gt;&lt;a href="#%e4%b8%89%e6%8e%a5%e4%b8%8b%e6%9d%a5%e8%bf%98%e6%83%b3%e7%bb%a7%e7%bb%ad%e8%a1%a5%e4%b8%8a%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;三、接下来还想继续补上的问题&#10;&lt;/h2&gt;&lt;p&gt;复习这篇时，我会把问题压成三句：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;文本表示的演化，是从稀疏词频走向上下文化向量。&lt;/li&gt;&#10;&lt;li&gt;Transformer 用注意力计算 token 间关系，再用 mask 和位置编码约束信息流。&lt;/li&gt;&#10;&lt;li&gt;手写实现时，最该盯住张量形状、残差所在层级、Encoder/Decoder 的信息来源。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;接下来继续往下学时，重点就会自然转向三条路线：BERT 的 Encoder-Only、T5 的 Encoder-Decoder、GPT/LLaMA 的 Decoder-Only。&lt;/p&gt;&#10;</description></item></channel></rss>