VLA 系统学习第 14 课:Attention 到底在算什么?——真正理解 Q、K、V
第十三课标准答案这一课的核心是把各种原始模态最后统一到\[ X\in\mathbb R^{B\times T\times D} \]这样下一步 Attention 才有明确输入。Token 不能简单等同于“单词”。Token 更准确地说是 Transformer Sequence 中的一个信息单位。语言里可以是词或子词图像里可以是 Patch机器人数据里可以是一个时间步的 State后面甚至还会遇到 Action Query。Token ID 不能直接当连续数值使用因为 ID 只是索引。例如 52 和 17 并不代表前者在语义上是后者的 3 倍。它们必须经过 Embedding变成具有可学习意义的向量。对nn.Embedding(100, 64)其中\[ 100 \]是词表大小num_embeddings\[ 64 \]是每个 Token 的 Embedding Dimension。输入\[ [32,20] \]经过nn.Embedding(1000, 64)以后\[ \boxed{[32,20,64]} \]也就是 32 个 Sample每个有 20 个 Token每个 Token 变成 64 维向量。对\[ state:[32,4,10] \]执行nn.Linear(10, 64)时Linear作用于最后一个维度\[ 10\rightarrow64 \]前面的\[ 32,4 \]保留所以\[ \boxed{[32,4,64]} \]图片\[ 224\times224 \]Patch Size\[ 16\times16 \]那么横向\[ 224/1614 \]纵向也是 14因此\[ 14\times14\boxed{196} \]个 Patch。Visual Patch 可以称为 Token因为每个 Patch 都被编码成一个向量并作为 Transformer Sequence 中的一个信息位置参与后续计算。[B,T,D]中的 \(T\) 更准确地表示Sequence Length不一定是时间。语言中可以是文本 Token 数ViT 中可以是 Patch 数机器人 History 中才可能是时间步数。Transformer 需要 Position Information是因为仅凭 Token Embedding本身并不能明确知道“谁在前、谁在后”。而\[ [A,B,C] \]和\[ [C,B,A] \]显然可能拥有完全不同的含义。对x x pos_embedding[:T]如果\[ x:[B,T,D] \]而\[ pos:[T,D] \]PyTorch 通过 Broadcasting 将同一套位置向量加到每个 Batch 上所以最终仍是\[ \boxed{[B,T,D]} \]Language、Image、Robot State 原始形式虽然不同但分别通过 Embedding、Visual Encoder / Patch Projection、State Projection 后都可以变成统一的 \(D\) 维 Token所以能够进一步交给 Transformer 处理。当我们写\[ QXW_Q \]时\[ X \]应该理解成已经经过编码、具有统一 Embedding Dimension 的一批 Token Sequence。其典型 Shape\[ \boxed{X:[B,T,D]} \]现在我们就从这里正式进入 Transformer 的核心。VLA 系统学习第 14 课Attention 到底在算什么——真正理解 Q、K、V现在假设我们已经拿到\[ X:[B,T,D] \]比如\[ X:[32,4,64] \]含义是32 个样本每个样本有 4 个 Token每个 Token 是 64 维。但新的问题来了。假设某一个 Token 是\[ x_1 \]它做决策的时候究竟应该更多参考\[ x_2 \]还是\[ x_3 \]或者\[ x_4 \]这就是 Attention 真正想解决的问题\[ \boxed{ 当前Token应该从其他Token那里取多少信息 } \]一、Attention 本质上是一次“检索”先不用公式。假设有三个 TokenToken 1当前机器人状态 Token 2过去机器人状态 Token 3某个视觉信息现在 Token 1 想更新自己的表示。它需要问Token 2 和我当前要找的信息相关吗Token 3 和我当前要找的信息相关吗于是 Attention 可以被理解为我想找什么 ↓ 和所有Token逐个匹配 ↓ 计算相关程度 ↓ 相关的多拿一点信息 ↓ 不相关的少拿一点 ↓ 把信息重新组合成新的Token表示这三个角色就分别对应\[ Q,\quad K,\quad V \]二、Q、K、V 到底分别是什么先用一个检索系统类比。QueryQQuery 表示我现在想找什么当前 Token 拿出自己的一个“查询表示”。KeyKKey 表示我有什么特征可以让别人判断要不要关注我每个 Token 都提供自己的 Key。ValueVValue 表示如果你决定关注我我真正提供给你的内容是什么所以可以先记\[ \boxed{ Q\text{我想找什么} } \]\[ \boxed{ K\text{我拿什么和你匹配} } \]\[ \boxed{ V\text{匹配成功以后我真正贡献什么信息} } \]这三个不是三份不同的原始数据。在最基本的 Self-Attention 中它们全部来自同一个\[ X \]只是通过三组不同参数投影以后扮演不同角色。三、为什么同一个 \(X\) 要变三次假设\[ X:[B,T,D] \]我们定义三个 Linearself.q_proj nn.Linear(D, d_k)self.k_proj nn.Linear(D, d_k)self.v_proj nn.Linear(D, d_v)然后Q self.q_proj(X)K self.k_proj(X)V self.v_proj(X)数学上\[ QXW_Q \]\[ KXW_K \]\[ VXW_V \]先忽略 Bias。如果为了教学简单地设\[ Dd_kd_v64 \]那么\[ X:[32,4,64] \]经过三个 Projection 后\[ Q:[32,4,64] \]\[ K:[32,4,64] \]\[ V:[32,4,64] \]Shape 看起来一样。但是它们的数值不一样因为\[ W_Q\neq W_K\neq W_V \]这些都是不同的可训练 Parameter。所以同一个 Token\[ x_i \]会被转换成\[ q_i,\quad k_i,\quad v_i \]三种不同表示。四、为什么非要分成三种表示假设一个 Token 原本包含很多混合信息位置 速度 物体关系 任务相关信息 ...当它作为 Query 时模型可能更想提取“我现在需要什么信息”当它作为 Key 时更适合提取“我具有什么特征可以和别人的需求匹配”而作为 Value 时又需要表达“别人关注我以后我应该实际提供什么内容”所以三套 Linear Projection本质是在让模型学习三种不同的“观察角度”。五、Q 和 K 怎么判断两个 Token 是否相关假设 Token 1 的 Query\[ q_1 \]我们拿它分别和\[ k_1,k_2,k_3 \]做点积\[ q_1\cdot k_1 \]\[ q_1\cdot k_2 \]\[ q_1\cdot k_3 \]点积越大可以粗略理解为两个向量在当前学习出的表示空间中越匹配。所以 Token 1 会得到三个分数\[ [s_{11},s_{12},s_{13}] \]其中\[ s_{12} \]表示Token 1 查询 Token 2 时的匹配分数。六、这里为什么突然出现 \(QK^T\)如果一个一个算太慢。假设\[ Q:[B,T,d_k] \]\[ K:[B,T,d_k] \]我们希望每一个 Query 都和每一个 Key 比较。所以把 K 的最后两个维度交换\[ K^T:[B,d_k,T] \]然后\[ QK^T \]Shape\[ [B,T,d_k] \times [B,d_k,T] \]得到\[ \boxed{ [B,T,T] } \]这就是 Attention 中最重要的一次 Shape 变化。七、[B,T,T]到底是什么意思例如\[ T3 \]那么得到\[ [3,3] \]的矩阵\[ S \begin{bmatrix} s_{11}s_{12}s_{13}\\ s_{21}s_{22}s_{23}\\ s_{31}s_{32}s_{33} \end{bmatrix} \]第一行\[ [s_{11},s_{12},s_{13}] \]表示Token 1 分别怎么看 Token 1、2、3。第二行Token 2 分别怎么看 Token 1、2、3。第三行同理。所以\[ \boxed{ Attention\ Score:[B,T,T] } \]实际上是一张Token 和 Token 之间的关系表。八、代码里到底怎么做假设x.shape [32, 4, 64]我们先得到q q_proj(x)k k_proj(x)v v_proj(x)所以q: [32, 4, 64] k: [32, 4, 64] v: [32, 4, 64]然后scores q k.transpose(-2, -1)注意k.transpose(-2, -1)把\[ [32,4,64] \]变成\[ [32,64,4] \]所以\[ [32,4,64] \times [32,64,4] \]得到\[ \boxed{[32,4,4]} \]这里每个\[ [4,4] \]就是一个 Sample 内 4 个 Token 两两之间的匹配分数。九、为什么用transpose(-2,-1)这里的-1表示最后一个维度。-2表示倒数第二个维度。所以k.transpose(-2, -1)就是交换\[ T \]和\[ D \]即\[ [B,T,D] \rightarrow [B,D,T] \]这种写法比transpose(1, 2)更通用因为即使前面未来再增加 Head Dimension它依然是在交换最后两个维度。这个写法后面 Multi-Head Attention 会经常出现。十、为什么公式还要除以 \(\sqrt{d_k}\)正式公式不是\[ QK^T \]而是\[ \frac{QK^T}{\sqrt{d_k}} \]原因可以先这样理解。如果向量维度\[ d_k \]很大点积实际上是在把很多项相加\[ q\cdot k q_1k_1q_2k_2\cdotsq_{d_k}k_{d_k} \]维度越来越大时这些点积数值的尺度也可能变大。如果把很大的正负数直接送进 SoftmaxSoftmax 很容易变得特别极端0.000001 0.999998 0.000001这会导致梯度等训练行为不够理想。因此除以\[ \sqrt{d_k} \]对分数尺度进行控制。所以叫Scaled Dot-Product Attention缩放点积注意力。十一、代码继续往下import mathscores q k.transpose(-2, -1)scores scores / math.sqrt(q.shape[-1])此时\[ scores:[B,T,T] \]例如\[ [32,4,4] \]但现在这些仍然只是任意实数。例如一行可能是\[ [2.1,-0.5,3.0,0.2] \]我们希望把它变成对不同 Token 的关注比例。这就轮到 Softmax。十二、Softmax 在这里的作用是什么执行weights torch.softmax(scores, dim-1)对于每一个 Query Token都在最后一个维度上做 Softmax。例如\[ [2.1,-0.5,3.0,0.2] \]可能变成\[ [0.27,0.02,0.66,0.05] \]并且\[ 0.270.020.660.051 \]于是可以理解为Token 1 → 27% Token 2 → 2% Token 3 → 66% Token 4 → 5%这就是Attention Weights注意力权重。十三、一个极小数字例子把 Q/K/V 真正跑通假设现在只有三个 Token并且\[ d_k2 \]Token 1 的 Query\[ q_1[1,0] \]三个 Key\[ k_1[1,0] \]\[ k_2[0,1] \]\[ k_3[1,1] \]先算匹配\[ q_1\cdot k_11 \]\[ q_1\cdot k_20 \]\[ q_1\cdot k_31 \]所以\[ scores[1,0,1] \]缩放\[ \sqrt{d_k}\sqrt2 \]得到大约\[ [0.707,0,0.707] \]经过 Softmax大约\[ \boxed{ [0.401,0.198,0.401] } \]也就是说 Token 1 当前认为Token 1 和 Token 3 比较值得关注Token 2 相对少一些。十四、但是 Attention Weight 还不是最终输出现在假设三个 Value 是\[ v_1[1,0] \]\[ v_2[0,2] \]\[ v_3[3,1] \]Attention Weight\[ [0.401,0.198,0.401] \]最终 Token 1 得到的新信息是\[ 0.401v_1 0.198v_2 0.401v_3 \]展开\[ 0.401[1,0] 0.198[0,2] 0.401[3,1] \]得到大约\[ \boxed{ [1.604,0.797] } \]这就是根据注意力权重把不同 Token 的 Value 加权融合。所以 Attention 不是“选一个 Token”。而通常是把所有相关 Token 的信息按不同权重混合起来。十五、这就是为什么最后要乘 \(V\)现在整体公式终于可以真正读懂\[ \operatorname{Attention}(Q,K,V) \operatorname{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V \]分成三步。第一步\[ QK^T \]问每个 Query 和每个 Key 有多匹配得到\[ [B,T,T] \]第二步\[ softmax \]把匹配分数变成每个 Token 应该关注其他 Token 的比例。仍然\[ [B,T,T] \]第三步\[ AttentionWeights\times V \]即\[ [B,T,T] \times [B,T,d_v] \]得到\[ \boxed{ [B,T,d_v] } \]于是每个 Token 都得到一个融合其他 Token 信息的新表示。十六、完整代码现在只有几行import mathimport torchimport torch.nn as nnclass SimpleSelfAttention(nn.Module): def __init__(self, d_model): super().__init__() self.q_proj nn.Linear(d_model, d_model) self.k_proj nn.Linear(d_model, d_model) self.v_proj nn.Linear(d_model, d_model) def forward(self, x): q self.q_proj(x) k self.k_proj(x) v self.v_proj(x) scores q k.transpose(-2, -1) scores scores / math.sqrt(q.shape[-1]) weights torch.softmax(scores, dim-1) output weights v return output假设x.shape [32, 4, 64]那么整个 Shape 流\[ X:[32,4,64] \]↓\[ Q,K,V:[32,4,64] \]↓\[ QK^T:[32,4,4] \]↓\[ Softmax:[32,4,4] \]↓\[ AttentionWeights\times V \]↓\[ Output:[32,4,64] \]你以后再看到 Attention就应该优先沿这条 Shape 链读。十七、为什么叫 Self-Attention刚才\[ QXW_Q \]\[ KXW_K \]\[ VXW_V \]三者全部来自同一个\[ X \]所以一个 Sequence 内部的 Token 相互关注。因此叫Self-Attention自注意力。例如 Robot History\[ [s_{t-3},s_{t-2},s_{t-1},s_t] \]经过 Self-Attention 后每个时间位置都可以根据其他时间位置重新组织自己的表示。十八、Cross-Attention 又是什么这个概念现在顺便建立因为后面的 Transformer Decoder 和 ACT 会遇到。假设\[ Q \]来自一个 Sequence而\[ K,V \]来自另一个 Sequence。例如Action Query ↓ Q Image / Robot Features ↓ K、V那么含义变成Action Query 去另一个信息序列里寻找自己需要的信息。这就叫Cross-Attention形式仍然是\[ Attention(Q,K,V) \]但\[ Q \]和\[ K,V \]来源不同。这个概念对之后理解 ACT Transformer Decoder 会非常重要。十九、Padding Mask 在 Attention 中终于再次出现上一课我们已经知道 Padding真实 真实 真实 PAD PAD模型不应该关注 PAD。假设 Attention Score\[ [B,T,T] \]那么在 Softmax 前可以把 Padding 对应位置屏蔽掉。概念上scores scores.masked_fill(mask 0, float(-inf))weights torch.softmax(scores, dim-1)因为\[ e^{-\infty}\approx0 \]所以 Softmax 后被 Mask 的位置权重近似\[ 0 \]也就是不允许 Attention 去读这些 Padding Token。于是之前学过的 Mask现在终于和 Transformer 真正连起来了。二十、Attention 和 Position Information是什么关系上一课我们说\[ XXP \]给 Token 加上位置。为什么因为普通 Self-Attention 更关注Token 内容之间的匹配。但 Sequence 顺序本身也非常重要。因此通常在 Attention 前需要给 Token 注入某种 Position Information。于是数据链\[ Raw\ Data \rightarrow Token\ Embedding \rightarrow Position\ Information \rightarrow Attention \]这就是为什么上一课必须先讲 Position而不是现在才突然补。二十一、Attention 到底“学到了”什么注意力权重不是人工写死当前状态必须关注上一帧 80% 必须关注图像 20%真正参与学习的是\[ W_Q,W_K,W_V \]训练过程中\[ Loss \rightarrow Backward \]会计算\[ \frac{\partial L}{\partial W_Q} \]\[ \frac{\partial L}{\partial W_K} \]\[ \frac{\partial L}{\partial W_V} \]Optimizer 再更新它们。于是模型逐渐学习什么样的 Query 和 Key 应该匹配以及被关注以后应该传递什么 Value。所以 Attention 仍然没有脱离我们最早建立的训练逻辑\[ Parameter \rightarrow Forward \rightarrow Loss \rightarrow Backward \rightarrow Parameter\ Update \]二十二、放回机器人 Sequence会发生什么假设\[ X [x_{t-3},x_{t-2},x_{t-1},x_t] \]Shape\[ [B,4,64] \]经过 Self-Attention。那么当前 Token\[ x_t \]可能学到做当前决策时应该高度关注 \(x_{t-1}\)稍微参考 \(x_{t-2}\)而 \(x_{t-3}\) 影响较小。另一个任务中可能完全不同。这些关系不需要人为规定而由\[ W_Q,W_K,W_V \]通过训练学习。这就是 Attention 相比简单固定加权的重要优势。二十三、为什么它对多模态尤其重要假设未来统一 Sequence 中包含Visual Token 1 Visual Token 2 ... Language Token 1 Language Token 2 Robot State Token ...某个 Action-related Token 可以通过 Attention 学习当前动作到底应该关注哪个视觉区域哪段语言最重要当前 Robot State 是否比某些视觉 Token 更关键这就是 Transformer 能够用于 VLA 的一个核心原因\[ \boxed{ 通过Attention在不同Token之间动态建立信息关系 } \]但实际 VLA 架构究竟如何组织 Token、Self-Attention、Cross-Attention需要具体模型具体分析不能一概而论。第十四课整章链路回看现在 Attention 公式不应该再只是需要背的\[ \operatorname{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V \]而应该能读成\[ X \]先生成\[ Q,K,V \]其中 Q 表示我想找什么。K我拿什么和别人匹配。V被关注后我真正提供什么。然后\[ QK^T \]生成\[ [B,T,T] \]的 Token-to-Token 匹配矩阵。Softmax 把它变成 Attention Weight。最后\[ Weights\times V \]让每个 Token 从其他 Token 中按权重重新汇总信息。最终\[ [B,T,D] \rightarrow [B,T,D] \]Sequence Length 没消失但每个 Token 的内容已经融合了其他位置的信息。第十四课自测Q、K、V 各自可以怎样直观理解为什么 Self-Attention 中 Q、K、V 都来自 \(X\)却仍然不是同一个 Tensor如果\[ X:[32,10,64] \]并且 \(d_kd_v64\)那么 Q、K、V 分别是什么 Shape为什么\[ Q:[32,10,64] \]乘\[ K^T:[32,64,10] \]会得到\[ [32,10,10] \][32,10,10]中最后两个 10 分别代表什么关系Softmax 为什么通常对 Attention Score 的最后一个维度进行为什么要除以\[ \sqrt{d_k} \]Attention Weight 算出来以后为什么还必须乘 VSelf-Attention 和 Cross-Attention 最核心的区别是什么Padding Mask 为什么通常要在 Softmax 之前作用到 Attention ScoreAttention 中真正通过训练学习的 Parameter 主要有哪些请完整解释\[ \operatorname{softmax} \left( \frac{QK^T}{\sqrt{d_k}} \right)V \]每一部分究竟在做什么。下一课第 15 课——为什么一个 Attention 还不够Multi-Head Attention 与完整 Transformer Block下一课我们正式从\[ Single\ Head\ Attention \]走到真实 Transformer 使用的\[ \boxed{Multi\text{-}Head\ Attention} \]但重点不会是多背一堆公式而是解释为什么同一组 Token 之间不能只学习“一种关系”比如同一个 Robot Sequence 中一组 Attention Head 可能更关注短期时间关系另一组可能学习其他特征关系——这是直觉示例不把具体 Head 功能当成固定事实。然后会穿插代码把\[ [B,T,D] \]真正拆成\[ [B,H,T,d_h] \]再算 Attention最后重新合并成\[ [B,T,D] \]随后把 Attention 放回完整 Transformer Block\[ X \rightarrow Multi\text{-}Head\ Attention \rightarrow Residual \rightarrow LayerNorm \rightarrow FeedForward \rightarrow Residual \rightarrow LayerNorm \]这一课结束之后你看到nn.TransformerEncoderLayer就不会再把它当成黑盒。再往下一步我们就可以开始讲Transformer 为什么适合作为 Robot Policy 的 Sequence Model然后正式向ACT过渡。

相关新闻

基于SSM框架的高校心理健康管理系统:测评、预约、预警全解析

基于SSM框架的高校心理健康管理系统:测评、预约、预警全解析

每年开学季,高校心理健康中心都要搞一轮新生心理普查,纸质问卷发下去几百份,回收、录入、统计一圈下来,至少折腾一两周。更麻烦的是,普查结果往往只是"测完就完",后续咨询预约、个案跟踪、状态对…

2026/10/9 5:42:44 阅读更多 →
Win10安装SQL Server 2008全指南:兼容性设置、报错排查与远程连接

Win10安装SQL Server 2008全指南:兼容性设置、报错排查与远程连接

说实话,这些年给人远程装SQL Server 2008,遇到最多的场景就是:电脑是Win10,数据是十几年前的老库,要么是课程要用的教材版本,要么是公司遗留系统的数据库。按理说在Win10上装个2008不算多难的事&#xff0c…

2026/10/9 5:42:44 阅读更多 →
基于SpringBoot+Vue的智慧社区管理系统计算机毕设(源码+lw+部署文档+讲解等)

基于SpringBoot+Vue的智慧社区管理系统计算机毕设(源码+lw+部署文档+讲解等)

博主介绍:✌ 专注于VUE,小程序,安卓,Java,python,物联网专业,有18年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。一、…

2026/10/9 5:42:44 阅读更多 →

最新新闻

Spring Boot幼儿园管理系统毕设实战:从源码到答辩全流程指南

Spring Boot幼儿园管理系统毕设实战:从源码到答辩全流程指南

毕业设计、Spring Boot、幼儿园管理系统、源码、远程调试——这几个关键词凑到一起,基本就是每年毕业季里最常见的那种求助帖。我前一阵帮朋友看一套网上买的幼儿园管理系统,标题写得明明白白:“基于Spring Boot的幼儿园管理系统(…

2026/10/9 6:07:02 阅读更多 →
Java实现ASR-LLM-TTS语音交互闭环的工程实践

Java实现ASR-LLM-TTS语音交互闭环的工程实践

简介:本资源是一个基于Java实现的AI语音聊天应用原型,面向具备Java基础的开发者与AI初学者,聚焦语音交互技术栈的快速验证与学习实践。项目覆盖语音识别、自然语言理解、对话管理、文本转语音及WebRTC实时通信等核心环节,适合作为…

2026/10/9 6:07:02 阅读更多 →
Linux chown 命令详解:修改文件所有者的正确姿势

Linux chown 命令详解:修改文件所有者的正确姿势

修改文件所有者,在 Linux 运维里几乎是每天都会碰到的操作。新同事接手旧项目、Web 服务读不了网站目录、从别人机器上拷过来的压缩包解压后属主一片混乱,翻来覆去最后都会落到同一个命令上——chown。这个命令看着简单,实际用起来有不少细节…

2026/10/9 6:07:02 阅读更多 →
Linux进程等待:如何正确回收僵尸子进程(wait/waitpid详解)

Linux进程等待:如何正确回收僵尸子进程(wait/waitpid详解)

运维或者 C/C 服务端开发的朋友&#xff0c;应该都见过这种场景&#xff1a;ps -ef一列下来&#xff0c;进程状态是Z&#xff0c;命令行括号里写着<defunct>。Z就是 zombie&#xff0c;僵尸进程。为什么会有这么多僵尸&#xff1f;因为子进程死了&#xff0c;父进程没有及…

2026/10/9 6:07:02 阅读更多 →
Kubernetes 1.13.3 电商微服务离线部署与 TLS 证书链实战

Kubernetes 1.13.3 电商微服务离线部署与 TLS 证书链实战

简介&#xff1a;本资源是一套面向运维工程师与云原生初学者的Kubernetes实战教学包&#xff0c;聚焦电商微服务在k8s 1.13.3版本上的完整部署落地&#xff0c;解决企业级容器编排环境中服务治理、镜像管理、Ingress流量控制等典型问题。压缩包共6个文件&#xff0c;含3个.gz/t…

2026/10/9 6:07:02 阅读更多 →
Visual C++ 手搓本地搜索引擎:倒排索引、分词与 TF-IDF 排序实战

Visual C++ 手搓本地搜索引擎:倒排索引、分词与 TF-IDF 排序实战

简介&#xff1a;这份资源是面向C初学者与游戏AI爱好者的Surakarta人机博弈项目源码包&#xff0c;基于Visual C开发&#xff0c;核心围绕alpha-beta搜索算法与简单估值函数展开&#xff0c;适合想理解博弈搜索、搜索引擎式状态空间遍历及面向对象编程的读者练手。压缩包共8个文…

2026/10/9 6:06:02 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题&#xff0c;隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题&#xff0c;排查到最后发现是ZonedDateTime序列化后时区丢了&#xff0c;用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问&#xff1a;办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好&#xff0c;问题是工作场景经常要在几处环境之间来回切换&#xff0c;每次都先登录跳板机再层层代理&#xff0c;实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及&#xff0c;但真正动手搭过一套能跑起来的 Agent 系统的人都知道&#xff0c;从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地&#xff0c;从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →