<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Think In Python</title>
        <link>http://www.thinkinpython.com</link>
        <description>Think in Python, Programming better.</description>
        <atom:link href="http://www.thinkinpython.com/rss.html" rel="self" />
        <language>zh-cn</language>
        <lastBuildDate>Thu, 30 Jul 2026 20:44:27 GMT</lastBuildDate>
        <item>
            <title>CUDA 之后，NVIDIA 还有什么?</title>
            <link>http://www.thinkinpython.com/post/what_next_to_cuda.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-a71">一、 护城河的迁移：单卡 CUDA 到集群 Fabric 的必然性</a></li>
<li><a href="#toc-ebc">1. CUDA 之外的选择</a></li>
<li><a href="#toc-f77">2. 从单卡算力到集群通信</a></li>
<li><a href="#toc-326">二、 跨机柜 NVLink Fabric 的逆天性能</a><ul>
<li><a href="#toc-a78">1. 硬件层面的 1:1 无阻塞扩展比（Non-blocking Scaling）</a></li>
<li><a href="#toc-b61">2. 对抗 UALink 联盟的迭代节奏</a></li>
</ul>
</li>
<li><a href="#toc-406">三、 In-Network Computing 极限优化的计算网络</a></li>
<li><a href="#toc-989">1. NVSwitch 芯片内部的算术演进</a></li>
<li><a href="#toc-cab">2. SHARP 协议的计算下沉</a></li>
<li><a href="#toc-336">四、 NVLink Fusion 的硬件平台化策略</a></li>
<li><a href="#toc-f5e">五、 总结</a></li>
</ul>
</div><p>市场长期将 CUDA 软件生态视为 NVIDIA 最深的护城河，但随着 Triton 等高级抽象编译框架的普及，底层硬件软件栈正在被“屏蔽”。竞争对手通过单卡算力追赶和开源软件替代，正试图瓦解 NVIDIA 的软件壁垒，有观点认为 CUDA 或许今年就会丧失其在 LLM 中的领导地位。</p>
<p>据笔者观察，NVIDIA 的护城河已完成了从“芯片/软件” 向 “平台/系统” 的跃迁。借助 NVIDIA NVLink Fabric、In-Network Computing和 Vera CPU 等组件，NVIDIA 以其卓越的 scale-out 、scale-up性能，成为超大 GPU 集群的首选方案和工程标准。 </p>
<h2><a id="toc-a71" class="anchor" href="#toc-a71"></a>一、 护城河的迁移：单卡 CUDA 到集群 Fabric 的必然性</h2>
<h2><a id="toc-ebc" class="anchor" href="#toc-ebc"></a>1. CUDA 之外的选择</h2>
<p>长久以来，开发者直接基于 CUDA C++ 编写底层算子，形成了极强的生态粘性。然而，当前 AI 的全面爆发让生态迁移成本骤降（参考 <a href="/post/cuda_vs_rocm.html">这篇博客</a> ）。  开发者通过高层框架进行编程，工具链自动将算子下发并转换，底层芯片是否为 CUDA，对开发者来说差异越来越小。这给了 AMD (MI系列) 以及云厂商自研 ASIC 极大的突围空间。</p>
<h2><a id="toc-f77" class="anchor" href="#toc-f77"></a>2. 从单卡算力到集群通信</h2>
<p>随着 LLM 参数规模的极速膨胀，AI 2.0 时代的计算核心矛盾，已经从单卡的 TFLOPS 极限，转向多 GPU 集群和 mem-fusion 网络的通信的带宽与延迟。  </p>
<p>在运行超大规模 MoE 模型时，Token 需要频繁在不同的专家 GPU 之间进行 All-to-All 随机路由。如果集群节点间的通信延迟高，GPU 将产生大量的长尾延迟和空闲等待。</p>
<p>谁能构建更快的 GPU 集群，谁就掌握了 AI 基建。</p>
<h2><a id="toc-326" class="anchor" href="#toc-326"></a>二、 跨机柜 NVLink Fabric 的逆天性能</h2>
<h3><a id="toc-a78" class="anchor" href="#toc-a78"></a>1. 硬件层面的 1:1 无阻塞扩展比（Non-blocking Scaling）</h3>
<p>NVIDIA 维持其机柜核心溢价的基础，在于其物理网络恐怖的线性扩展能力。</p>
<ul>
<li>Blackwell 架构 NVLink 5：单 GPU 具备 1.8 TB/s 双向带宽，扩展到 GB200 NVL72 机柜时，通过无阻塞胖树（Fat-Tree）拓扑，整机柜物理总带宽无损达到 130 TB/s。</li>
</ul>
<p>为了解决分布式系统的一致性通常会引入复杂的通信协议，通信的开销通常会使得扩展比降低，即 1 + 1 = 1.5 的效果，扩展比不扩展强，但比两个机柜的独立带宽之和差一点。NVIDIA 的 NVLINK 和 NVLink Fabric 在横向（机柜间）和纵向（机柜内）都实现了接近无损的扩展，非常令人震撼，堪称工程奇迹。</p>
<h3><a id="toc-b61" class="anchor" href="#toc-b61"></a>2. 对抗 UALink 联盟的迭代节奏</h3>
<p>由 AMD、Intel、Broadcom、Cisco、Google、Meta、Microsoft 等组成的 UALink (Ultra Accelerator Link) 联盟试图复制 PCIe 的开放成功，推出了 UALink 1.0 和 UALink 2.0 规范，旨在联合打破 NVLink 的垄断。  </p>
<p>然而，开放标准的软硬件生态碎片化严重，且需要多厂商长周期的利益博弈。NVIDIA 利用其一年一迭代的激进迭代，在 UALink 2.0 芯片实际量产出货前，便用技术成熟的 Rubin NVL576 锁死了最高端算力市场，让开放标准难以望其项背。</p>
<h2><a id="toc-406" class="anchor" href="#toc-406"></a>三、 In-Network Computing 极限优化的计算网络</h2>
<p>竞争对手即使通过物理拼凑做出大集群，在实际运行大模型时的 Model Flops Utilization（MFU，模型浮点运算利用率） 也会因为通信风暴发生断崖式下跌。NVIDIA 的解法是将网络设备“计算化”。</p>
<h2><a id="toc-989" class="anchor" href="#toc-989"></a>1. NVSwitch 芯片内部的算术演进</h2>
<p>在最新的 NVSwitch 交换机芯片 中，NVIDIA 不仅堆叠了高密度的 SerDes 接口，更直接在交换机内部集成了 ALU（算术逻辑单元），可以承担一部分计算任务。</p>
<h2><a id="toc-cab" class="anchor" href="#toc-cab"></a>2. SHARP 协议的计算下沉</h2>
<p>利用 SHARP（可伸缩层级聚合与削减协议） 引擎，大模型集体通信中最核心的 All-Reduce 和 All-To-All 梯度求和与分发指令，直接在 NVSwitch 交换机内部流动的过程中完成运算，无需传输到指定 GPU 节点计算。 </p>
<p>数据不需要跨网络返回 GPU，大幅减少了网络中的数据流量与通信延迟，突破了传统网络带宽瓶颈。这种优化是由协议、交换设备共同完成，目前只有 NVIDIA 具备这样的统治力。</p>
<h2><a id="toc-336" class="anchor" href="#toc-336"></a>四、 NVLink Fusion 的硬件平台化策略</h2>
<p>伴随着系统架构演进，NVIDIA 推出了 NVLink Fusion 技术，允许云厂商自研的定制化 ASIC 或专用 CPU 通过标准接口（如 UCIe）直接接入 NVIDIA NVLink Fabric 中。  </p>
<p>这打破了原有的排他性垄断形象，却建立了更深层次的依存关系：云厂商可以用自研芯片，但前提是必须采用 NVIDIA 的 NVSwitch 交换机、机柜架构和 NVLink 物理织网。 NVIDIA 由此从一个“芯片供应商”，升级为了整个 AI 数据中心基础设施的“行业母体”，NVIDIA 正实现硬件平台化。</p>
<h2><a id="toc-f5e" class="anchor" href="#toc-f5e"></a>五、 总结</h2>
<p>后续应紧密跟踪从 Blackwell 铜缆背板向 Rubin 跨机柜硅光子切换的节奏。若上游高精度光路对准封装良率爬坡不及预期，可能会对 NVIDIA 的高密度机柜交付速度产生阶段性制约。 </p>
<p>NVIDIA 用 NVLink Fabric 锁死了未来物理机器的边界，这道由材料学、网内计算与全栈协同筑起的系统级护城河，比 CUDA 软件更难被逆向工程或开源生态瓦解。</p>

            ]]></description>
            <pubDate>Wed, 29 Jul 2026 11:49:58 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/what_next_to_cuda.html</guid>
        </item>
        <item>
            <title>HBM3到4，发生了什么？</title>
            <link>http://www.thinkinpython.com/post/HBM_3_4.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-617">1. DRAM与内存墙</a><ul>
<li><a href="#toc-378">路线一：GDDR（Graphics DDR）——频率路线</a></li>
<li><a href="#toc-618">路线二：HBM（High Bandwidth Memory）——位宽与短距路线</a></li>
</ul>
</li>
<li><a href="#toc-c12">2. HBM3架构</a><ul>
<li><a href="#toc-2e8">2.1 DRAM Core Die（核心存储层）</a></li>
<li><a href="#toc-b57">2.2 Microbump（微凸块）层间互连</a></li>
<li><a href="#toc-195">2.3 Base Die（基础层）</a></li>
<li><a href="#toc-4ed">2.4 1024-bit 位宽与伪通道设计</a></li>
<li><a href="#toc-934">2.5 解决了什么问题</a></li>
<li><a href="#toc-cd0">2.6 HBM3 的新问题</a></li>
</ul>
</li>
<li><a href="#toc-fa8">3. HBM4 架构</a><ul>
<li><a href="#toc-29e">3.1 2048-bit 接口</a></li>
<li><a href="#toc-df1">3.2 混合键合（Hybrid Bonding）</a></li>
<li><a href="#toc-7a6">3.3 Base Die 工艺升级：逻辑工艺集成</a></li>
</ul>
</li>
<li><a href="#toc-55a">4. HBM4 带来的变化</a><ul>
<li><a href="#toc-bd0">4.1 16-Hi 堆叠与厚度挑战</a></li>
<li><a href="#toc-c04">4.2 HBM4 的成本与产能特征</a></li>
</ul>
</li>
</ul>
</div><h1><a id="toc-617" class="anchor" href="#toc-617"></a>1. DRAM与内存墙</h1>
<p>2017 年，NVIDIA V100 搭载 HBM2 显存，带宽 0.9TB/s，峰值算力 125 TFLOPS。2023 年，H100 搭载 HBM3 显存，带宽 3.35TB/s，峰值算力 1,979 TFLOPS。</p>
<p>七年间带宽仅提升了 3.7 倍，算力却提升了接近 16 倍。当处理器的计算能力增速远高于存储带宽增长时，就会出现处理器有能力跑的更快，但是不得不等待存储搬运数据，就像撞到一堵墙，这就是所谓的 “内存墙”。</p>
<p><img src="https://thinkinpython.com/static/upload/20260724/upload_27780aea5eca906d18eba4768d06b4cf.png" alt="image.png"></p>
<p>DRAM（Dynamic Random Access Memory，动态随机存取存储器） 是目前计算机主存储器和显存的核心技术，有过装机经验的朋友应该见过内存条上的颗粒芯片，现代GPU的显存通常被改在散热器下面，看起来很内存颗粒差不太多。</p>
<p>DRAM 的记忆单元由 1 个晶体管（Transistor）+ 1 个电容（Capacitor） 构成，简称 1T1C：通过晶体管向电容充放电实现读写，但因电容漏电需要每隔 ~64ms 刷新一次，掉电以后记忆会丢失。</p>
<p>DRAM 的读写速度由以下公式确定：</p>
<pre><code class="hljs lang-undefined">带宽（bytes/s）= 频率（Hz）× 位宽(bits)/8
</code></pre>
<p>目前无论计算单元 CPU 或 GPU，还是 DRAM 的制程都已经逐步接近物理极限，但是计算单元的效率增速依然高于 DRAM。特别是 GPU，其中通常包含数千个并行单元，其对数据带宽的要求能达到 CPU 的10～100 倍。</p>
<p>为了满足 GPU 对存储带宽的要求，从上面提到的带宽公式可以知道，要么提高频率，要么增加位宽。</p>
<h2><a id="toc-378" class="anchor" href="#toc-378"></a>路线一：GDDR（Graphics DDR）——频率路线</h2>
<p>GDDR（Graphics Double Data Rate，图形双倍数据率）与消费级 DDR 内存同源：</p>
<ul>
<li>通过激进提高 I/O 数据速率来获得高带宽（当前主流 GDDR6X 可达 16-24 Gbps，下一代 GDDR7 预计可达 28-32 Gbps）。
每个通道位宽仅为 32-bit，通过多通道并行（通常 8-16 通道）达到总位宽 256-512-bit。</li>
<li>采用独立封装（Separate Package），每颗芯片独立焊接到 PCB 上。</li>
</ul>
<p><strong>代价</strong>：</p>
<ul>
<li>频率提高导致功耗显著增加。在核心电压基本保持不变的情况下，根据动态功耗公式，功耗与频率呈线性正比关系，高频运行会带来巨大的发热与能耗压力。</li>
<li>独立封装无法进行垂直堆叠，单芯片容量受限。多颗芯片并联占用大量 PCB 面积，且长距离走线使得信号完整性（Signal Integrity）设计难度递增。</li>
</ul>
<p>典型产品：NVIDIA RTX 4090 使用 24 颗 GDDR6X，总位宽 384-bit，带宽达 1.0 TB/s。</p>
<h2><a id="toc-618" class="anchor" href="#toc-618"></a>路线二：HBM（High Bandwidth Memory）——位宽与短距路线</h2>
<p>HBM 采取完全不同的思路，不追求高频，而是将位宽和物理距离优化推到极致。</p>
<ul>
<li>通过 TSV（Through Silicon Via，硅通孔）将多层 DRAM 芯片进行 3D 垂直堆叠。</li>
<li>使用 Microbump（微凸块）将各层进行高密度垂直互连。
整个堆叠与 GPU 通过 Interposer（中介层）封装在同一基板上，实现极短的互连布线。</li>
<li>HBM 的核心理念：用“宽”和“短”替代“快”。以 HBM3 为例，每个堆叠（Stack）的接口位宽高达 1024-bit，而一条 GDDR6 通道仅为 32-bit。HBM 以更低的数据速率（6.4 Gbps vs 16 Gbps）实现了数倍于 GDDR 的总带宽，同时大幅降低了传输延迟与功耗。</li>
</ul>
<p><strong>代价</strong>：</p>
<ul>
<li>需要精确的 Interposer 和先进封装工艺（如 CoWoS），制程复杂度远超传统独立封装。</li>
<li>TSV 工艺成本高、良率控制难度大。</li>
<li>3D 堆叠结构使散热管理更加困难。</li>
</ul>
<p>HBM 是一条“昂贵但必要”的路线。消费级显卡使用 GDDR 仍是兼顾性能与性价比的选择；但在 AI 训练、HPC（高性能计算）这类需要 TB/s 级海量数据吞吐的场景中，HBM 是目前打破“内存墙”最现实且核心的解决方案。</p>
<h1><a id="toc-c12" class="anchor" href="#toc-c12"></a>2. HBM3架构</h1>
<p><img src="https://thinkinpython.com/static/upload/20260724/upload_ad477faaf497ac7140c40e54ae414f38.png" alt="image.png"></p>
<p>为了提高带宽和单位面积下的存储容量，HBM3 将多层 DRAM 在垂直方向累加起来，就像一栋8～12 层楼房。这样就比 GDDR 那种平房容量更高、吞吐量也更大。</p>
<h2><a id="toc-2e8" class="anchor" href="#toc-2e8"></a>2.1 DRAM Core Die（核心存储层）</h2>
<p>DRAM Core Die 是实际记忆数据的场所，其结构大体上与通用 RAM 一致，构成了 HBM 各层“货仓”（但 1 楼的 Base Die 除外，稍晚会提到）。</p>
<p>每颗 Core Die 是一颗经过 TSV （硅通孔）工艺魔改的 DRAM 芯片。与传统 DRAM 不同，HBM 的 Core Die 表面密集排列着贯穿硅片的通孔阵列——TSV（Through Silicon Via，硅通孔）。这些通孔随后会被填充铜柱，形成横跨所有层的高速数据垂直通路，同时铜柱也是 HBM 的关键散热组件。铜柱两端会焊接微小的锡球（Microbumps），用于两层之间的物理和电气连接。</p>
<p><img src="https://thinkinpython.com/static/upload/20260724/upload_52eb1e835d7db8b3630d8daf81e6d2d5.png" alt="image.png"></p>
<p>传统 DRAM 的数据 I/O 位于芯片边缘（Peripheral Area），通过金属线连接到 PCB。这种方式无法实现垂直堆叠。TSV 解决了这个问题：它将数据 I/O 从芯片边缘转移到了芯片表面/内部，使得数据能够垂直穿过每一层芯片传输，最终由底部的 Base Die 统一对外输出。</p>
<h2><a id="toc-b57" class="anchor" href="#toc-b57"></a>2.2 Microbump（微凸块）层间互连</h2>
<p>相邻 DRAM die 之间通过 Microbump（微凸块） 实现物理和电气连接：</p>
<ul>
<li>Microbump 是直径约 20-25μm、间距约 40-50μm 的微小锡球。</li>
<li>每个 microbump 对应一个 TSV 通孔的出口。</li>
<li>多层 die 堆叠时，die 与 die 之间填充 Underfill（底部填充胶）以增强机械稳定性。</li>
</ul>
<p>简而言之，各层之间通过 Microbump 这种微小的锡球焊接彼此的铜柱，灌胶以后形成一个整体。</p>
<h2><a id="toc-195" class="anchor" href="#toc-195"></a>2.3 Base Die（基础层）</h2>
<p>堆叠最底部是一颗特殊的逻辑 Die，它不包含 DRAM 存储单元，而是承担底层控制功能：</p>
<ul>
<li>DRAM 阵列控制：管理每一层 Core Die 的刷新时序（Refresh）、行列冗余（Row/Column Redundancy）及故障替换。</li>
<li>ECC 引擎：HBM3 引入了强大的片上 ECC（On-die ECC）和错误检查与清洗（ECS）功能，保障海量数据吞吐下的可靠性。</li>
<li>接口桥接：提供标准化的并行接口，与外部 GPU 侧的 HBM PHY 进行对接。</li>
</ul>
<p>Base Die 是 HBM 堆叠中唯一使用逻辑工艺的部分，通常采用 12nm/16nm 等先进逻辑节点制造，以支撑复杂的控制逻辑。这一层在 HBM3 中一般由 DRAM 厂商自行完成。</p>
<h2><a id="toc-4ed" class="anchor" href="#toc-4ed"></a>2.4 1024-bit 位宽与伪通道设计</h2>
<p>HBM3 每个堆叠对外暴露 1024-bit 接口，但内部架构进行了革新：</p>
<ul>
<li>这 1024-bit 被划分为 16 个 64-bit 通道，并进一步细分为 32 个 32-bit 伪通道（Pseudo-Channels）。</li>
<li>伪通道可独立异步操作，大幅提升了随机访问的并发效率，减少了通道间的干扰。</li>
<li>凭借 1024-bit 的极致位宽和 6.4 Gbps 的数据速率，单堆叠带宽达 819 GB/s，约为单颗 GDDR6 芯片的 10-13 倍。</li>
</ul>
<h2><a id="toc-934" class="anchor" href="#toc-934"></a>2.5 解决了什么问题</h2>
<p>HBM3 最重要的贡献是在单位面积内实现了前所未有的带宽密度，同时通过伪通道架构大幅提升了并发访问效率。</p>
<p>以 H100 GPU 为例：搭配 6 颗 HBM3 stack（12-Hi），总带宽达 3.35 TB/s。HBM3 堆叠的标准封装尺寸约为 7 mm × 11 mm，6 颗 stack 合计占用约 462 mm²。在一张面积约 3,000 mm² 的高端 GPU 封装基板上，HBM 仅占用约 15%-20% 的面积，就提供了 3.35 TB/s 的带宽。 如果使用 GDDR6 实现同等带宽（单颗 ~64 GB/s），至少需要 54-60 颗芯片，这将彻底耗尽 PCB 空间并引发严重的信号完整性问题，在 GPU 周围平铺五六十颗显存颗粒几乎无法实现。</p>
<h2><a id="toc-cd0" class="anchor" href="#toc-cd0"></a>2.6 HBM3 的新问题</h2>
<p>HBM3 将 TSV + Microbump 的组合推到了当前极限。暴露出的问题直接定义了 HBM4 的设计方向。</p>
<ul>
<li><p>散热：HBM3 堆叠十几层以后，GPU 运行时发热严重，特别是堆叠中层，通常比底层高出 15 度左右。</p>
</li>
<li><p>Microbump 的物理极限：为了堆叠更多层并限制堆叠高度，必须使用更小的锡球，过小的锡球又会造成层与层连接强度不足、虚焊、短路等风险，也会造成连接电阻上升，进一步加剧发热。</p>
</li>
<li><p>信号完整性：过多的接口界面引入的寄生电容、电阻导致总线信号质量下降。</p>
</li>
<li><p>封装、测试成本上升。</p>
</li>
</ul>
<p>其实核心矛盾是更强的 LLM 对显存的需求持续膨胀，需要更快更大的显存，堆叠更多层 Core die。</p>
<h1><a id="toc-fa8" class="anchor" href="#toc-fa8"></a>3. HBM4 架构</h1>
<p>HBM4 不是一次简单的规格升级，而是在接口带宽、芯片互连方式、base die 工艺、堆叠结构四个维度同时发生了方向性变化。</p>
<h2><a id="toc-29e" class="anchor" href="#toc-29e"></a>3.1 2048-bit 接口</h2>
<p>HBM3 到 HBM4 最直观的变化是接口位宽从 1024-bit 翻倍到 2048-bit。</p>
<p>根据 JEDEC 发布的 HBM4 规范（JESD270-4），HBM4 被划分为 32 个独立的 64-bit 通道。每个 64-bit 通道内部再细分为 2 个 32-bit 的伪通道（Pseudo-Channels）。这种扩展允许在内存操作中实现更大的访问灵活性和并行性。</p>
<p>这意味着 GPU 需要为 HBM4 重新设计 HBM PHY（物理层接口）。随着总线宽度翻倍，HBM PHY 面积也随之增大。反过来，如果将部分存储管理逻辑“下放”到 HBM Base Die，可以局部抵消 PHY 面积的增长。</p>
<p>HBM3E 的单颗带宽上限约为 1.2-1.4 TB/s。如果 GPU 配置 8 颗 HBM4 stack，系统总带宽可达 16-26 TB/s。</p>
<h2><a id="toc-df1" class="anchor" href="#toc-df1"></a>3.2 混合键合（Hybrid Bonding）</h2>
<p><img src="https://thinkinpython.com/static/upload/20260725/upload_8d4985ff17dbd86b9dc448c080eb5bef.png" alt="image.png"></p>
<p>混合键合（也称 Cu-Cu Bonding / 铜-铜直接键合）是突破 16-Hi 堆叠物理极限的关键技术。它去除了传统的锡球和底部填充胶，将芯片表面通过高精度打磨（CMP）抛光至原子级别平整度后，铜触点与介电层直接通过分子扩散熔合为一个整体，层与层之间完全紧贴，堆叠高度甚至能比 HBM3 更低。</p>
<h2><a id="toc-7a6" class="anchor" href="#toc-7a6"></a>3.3 Base Die 工艺升级：逻辑工艺集成</h2>
<p>Base Die 是 HBM 堆叠最底部的控制层。HBM4 将 Base Die 从 DRAM 外围工艺全面迁移至先进逻辑代工节点。例如，SK海力士采用台积电的 12nm/5nm 工艺，三星则采用自研的 4nm (SF4) 逻辑工艺。</p>
<p>解决的问题：</p>
<ul>
<li>减轻 GPU die 的 PHY 占用：将部分存储管理逻辑（指令调度、时序控制、ECC 聚合）从 GPU SoC 迁移到 Base Die，GPU 只负责更高层级的访存命令。</li>
<li>降低系统能耗：逻辑工艺的升级使 Base Die 的工作电压（VDDQ）从 HBM3E 的 1.1V 降至 HBM4 的 0.75V 左右，显著降低了发热与功耗。</li>
<li>更高的管理能力：逻辑 Base Die 可集成更复杂的 ECC 引擎、每层 DRAM die 的独立温度监控和数据刷新率自适应调节。</li>
</ul>
<p>Base Die 工艺迁移到逻辑节点后，其生产从 DRAM Fab 转向逻辑代工厂（例如台积电），封装厂有可能在 HBM4 供应链中分享更多毛利。</p>
<p>另外，三星是几家厂商重唯一具备 DRAM、逻辑封装能力的厂商，HBM4 从晶圆加工到最终封片可以在内部供应链解决，而其他厂商需要依赖外部代工厂，这可能使三星在 HBM4 市场获得成本优势。</p>
<h1><a id="toc-55a" class="anchor" href="#toc-55a"></a>4. HBM4 带来的变化</h1>
<h2><a id="toc-bd0" class="anchor" href="#toc-bd0"></a>4.1 16-Hi 堆叠与厚度挑战</h2>
<p>HBM4 支持最高 16-Hi 堆叠。为满足 JEDEC 规定的 775μm 总高度限制，DRAM Die 的厚度必须从 HBM3 的 ~50μm 减薄至 ~30μm。极薄的晶圆在加工和键合过程中极易损坏，这对封装工艺提出了极高的挑战。</p>
<p>更大的单 Stack 容量意味着更少的 stack 数量即可实现同等总容量，从而降低 GPU 封装基板复杂度和 Interposer 面积。</p>
<h2><a id="toc-c04" class="anchor" href="#toc-c04"></a>4.2 HBM4 的成本与产能特征</h2>
<p>相较于 HBM3，HBM4 的成本分布预期发生显著变化：</p>
<ul>
<li><p>Base Die 成本占比上升：单位面积的逻辑 wafer 成本是 DRAM 的 2-3 倍。</p>
</li>
<li><p>封装绝对成本不降反升：混合键合初期良率低于成熟的 Microbump，爬坡过程预计需要 2-3 年。</p>
</li>
<li><p>测试复杂度更高：16-Hi 堆叠中每层都需要 KGD（Known Good Die）测试，良率损失随层数线性增加。</p>
</li>
<li><p>HBM4 对 DRAM 晶圆消耗量的放大效应：每颗 stack 包含更多 Core Die（16 vs 12，+33%）加上混合键合良率爬坡损失，HBM 对 DRAM 总晶圆产能的“吞噬”效应被放大，留给标准通用型 DRAM 的晶圆产能空间被进一步挤压。</p>
</li>
</ul>
<p>从 HBM4 开始，存储芯片更接近逻辑芯片，而非之前单纯的物理芯片。其 Base Die 开始使用逻辑封片，不再只是单纯的电气接口层，它开始集成内存控制器（Memory Controller）、ECC（错误检查纠正）、电源管理，甚至可以根据客户需求集成轻量级的计算单元（Compute Blocks）。这意味着，存储芯片自身已经具备了一定的“大脑”和计算调度能力。GPU 厂商甚至可以针对自身硬件定制 HBM4 的逻辑电路，进一步优化 GPU 设计。这使得存储行业有可能甩掉纯周期性属性，逐步向高门槛的“成长型科技系统”重估。</p>
<p>联想本月全球存储厂商股票暴跌，已经处于超卖状态，新的机会也许已经出现。</p>

            ]]></description>
            <pubDate>Fri, 24 Jul 2026 10:50:32 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/HBM_3_4.html</guid>
        </item>
        <item>
            <title>存储巨头 1000 亿美金支出去了哪里？</title>
            <link>http://www.thinkinpython.com/post/HBM_capex.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-25f">总结</a></li>
</ul>
</div><p>目前，全球 DRAM 市场由三星、SK 海力士以及美光三巨头垄断。在 AI 算力与基础设施爆发的超级存储周期推动下，三大厂商在未来几年（2026—2027年及以后）均制定了极其激进的资本支出 (CapEx) 计划：</p>
<table>
<thead>
<tr>
<th>厂商</th>
<th>未来1-2年年均资本开支估算(USD)</th>
</tr>
</thead>
<tbody>
<tr>
<td>三星电子 (Samsung)</td>
<td>$700亿</td>
</tr>
<tr>
<td>SK海力士 (SK Hynix)</td>
<td>$300亿</td>
</tr>
<tr>
<td>美光科技 (Micron)</td>
<td>$$350亿</td>
</tr>
</tbody>
</table>
<p>其中三星和 SK 海力士预计未来 10 年在韩国本土投资超过 2000兆韩元，约合 3.56万亿美元。纵观各厂商支出领域：</p>
<p><img src="https://thinkinpython.com/static/upload/20260724/upload_2f276e0b5f9501beb7267fa5e73b0545.png" alt="image.png"></p>
<ul>
<li><p>厂房和无尘室等基础设施投资占大头，为承载更庞大的 HBM 封装和高阶 DRAM 产能，全行业步入厂房扩建期。厂房基建的周期通常为 2～3年，到 2028 年之前，全球存储慌大概率无法缓解。2028 年之后，要看 AI 产业上游厂商（Google、Meta、 微软、Anthropic等）的资本支出是否依然维持高增长，否则存储周期到顶。</p>
</li>
<li><p>HBM 和先进封装设备大约占总投资 1/3，主要用于采购 TSV（硅通孔）、临时键合（Temporary Bonding）和各类后道封装设备。存储厂商将加速从 HBM3E 向 HBM4 过渡，抢占技术壁垒最高 HBM4 供应链位置。</p>
</li>
<li><p>约 20% 支出将投资高阶 DRAM 晶圆，目标是 DRAM 扩产，满足服务器市场 DDR5 的需求缺口，而且 HBM 的良率、晶圆消耗，远甚于 DDR5。即使未来 DRAM 扩产，只要 AI 产业支出不减，DDR5 的产能大概率依然被 HBM 挤压。</p>
</li>
</ul>
<h1><a id="toc-25f" class="anchor" href="#toc-25f"></a>总结</h1>
<p>存储厂商的资本支出，可以看到如下趋势：</p>
<ul>
<li>产能扩充：押注 AI 对显存、服务器内存的需求持续增长。</li>
<li>AI优先：扩充产能主要为 HBM3E 及下一代 HBM4，存储厂商对下一代 GPU 信心充足，优先满足 AI 需求。</li>
</ul>
<p>存储市场的未来，产能爆发是确定的，存储能不能赚钱，还能赚多久的钱，取决于上游厂商是否可以找到 AI 持续盈利的证据，哪怕后续只是需求增幅放缓，对存储行业的打击也是致命的。</p>

            ]]></description>
            <pubDate>Fri, 24 Jul 2026 06:50:01 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/HBM_capex.html</guid>
        </item>
        <item>
            <title>关于光连接，华尔街不会告诉你的事</title>
            <link>http://www.thinkinpython.com/post/optical_link_in_gpu.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-456">一、 账本里的真相</a></li>
<li><a href="#toc-748">二、 机架内互联: 被高估的“全光”刚需</a></li>
<li><a href="#toc-2b9">三、 集群光互连: 缺乏爆发逻辑</a></li>
<li><a href="#toc-25f">总结</a></li>
</ul>
</div><p>在科技投资的宏大叙事里，华尔街最擅长的就是为每一个微小的技术迭代包装出数千亿美元的“总体可寻址市场（TAM）”。在这一轮 AI 算力狂欢中，“光连接（Optical Interconnect）”无疑是被聚光灯打得最足的概念之一。从“算力爆发必带来光模块无处不在”到“CPO技术重塑数据中心”，激进的研报不断刺激着投资者的神经。</p>
<p>然而，剥开这些被精心包裹的幻象，回到最底层的服务器成本拆解（BOM）与物理工程现实，我们会发现一个被刻意忽略的真相：光连接概念正面临着严重的过度炒作。在 AI 硬件的权力版图中，它只是一个缺乏溢价资本的边缘角色。</p>
<hr>
<h2><a id="toc-456" class="anchor" href="#toc-456"></a>一、 账本里的真相</h2>
<p>AI 硬件的绝对核心只有 GPU 和 HBM
华尔街乐于展示光连接设备出货量的同比翻倍增长，但他们很少会让你看一眼一台标准 AI 服务器的真实成本构成。</p>
<p>以目前全球数据中心标配的 8 卡 NVIDIA H200 服务器为例，其整机建议零售价（MSRP）约为 $350,000。当我们把这张账单拆细，其价值链的真实垄断格局一目了然：</p>
<p><img src="https://thinkinpython.com/static/upload/20260605/upload_8e0f826ad0cb13b10acc079faad8e7fc.png" alt="image_900d1719.png"></p>
<p><img src="https://thinkinpython.com/static/upload/20260605/upload_c1f9488e2b0fc37484235a1e6531bb82.png" alt="iShot_2026-06-05_18.24.16.png"></p>
<ul>
<li>绝对核心：8 块配置了 141GB HBM3e 显存的 H200 GPU 核心采购成本高达 $256,000，直接吞噬了整机 70% 的资金。</li>
<li>边缘分润：包含了高速网卡、光通信接口在内的整个网络与 I/O 组件，在单机整机中的采购成本仅占 7%。</li>
</ul>
<p>在 AI 硬件中，任何不能直接贡献算力（FLOPS）或显存带宽（HBM）的组件，都是外围设备。英伟达凭借核心芯片与 CUDA 生态卷走了全产业链近一半的纯利润，而光连接设备在整机中只是极其边缘的硬件，由于缺乏生态护城河，其价值根本不存在爆发的基础。</p>
<hr>
<h2><a id="toc-748" class="anchor" href="#toc-748"></a>二、 机架内互联: 被高估的“全光”刚需</h2>
<p>华尔街的叙事逻辑是线性外推：速度越快，就越需要光。但他们没有告诉你的是，在短距离互联中，铜连接已经取得巨大突破：</p>
<ul>
<li><p>目前基于纯铜互联的 NVLink 6 已经能够实现单卡双工 3.6TB/s、机架级一二百 TB/s 的惊人带宽，至少在目前已经相当够用。</p>
</li>
<li><p>光通信听起来快，但它必须在传输时进行 2 次光电转换，这个过程会引入不可避免的物理延时，光电转换也有能耗、发热问题。铜连接工艺成熟、技术稳定、直接传电信号，近乎零延迟，性价比极高。</p>
</li>
</ul>
<p>对于下游客户（如云服务商）而言，机架内通过现有的铜互联方案已经足够快、足够稳。这就像当年的 5G 概念和 IPv6 升级一样——技术指标固然完美，但在老的 4G 和 IPv4 依然够用且极其省钱的背景下，用户缺乏迫切的升级动力。 </p>
<hr>
<h2><a id="toc-2b9" class="anchor" href="#toc-2b9"></a>三、 集群光互连: 缺乏爆发逻辑</h2>
<p>当然，不能否认光连接的价值。在超大集群的构建中，光连接具有铜缆无法替代的优势：</p>
<ul>
<li>打破距离限制：当万卡、十万卡集群需要跨机柜、跨机房甚至跨建筑连接时，铜缆在超过 2-3 米后信号会发生剧烈的物理衰减。此时，必须通过光纤通信来突破距离限制。</li>
<li>但这不会造就价值爆发：光连接在多机柜集群中确实有刚性场景，但它无法改变其在整体数据中心资本开支（CapEx）中仅占个位数的边缘地位。更重要的，这类光通信设备缺乏像核心算力芯片那样的技术专利垄断和软件生态锁死，随着代工厂规模化量产与良率提升，其 ASP（平均售价）必然被下游客户持续压低。</li>
</ul>
<h2><a id="toc-25f" class="anchor" href="#toc-25f"></a>总结</h2>
<p>华尔街制造“光连接”的增长神话，过度炒作光连接概念。我们必须看清底层的硬核逻辑：AI 硬件的绝对重心始终在核心芯片（GPU）与高带宽显存（HBM）身上。光连接在 AI 硬件中必然有一席之地，但也仅仅是一席之地，不会成为下一个英伟达。</p>

            ]]></description>
            <pubDate>Thu, 04 Jun 2026 15:12:35 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/optical_link_in_gpu.html</guid>
        </item>
        <item>
            <title>悖论——AI 正在反噬英伟达</title>
            <link>http://www.thinkinpython.com/post/cuda_vs_rocm.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-474">一、 铁王座：CUDA 凭什么成为英伟达的护城河？</a></li>
<li><a href="#toc-82b">二、 只是致敬，并非抄袭：ROCm 与 CUDA 的底层异同</a></li>
<li><a href="#toc-959">1. 硬件控制原理：高度一致</a></li>
<li><a href="#toc-c80">2. 软件生态构建：闭源黑盒 vs. 开源标准</a></li>
<li><a href="#toc-da2">三、 悖论：AI 正在摧毁毁 CUDA 的围墙？</a></li>
<li><a href="#toc-47d">1. 自动重写：生成式 AI 抹平了代码迁移成本</a></li>
<li><a href="#toc-7ec">2. 降维打击：大一统中间件（Triton）的崛起</a></li>
<li><a href="#toc-143">四、 反击：英伟达的防御与应对措施</a></li>
<li><a href="#toc-f38">1. 从“卖芯片”彻底转变为“卖数据中心系统”</a></li>
<li><a href="#toc-1ee">2. 恐怖的“摩尔定律”速度压制（时间窗口战）</a></li>
<li><a href="#toc-dd3">五、 展望：双雄逐鹿的终局走向</a></li>
<li><a href="#toc-f4e">英伟达（NVIDIA）：向系统级平台与云计算巨头演进</a></li>
<li><a href="#toc-382">AMD：在推理（Inference）与企业级市场迎来历史性爆发</a></li>
<li><a href="#toc-ebb">总结：AI 没有毁灭英伟达，但 AI 会解放硬件市场</a></li>
</ul>
</div><p>在硅谷的商业史上，很少有一家企业能像英伟达（NVIDIA）这样，凭借一套软件生态筑起数千亿美元的商业高墙。这堵墙的名字叫 CUDA。</p>
<p>长期以来，业界形成了一个牢不可破的共识：买英伟达是为了它的硬件，而留下来是因为它的软件。 </p>
<p>然而，历史往往充满了反讽。随着由英伟达亲手引爆的生成式 AI 浪潮走向纵深，一个意想不到的“回旋镖”正加速飞回：AI 越强大，重写和迁移 CUDA 代码的门槛就越低。英伟达引领的 AI 革命，正在反向削弱它自己最引以为傲的软件护城河。</p>
<p>这是一场关于编译器、中间件、开源力量与人工智能自我进化的硬核博弈。</p>
<hr>
<h2><a id="toc-474" class="anchor" href="#toc-474"></a>一、 铁王座：CUDA 凭什么成为英伟达的护城河？</h2>
<p>要理解城墙是如何倒塌的，首先要明白它是如何建立的。</p>
<p>在 2006 年之前，GPU（图形处理器）只是单纯的游戏显卡。如果科学家想要用 GPU 运行数学矩阵运算，必须把数学公式伪装成“图形渲染指令”喂给显卡，编写过程极其痛苦。</p>
<p>2006 年，英伟达推出了 CUDA（统一计算设备架构）。它的核心贡献在于：允许程序员直接使用 C/C++ 语言来编写控制 GPU 的并行计算代码。</p>
<p><img src="https://thinkinpython.com/static/upload/20260605/upload_ce195777da0904e824007b90be24afde.png" alt="image.png"></p>
<p>为了推广 CUDA，黄仁勋做出了一个在当时看来极其疯狂且亏损巨大的决定：强制让英伟达出厂的所有显卡（包括千元级的GeForce游戏显卡）都必须内置 CUDA 模块。事实证明老黄的这一决策极具远见！</p>
<p>这一决定为英伟达创造了一个价值数千亿的护城河，带来了两个决定性的商业结果：</p>
<ol>
<li>人才基础绝对垄断：过去 18 年里，全球无数的高校学生、科研人员和独立开发者，只需用自己的游戏电脑就能零门槛学习 CUDA。当这批人毕业进入大模型公司或云巨头企业时，他们只会使用 CUDA。</li>
<li>Day-0 生态锁死：全球几乎所有的 AI 开源论文、创新大模型（如 Transformer、Diffusion、Sora），在 GitHub 上发布的第一天，默认代码全部基于 CUDA 编写。</li>
</ol>
<p>英伟达借此收起了超过 75% 的高昂硬件毛利，史称 “英伟达税”。企业想要更便宜的硬件？对不起，你离不开 CUDA。</p>
<p>天下苦英伟达久矣，苍天已死，ROCm当立！</p>
<hr>
<h2><a id="toc-82b" class="anchor" href="#toc-82b"></a>二、 只是致敬，并非抄袭：ROCm 与 CUDA 的底层异同</h2>
<p>为了打破英伟达的垄断，AMD 在 2016 年推出了开源的 ROCm（Radeon Open Compute platform）。从技术实现原理来看，两者的底层逻辑呈现出“异曲同工”，但在软件栈的构建思路上却“背道而驰”。</p>
<h2><a id="toc-959" class="anchor" href="#toc-959"></a>1. 硬件控制原理：高度一致</h2>
<p>在最底层的芯片控制上，CUDA 和 ROCm 都基于 SIMT（单指令多线程） 架构。两者的核心概念在物理硬件上几乎是一一对应的：</p>
<ul>
<li>英伟达的 Thread≈ AMD 的 Work-item</li>
<li>英伟达的 Warp（32线程）≈ AMD 的 Wavefront（波前，32/64线程）</li>
<li>英伟达的 Block（线程块）≈ AMD 的 Work-group</li>
</ul>
<p>因此，无论是 CUDA 还是 ROCm，优化矩阵运算和控制显存缓存的数学逻辑在本质上是互通的。</p>
<h2><a id="toc-c80" class="anchor" href="#toc-c80"></a>2. 软件生态构建：闭源黑盒 vs. 开源标准</h2>
<p>两者的真正差异在于编译器和代码的生成机制：</p>
<ul>
<li><p>CUDA 的 NVCC 编译器：英伟达采用全自研且闭源的 NVCC。它将代码编译成一种私有的虚拟中间语言 PTX，再通过闭源驱动实时翻译成特定显卡的机器码。其内部的数学加速库（如 cuDNN、TensorRT）经过了 18 年的黑盒调优，外界无法窥探。</p>
</li>
<li><p>ROCm 的 LLVM 生态（开源公路）：AMD 没有从头自研编译器，而是直接拥抱了工业标准的开源编译器框架 LLVM。AMD 开发了 HIP（可移植异构接口） 技术，作为代码的桥接层。</p>
</li>
</ul>
<p><img src="https://thinkinpython.com/static/upload/20260605/upload_4ff1569c776f090312add07088421227.png" alt="hip.png"></p>
<p>AMD 的战略很明确：通过 HIP 提供一个“一键翻译工具（hipify）”，试图让开发者把现有的 CUDA 代码自动翻译成 HIP 代码，从而实现“一次编写，到处运行”。</p>
<p>然而，在过去几年中，ROCm 的市场份额依然极低。其原因不在于硬件参数，而在于迁移成本的不可承受之重。早期的 ROCm 充满了编译 Bug、文档缺失、且由于缺乏类似英伟达的群众基础，企业为了将 CUDA 迁移到 ROCm，需要雇佣极其昂贵的系统级工程师进行手动调优，排查诡异的编译器错误。在分秒必争的 AI 竞赛中，没有公司愿意承担这种时间成本。</p>
<p>直到生成式 AI 的爆发，彻底改变了博弈的底层规则。</p>
<hr>
<h2><a id="toc-da2" class="anchor" href="#toc-da2"></a>三、 悖论：AI 正在摧毁毁 CUDA 的围墙？</h2>
<p>英伟达引以为傲的 AI 技术，正在成为其软件护城河最致命的“特洛伊木马”。这种蚕食主要通过两个路径发生：</p>
<h2><a id="toc-47d" class="anchor" href="#toc-47d"></a>1. 自动重写：生成式 AI 抹平了代码迁移成本</h2>
<p>过去需要一个顶级专家团队耗时数月才能完成的“CUDA 到 ROCm/HIP”的代码重写与调优工作，现在正在被大语言模型（如 Claude 3.5、GPT-4o）以分钟级的时间彻底抹平。</p>
<p>现代 AI 编程大模型对底层的抽象语法树（AST）和 GPU 显存对齐有着完美的理解。AI 能够轻松识别 CUDA 代码中的专有算子，不仅能进行语法替换，还能根据 AMD 的硬件特性自动重写出高度优化、无 Bug 的 HIP 算子。</p>
<p>这构成了科技史上最讽刺的商业闭环：</p>
<p>英伟达售卖昂贵芯片 ➔ 科技巨头购买并训练出强大的生成式 AI ➔ 巨头用这个 AI 自动将 CUDA 代码重写迁移为 ROCm ➔ 巨头大规模转向采购便宜的 AMD 芯片 ➔ 摆脱英伟达</p>
<h2><a id="toc-7ec" class="anchor" href="#toc-7ec"></a>2. 降维打击：大一统中间件（Triton）的崛起</h2>
<p>比 AI 自动写代码更致命的，是 AI 底层基础设施本身的架构演进——以 OpenAI 主导的 Triton 语言为代表的中间件迅速崛起。</p>
<p>在过去，深度学习框架（如 PyTorch）的底层需要针对英伟达编写大量的 CUDA 算子。而 OpenAI 发布的 Triton，是一种极简的、基于 Python 的开源编译器。它的目标是让普通程序员写出 Python 级别的简易代码，由 Triton 编译器自动去处理底层的并行和内存管理。</p>
<p>最关键的是：Triton 在设计之初，就同时开发了 NVIDIA 和 AMD 的双后端。</p>
<p><img src="https://thinkinpython.com/static/upload/20260605/upload_db43c2a4845dd5640c0727f0f2a7374b.png" alt="image.png"></p>
<p>当 OpenAI、Meta 等大模型厂商逐渐将自家的核心模型从直接调用 CUDA 转向通过 Triton 编写时，底层的硬件开始变得完全透明和可替换。英伟达精心构筑的 CUDA 软件墙，正在被 Triton 这种中间件从内部逐步“瓦解”。</p>
<hr>
<h2><a id="toc-143" class="anchor" href="#toc-143"></a>四、 反击：英伟达的防御与应对措施</h2>
<p>面对软件护城河被 AI 和开源生态反向侵蚀的危机，英伟达的竞争策略已经发生了重大位移，他们正在将防御阵线从“单卡软件”推向更难被攻破的<strong>物理极限</strong>。</p>
<h2><a id="toc-f38" class="anchor" href="#toc-f38"></a>1. 从“卖芯片”彻底转变为“卖数据中心系统”</h2>
<p>当单卡的软件壁垒逐渐被抹平时，英伟达开始在超大规模集群的网络互联上加高壁垒。</p>
<ul>
<li><p>大模型训练现在已经进入万卡、十万卡时代，芯片之间的通信延迟比单卡算力更重要。</p>
</li>
<li><p>英伟达通过私有的 NVLink 协议、NVSwitch 芯片以及收购 Mellanox 获得的 InfiniBand（IB）网络技术，将上万张显卡织成一整个极其高效的“超级大脑”。这种万卡级别的物理网络拓扑、高频通信软硬件的极限整合，是单靠大模型“重写几行代码”绝对无法跨越的物理硬实力。</p>
</li>
</ul>
<h2><a id="toc-1ee" class="anchor" href="#toc-1ee"></a>2. 恐怖的“摩尔定律”速度压制（时间窗口战）</h2>
<p>英伟达正在采用商业史上罕见的高强度研发节奏，将硬件迭代速度提升至一年一代（从 Hopper 到 Blackwell，再到 Rubin 架构）。</p>
<p>即使 AI 能完美、零成本地将 CUDA 代码迁移到 AMD 的硬件上，如果英伟达新一代硬件的绝对性能依然能拉开对手一代以上的差距，那么理性的企业为了抢夺模型上线的关键时间窗口（Time-to-Market），依然不得不乖乖向英伟达奉上高额的溢价。</p>
<hr>
<h2><a id="toc-dd3" class="anchor" href="#toc-dd3"></a>五、 展望：双雄逐鹿的终局走向</h2>
<p>随着软件壁垒的消融，AI 芯片竞争的下半场，正在从过去的“生态垄断战”逐步回归到最纯粹的“硬件性价比、功耗比以及大规模网络互联能力”的物理对决。</p>
<h2><a id="toc-f4e" class="anchor" href="#toc-f4e"></a>英伟达（NVIDIA）：向系统级平台与云计算巨头演进</h2>
<p>英伟达的短期地位依然难以撼动。虽然单卡 CUDA 的壁垒在降低，但它凭借全栈的数据中心网络（NVLink）和一年一代的恐怖迭代速度，依然会牢牢占据最顶尖、最追求极致性能的超大规模 AI 训练市场（AI Training）。英伟达未来的角色将更像是一个“AI 基础设施的超级总承包商”。</p>
<h2><a id="toc-382" class="anchor" href="#toc-382"></a>AMD：在推理（Inference）与企业级市场迎来历史性爆发</h2>
<p>对于 AMD 而言，这是历史上最好的红利期。随着全球大模型逐渐从“训练阶段”走向“大规模商业落地推理阶段”，市场对算力的需求正在从“不计成本追求极限性能”转向“追求极致的每美元性价比和功耗比”。</p>
<p>在 PyTorch、Triton 的加持以及 AI 自动迁移工具的普及下，ROCm 的软件劣势正在被快速拉平。AMD 的 Instinct 系列芯片凭借更大的显存容量和高性价比，将极大程度地蚕食云巨头、传统企业级私有化部署的推理算力市场。</p>
<h2><a id="toc-ebb" class="anchor" href="#toc-ebb"></a>总结：AI 没有毁灭英伟达，但 AI 会解放硬件市场</h2>
<p>这场由英伟达亲手点燃的 AI 圣火，在不久的将来，会解除在其他硬件厂商身上的 CUDA 枷锁，让整个芯片行业重新回到了以物理性能与创新效率为核心的良性竞争赛道上。这算不算一个美好的愿望？！（Doggy）</p>

            ]]></description>
            <pubDate>Wed, 03 Jun 2026 13:58:41 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/cuda_vs_rocm.html</guid>
        </item>
        <item>
            <title>在线加密工具</title>
            <link>http://www.thinkinpython.com/post/rsa_encryt.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#%E5%9C%A8%E7%BA%BF%E5%8A%A0%E5%AF%86%E5%B7%A5%E5%85%B7-staticencrypthtml">在线加密工具 <a href="/static/encrypt.html"></a></a><ul>
<li><a href="#howto">How to</a></li>
</ul>
</li>
<li><a href="#toc-f0d">1. 接收方准备公钥</a></li>
<li><a href="#toc-194">发送方加密信息</a></li>
<li><a href="#toc-1d8">接收方解密信息</a></li>
</ul>
</div><h2><a id="toc-a56" class="anchor" href="#toc-a56"></a>在线加密工具 <a href="/static/encrypt.html">&lt;入口&gt;</a></h2>
<h1><a id="howto" class="anchor" href="#howto"></a>How to</h1>
<h2><a id="toc-f0d" class="anchor" href="#toc-f0d"></a>1. 接收方准备公钥</h2>
<p><img src="https://thinkinpython.com/static/upload/20260521/upload_722130fdcd2894cb695252372ca3a9c7.png" alt="image.png"></p>
<h2><a id="toc-194" class="anchor" href="#toc-194"></a>发送方加密信息</h2>
<p>只要发送方没有更换公钥，该公钥可以一直使用。只需更新明文信息，点击加密按钮即可生成新的秘文。</p>
<p><img src="https://thinkinpython.com/static/upload/20260521/upload_e9bd9a4d558182347b3a77c871a9fccb.png" alt="image.png"></p>
<h2><a id="toc-1d8" class="anchor" href="#toc-1d8"></a>接收方解密信息</h2>
<p>只要不刷新页面，可以持续解密信息。</p>
<p><img src="https://thinkinpython.com/static/upload/20260521/upload_7d6c47f271c1e75ae80e30554e84c31b.png" alt="image.png"></p>

            ]]></description>
            <pubDate>Sun, 10 May 2026 18:22:56 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/rsa_encryt.html</guid>
        </item>
        <item>
            <title>大型代码库的 Claude Code 最佳实践：构建层级化知识库</title>
            <link>http://www.thinkinpython.com/post/claude-code-large-codebase-best-practices-cn.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-dd2">大型代码库的 Claude Code 最佳实践：构建层级化知识库</a><ul>
<li><a href="#toc-e45">引言</a></li>
<li><a href="#toc-903">核心原则：渐进式披露</a></li>
<li><a href="#toc-9dc">三级层级结构</a><ul>
<li><a href="#toc-887">第一层：项目根目录（全局上下文）</a></li>
<li><a href="#toc-b86">第二层：模块/领域（战略上下文）</a></li>
<li><a href="#toc-4a7">第三层：叶子节点/组件（战术上下文）</a></li>
</ul>
</li>
<li><a href="#toc-1d3">AI 友好内容的编写规范</a><ul>
<li><a href="#toc-81d">1. 明确而非习惯用语</a></li>
<li><a href="#toc-157">2. 使用&quot;要/不要&quot;列表</a></li>
<li><a href="#toc-9b6">3. 引用具体文件路径</a></li>
<li><a href="#toc-dd2">4. 保持精简</a></li>
</ul>
</li>
<li><a href="#toc-794">层级化 vs 扁平化：对比</a></li>
<li><a href="#toc-0b2">实施步骤</a><ul>
<li><a href="#toc-981">第一阶段：根目录</a></li>
<li><a href="#toc-862">第二阶段：核心模块</a></li>
<li><a href="#toc-a6d">第三阶段：复杂组件</a></li>
<li><a href="#toc-6ad">第四阶段：让 Claude 协助</a></li>
</ul>
</li>
<li><a href="#toc-25f">总结</a></li>
</ul>
</li>
</ul>
</div><h1><a id="toc-dd2" class="anchor" href="#toc-dd2"></a>大型代码库的 Claude Code 最佳实践：构建层级化知识库</h1>
<blockquote>
<p><strong>摘要</strong>：在大型代码库中高效使用 Claude Code 的核心在于&quot;渐进式披露&quot;原则。通过构建三级层级化知识库，让 AI 在需要时获取恰到好处的上下文，避免 token 浪费和上下文混淆。</p>
</blockquote>
<hr>
<p><a href="/post/claude-code-large-codebase-best-practices.html">to English</a></p>
<h2><a id="toc-e45" class="anchor" href="#toc-e45"></a>引言</h2>
<p>AI 辅助编程工具日益普及，开发者面临新挑战：如何在大型代码库中高效使用 Claude Code。在根目录放一个庞大的 README 并非良策——token 浪费、上下文混淆、维护困难。</p>
<p>本文介绍一种<strong>层级化知识库</strong>最佳实践，通过三级文档结构，让 Claude Code 在正确时机获取正确信息。</p>
<hr>
<h2><a id="toc-903" class="anchor" href="#toc-903"></a>核心原则：渐进式披露</h2>
<p><strong>渐进式披露（Progressive Disclosure）</strong>：在根目录提供高层规则，随着 AI 深入子目录，逐步提供更具体的&quot;为什么&quot;和&quot;怎么做&quot;。</p>
<p>Claude Code 原生识别 <code>CLAUDE.md</code> 文件。我们将此模式扩展为层级化方法，让文档结构与目录树对齐。</p>
<hr>
<h2><a id="toc-9dc" class="anchor" href="#toc-9dc"></a>三级层级结构</h2>
<h3><a id="toc-887" class="anchor" href="#toc-887"></a>第一层：项目根目录（全局上下文）</h3>
<p><strong>文件位置</strong>：<code>/CLAUDE.md</code></p>
<p><strong>定位</strong>：项目&quot;宪法&quot;，定义技术栈、核心命令、不可违背的标准。</p>
<p><strong>示例内容</strong>：</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## 构建命令</span>
<span class="hljs-bullet">- </span>生产构建：pnpm build
<span class="hljs-bullet">- </span>开发模式：pnpm dev

<span class="hljs-section">## 测试命令</span>
<span class="hljs-bullet">- </span>单元测试：pnpm test:unit <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">文件</span>&gt;</span></span>
<span class="hljs-bullet">- </span>E2E 测试：pnpm test:e2e

<span class="hljs-section">## 代码规范</span>
<span class="hljs-bullet">- </span>仅使用函数式组件
<span class="hljs-bullet">- </span>禁止 default exports
<span class="hljs-bullet">- </span>样式使用 Tailwind CSS

<span class="hljs-section">## 架构概述</span>
<span class="hljs-bullet">- </span>Next.js 单体仓库
<span class="hljs-bullet">- </span>共享逻辑位于 /packages/shared
</code></pre>
<hr>
<h3><a id="toc-b86" class="anchor" href="#toc-b86"></a>第二层：模块/领域（战略上下文）</h3>
<p><strong>文件位置</strong>：<code>/src/features/billing/CONTEXT.md</code></p>
<p><strong>定位</strong>：解释代码无法揭示的业务逻辑和隐性数据流。</p>
<p><strong>示例内容</strong>：</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## 领域逻辑</span>
本模块处理 Stripe 支付集成。

<span class="hljs-section">## 数据流</span>
所有支付必须先触发 webhook-handler，再更新数据库。

<span class="hljs-section">## 安全要求</span>
<span class="hljs-bullet">- </span>禁止在前端暴露 Secret_Key
<span class="hljs-bullet">- </span>使用 /api/stripe 中的代理进行后端调用

<span class="hljs-section">## 依赖关系</span>
<span class="hljs-bullet">- </span>依赖 UserStore 进行税费计算
<span class="hljs-bullet">- </span>与 OrderService 双向同步
</code></pre>
<hr>
<h3><a id="toc-4a7" class="anchor" href="#toc-4a7"></a>第三层：叶子节点/组件（战术上下文）</h3>
<p><strong>文件位置</strong>：<code>/src/components/DataGrid/NOTES.md</code></p>
<p><strong>定位</strong>：解释&quot;陷阱&quot;和技术债务。</p>
<p><strong>示例内容</strong>：</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## 性能注意事项</span>
<span class="hljs-bullet">- </span>使用 react-virtualized 进行虚拟滚动
<span class="hljs-bullet">- </span>禁止移除 rowHeight 属性，否则在 Safari 上会崩溃

<span class="hljs-section">## 已知问题</span>
<span class="hljs-bullet">- </span>排序切换与 API 存在竞态条件
<span class="hljs-bullet">- </span>解决方案：使用 isLoading ref 进行防抖

<span class="hljs-section">## 待重构</span>
<span class="hljs-bullet">- </span>[ ] 将排序逻辑提取为独立 Hook
<span class="hljs-bullet">- </span>[ ] 替换已废弃的 componentWillReceiveProps
</code></pre>
<hr>
<h2><a id="toc-1d3" class="anchor" href="#toc-1d3"></a>AI 友好内容的编写规范</h2>
<h3><a id="toc-81d" class="anchor" href="#toc-81d"></a>1. 明确而非习惯用语</h3>
<p>❌ 错误：<code>Just run the tests</code><br>✅ 正确：<code>Use npm run test</code></p>
<p>AI 对明确指令响应更好，避免开发者&quot;行话&quot;。</p>
<h3><a id="toc-157" class="anchor" href="#toc-157"></a>2. 使用&quot;要/不要&quot;列表</h3>
<p>AI 对否定约束响应极佳：</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## 类型规范</span>
<span class="hljs-bullet">- </span>❌ 不要使用 'any' 类型
<span class="hljs-bullet">- </span>✅ 类型 truly 不明确时使用 'unknown'
<span class="hljs-bullet">- </span>✅ 优先使用 TypeScript 严格模式
</code></pre>
<h3><a id="toc-9b6" class="anchor" href="#toc-9b6"></a>3. 引用具体文件路径</h3>
<p>让 AI 知道&quot;真相&quot;在哪里：</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## 数据模型</span>
<span class="hljs-bullet">- </span>主 Schema 定义在 /src/db/schema.ts
<span class="hljs-bullet">- </span>类型导出在 /src/types/index.ts
</code></pre>
<h3><a id="toc-dd2" class="anchor" href="#toc-dd2"></a>4. 保持精简</h3>
<p>单个上下文文件<strong>不超过 50 行</strong>高密度信息。超过 10KB，AI 可能浪费过多 token。</p>
<hr>
<h2><a id="toc-794" class="anchor" href="#toc-794"></a>层级化 vs 扁平化：对比</h2>
<table>
<thead>
<tr>
<th>特性</th>
<th>扁平化（单一 README）</th>
<th>层级化（多级结构）</th>
</tr>
</thead>
<tbody>
<tr>
<td>Token 使用</td>
<td>高（AI 每次读取全部内容）</td>
<td>低（仅读取相关目录笔记）</td>
</tr>
<tr>
<td>精确度</td>
<td>低（可能混淆 Webhook 规则与 UI 规则）</td>
<td>高（特定文件夹的特定规则）</td>
</tr>
<tr>
<td>可维护性</td>
<td>难（单一文件变成&quot;杂物抽屉&quot;）</td>
<td>易（小文件贴近所描述的代码）</td>
</tr>
<tr>
<td>扩展性</td>
<td>差（随项目增长迅速膨胀）</td>
<td>好（新增模块只需添加对应文件）</td>
</tr>
</tbody>
</table>
<hr>
<h2><a id="toc-0b2" class="anchor" href="#toc-0b2"></a>实施步骤</h2>
<p>无需一次性完成。采用渐进式方法：</p>
<h3><a id="toc-981" class="anchor" href="#toc-981"></a>第一阶段：根目录</h3>
<ol>
<li>创建 <code>/CLAUDE.md</code></li>
<li>定义技术栈、构建命令、代码规范</li>
</ol>
<h3><a id="toc-862" class="anchor" href="#toc-862"></a>第二阶段：核心模块</h3>
<ol>
<li>识别 3-5 个核心业务模块</li>
<li>为每个模块创建 <code>CONTEXT.md</code></li>
<li>描述数据流、安全要求、依赖关系</li>
</ol>
<h3><a id="toc-a6d" class="anchor" href="#toc-a6d"></a>第三阶段：复杂组件</h3>
<ol>
<li>识别存在技术债务或&quot;陷阱&quot;的组件</li>
<li>创建 <code>NOTES.md</code> 记录已知问题和解决方案</li>
</ol>
<h3><a id="toc-6ad" class="anchor" href="#toc-6ad"></a>第四阶段：让 Claude 协助</h3>
<p>使用 Claude Code 本身帮助生成文档：</p>
<pre><code class="hljs lang-bash"><span class="hljs-comment"># 让 Claude 分析模块并生成 CONTEXT.md</span>
claude <span class="hljs-string">"Analyze the billing module and create a CONTEXT.md 
        that explains the data flow and security requirements"</span>
</code></pre>
<hr>
<h2><a id="toc-25f" class="anchor" href="#toc-25f"></a>总结</h2>
<p>层级化知识库的核心价值：</p>
<ol>
<li><strong>节省 token</strong>：AI 仅读取相关上下文</li>
<li><strong>提高精确度</strong>：特定规则作用于特定范围</li>
<li><strong>易于维护</strong>：小文件贴近代码，更新成本低</li>
<li><strong>可扩展</strong>：随项目增长自然扩展</li>
</ol>
<p>实施时从根目录 <code>/CLAUDE.md</code> 入手，逐步向下扩展。记住：<strong>文档的价值在于被使用，而非被写完</strong>。</p>
<hr>
<p><strong>参考资料</strong></p>
<ul>
<li><a href="https://docs.anthropic.com/claude-code">Claude Code 官方文档</a></li>
<li><a href="https://www.nngroup.com/articles/progressive-disclosure/">Progressive Disclosure in Software Design</a></li>
</ul>

            ]]></description>
            <pubDate>Tue, 31 Mar 2026 04:36:26 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/claude-code-large-codebase-best-practices-cn.html</guid>
        </item>
        <item>
            <title>Best Practices for Large Codebases with Claude Code: Building a Level-Structured Knowledge Base</title>
            <link>http://www.thinkinpython.com/post/claude-code-large-codebase-best-practices.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-699">Best Practices for Large Codebases with Claude Code: Building a Level-Structured Knowledge Base</a><ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#toc-562">Core Principle: Progressive Disclosure</a></li>
<li><a href="#the3-tierhierarchy">The 3-Tier Hierarchy</a><ul>
<li><a href="#toc-05b">Tier 1: Project Root (Global Context)</a></li>
<li><a href="#toc-aaa">Tier 2: Module/Domain (Strategic Context)</a></li>
<li><a href="#toc-822">Tier 3: Leaf/Component (Tactical Context)</a></li>
</ul>
</li>
<li><a href="#toc-6ea">Best Practices for &quot;AI-Friendly&quot; Content</a><ul>
<li><a href="#toc-267">1. Be Explicit, Not Idiomatic</a></li>
<li><a href="#toc-c43">2. Use &quot;Do/Don&#39;t&quot; Lists</a></li>
<li><a href="#toc-5f4">3. Reference Specific Files</a></li>
<li><a href="#toc-eb3">4. Keep It Small</a></li>
</ul>
</li>
<li><a href="#toc-dca">Hierarchical vs. Flat: Comparison</a></li>
<li><a href="#implementationsteps">Implementation Steps</a><ul>
<li><a href="#toc-c7a">Phase 1: Root Directory</a></li>
<li><a href="#toc-959">Phase 2: Core Modules</a></li>
<li><a href="#toc-13e">Phase 3: Complex Components</a></li>
<li><a href="#toc-404">Phase 4: Let Claude Help</a></li>
</ul>
</li>
<li><a href="#summary">Summary</a></li>
</ul>
</li>
</ul>
</div><h1><a id="toc-699" class="anchor" href="#toc-699"></a>Best Practices for Large Codebases with Claude Code: Building a Level-Structured Knowledge Base</h1>
<blockquote>
<p><strong>Abstract</strong>: The key to efficiently using Claude Code in large codebases lies in the principle of &quot;Progressive Disclosure.&quot; By building a three-tier hierarchical knowledge base, AI can access just the right amount of context when needed, avoiding token waste and context confusion.</p>
</blockquote>
<hr>
<p><a href="/post/claude-code-large-codebase-best-practices-cn.html">中文版</a></p>
<h2><a id="introduction" class="anchor" href="#introduction"></a>Introduction</h2>
<p>As AI-assisted programming tools become ubiquitous, developers face a new challenge: how to use Claude Code effectively in large codebases. Placing a massive README file at the root is far from optimal—it leads to token waste, context confusion, and maintenance difficulties.</p>
<p>This article presents a <strong>hierarchical knowledge base</strong> best practice, using a three-tier documentation structure to ensure Claude Code receives the right information at the right time.</p>
<hr>
<h2><a id="toc-562" class="anchor" href="#toc-562"></a>Core Principle: Progressive Disclosure</h2>
<p><strong>Progressive Disclosure</strong> means providing high-level rules at the root, then offering increasingly specific &quot;why&quot; and &quot;how&quot; details as AI drills down into subdirectories.</p>
<p>Claude Code natively recognizes <code>CLAUDE.md</code> files. We can extend this pattern into a hierarchical approach, aligning documentation structure with the directory tree.</p>
<hr>
<h2><a id="the3-tierhierarchy" class="anchor" href="#the3-tierhierarchy"></a>The 3-Tier Hierarchy</h2>
<h3><a id="toc-05b" class="anchor" href="#toc-05b"></a>Tier 1: Project Root (Global Context)</h3>
<p><strong>File Location</strong>: <code>/CLAUDE.md</code></p>
<p><strong>Purpose</strong>: The &quot;Constitution&quot;—defining the tech stack, core commands, and non-negotiable standards.</p>
<p><strong>Example Content</strong>:</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## Build Commands</span>
<span class="hljs-bullet">- </span>Production build: <span class="hljs-code">`pnpm build`</span>
<span class="hljs-bullet">- </span>Development mode: <span class="hljs-code">`pnpm dev`</span>

<span class="hljs-section">## Test Commands</span>
<span class="hljs-bullet">- </span>Unit tests: <span class="hljs-code">`pnpm test:unit &lt;file&gt;`</span>
<span class="hljs-bullet">- </span>E2E tests: <span class="hljs-code">`pnpm test:e2e`</span>

<span class="hljs-section">## Code Style</span>
<span class="hljs-bullet">- </span>Functional components only
<span class="hljs-bullet">- </span>No default exports
<span class="hljs-bullet">- </span>Use Tailwind CSS for styling

<span class="hljs-section">## Architecture</span>
<span class="hljs-bullet">- </span>Next.js monorepo
<span class="hljs-bullet">- </span>Shared logic in <span class="hljs-code">`/packages/shared`</span>
</code></pre>
<hr>
<h3><a id="toc-aaa" class="anchor" href="#toc-aaa"></a>Tier 2: Module/Domain (Strategic Context)</h3>
<p><strong>File Location</strong>: <code>/src/features/billing/CONTEXT.md</code></p>
<p><strong>Purpose</strong>: Explaining business logic and invisible data flows that code alone won&#39;t reveal.</p>
<p><strong>Example Content</strong>:</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## Domain Logic</span>
This module handles Stripe integration.

<span class="hljs-section">## Data Flow</span>
All payments must trigger the <span class="hljs-code">`webhook-handler`</span> before updating the DB.

<span class="hljs-section">## Security</span>
<span class="hljs-bullet">- </span>Never expose Secret_Key to the frontend
<span class="hljs-bullet">- </span>Use the proxy in <span class="hljs-code">`/api/stripe`</span> for backend calls

<span class="hljs-section">## Dependencies</span>
<span class="hljs-bullet">- </span>Depends on UserStore for tax calculations
<span class="hljs-bullet">- </span>Bidirectional sync with OrderService
</code></pre>
<hr>
<h3><a id="toc-822" class="anchor" href="#toc-822"></a>Tier 3: Leaf/Component (Tactical Context)</h3>
<p><strong>File Location</strong>: <code>/src/components/DataGrid/NOTES.md</code></p>
<p><strong>Purpose</strong>: Explaining &quot;gotchas&quot; and specific technical debt.</p>
<p><strong>Example Content</strong>:</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## Performance</span>
<span class="hljs-bullet">- </span>Uses react-virtualized for virtual scrolling
<span class="hljs-bullet">- </span>Do not remove the <span class="hljs-code">`rowHeight`</span> prop or it will crash on Safari

<span class="hljs-section">## Known Issues</span>
<span class="hljs-bullet">- </span>Sorting toggle has a race condition with the API
<span class="hljs-bullet">- </span>Workaround: use <span class="hljs-code">`isLoading`</span> ref to debounce

<span class="hljs-section">## TODO</span>
<span class="hljs-bullet">- </span>[ ] Extract sorting logic into a standalone Hook
<span class="hljs-bullet">- </span>[ ] Replace deprecated componentWillReceiveProps
</code></pre>
<hr>
<h2><a id="toc-6ea" class="anchor" href="#toc-6ea"></a>Best Practices for &quot;AI-Friendly&quot; Content</h2>
<h3><a id="toc-267" class="anchor" href="#toc-267"></a>1. Be Explicit, Not Idiomatic</h3>
<p>❌ Wrong: <code>Just run the tests</code><br>✅ Right: <code>Use npm run test</code></p>
<p>AI models respond better to explicit instructions. Avoid developer &quot;jargon.&quot;</p>
<h3><a id="toc-c43" class="anchor" href="#toc-c43"></a>2. Use &quot;Do/Don&#39;t&quot; Lists</h3>
<p>AI models respond exceptionally well to negative constraints:</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## Type Safety</span>
<span class="hljs-bullet">- </span>❌ Don't use 'any' types
<span class="hljs-bullet">- </span>✅ Use 'unknown' if the type is truly ambiguous
<span class="hljs-bullet">- </span>✅ Prefer TypeScript strict mode
</code></pre>
<h3><a id="toc-5f4" class="anchor" href="#toc-5f4"></a>3. Reference Specific Files</h3>
<p>Let AI know where &quot;The Truth&quot; lives:</p>
<pre><code class="hljs lang-markdown"><span class="hljs-section">## Data Models</span>
<span class="hljs-bullet">- </span>Master schema defined in <span class="hljs-code">`/src/db/schema.ts`</span>
<span class="hljs-bullet">- </span>Type exports in <span class="hljs-code">`/src/types/index.ts`</span>
</code></pre>
<h3><a id="toc-eb3" class="anchor" href="#toc-eb3"></a>4. Keep It Small</h3>
<p>Individual context files should be <strong>under 50 lines</strong> of high-density information. If a file exceeds 10KB, AI may waste too many tokens reading it.</p>
<hr>
<h2><a id="toc-dca" class="anchor" href="#toc-dca"></a>Hierarchical vs. Flat: Comparison</h2>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Flat (One Big README)</th>
<th>Hierarchical (Level-Structured)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Token Usage</td>
<td>High (Claude reads everything every time)</td>
<td>Low (Claude only reads relevant folder&#39;s notes)</td>
</tr>
<tr>
<td>Precision</td>
<td>Low (May confuse Webhook rules with UI rules)</td>
<td>High (Specific rules for specific folders)</td>
</tr>
<tr>
<td>Maintainability</td>
<td>Hard (One file becomes a &quot;junk drawer&quot;)</td>
<td>Easy (Small files stay close to the code they describe)</td>
</tr>
<tr>
<td>Scalability</td>
<td>Poor (Rapidly bloats as project grows)</td>
<td>Good (New modules just add corresponding files)</td>
</tr>
</tbody>
</table>
<hr>
<h2><a id="implementationsteps" class="anchor" href="#implementationsteps"></a>Implementation Steps</h2>
<p>You don&#39;t have to write all of this at once. Adopt a progressive approach:</p>
<h3><a id="toc-c7a" class="anchor" href="#toc-c7a"></a>Phase 1: Root Directory</h3>
<ol>
<li>Create <code>/CLAUDE.md</code></li>
<li>Define tech stack, build commands, code conventions</li>
</ol>
<h3><a id="toc-959" class="anchor" href="#toc-959"></a>Phase 2: Core Modules</h3>
<ol>
<li>Identify 3-5 core business modules</li>
<li>Create <code>CONTEXT.md</code> for each module</li>
<li>Document data flows, security requirements, dependencies</li>
</ol>
<h3><a id="toc-13e" class="anchor" href="#toc-13e"></a>Phase 3: Complex Components</h3>
<ol>
<li>Identify components with technical debt or &quot;gotchas&quot;</li>
<li>Create <code>NOTES.md</code> documenting known issues and workarounds</li>
</ol>
<h3><a id="toc-404" class="anchor" href="#toc-404"></a>Phase 4: Let Claude Help</h3>
<p>Use Claude Code itself to help generate documentation:</p>
<pre><code class="hljs lang-bash"><span class="hljs-comment"># Ask Claude to analyze a module and generate CONTEXT.md</span>
claude <span class="hljs-string">"Analyze the billing module and create a CONTEXT.md 
        that explains the data flow and security requirements"</span>
</code></pre>
<hr>
<h2><a id="summary" class="anchor" href="#summary"></a>Summary</h2>
<p>The core value of a hierarchical knowledge base:</p>
<ol>
<li><strong>Saves tokens</strong>: AI reads only relevant context</li>
<li><strong>Improves precision</strong>: Specific rules apply to specific scopes</li>
<li><strong>Easy maintenance</strong>: Small files stay close to code, low update cost</li>
<li><strong>Scalable</strong>: Grows naturally with the project</li>
</ol>
<p>When starting, begin with <code>/CLAUDE.md</code> at the root, then expand downward. Remember: <strong>The value of documentation lies in being used, not in being finished.</strong></p>
<hr>
<p><strong>References</strong></p>
<ul>
<li><a href="https://docs.anthropic.com/claude-code">Claude Code Official Documentation</a></li>
<li><a href="https://www.nngroup.com/articles/progressive-disclosure/">Progressive Disclosure in Software Design</a></li>
</ul>

            ]]></description>
            <pubDate>Tue, 31 Mar 2026 02:43:30 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/claude-code-large-codebase-best-practices.html</guid>
        </item>
        <item>
            <title>古都之秋</title>
            <link>http://www.thinkinpython.com/post/fall_of_the_ancient_city.html</link>
            <description><![CDATA[
            <div class="toc"></div><p><img src="https://thinkinpython.com/static/upload/20251102/upload_e6cf72beb7b880c3ec9cead25984501f.png" alt="2.png"></p>
<p><img src="https://thinkinpython.com/static/upload/20251102/upload_d63ab713da10fc48f31030de8a09ddcc.png" alt="4.png"></p>
<p><img src="https://thinkinpython.com/static/upload/20251102/upload_e82a73d7a44f953360441e910aa80fed.png" alt="5.png"></p>
<p><img src="https://thinkinpython.com/static/upload/20251102/upload_a62227a287b0de0c9a6303f6a186779b.png" alt="9.png"></p>

            ]]></description>
            <pubDate>Sun, 02 Nov 2025 14:20:37 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/fall_of_the_ancient_city.html</guid>
        </item>
        <item>
            <title>Amber---下一个 shell 脚本何必是 shell script</title>
            <link>http://www.thinkinpython.com/post/amber_script.html</link>
            <description><![CDATA[
            <div class="toc"><ul>
<li><a href="#toc-9ed">先睹为快</a></li>
<li><a href="#toc-24c">执行命令</a></li>
<li><a href="#toc-25f">总结</a></li>
</ul>
</div><p>Linux shell script 是我最喜欢的脚本之一，历史悠久，底蕴深厚，shell script 几乎是内核的一部分，托 POSIX 标准的福，你可以在任何 Linux 系统中使用它。但是编写 shell script 体验并不太好，各种奇怪的语法、没有类型检查、孱弱的数组支持，有时候排查很久的问题，仅仅是错误的使用引号、或者多了一个空格。</p>
<p>我很喜欢造轮子，曾打算写一个高级语言，可以编译成 shell script 执行，即使是一些简单的语法糖，也能很大程度提升 shell script 用户的幸福感。前几天发现一个项目 <a href="https://amber-lang.com">Amber</a> 已经做了这些工作，试用了下还不错，语法类似 Ecmas 或者 js，支持 Text、Num、Bool、Null 和 [] 数组，可以直接编译成 shell script，直接拿到任何 shell 中执行，没有任何移植性困扰。</p>
<h1><a id="toc-9ed" class="anchor" href="#toc-9ed"></a>先睹为快</h1>
<p>参考官网的安装指导，只需要一行命令：</p>
<pre><code class="hljs lang-bash">curl -s <span class="hljs-string">"https://raw.githubusercontent.com/Ph0enixKM/AmberNative/master/setup/install.sh"</span> | bash
</code></pre>
<p>请确保你的系统已安装了 curl、bc， 安装以后就可以使用 <code>amber</code> 命令。 下面是一个简单的例子：</p>
<pre><code class="hljs lang-undefined">let fruits = ["apple", "banana", "grape"]

fun show_opt(fruits) {
    loop index, f in fruits {
        echo "{index}: {f}"
    }
}

show_opt(fruits)
</code></pre>
<p>将上面的代码保存为 <code>test1.ab</code>, 执行它</p>
<pre><code class="hljs lang-bash">~/<span class="hljs-built_in">test</span> $ amber test1.ab
0: apple
1: banana
2: grape
</code></pre>
<p>只要你有任何一种变成经验，很容易明白 amber 的基本语法。</p>
<p>上面的 amber 脚本等效的 shell 如何呢？我们可以将 amber 脚本编译为 shell 脚本。</p>
<pre><code class="hljs lang-undefined">amber test1.ab test1.sh
</code></pre>
<p>相比直接执行 amber 脚本，只需要增加一个参数指定编译输出的脚本文件名即可。<code>test1.sh</code> 看起来这样：</p>
<pre><code class="hljs lang-bash">__AMBER_ARRAY_0=(<span class="hljs-string">"apple"</span> <span class="hljs-string">"banana"</span> <span class="hljs-string">"grape"</span>);
__0_fruits=(<span class="hljs-string">"<span class="hljs-variable">${__AMBER_ARRAY_0[@]}</span>"</span>);
<span class="hljs-keyword">function</span> show_opt__0_v0 {
    <span class="hljs-built_in">local</span> fruits=(<span class="hljs-string">"<span class="hljs-variable">${!1}</span>"</span>)
    index=0;
<span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> <span class="hljs-string">"<span class="hljs-variable">${fruits[@]}</span>"</span>
<span class="hljs-keyword">do</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${index}</span>: <span class="hljs-variable">${f}</span>"</span>
        <span class="hljs-built_in">let</span> index=<span class="hljs-variable">${index}</span>+1
<span class="hljs-keyword">done</span>
};
show_opt__0_v0 __0_fruits[@];
__AMBER_FUN_show_opt0_v0__9=<span class="hljs-variable">${__AMBER_FUN_show_opt0_v0}</span>;
<span class="hljs-built_in">echo</span> <span class="hljs-variable">${__AMBER_FUN_show_opt0_v0__9}</span> &gt; /dev/null 2&gt;&amp;1
</code></pre>
<p>相比之下，amber 脚本真的是相当人性化。</p>
<h1><a id="toc-24c" class="anchor" href="#toc-24c"></a>执行命令</h1>
<p>shell 最强大的能力在于可以方便的调用已安装的命令。amber 也具备这样的能力，而且提供了良好的异常处理能力。</p>
<p>基本语法是 </p>
<pre><code class="hljs lang-undefined">$your cmd$ failed { exception handler }
</code></pre>
<p>两个 $ 之间可以是任何有效的 shell 命令，failed 是 amber 的关键字，表示指令的异常处理。</p>
<p>为了正常使用异常机制，异常所在代码要么位于 main block，要么在函数中。amber 可以指定 main 作为脚本入口。</p>
<pre><code class="hljs lang-bash">main {
    <span class="hljs-built_in">let</span> file_name = <span class="hljs-string">"1.txt"</span>
    <span class="hljs-built_in">let</span> cmd = <span class="hljs-string">"cat"</span>
    <span class="hljs-built_in">let</span> file_content = <span class="hljs-variable">${cmd}</span> {file_name}$ failed {
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"{file_name} not exist"</span>
        fail
    }

    <span class="hljs-built_in">echo</span> file_content
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"done"</span>
}
</code></pre><p>这段代码的尝试获取 <code>1.txt</code> 的内容，如果这个文件不存在就报错退出，否则打印文件内容。</p>
<p>指令可以是任何字符串，比如例子中的命令由 <code>cmd</code> 和 <code>file_name</code> 变量拼接生成。<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="4.263ex" height="2.176ex" style="vertical-align: -0.338ex;" viewBox="0 -791.3 1835.5 936.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">cmd</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-63" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6D" x="433" y="0"></use>
 <use xlink:href="#E1-MJMATHI-64" x="1312" y="0"></use>
</g>
</svg> 的标准输出可以直接赋值给变量，获取指令输出非常方便。当使用 <svg xmlns:xlink="http://www.w3.org/1999/xlink" width="4.263ex" height="2.176ex" style="vertical-align: -0.338ex;" viewBox="0 -791.3 1835.5 936.9" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" aria-labelledby="MathJax-SVG-1-Title">
<title id="MathJax-SVG-1-Title">cmd</title>
<defs aria-hidden="true">
<path stroke-width="1" id="E1-MJMATHI-63" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z"></path>
<path stroke-width="1" id="E1-MJMATHI-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path>
<path stroke-width="1" id="E1-MJMATHI-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"></path>
</defs>
<g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)" aria-hidden="true">
 <use xlink:href="#E1-MJMATHI-63" x="0" y="0"></use>
 <use xlink:href="#E1-MJMATHI-6D" x="433" y="0"></use>
 <use xlink:href="#E1-MJMATHI-64" x="1312" y="0"></use>
</g>
</svg> 调用指令时，必须指定异常处理，可以通过 <code>failed</code> 关键字指明之后的代码块用作异常处理。<code>fail</code> 关键字用于抛出异常。</p>
<p>还有一种简化的一场处理方式，上面代码可以稍作调整:</p>
<pre><code class="hljs lang-xquery">    <span class="hljs-keyword">let</span> file_content = ${cmd} {file_name}$?
</code></pre><p>相当于</p>
<pre><code class="hljs lang-xquery">    <span class="hljs-keyword">let</span> file_content = ${cmd} {file_name}$ failed {
        fail status
    }
</code></pre><p>我很喜欢 <code>?</code> 的设计，表示指令是不可靠的，出错时就停止。二者的区别是简写方式无法指定报错信息。</p>
<h1><a id="toc-25f" class="anchor" href="#toc-25f"></a>总结</h1>
<p>目前我已用 amber 作为 Linux 下编写脚本的首选工具，感觉好用。好工具，好生活，拯救脱发。</p>

            ]]></description>
            <pubDate>Wed, 29 May 2024 17:25:14 GMT</pubDate>
            <guid>http://www.thinkinpython.com/post/amber_script.html</guid>
        </item>
    </channel>
</rss>
