[{"data":1,"prerenderedAt":1127},["ShallowReactive",2],{"post-\u002Fposts\u002Fflow-matching-generative-models":3,"all-posts-nav":850},{"id":4,"title":5,"body":6,"categories":835,"date":837,"description":12,"draft":838,"extension":839,"hidden":838,"meta":840,"navigation":366,"path":841,"published":838,"seo":842,"stem":843,"tags":844,"__hash__":849},"posts\u002Fposts\u002Fflow-matching-generative-models.md","Flow Matching：从噪声到数据的连续流生成模型",{"type":7,"value":8,"toc":821},"minimark",[9,13,16,22,25,32,37,40,43,46,49,52,55,58,61,65,68,78,86,89,92,95,98,101,104,118,121,125,128,131,134,140,143,146,149,152,159,162,165,168,171,174,177,180,182,185,188,192,195,198,201,204,207,210,213,216,230,233,237,240,243,246,249,252,255,259,262,265,268,282,285,288,292,295,298,315,318,322,325,575,578,728,731,735,738,741,744,747,750,753,756,780,783,797,800,803,806,809,812,817],[10,11,12],"p",{},"Flow Matching 是近几年生成模型里非常重要的一条路线。它和 Diffusion Model 关系很近，但视角更直接：不再把生成过程理解成“一步步去噪”，而是学习一个连续的速度场，让噪声样本沿着这条流逐渐移动到真实数据分布。",[10,14,15],{},"一句话概括：",[17,18,19],"blockquote",{},[10,20,21],{},"Flow Matching 学的是“数据应该怎么流动”，而不是“每一步应该去掉多少噪声”。",[10,23,24],{},"这类方法正在被大量图像、视频和 DiT（Diffusion Transformer）相关工作采用，也和 Rectified Flow、Continuous Normalizing Flow、Consistency Model 等方向有很深的联系。",[10,26,27],{},[28,29],"img",{"alt":30,"src":31},"Diffusion vs Flow Matching overview","\u002Fimages\u002Fflow-matching-overview.svg",[33,34,36],"h2",{"id":35},"从-diffusion-说起","从 Diffusion 说起",[10,38,39],{},"经典扩散模型包含两个过程。",[10,41,42],{},"训练时，从真实样本 $x_0$ 出发，不断加入高斯噪声，最后得到近似纯噪声的 $x_T$。",[10,44,45],{},"生成时，从随机噪声开始，模型一步步反向去噪，最终得到图片、音频或视频。",[10,47,48],{},"它的核心可以粗略理解为学习：",[10,50,51],{},"$$\np(x_ \\mid x_t)\n$$",[10,53,54],{},"也就是：当前这个带噪样本，下一步应该变得稍微干净一点。",[10,56,57],{},"这个框架很成功，但它的理论推导通常会涉及 score function、SDE、reverse process 等概念。对于工程实现来说，扩散模型也常常需要较多采样步数，虽然 DDIM、DPM-Solver、Consistency 等方法已经大幅加速。",[10,59,60],{},"Flow Matching 的出发点是：能不能不绕这么多弯，直接学习从噪声到数据的“流动方向”？",[33,62,64],{"id":63},"flow-matching-的核心思想","Flow Matching 的核心思想",[10,66,67],{},"假设有两个端点：",[69,70,71,75],"ul",{},[72,73,74],"li",{},"$x_0$：真实数据样本",[72,76,77],{},"$x_1$：高斯噪声样本",[10,79,80,81,85],{},"我们希望在 $t \\in ",[82,83,84],"span",{},"0, 1","$ 上构造一条路径 $x_t$，让样本可以从噪声端连续流向数据端。",[10,87,88],{},"Flow Matching 要学习的是一个速度场：",[10,90,91],{},"$$\nv_\\theta(x_t, t)\n$$",[10,93,94],{},"它表示：在时间 $t$，位于 $x_t$ 的样本应该往哪个方向移动。",[10,96,97],{},"这个生成过程可以写成一个常微分方程（ODE）：",[10,99,100],{},"$$\n\\frac{dx_t}{dt} = v_\\theta(x_t, t)\n$$",[10,102,103],{},"如果把样本想象成河里的粒子，那么：",[69,105,106,109,112,115],{},[72,107,108],{},"噪声分布是河流上游",[72,110,111],{},"数据分布是河流下游",[72,113,114],{},"模型学习的是整条河的水流方向",[72,116,117],{},"生成就是沿着速度场积分",[10,119,120],{},"所以，Diffusion 更像“每一步帮你擦掉一点噪声”，Flow Matching 更像“直接告诉你该往哪里走”。",[33,122,124],{"id":123},"最常见的训练形式conditional-flow-matching","最常见的训练形式：Conditional Flow Matching",[10,126,127],{},"Flow Matching 的关键是：训练时我们需要知道中间点 $x_t$ 的目标速度。",[10,129,130],{},"最常见、也最直观的一种方式是在线性路径上训练。",[10,132,133],{},"给定真实样本 $x_0$ 和噪声样本 $x_1$，构造：",[10,135,136],{},[28,137],{"alt":138,"src":139},"Flow Matching linear interpolation path","\u002Fimages\u002Fflow-matching-linear-path.svg",[10,141,142],{},"$$\nx_t = (1 - t)x_0 + tx_1\n$$",[10,144,145],{},"这是一条从数据到噪声的直线路径。它对时间求导得到：",[10,147,148],{},"$$\nu_t = \\frac{dx_t}{dt} = x_1 - x_0\n$$",[10,150,151],{},"于是训练目标就非常直接：",[10,153,154,155,158],{},"$$\n\\mathcal L(\\theta)\n= \\mathbb E_{x_0, x_1, t}\n\\Bigl",[82,156,157],{},"\n\\Vert v_\\theta(x_t, t) - (x_1 - x_0) \\Vert_2^2\n\\Bigr","\n$$",[10,160,161],{},"也就是说，模型输入中间状态 $x_t$ 和时间 $t$，输出这个点应该具有的速度。监督信号不是复杂的后验分布，而是一个明确的向量。",[10,163,164],{},"这也是 Flow Matching 很吸引人的地方：训练目标简单、稳定、直观。",[33,166,167],{"id":167},"推理时怎么生成",[10,169,170],{},"训练完成后，我们已经得到了一个速度场 $v_\\theta(x, t)$。",[10,172,173],{},"生成时通常从噪声开始：",[10,175,176],{},"$$\nx_1 \\sim \\mathcal{N}(0, I)\n$$",[10,178,179],{},"然后解 ODE，从 $t=1$ 积分到 $t=0$：",[10,181,100],{},[10,183,184],{},"最终得到的 $x_0$ 就是生成样本。",[10,186,187],{},"这里要注意一个符号方向问题：如果训练路径定义为 $x_t=(1-t)x_0+tx_1$，那么 $t=0$ 是数据，$t=1$ 是噪声。生成时需要从 $1 \\rightarrow 0$ 反向积分。不同论文可能会把时间方向反过来，但本质相同。",[33,189,191],{"id":190},"它和-diffusion-的区别","它和 Diffusion 的区别",[10,193,194],{},"Diffusion 和 Flow Matching 并不是完全割裂的两类模型，而是有很强的统一关系。但从建模直觉上看，它们有明显差异。",[10,196,197],{},"Diffusion 通常从随机过程角度出发，可以写成 SDE：",[10,199,200],{},"$$\ndx = f(x,t)dt + g(t)dW_t\n$$",[10,202,203],{},"这里有随机噪声项 $dW_t$。",[10,205,206],{},"Flow Matching 更常用确定性 ODE 表达：",[10,208,209],{},"$$\ndx = v(x,t)dt\n$$",[10,211,212],{},"它没有显式随机项，而是通过一个确定性速度场把分布从噪声推向数据。",[10,214,215],{},"可以这样理解：",[69,217,218,221,224,227],{},[72,219,220],{},"Diffusion：通过加噪和反向去噪构造生成过程",[72,222,223],{},"Flow Matching：通过学习分布之间的连续传输构造生成过程",[72,225,226],{},"Diffusion 更偏 score \u002F SDE 视角",[72,228,229],{},"Flow Matching 更偏 velocity field \u002F ODE 视角",[10,231,232],{},"不过很多现代扩散模型也可以写成 probability flow ODE，所以二者在理论上存在交汇。",[33,234,236],{"id":235},"它和-cnf-的关系","它和 CNF 的关系",[10,238,239],{},"Flow Matching 和 Continuous Normalizing Flow（CNF）关系也很深。",[10,241,242],{},"CNF 同样使用连续动力系统：",[10,244,245],{},"$$\n\\frac{dx}{dt} = v_\\theta(x,t)\n$$",[10,247,248],{},"并通过可逆流把简单分布变成复杂数据分布。",[10,250,251],{},"传统 CNF 的难点在于似然计算通常需要处理 divergence 或 trace 项，训练成本较高。Flow Matching 则换了一个角度：不直接最大化精确似然，而是构造可监督的路径和速度目标，让模型直接回归速度场。",[10,253,254],{},"因此可以把 Flow Matching 理解为一种更实用、更易训练的连续流生成模型训练方式。",[33,256,258],{"id":257},"rectified-flow把路径拉直","Rectified Flow：把路径拉直",[10,260,261],{},"Rectified Flow 是 Flow Matching 相关方向里非常重要的一支。",[10,263,264],{},"它的核心思想是：让从噪声到数据的轨迹尽可能直。",[10,266,267],{},"为什么“直”很重要？",[69,269,270,273,276,279],{},[72,271,272],{},"轨迹越弯，模型越难学",[72,274,275],{},"轨迹越弯，ODE 积分越困难",[72,277,278],{},"轨迹越弯，采样通常需要更多步",[72,280,281],{},"轨迹越直，少步采样越容易",[10,283,284],{},"所以 Rectified Flow 会通过重新配对、重训练等方式，把原本弯曲复杂的生成路径逐渐拉直。直观地说，它不是只学习“怎么流”，还希望这条流尽可能接近最短路径。",[10,286,287],{},"这也是为什么很多人会把 Rectified Flow 和 Optimal Transport（最优传输）联系起来：理想情况下，我们希望噪声分布到数据分布的搬运路径既正确又高效。",[33,289,291],{"id":290},"为什么-flow-matching-适合-dit","为什么 Flow Matching 适合 DiT",[10,293,294],{},"现在图像和视频生成里，Transformer 架构越来越重要，例如 DiT、视频 DiT、多模态 Transformer 等。",[10,296,297],{},"Flow Matching 与这类架构很契合，原因包括：",[69,299,300,303,306,309,312],{},[72,301,302],{},"输入输出形式简单：模型预测速度向量，和预测噪声一样容易实现",[72,304,305],{},"连续时间建模自然：时间 $t$ 可以作为 embedding 输入 Transformer",[72,307,308],{},"训练目标稳定：MSE 回归速度场，工程上很友好",[72,310,311],{},"采样步数可控：ODE solver 可以灵活选择步数和精度",[72,313,314],{},"适合 latent space：可以在 VAE latent 或视频 latent 中建模连续流",[10,316,317],{},"在工程上，一个 Flow Matching Transformer 和一个 Diffusion Transformer 往往非常相似：都是输入 noisy latent、time embedding、condition embedding，然后输出一个与 latent 同形状的张量。差别主要在训练目标和采样方程。",[33,319,321],{"id":320},"极简-pytorch-伪代码","极简 PyTorch 伪代码",[10,323,324],{},"下面是一个非常简化的训练形式，用来体现核心思想：",[326,327,332],"pre",{"className":328,"code":329,"language":330,"meta":331,"style":331},"language-python shiki shiki-themes github-dark-dimmed github-light","import torch\nimport torch.nn.functional as F\n\ndef flow_matching_loss(model, x_data):\n    batch_size = x_data.shape[0]\n\n    x_noise = torch.randn_like(x_data)\n    t = torch.rand(batch_size, device=x_data.device)\n\n    view_shape = [batch_size] + [1] * (x_data.ndim - 1)\n    t_view = t.view(*view_shape)\n\n    x_t = (1 - t_view) * x_data + t_view * x_noise\n    target_velocity = x_noise - x_data\n\n    pred_velocity = model(x_t, t)\n    return F.mse_loss(pred_velocity, target_velocity)\n","python","",[333,334,335,347,361,368,381,400,405,416,436,441,479,495,500,534,550,555,566],"code",{"__ignoreMap":331},[82,336,339,343],{"class":337,"line":338},"line",1,[82,340,342],{"class":341},"s6PUj","import",[82,344,346],{"class":345},"ssh_m"," torch\n",[82,348,350,352,355,358],{"class":337,"line":349},2,[82,351,342],{"class":341},[82,353,354],{"class":345}," torch.nn.functional ",[82,356,357],{"class":341},"as",[82,359,360],{"class":345}," F\n",[82,362,364],{"class":337,"line":363},3,[82,365,367],{"emptyLinePlaceholder":366},true,"\n",[82,369,371,374,378],{"class":337,"line":370},4,[82,372,373],{"class":341},"def",[82,375,377],{"class":376},"saVmf"," flow_matching_loss",[82,379,380],{"class":345},"(model, x_data):\n",[82,382,384,387,390,393,397],{"class":337,"line":383},5,[82,385,386],{"class":345},"    batch_size ",[82,388,389],{"class":341},"=",[82,391,392],{"class":345}," x_data.shape[",[82,394,396],{"class":395},"swcJU","0",[82,398,399],{"class":345},"]\n",[82,401,403],{"class":337,"line":402},6,[82,404,367],{"emptyLinePlaceholder":366},[82,406,408,411,413],{"class":337,"line":407},7,[82,409,410],{"class":345},"    x_noise ",[82,412,389],{"class":341},[82,414,415],{"class":345}," torch.randn_like(x_data)\n",[82,417,419,422,424,427,431,433],{"class":337,"line":418},8,[82,420,421],{"class":345},"    t ",[82,423,389],{"class":341},[82,425,426],{"class":345}," torch.rand(batch_size, ",[82,428,430],{"class":429},"sNjOc","device",[82,432,389],{"class":341},[82,434,435],{"class":345},"x_data.device)\n",[82,437,439],{"class":337,"line":438},9,[82,440,367],{"emptyLinePlaceholder":366},[82,442,444,447,449,452,455,458,461,464,467,470,473,476],{"class":337,"line":443},10,[82,445,446],{"class":345},"    view_shape ",[82,448,389],{"class":341},[82,450,451],{"class":345}," [batch_size] ",[82,453,454],{"class":341},"+",[82,456,457],{"class":345}," [",[82,459,460],{"class":395},"1",[82,462,463],{"class":345},"] ",[82,465,466],{"class":341},"*",[82,468,469],{"class":345}," (x_data.ndim ",[82,471,472],{"class":341},"-",[82,474,475],{"class":395}," 1",[82,477,478],{"class":345},")\n",[82,480,482,485,487,490,492],{"class":337,"line":481},11,[82,483,484],{"class":345},"    t_view ",[82,486,389],{"class":341},[82,488,489],{"class":345}," t.view(",[82,491,466],{"class":341},[82,493,494],{"class":345},"view_shape)\n",[82,496,498],{"class":337,"line":497},12,[82,499,367],{"emptyLinePlaceholder":366},[82,501,503,506,508,511,513,516,519,521,524,526,529,531],{"class":337,"line":502},13,[82,504,505],{"class":345},"    x_t ",[82,507,389],{"class":341},[82,509,510],{"class":345}," (",[82,512,460],{"class":395},[82,514,515],{"class":341}," -",[82,517,518],{"class":345}," t_view) ",[82,520,466],{"class":341},[82,522,523],{"class":345}," x_data ",[82,525,454],{"class":341},[82,527,528],{"class":345}," t_view ",[82,530,466],{"class":341},[82,532,533],{"class":345}," x_noise\n",[82,535,537,540,542,545,547],{"class":337,"line":536},14,[82,538,539],{"class":345},"    target_velocity ",[82,541,389],{"class":341},[82,543,544],{"class":345}," x_noise ",[82,546,472],{"class":341},[82,548,549],{"class":345}," x_data\n",[82,551,553],{"class":337,"line":552},15,[82,554,367],{"emptyLinePlaceholder":366},[82,556,558,561,563],{"class":337,"line":557},16,[82,559,560],{"class":345},"    pred_velocity ",[82,562,389],{"class":341},[82,564,565],{"class":345}," model(x_t, t)\n",[82,567,569,572],{"class":337,"line":568},17,[82,570,571],{"class":341},"    return",[82,573,574],{"class":345}," F.mse_loss(pred_velocity, target_velocity)\n",[10,576,577],{},"推理时则类似：",[326,579,581],{"className":328,"code":580,"language":330,"meta":331,"style":331},"@torch.no_grad()\ndef sample(model, shape, steps, device):\n    x = torch.randn(shape, device=device)\n    dt = 1.0 \u002F steps\n\n    for i in range(steps):\n        t = torch.full((shape[0],), 1 - i * dt, device=device)\n        velocity = model(x, t)\n        x = x - dt * velocity\n\n    return x\n",[333,582,583,591,601,618,634,638,655,687,697,717,721],{"__ignoreMap":331},[82,584,585,588],{"class":337,"line":338},[82,586,587],{"class":376},"@torch.no_grad",[82,589,590],{"class":345},"()\n",[82,592,593,595,598],{"class":337,"line":349},[82,594,373],{"class":341},[82,596,597],{"class":376}," sample",[82,599,600],{"class":345},"(model, shape, steps, device):\n",[82,602,603,606,608,611,613,615],{"class":337,"line":363},[82,604,605],{"class":345},"    x ",[82,607,389],{"class":341},[82,609,610],{"class":345}," torch.randn(shape, ",[82,612,430],{"class":429},[82,614,389],{"class":341},[82,616,617],{"class":345},"device)\n",[82,619,620,623,625,628,631],{"class":337,"line":370},[82,621,622],{"class":345},"    dt ",[82,624,389],{"class":341},[82,626,627],{"class":395}," 1.0",[82,629,630],{"class":341}," \u002F",[82,632,633],{"class":345}," steps\n",[82,635,636],{"class":337,"line":383},[82,637,367],{"emptyLinePlaceholder":366},[82,639,640,643,646,649,652],{"class":337,"line":402},[82,641,642],{"class":341},"    for",[82,644,645],{"class":345}," i ",[82,647,648],{"class":341},"in",[82,650,651],{"class":395}," range",[82,653,654],{"class":345},"(steps):\n",[82,656,657,660,662,665,667,670,672,674,676,678,681,683,685],{"class":337,"line":407},[82,658,659],{"class":345},"        t ",[82,661,389],{"class":341},[82,663,664],{"class":345}," torch.full((shape[",[82,666,396],{"class":395},[82,668,669],{"class":345},"],), ",[82,671,460],{"class":395},[82,673,515],{"class":341},[82,675,645],{"class":345},[82,677,466],{"class":341},[82,679,680],{"class":345}," dt, ",[82,682,430],{"class":429},[82,684,389],{"class":341},[82,686,617],{"class":345},[82,688,689,692,694],{"class":337,"line":418},[82,690,691],{"class":345},"        velocity ",[82,693,389],{"class":341},[82,695,696],{"class":345}," model(x, t)\n",[82,698,699,702,704,707,709,712,714],{"class":337,"line":438},[82,700,701],{"class":345},"        x ",[82,703,389],{"class":341},[82,705,706],{"class":345}," x ",[82,708,472],{"class":341},[82,710,711],{"class":345}," dt ",[82,713,466],{"class":341},[82,715,716],{"class":345}," velocity\n",[82,718,719],{"class":337,"line":443},[82,720,367],{"emptyLinePlaceholder":366},[82,722,723,725],{"class":337,"line":481},[82,724,571],{"class":341},[82,726,727],{"class":345}," x\n",[10,729,730],{},"这里用的是最简单的 Euler 积分。真实系统里通常会使用更好的 noise schedule、time sampling、ODE solver、classifier-free guidance，以及在 latent space 中训练。",[33,732,734],{"id":733},"flow-matching-为什么火","Flow Matching 为什么火",[10,736,737],{},"它受欢迎的原因可以总结为四点。",[10,739,740],{},"第一，理论视角统一。它把扩散模型、连续流、最优传输等概念放到了同一个“速度场”框架里。",[10,742,743],{},"第二，训练目标直接。相比复杂的反向扩散推导，Flow Matching 可以直接回归目标 velocity。",[10,745,746],{},"第三，采样有潜力更快。因为生成过程是 ODE 积分，可以通过更好的路径设计和求解器减少步数。",[10,748,749],{},"第四，工程迁移成本低。对于已经有 Diffusion \u002F DiT 系统的团队来说，把预测噪声改成预测 velocity，并调整采样器，是一条相对自然的演进路线。",[33,751,752],{"id":752},"如何继续深入",[10,754,755],{},"如果想系统学习，建议按这个顺序：",[757,758,759,762,765,768,771,774,777],"ol",{},[72,760,761],{},"DDPM：理解扩散模型的基本训练与采样。",[72,763,764],{},"Score-based Model：理解 score function 和噪声条件分数网络。",[72,766,767],{},"SDE \u002F ODE：理解随机过程与 probability flow ODE。",[72,769,770],{},"CNF：理解连续可逆流和分布变换。",[72,772,773],{},"Flow Matching：理解速度场监督训练。",[72,775,776],{},"Rectified Flow：理解路径拉直和少步生成。",[72,778,779],{},"Consistency Model：理解一步或少步生成的另一条路线。",[10,781,782],{},"几篇经典论文包括：",[69,784,785,788,791,794],{},[72,786,787],{},"Flow Matching for Generative Modeling",[72,789,790],{},"Rectified Flow: A Marginal Preserving Approach to Optimal Transport",[72,792,793],{},"Consistency Models",[72,795,796],{},"Scalable Diffusion Models with Transformers",[33,798,799],{"id":799},"总结",[10,801,802],{},"Flow Matching 的核心不是“去噪”，而是“流动”。",[10,804,805],{},"它把生成建模看成一个连续传输问题：从简单噪声分布出发，学习一个速度场，把样本沿着 ODE 推向真实数据分布。",[10,807,808],{},"这个视角同时继承了 Diffusion 的生成质量、CNF 的连续优雅和 ODE 的采样灵活性。因此在图像、视频、音频和 latent generative model 中，Flow Matching 很可能会继续成为主流方向之一。",[10,810,811],{},"如果用一句更形象的话收尾：",[17,813,814],{},[10,815,816],{},"Diffusion 像是在雾里一点点擦出图像；Flow Matching 像是知道风往哪里吹，让噪声顺着风长成数据。",[818,819,820],"style",{},"html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .saVmf, html code.shiki .saVmf{--shiki-default:#DCBDFB;--shiki-light:#6F42C1}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .sNjOc, html code.shiki .sNjOc{--shiki-default:#F69D50;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":331,"searchDepth":349,"depth":363,"links":822},[823,824,825,826,827,828,829,830,831,832,833,834],{"id":35,"depth":349,"text":36},{"id":63,"depth":349,"text":64},{"id":123,"depth":349,"text":124},{"id":167,"depth":349,"text":167},{"id":190,"depth":349,"text":191},{"id":235,"depth":349,"text":236},{"id":257,"depth":349,"text":258},{"id":290,"depth":349,"text":291},{"id":320,"depth":349,"text":321},{"id":733,"depth":349,"text":734},{"id":752,"depth":349,"text":752},{"id":799,"depth":349,"text":799},[836],"AI","2026-05-07 00:00:00",false,"md",{"mathjax":366},"\u002Fposts\u002Fflow-matching-generative-models",{"title":5,"description":12},"posts\u002Fflow-matching-generative-models",[845,846,847,848],"生成模型","Diffusion","Flow Matching","深度学习","Lt9jGJV5h9CTZiUi49PpRRqKwk_LfGblWJLEI4yHjB4",[851,864,876,882,895,904,913,923,933,942,952,964,977,989,998,1001,1013,1024,1034,1042,1053,1059,1065,1071,1079,1088,1096,1102,1110,1118],{"slug":852,"path":853,"title":854,"date":855,"tags":856,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":438},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[857,858,859,860,861,862,863],"RAG","多模态","AI Infra","BM25","向量检索","混合检索","实习求职",{"slug":865,"path":866,"title":867,"date":868,"tags":869,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":481},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[870,859,871,872,873,874,875,863],"LLM","vLLM","PagedAttention","KV Cache","推理优化","投机解码",{"slug":877,"path":878,"title":879,"date":880,"tags":881,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":443},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[870,859,871,872,874,875,863],{"slug":883,"path":884,"title":885,"date":886,"tags":887,"description":893,"draft":838,"hidden":838,"published":366,"readingTime":894},"bytedance-recommendation-architecture-intern-interview","\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股","2026-06-09",[888,889,890,891,892],"面试","推荐系统","后端架构","实时计算","字节跳动","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",18,{"slug":896,"path":897,"title":898,"date":886,"tags":899,"description":903,"draft":838,"hidden":838,"published":366,"readingTime":497},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[900,901,890,902,888],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",{"slug":905,"path":906,"title":907,"date":886,"tags":908,"description":912,"draft":838,"hidden":838,"published":366,"readingTime":418},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[909,910,911,888,889],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",{"slug":914,"path":915,"title":916,"date":886,"tags":917,"description":922,"draft":838,"hidden":838,"published":366,"readingTime":402},"leetcode-lru-merge-k-reverse-list","\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",[918,919,920,921,888],"算法","链表","LRU","LeetCode","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",{"slug":924,"path":925,"title":926,"date":927,"tags":928,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":557},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[929,858,930,857,931,932],"OCR","医疗 AI","Python","源码分析",{"slug":934,"path":935,"title":936,"date":937,"tags":938,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":443},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[939,940,941],"English","CET6","Writing",{"slug":943,"path":944,"title":945,"date":946,"tags":947,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":951},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[948,949,870,859,950],"Claude Code","Agent","上下文工程",27,{"slug":953,"path":954,"title":955,"date":956,"tags":957,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":963},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[870,958,959,960,961,859,962],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",19,{"slug":965,"path":966,"title":967,"date":968,"tags":969,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":976},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[970,971,972,973,974,910,975],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",25,{"slug":978,"path":979,"title":980,"date":981,"tags":982,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":951},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[970,983,984,985,975,986,987,988],"云存储","网盘系统","分布式系统","Redis","RabbitMQ","Elasticsearch",{"slug":990,"path":991,"title":992,"date":993,"tags":994,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":997},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[995,949,859,996,932],"OpenClaw","TypeScript",20,{"slug":999,"path":841,"title":5,"date":837,"tags":1000,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":443},"flow-matching-generative-models",[845,846,847,848],{"slug":1002,"path":1003,"title":1004,"date":1005,"tags":1006,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":552},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1007,1008,1009,857,1010,1011,1012],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",{"slug":1014,"path":1015,"title":1016,"date":1017,"tags":1018,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":557},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[985,1019,1020,1021,1022,1023,949],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1025,"path":1026,"title":1027,"date":1028,"tags":1029,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":552},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[848,1030,1031,870,1032,871,1033],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1035,"path":1036,"title":1037,"date":1038,"tags":1039,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":894},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[848,1040,962,1032,1041],"Autograd","Mini Framework",{"slug":1043,"path":1044,"title":1045,"date":1046,"tags":1047,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":497},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1048,1049,1050,1051,1052],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1054,"path":1055,"title":1056,"date":1057,"tags":1058,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":383},"agent-memory","\u002Fposts\u002Fagent-memory","Agent 对话记忆化：从原理到实现","2026-04-24",[870,949,857,888],{"slug":1060,"path":1061,"title":1062,"date":1057,"tags":1063,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":402},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[870,949,1064,888],"上下文压缩",{"slug":1066,"path":1067,"title":1068,"date":1069,"tags":1070,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":438},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1048,1049,888,1052],{"slug":1072,"path":1073,"title":1074,"date":1075,"tags":1076,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":338},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1077,1048,1078],"XCPC","比赛",{"slug":1080,"path":1081,"title":1082,"date":1083,"tags":1084,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":407},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[911,1085,1086,1087,888],"FastAPI","PostgreSQL","Docker",{"slug":1089,"path":1090,"title":1091,"date":1092,"tags":1093,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":402},"deepscientist-tech-stack","\u002Fposts\u002Fdeepscientist-tech-stack","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计","2026-04-06",[1094,1085,1095,1086,888],"全栈","Next.js",{"slug":1097,"path":1098,"title":1099,"date":1092,"tags":1100,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":418},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[996,1101,870,932,888],"CLI",{"slug":1103,"path":1104,"title":1105,"date":1092,"tags":1106,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":383},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[1107,1108,1109],"Hexo","前端","开源",{"slug":1111,"path":1112,"title":1113,"date":1114,"tags":1115,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":349},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[1116,1117],"Git","工具",{"slug":1119,"path":1120,"title":1121,"date":1122,"tags":1123,"description":331,"draft":838,"hidden":838,"published":366,"readingTime":363},"github-actions-intro","\u002Fposts\u002Fgithub-actions-intro","GitHub Actions 入门：自动化你的工作流","2026-04-04 09:00:00",[1124,1125,1126],"GitHub Actions","CI\u002FCD","自动化",1782796012110]