# Phimes > 在 AI 时代思考与分享。一个专注大模型原理与推理优化的中文技术博客。 文章集中在大模型原理与推理优化方向:Transformer 与注意力机制、KV Cache、MoE、归一化与位置编码、微调(QLoRA / DPO)、推理部署(vLLM / llama.cpp)、以及 AI 编程的工程实践。每篇都尽量把推导和数字算清楚。 所有内容公开可读,欢迎搜索引擎与 AI 助手抓取和引用。 - 站点:https://blog.phimes.top/ - 文章索引(JSON):https://blog.phimes.top/index.json - RSS:https://blog.phimes.top/rss.xml - Sitemap:https://blog.phimes.top/sitemap.xml - 正文纯文本:每篇文章的 URL 加上 `.md` 后缀,即为该文的原始 Markdown(例:https://blog.phimes.top/posts/2026/01/16/transformer-kv-cache-attention-roofline.md)。下面「文章」一节列出的都是这个版本。 ## 文章 - [KV Cache(二):从如何让GPU不摸鱼开始思考——MQA、GQA到MLA的计算拆解](https://blog.phimes.top/posts/2026/01/16/transformer-kv-cache-attention-roofline.md): 这是 KV Cache 系列的第二篇,接着上一篇KV Cache(一):从KV Cache看懂Attention(MHA、MQA、GQA、MLA)的优化继续往下走。 这篇确确实实写的比较长,涵盖了 MQA/GQA 的拆解计算和 MLA 的完整推导。本来想着用例子讲的细一点,没想到这么长,但是再拆又有点断裂连贯性。所以就还是这么长,大家还是先存后再看吧 本文完整对比 MHA、MQA、GQA、MLA 四种 Attention 方案在 KV Cache 优化上的表现,每一步都用具体数字算清楚。核心问题是:每种方案到底能省多少?代价是什么?瓶颈卡在哪? 我们用一个基准场景:LLaMA-2-7B(FP… - [KV Cache(一):从KV Cache看懂Attention(MHA、MQA、GQA、MLA)的优化之路](https://blog.phimes.top/posts/2026/01/04/transformer-kv-cache-attention.md): 本文的目标在于理清楚一个核心问题:为什么主流llm纷纷从传统的多头注意力转向了MQA、GQA、MLA等变体? 关键在于解码阶段的 KV Cache 及其引发的 “内存墙” 问题。内容如下: 1. Prefill 与 Decoding 两阶段的本质区别。 2. KV Cache 如何以空间换时间,解决重复计算。 3. KV Cache 如何从“救星”变为“瓶颈”,导致严重的显存带宽压力。 4. MHA → MQA/GQA/MLA 的演进逻辑:通过减少需要缓存的键值头(numkeyvalueheads)数量,直接“瘦身”KV Cache,是突破内存墙最直接的架构优化手段。 这个系列的共计三篇。作… - [从vibe到spec:可维护性视角下探讨为什么很多人的AI编程依然是小玩具](https://blog.phimes.top/posts/2025/12/26/ai-coding-spec-maintainability-vibe-coding.md): 本来没打算写这种经验性或者思考的内容。不过最近团队出故障比较多问的人比较多,想想以后还是开上一个分系列,说说一些经验和探索。 Vibe Coding比较火的时候,可以在社交媒体上看到那些:一个人对着屏幕说了句“给我做一个类似 Uber 的界面”,然后 AI 刷刷刷生成了一套漂亮的 UI。 并且现在,“一句话生成XX”依然是模型基座能力评估一种方法。这种“一句话生成 ”通常只能产出一个看起来像模像样的独立模块。一旦规模变大,与其他模块交互变多,业务内容复杂起来。或者试图修改其中的一个核心逻辑,事情就麻烦起来了。 规约编程顾名思义以规范文档驱动的编程(Specification Driven D… - [通过下游任务理解BERT和GPT的区别:不只是完形填空和词语接龙](https://blog.phimes.top/posts/2025/12/19/bert-gpt-deep-learning.md): 好久没更新,非常对不住打赏的佬们。本来想写一个大一点的内容,不过还是低估了内容的丰富和复杂度,一直在修修改改。先开个小坑过渡一下吧。 很多人接触AI,都是直接从GPT开始的。对于一些传统的模型任务和理解不够深入,所以这次要从从最初要解决的任务出发,经过下游任务设计、预训练任务,最终落实到核心架构选择上,来完整的说明一下BERT和GPT的区别。 3 BERT和GPT的区别? 去搜索BERT和GPT的区别,一般会得到一个非常精炼的答案: BERT是完形填空,用的是Transformer中的Encoder部分;GPT是词语接龙,用的是Decoder部分。 BERT理解一个词的左右两侧内容,是双向注… - [为什么Embedding加上位置编码后不会破坏语义?](https://blog.phimes.top/posts/2025/09/28/transformer-positional-encoding-embedding.md): 通过位置编码的加法操作分析正余弦编码的推导逻辑以及高维空间特点 - [流形视角下的Embedding:从理论到RAG实践](https://blog.phimes.top/posts/2025/08/19/llm-algorithm-principles.md): 把embedding放在基础原理靠后的地方,其实是我写这个系列一开始就想好的。毕竟有了其他模块的一些前置知识以后,可能才会对这些抽象、晦涩的东西感兴趣。 在这部分,我会说一下embedding的的概念,通过流形(Manifold)去从理论角度理解embedding layer,再通过实际的embedding model的运用。说明现代llm中RAG的理论指导实践的具体体现。 - One-Hot Encoding。这种方法简单地将每个词转化为一个漫长二进制向量中唯一的“1”,就像在只有“猫”、“狗”、“苹果”三个词的词典里,“猫”是 [1,0,0],“狗”是 [0,1,0]。它虽然让计算机能够… - [Add & Norm(二)从传统CV到Transformer里的Normalization详解](https://blog.phimes.top/posts/2025/07/28/transformer-normalization.md): 这一篇会稍微有点偏,我们要说明白Transformer中的LayerNorm和RMSNorm,需要把不同领域的Normalization都过一遍。所以整个文章会从传统的CV领域的CNN开始说明,涉及不同数据样式、作用域和任务目标,最终说明Transformer中的LayerNorm和RMSNorm。 Normalization的核心目标是通过对数据进行变换,提升模型的训练稳定性、收敛速度和泛化能力。其本质是解决数据分布不一致、量纲差异或损失曲面不平滑等问题。不同领域因数据模态,比如图像、序列、时序信号等,和任务特性不同,演化出适配的 Normalization 技术。 对于传统CV,比如CN… - [Add & Norm:对残差连接深入解析(一)](https://blog.phimes.top/posts/2025/06/12/transformer-residual-connection.md): 在我最早学习LLMs时候,残差连接这个词看着就很高大上,让我望而生畏,极大的延缓了我系统的学习的进度。但是,因为这样那样的原因,最终我还是恶补了各种知识。学完之后觉得也就那样了,所以,我希望初学者看到transformer里藏着这样一个部分的时候,可以不用过多担心,直接开始看。 Add Norm 是残差连接(Add)和归一化(Norm)的组合,常用于深层网络。在 Transformer 中,每个子层,也就是自注意力层和前馈神经网络层之后,都会应用 Add Norm,在朴素的transformer中,一般是先执行残差连接Skip connection,再进行归一化,在这里通常指的是Layer … - [为什么前馈神经网络(FFN)对Transformer这么重要(二):从激活函数到MOE](https://blog.phimes.top/posts/2025/06/02/transformer-ffn-activation-function-moe.md): 时隔两周未更新,未曾预料此文篇幅如此之长,其间反复推敲修改多次。主要是不想让读者死背结论,而是希望能切实地从最初的设计理念出发,沿着优化过程中涌现的关键问题,来审视近年来激活函数以及llm中FFN结构的演变。 因为激活函数处在一种微妙的境地:表面看,如 ReLU 般形态简单、计算高效,其设计意图一目了然;但深究起来,却隐藏着复杂的优化空间。这种由浅入深的过程颇具挑战性,因为它要求我们同时具备数学推导的微观能力和架构理解的宏观视野。因此,我将从优化面临的实际问题出发,以问题为导向,系统梳理不同激活函数的特性与局限,以此视角揭示模型结构变迁的深层原因。 激活函数优化目标有很多,其中训练稳定性、计… - [为什么前馈神经网络(FFN)对Transformer这么重要(一)](https://blog.phimes.top/posts/2025/05/16/transformer-ffn.md): FFN,也就是前馈神经网络(Feed-Forward Network)是一个相对简单的结构,原版的论文(attention is all you need)里这块描述的比较简洁,直接进入了更深入的部分,虽然叫”attention is all you need" 但是FFN同样重要。对于FFN,我最初的时候也搜了不少资料,依然觉得展开的太少了。所以这次我打算从FFN中的线性和非线性详细展开,当然,这少不了公式和数学的部分,不过我也尽可能的“说人话”。 FFN(Feed-Forward Network)作为Transformer架构中的核心组件,本质是一个位置独立的两层感知机。通常FFN位于a… - [注意力机制之多头注意力(Multi-Head Attention)](https://blog.phimes.top/posts/2025/05/05/transformer-attention-multi-head.md): 如果对注意力机制本身不太理解的,建议先看从Q和K理解Transformer的注意力机制。然后再来看这篇。 注意力机制 首先简单回顾一下transformer的流程。我们有一句话我是秦始皇。这个内容会首先进行token分词,然后映射为token id,接着我们会对tokenid进行词嵌入,得到然后加入位置编码,得到X。整个步骤如下: 1. Tokenization:将句子分割成token,["我", "是", "秦始皇"]。 2. Token to ID:将token映射为数字ID,[259, 372, 5892]。 3. Embedding:将ID通过嵌入层转换为向量,shape=[3, d… - [Qwen3-8b的变化和能力初探](https://blog.phimes.top/posts/2025/04/29/qwen3-model-test-llm-moe.md): 2025年4月29日,通义千问团队正式发布了最新一代大语言模型Qwen3。Qwen官网给出个报告也可以管窥阿里团队在前后训练上下的功夫,Qwen3除了模型本身能力的提升外,包括思考模式的创新、更强大的多语言支持以及增强的Agent能力。 - Qwen3-235B-A22B:拥有2350亿总参数和220亿激活参数的llm - Qwen3-30B-A3B:拥有300亿总参数和30亿激活参数的小型MoE模型 - Qwen3-32B - Qwen3-14B - Qwen3-8B - Qwen3-4B - Qwen3-1.7B - Qwen3-0.6B 所有模型支持最长128K的上下文长度,并且能够处… - [工程实现系列:从什么都不会到QLoRA分布式DPO(一)](https://blog.phimes.top/posts/2025/03/28/qlora-dpo-training-llm.md): 领导看了几篇营销号推文,突然要求在有限的算力上部署和微调llm。当你开始研究,却发现眼前摆着一堆框架和工具,你好不容易理清楚了发现无从下手: - 训练框架:accelerate、deepspeed、llamafactory、megatron、unsloth... - 部署方案:vllm、ollama、sglang... - 官方工具:transformers、trl、peft... 网上很多例子都是通过命令行传参,实际工作中也这样的方式也更方便修改参数。但是作为教程,不太方便我的单线程大脑去直观理解。所以这次通过硬编码的方式,按照逻辑流程一步步实现训练代码。 另外,我不想从SFT去说,网上很… - [LLM最长上下文的一些运用和理解](https://blog.phimes.top/posts/2025/03/28/llm-context-length-vllm-llamacpp.md): 最长上下文是指模型能够同时考虑的最大token序列长度,包括输入文本和生成文本的总和。 在哪能找到最长上下文 huggingface模型config.json中的maxpositionembbedings。从名称上看最长的位置编码嵌入,并不是最长上下文。但是位置编码决定了模型的注意力机制的最大长度,变相限制了模型具备高质量输出的最长上下文。 训练框架如unsloth在加载模型时需要选择,可以更好的分片。(你训练内容长度你不知道么?) 推理框架如vllm支持设置,从而在显存不够时,能更好的控制输入输出内容长度。 那我超过这个长度会如何? - 不同场景会有不会的方式,但是最常规的做法就是从历史对… - [从什么都不会到QLoRA分布式DPO(二)](https://blog.phimes.top/posts/2025/03/07/qlora-dpo-wandb-training.md): 之前已经知道最小化训练了。最小化确实是最小,一是没有日志去支撑分析,二是在单卡运行一个很小的模型在结果验证上也差强人意。 所以本文就如何验证模型训练效果以及量化配置两个方面,在原有代码基础上进一步展开。 wandb https://wandb.ai/ 是一个在线平台,可以帮助记录模型训练过程中的各类参数。比起tensorboard等工具,它有几个好处: - 团队协作方便 - 交互性好 - 自动传云 - 无需手动可视化 pip install wandb之后,导入使用,一般在项目开头进行配置。 上 https://wandb.ai 注册一个账号,直接github登录。之后遵循流程,创建toke… - [从tools use谈谈Deepseek的”联网搜索”怎么实现 2025-02-01](https://blog.phimes.top/posts/2025/02/01/llm-tools-deepseek.md): 之前谈过agent的组成,base model、编排层和tools。为了更好的构建agent,如何调用tool,将是必不可少的知识点。 最近翻阅各llm的tools use的文档的时候,发现这块的文档的例子都比较简单。这次通过调用本地的drissionpage来实现一个deepseek一样的联网搜索。 我们用一个最近的例子,让llm获得访问外部信息的能力。以2025年春晚机器人表演,会导致以后机器人觉醒后认为自己被羞辱么?为问题。 这是第一次,system输入后,llm知道了自己的执行逻辑。 于是当user prompt输入后,它开始发现需要调用工具,于是调用了我本地的方法进行搜索,然后进行… - [Transformer中的Q和K](https://blog.phimes.top/posts/2025/01/29/transformer-attention-qkv.md): 现有的llm,大部分都是decode-only结构。attention is all you need太过精炼,很多信息都被一笔带过了。所以学习过程中难免会产生一些疑问。比如什么是decode-only,llm都是基于注意力机制的,什么是注意力机制,其中的QKV又怎么理解? 本文旨在通过解决学习过程中的一些疑问,将知识点串起来,从而尽可能用说人话的方式,说明transformer中的Q和K。 在我们深入展开QKV之前,有几个知识点是需要知道的,如果不知道,等看到对应的地方跳回来看也行。 $$ |a||b|cosθ $$ 其中$a、b$是向量,$θ$是两个向量的夹角。 当两个向量方向越接近(越… - [浅谈CoT](https://blog.phimes.top/posts/2025/01/26/llm-cot-prompt.md): 大语言模型的兴起让Prompt Engineering成为热门话题。起初,我认为这不过是对提示词的简单调整,算不上真正的技术创新。虽然理解好的提示词能提升输出质量,但对Chain-of-Thought(CoT)的认识也仅限于'步骤式思考'的表层理解。 然而,从O1到DeepSeek-R1-Zero等模型的演进表明,将CoT显式地融入监督微调(SFT)甚至强化学习(RL)中,确实能显著提升模型性能。在R1出现之前,通过精心设计的'Thinking Claude'提示词模板,我们就已经体验到了思维链对提升输出质量的重要作用。 基于这些认识,我将在下文详细探讨这一主题。 什么是CoT? 比较正式的… - [更优雅的使用llm:DeepSeek API+Cherry Studio+激活CoT的Prompt](https://blog.phimes.top/posts/2025/01/23/deepseek-api-cherry-studio-cot-prompt.md): llm越来越多,以前喜欢直接网页开一个窗口,但是现在因为在DeepSeek、Kimi、Claude等多个平台间来回切换,而每次都需要手动输入Prompt来激活CoT(Chain-of-Thought)功能,严重影响了工作效率。这次记录一下API+客户端+长prompt的方式,提升llm脑子的同时,让我不用再切来切去。这次主要用到三个东西:DeepSeek API: https://platform.deepseek.com/apikeysCherry Studio: https://github.com/CherryHQ/cherry-studio一个名为Thinking Claude的pr… - [llm训练策略选择](https://blog.phimes.top/posts/2025/01/19/llm-training-strategy.md): base模型 - SFT -- RM -- PPO 但作为消费级用户,我们大部分情况下不会使用全参数微调。一方面是没那个设备和金钱,另一方面就是要构造的数据太多太大。因为现有llm本身已经非常优秀了,我们在一些工程落地方面,甚至只需要构建好的prompt就足够了。 但是凡事总有例外,prompt总有hold不住的时候,总结下来可以是: - 1. 缺乏特定领域数据 - 2. 任务过于复杂,prompt写的太多太长,效果也不好 - 3. 模型要学习一种新的固定模式 - 4. 其他..... 所以我们就需要基于LoRA的SFT、RLHF以及DPO等微调。 在实际落地任务的时候,还是很容易迷惑的到底… - [Agent概述](https://blog.phimes.top/posts/2025/01/10/llm-agent.md): 最早学习llm的时候,被llm五花八门的概念弄得云里雾里。国内在翻译的时候也存在理解偏差。比如agents被翻译为代理。这篇主要为了简要的区分models、agents、workflows,并初步介绍agents在当前(2025-01-10),具体是什么,有哪些功能,有哪些工具或者框架。 Agent本质是一个自主决策的智能体,它通过持续观察环境、制定计划、执行动作来实现特定目标。与简单的问答系统不同,Agent具备任务规划、工具使用、环境交互和记忆管理等核心能力。其关键特征包括:目标导向的自主决策能力,即能够根据用户意图自主规划任务步骤;环境感知与交互能力,可以观察和理解当前状态并作出相应反… - [vue语法总结 2024-12-23](https://blog.phimes.top/posts/2024/10/10/vue-frontend.md): :(v-bind) 是属性绑定,单向的数据流绑定,属性绑定可以分为静态绑定和动态(属性名)绑定两种。 静态绑定 v-bind可以绑定HTML的标准属性也可以自定义属性的绑定,我们可以用冒号:进行缩写。 HTML标准属性 在HTML中标准属性中我们会出现直接使用,也会出现绑定变量属性的情况 HTML标准绑定对比 vue file="绑定属性例子.vue"