小红书dots3 note开源深度解析:280B MoE多模态模型,内容平台入局开源大模型赛道

一、引言:内容平台的一次战略转身

2026年8月14日,小红书dots模型实验室(dots studio)正式发布了dots3-note preview——这是dots3系列的首个开源版本,也是国内内容平台首次公开进入开源大模型赛道。这一动作的意义远不止于"又多了一款开源模型",它标志着小红书正从AI应用层玩家向底层模型能力建设者转型。

dots3 note preview采用MoE(Mixture of Experts)架构,总参数量280B,每token激活参数仅16B,支持512K超长上下文窗口,具备文本、视觉与语音的全模态理解能力。更令人瞩目的是,该模型同系列的一个分支版本在IMO 2026(国际数学奥林匹克竞赛)中斩获了官方认证的42/42满分成绩。

本文将从架构设计、MoE路由机制、注意力机制、多模态处理、训练方法论、部署实践、评测表现与行业影响等多个维度,对dots3 note preview进行全方位技术深度解析。


二、整体架构概览

dots3 note preview的整体架构可拆解为三个核心子系统:语言主干网络(Language Backbone)、视觉编码器(Vision Encoder)和音频编码器(Audio Encoder)。三者协同工作,实现文本、图像、视频和音频的统一输入理解。

2.1 架构参数总览

组件参数
语言主干总参数280B
语言主干激活参数16B(MoE)
解码器层数1个Dense层 + 45个MoE层
隐藏维度5,120
专家网络256个路由专家 + 1个共享专家,Top-8路由
注意力层13层DSA + 33层滑动窗口注意力(SWA)
DSA选择Top-k2,048
上下文长度512K token
词表大小152K
视觉编码器MoE ViT,7B总参数,1.2B激活
音频编码器Dense,800M参数
多token预测(MTP)1个共享层,1.13B参数
支持精度BF16 / FP8

2.2 架构总览图

┌─────────────────────────────────────────────────────────────┐
│                    dots3-note preview 整体架构                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌──────────────────┐  ┌──────────────────┐                │
│  │  视觉编码器        │  │  音频编码器        │                │
│  │  MoE ViT         │  │  Dense Encoder   │                │
│  │  7B总/1.2B激活    │  │  800M参数         │                │
│  │  图像+视频帧输入   │  │  16kHz语音输入    │                │
│  └────────┬─────────┘  └────────┬─────────┘                │
│           │                     │                          │
│           ▼                     ▼                          │
│  ┌──────────────────────────────────────────────────────┐  │
│  │              多模态投影对齐层                          │  │
│  │      (Visual/Audio Projector → LLM Embedding Space)  │  │
│  └──────────────────────┬───────────────────────────────┘  │
│                         │                                   │
│                         ▼                                   │
│  ┌──────────────────────────────────────────────────────┐  │
│  │             语言主干 (Language Backbone)               │  │
│  │                                                       │  │
│  │  ┌───────┐  ┌───────┐  ┌───────┐      ┌───────┐     │  │
│  │  │ Dense │  │ MoE 1 │  │ MoE 2 │ ...  │ MoE 45│     │  │
│  │  │ Layer │  │ Layer │  │ Layer │      │ Layer │     │  │
│  │  └───┬───┘  └───┬───┘  └───┬───┘      └───┬───┘     │  │
│  │      │          │          │              │         │  │
│  │      ▼          ▼          ▼              ▼         │  │
│  │  ┌──────────────────────────────────────────────┐   │  │
│  │  │  MTP Head (1.13B, 共享多token预测层)          │   │  │
│  │  └──────────────────────────────────────────────┘   │  │
│  └──────────────────────────────────────────────────────┘  │
│                         │                                   │
│                         ▼                                   │
│  ┌──────────────────────────────────────────────────────┐  │
│  │             输出层 (文本生成)                          │  │
│  └──────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

三、MoE架构深度解析

3.1 专家路由机制

dots3 note的MoE层采用256个路由专家(routed experts)加1个共享专家(shared expert)的设计,每个token通过Top-8路由机制选择8个最相关的专家激活。

核心路由计算流程如下:

import torch
import torch.nn.functional as F

class Dots3MoELayer(torch.nn.Module):
    """dots3-note MoE层简化实现"""
    
    def __init__(self, hidden_dim=5120, n_experts=256, n_shared_experts=1, 
                 top_k=8, expert_dim=1536):
        super().__init__()
        self.hidden_dim = hidden_dim
        self.n_experts = n_experts
        self.top_k = top_k
        
        # 路由网络(Gate)
        self.gate = torch.nn.Linear(hidden_dim, n_experts, bias=False)
        
        # 共享专家
        self.shared_expert = torch.nn.Sequential(
            torch.nn.Linear(hidden_dim, expert_dim * 4),
            torch.nn.SiLU(),
            torch.nn.Linear(expert_dim * 4, hidden_dim),
        )
        
        # 路由专家(示意:实际使用分组矩阵乘优化)
        self.experts = torch.nn.ModuleList([
            torch.nn.Sequential(
                torch.nn.Linear(hidden_dim, expert_dim * 4),
                torch.nn.SiLU(),
                torch.nn.Linear(expert_dim * 4, hidden_dim),
            )
            for _ in range(n_experts)
        ])
    
    def forward(self, x):
        # x: [batch_size, seq_len, hidden_dim]
        batch_size, seq_len, _ = x.shape
        
        # 1. 计算路由分数
        gate_logits = self.gate(x)  # [B, S, 256]
        gate_scores = F.softmax(gate_logits, dim=-1, dtype=torch.float32)
        
        # 2. Top-8 选择
        topk_scores, topk_indices = torch.topk(gate_scores, self.top_k, dim=-1)
        topk_scores = topk_scores / topk_scores.sum(dim=-1, keepdim=True)
        
        # 3. 共享专家输出(始终激活)
        shared_out = self.shared_expert(x)
        
        # 4. 路由专家输出(仅对选中的专家计算)
        # 简化:实际实现使用分组GEMM + 分散/聚合
        final_hidden = shared_out  # 从共享专家开始
        final_hidden = final_hidden.to(x.dtype)
        
        # 实际推理框架会使用dispatch/combine融合算子
        # 这里仅展示路由逻辑
        routed_output = torch.zeros_like(x)
        for i in range(self.n_experts):
            mask = (topk_indices == i).any(dim=-1)
            if mask.any():
                expert_out = self.experts[i](x[mask])
                # 加权求和
                expert_weight = topk_scores[mask][topk_indices[mask] == i]
                routed_output[mask] += expert_out * expert_weight.unsqueeze(-1)
        
        return final_hidden + routed_output

3.2 激活参数的经济学

280B总参数 / 16B激活参数的组合是dots3 note最核心的设计决策。这背后的经济学非常清晰:

  • 知识容量:280B的稠密权重提供了充足的知识表征空间,让模型在各种领域都有足够的"见识"
  • 推理成本:每token仅激活16B参数,计算量和显存需求接近16B稠密模型
  • 部署友好:在H100 80GB x 8的节点上,使用FP8量化即可完成单机部署

对比同期的其他开源模型:

模型总参数激活参数架构上下文
dots3 note preview280B16BMoE (256/8)512K
DeepSeek-v4-flash284B13BMoE128K
GLM-5.2743B39BMoE256K
Hy3295B21BMoE256K

3.3 MoE路由与注意力混合架构图

┌──────────────────────────────────────────────────────────────┐
│                dots3-note 单层Transformer结构                 │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│                    输入 x (hidden_dim=5120)                   │
│                           │                                  │
│                           ▼                                  │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                  RMSNorm                             │   │
│  └──────────────────────┬───────────────────────────────┘   │
│                         │                                    │
│                         ▼                                    │
│  ┌──────────────────────────────────────────────────────┐   │
│  │              注意力层 (每层二选一)                      │   │
│  │                                                       │   │
│  │  ┌─────────────────┐  或  ┌──────────────────────┐   │   │
│  │  │  DSA (13层)      │      │  SWA (33层)           │   │   │
│  │  │  Top-2048稀疏    │      │  滑动窗口 size=513    │   │   │
│  │  │  MLA + Indexer   │      │  MLA + 窗口掩码       │   │   │
│  │  └─────────────────┘      └──────────────────────┘   │   │
│  └──────────────────────┬───────────────────────────────┘   │
│                         │                                    │
│                         ▼                                    │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                残差连接 + RMSNorm                      │   │
│  └──────────────────────┬───────────────────────────────┘   │
│                         │                                    │
│                         ▼                                    │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                  MoE FFN 层                           │   │
│  │                                                       │   │
│  │   ┌──────────────────────────────────────────────┐    │   │
│  │   │         Gate (Linear 5120→256)               │    │   │
│  │   │              │  Top-8 路由                    │    │   │
│  │   │              ▼                               │    │   │
│  │   │  ┌─────┐ ┌─────┐ ┌─────┐     ┌─────┐       │    │   │
│  │   │  │Exp 1│ │Exp 2│ │Exp 3│ ... │Exp 8│       │    │   │
│  │   │  └──┬──┘ └──┬──┘ └──┬──┘     └──┬──┘       │    │   │
│  │   │     │        │        │          │          │    │   │
│  │   │     └────────┴────────┴──────────┘          │    │   │
│  │   │              │ 加权求和                      │    │   │
│  │   │              ▼                               │    │   │
│  │   │    ┌────────────────────────┐               │    │   │
│  │   │    │ 共享专家 (Shared Expert)│               │    │   │
│  │   │    └───────────┬────────────┘               │    │   │
│  │   │                │ 相加                        │    │   │
│  │   └────────────────┼────────────────────────────┘    │   │
│  └──────────────────────┬───────────────────────────────┘   │
│                         │                                    │
│                         ▼                                    │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                残差连接 + 输出                         │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                              │
└──────────────────────────────────────────────────────────────┘

四、DSA稀疏注意力与512K上下文

4.1 为什么需要稀疏注意力

标准全注意力机制(Full Attention)的计算复杂度为O(N²)。当上下文长度从4K扩展到512K时,计算量不是增长128倍,而是增长了约16,000倍。如果不做稀疏化,单是512K上下文的注意力矩阵就需要约1TB的显存。

dots3 note采用了一种混合注意力架构:13层DSA(Dots Sparse Attention)+ 33层SWA(Sliding Window Attention),比例约为1:3。

4.2 DSA工作原理

DSA的核心思想是"先选重点,再算细节",通过一个轻量级的Indexer(索引器)快速筛选出最相关的token,仅对这些token做完整的注意力计算。

import torch
import torch.nn.functional as F

class DSAttention(torch.nn.Module):
    """
    Dots Sparse Attention (DSA) 简化实现
    
    核心流程:
    1. 使用轻量级 Indexer 计算所有 token 的索引分数
    2. 选择 Top-2048 个最相关的 KV 条目
    3. 仅对选中的条目进行标准 MLA 注意力计算
    """
    
    def __init__(self, hidden_dim=5120, n_heads=64, head_dim=128,
                 index_n_heads=64, index_head_dim=128, index_topk=2048):
        super().__init__()
        self.hidden_dim = hidden_dim
        self.n_heads = n_heads
        self.head_dim = head_dim
        self.index_topk = index_topk
        
        # MLA: QKV 低秩投影
        self.q_proj = torch.nn.Linear(hidden_dim, n_heads * head_dim, bias=False)
        self.kv_proj = torch.nn.Linear(hidden_dim, 2 * head_dim, bias=False)  # MLA共享KV
        self.o_proj = torch.nn.Linear(n_heads * head_dim, hidden_dim, bias=False)
        
        # DSA Indexer: 轻量级检索器
        self.indexer = DSAIndexer(
            hidden_dim=hidden_dim,
            n_heads=index_n_heads,
            head_dim=index_head_dim
        )
    
    def forward(self, x, attention_mask=None):
        batch_size, seq_len, _ = x.shape
        
        # 1. 计算 Q 和共享 KV
        q = self.q_proj(x)  # [B, S, n_heads * head_dim]
        q = q.view(batch_size, seq_len, self.n_heads, self.head_dim)
        
        kv = self.kv_proj(x)  # [B, S, 2 * head_dim]
        k, v = kv.chunk(2, dim=-1)  # 共享单头 KV
        k = k.unsqueeze(2)  # [B, S, 1, head_dim]
        v = v.unsqueeze(2)  # [B, S, 1, head_dim]
        
        # 2. 使用 Indexer 选择 Top-K 位置
        #    返回每个 query 需要关注的 key 索引
        selected_indices = self.indexer(x, self.index_topk)
        # selected_indices: [B, S, topk]
        
        # 3. 仅对选中的 KV 计算注意力
        # 使用 gather 操作收集选中的 K, V
        selected_k = torch.gather(
            k.unsqueeze(1).expand(-1, seq_len, -1, -1, -1),
            dim=2,
            index=selected_indices.unsqueeze(-1).unsqueeze(-1)
            .expand(-1, -1, -1, 1, self.head_dim)
        )  # [B, S, topk, 1, head_dim]
        
        selected_v = torch.gather(
            v.unsqueeze(1).expand(-1, seq_len, -1, -1, -1),
            dim=2,
            index=selected_indices.unsqueeze(-1).unsqueeze(-1)
            .expand(-1, -1, -1, 1, self.head_dim)
        )  # [B, S, topk, 1, head_dim]
        
        # 4. 注意力计算(仅 topk 个位置)
        attn_scores = torch.einsum(
            "bqhd,bqkhd->bqhk",
            q.unsqueeze(2),  # [B, S, 1, n_heads, head_dim]
            selected_k      # [B, S, topk, 1, head_dim]
        ) / (self.head_dim ** 0.5)
        
        if attention_mask is not None:
            attn_scores = attn_scores + attention_mask
        
        attn_weights = F.softmax(attn_scores, dim=-1)
        attn_output = torch.einsum(
            "bqhk,bqkhd->bqhd",
            attn_weights,
            selected_v
        )
        
        # 5. 输出投影
        attn_output = attn_output.reshape(batch_size, seq_len, -1)
        return self.o_proj(attn_output)


class DSAIndexer(torch.nn.Module):
    """
    DSA 索引器 (Indexer)
    
    使用独立的低维投影快速编码所有 token 的位置与语义,
    为每个 query 计算与所有 key 的索引分数。
    """
    
    def __init__(self, hidden_dim, n_heads=64, head_dim=128):
        super().__init__()
        self.n_heads = n_heads
        self.head_dim = head_dim
        
        # 独立的索引器参数
        self.wq = torch.nn.Linear(hidden_dim, n_heads * head_dim, bias=False)
        self.wk = torch.nn.Linear(hidden_dim, n_heads * head_dim, bias=False)
        self.weights_proj = torch.nn.Linear(hidden_dim, n_heads, bias=False)
        self.k_norm = torch.nn.LayerNorm(head_dim)
    
    def forward(self, x, topk):
        batch_size, seq_len, _ = x.shape
        
        # 索引器 Q 和 K
        idx_q = self.wq(x)  # [B, S, n_heads * head_dim]
        idx_k = self.wk(x)  # [B, S, n_heads * head_dim]
        
        idx_q = idx_q.view(batch_size, seq_len, self.n_heads, self.head_dim)
        idx_k = idx_k.view(batch_size, seq_len, self.n_heads, self.head_dim)
        idx_k = self.k_norm(idx_k)
        
        # 计算索引分数
        # 公式: I(t,s) = sum_j(w_j * ReLU(q_j · k_j))
        idx_scores = torch.einsum(
            "bqhd,bkhd->bqkh",
            idx_q, idx_k
        )  # [B, S, S, n_heads]
        
        idx_scores = F.relu(idx_scores)  # ReLU 激活
        
        # 多头加权求和
        idx_weights = self.weights_proj(x)  # [B, S, n_heads]
        idx_scores = torch.einsum(
            "bqkh,bqh->bqk",
            idx_scores, idx_weights
        )  # [B, S, S]
        
        # 选择 Top-K
        topk_values, topk_indices = torch.topk(
            idx_scores, topk, dim=-1
        )  # [B, S, topk]
        
        return topk_indices

4.3 DSA + SWA 混合注意力布局

┌──────────────────────────────────────────────────────────────────┐
│              dots3-note 46层注意力混合布局                        │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  层索引    类型         说明             容量                     │
│  ──────   ──────────   ──────────────   ─────────────────       │
│   0       Dense       稠密层(起始)     全注意力                  │
│   1       DSA         Top-2048稀疏      全局长距离建模            │
│   2       SWA         滑动窗口513       局部上下文建模            │
│   3       DSA         Top-2048稀疏      全局长距离建模            │
│   4       SWA         滑动窗口513       局部上下文建模            │
│   5       SWA         滑动窗口513       局部上下文建模            │
│  ...      ...         交错排列                                    │
│   45      MoE+SWA     最后一个MoE层     局部上下文建模            │
│                                                                  │
│  统计: DSA × 13  |  SWA × 33  |  比例 ≈ 1:3                     │
│                                                                  │
│  设计哲学:                                                        │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │  大部分层(SWA) 用廉价滑动窗口处理"附近"信息               │   │
│  │  少部分层(DSA) 用稀疏注意力覆盖"全图"                     │   │
│  │  全局与局部各司其职,在成本和效果之间取得平衡              │   │
│  └──────────────────────────────────────────────────────────┘   │
│                                                                  │
│  DSA 层内部结构:                                                  │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │  Step 1: Indexer 检索 → 所有 token 的索引分数            │   │
│  │  Step 2: Selection → Top-2048 个候选                    │   │
│  │  Step 3: Attention → 仅对选中候选做完整注意力计算        │   │
│  │  Step 4: Output → 输出投影                              │   │
│  │  复杂度: O(N × topk) ≈ O(N) 而非 O(N²)                  │   │
│  └──────────────────────────────────────────────────────────┘   │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

五、多模态处理流程

5.1 视觉编码器:MoE ViT

dots3 note的视觉编码器本身也是一个MoE架构,总参数7B,激活参数1.2B。这在大模型视觉编码器中属于相当激进的规模。

import torch
import torchvision.transforms as T
from PIL import Image

class Dots3MultimodalProcessor:
    """
    dots3-note 多模态处理管线
    支持文本、图像、视频、音频的统一输入处理
    """
    
    def __init__(self, model, processor):
        self.model = model
        self.processor = processor
        self.device = next(model.parameters()).device
        
        # 图像预处理
        self.image_transform = T.Compose([
            T.Resize((384, 384)),
            T.ToTensor(),
            T.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
        ])
    
    def process_text_only(self, text, enable_thinking=False):
        """纯文本推理"""
        messages = [{"role": "user", "content": text}]
        inputs = self.processor.tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            return_tensors="pt",
            return_dict=True,
            enable_thinking=enable_thinking,
        ).to(self.device)
        
        outputs = self.model.generate(
            **inputs,
            max_new_tokens=2048,
            temperature=0.7,
            top_p=0.95,
        )
        return self.processor.decode(
            outputs[0, inputs.input_ids.shape[1]:],
            skip_special_tokens=True
        )
    
    def process_image_text(self, image_path, text):
        """图文理解"""
        image = Image.open(image_path).convert("RGB")
        image_tensor = self.image_transform(image).unsqueeze(0).to(self.device)
        
        # 构建多模态输入
        messages = [{
            "role": "user",
            "content": [
                {"type": "image", "image": image_tensor},
                {"type": "text", "text": text},
            ]
        }]
        
        inputs = self.processor.tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            return_tensors="pt",
            return_dict=True,
        ).to(self.device)
        
        outputs = self.model.generate(
            **inputs,
            max_new_tokens=2048,
            temperature=0.7,
        )
        return self.processor.decode(
            outputs[0, inputs.input_ids.shape[1]:],
            skip_special_tokens=True
        )
    
    def process_video(self, video_path, text):
        """视频理解(含音频轨)"""
        # 视频处理器会自动执行:
        # 1. 帧采样(根据token预算确定帧数)
        # 2. 音频轨提取并编码
        # 3. 时间戳交错排列
        # 4. 帧、时间戳、音频段的token预算分配
        messages = [{
            "role": "user",
            "content": [
                {"type": "video_url", "video_url": {"url": video_path}},
                {"type": "text", "text": text},
            ]
        }]
        # ... 后续处理与图像类似
        pass

# 使用示例
def run_multimodal_example():
    """使用OpenAI兼容接口进行多模态推理"""
    from openai import OpenAI
    
    client = OpenAI(
        base_url="http://127.0.0.1:8000/v1",
        api_key="EMPTY"
    )
    
    # 图像理解
    response = client.chat.completions.create(
        model="dots3-note-prev",
        messages=[{
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {
                    "url": "https://example.com/photo.jpg"
                }},
                {"type": "text", "text": "请描述这张图片中的细节"},
            ]
        }],
        temperature=0.7,
        max_tokens=1024,
    )
    print(response.choices[0].message.content)
    
    # 启用思考模式(推理模式)
    response = client.chat.completions.create(
        model="dots3-note-prev",
        messages=[{"role": "user", "content": "证明: 根号2是无理数"}],
        temperature=1.0,
        max_tokens=4096,
        extra_body={"chat_template_kwargs": {"enable_thinking": True}},
    )
    print(response.choices[0].message.content)

5.2 多模态处理流程架构图

┌──────────────────────────────────────────────────────────────────┐
│                  dots3-note 多模态处理流程                        │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  输入类型                                                         │
│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐                        │
│  │ 文本  │  │ 图像  │  │ 视频  │  │ 音频  │                        │
│  └──┬───┘  └──┬───┘  └──┬───┘  └──┬───┘                        │
│     │         │         │         │                             │
│     ▼         ▼         ▼         ▼                             │
│  ┌──────┐  ┌──────────────┐  ┌──────────────┐                  │
│  │Tokenizer│  │  MoE ViT    │  │  Dense Audio  │                  │
│  │152K词表 │  │  7B/1.2B    │  │  Encoder      │                  │
│  │         │  │  384×384    │  │  800M         │                  │
│  │         │  │  [图像帧]   │  │  16kHz        │                  │
│  └────────┘  └──────────────┘  └──────────────┘                  │
│       │              │                  │                        │
│       │              │    ┌─────────────┘                        │
│       │              │    │ 视频处理: 帧采样+音频提取+时间戳交错   │
│       ▼              ▼    ▼                                      │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │              多模态token嵌入 + 位置编码                     │  │
│  │  [文本token] [图像token×N] [音频token×M] [时间戳] ...      │  │
│  └──────────────────────────┬─────────────────────────────────┘  │
│                             │                                    │
│                             ▼                                    │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │           dots3-note 语言主干 (46层)                        │  │
│  │                                                             │  │
│  │  ┌───────┐ ┌───────┐ ┌───────┐       ┌───────┐           │  │
│  │  │ Dense │ │MoE+SWA│ │MoE+DSA│  ...  │MoE+SWA│           │  │
│  │  │ Attn  │ │  FFN  │ │  FFN  │       │  FFN  │           │  │
│  │  └───┬───┘ └───┬───┘ └───┬───┘       └───┬───┘           │  │
│  │      └─────────┴─────────┴───────────────┘                │  │
│  └──────────────────────────┬─────────────────────────────────┘  │
│                             │                                    │
│                             ▼                                    │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │  MTP Head: 并行生成后续3个token + 校验 → 单次前向多token输出 │  │
│  └────────────────────────────────────────────────────────────┘  │
│                             │                                    │
│                             ▼                                    │
│                       输出: 文本生成                               │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

六、TEMPO强化学习:长程Agent任务的训练创新

6.1 长程Agent训练的核心挑战

在Agent场景中,任务执行时间可能长达数小时甚至数十小时。传统的value-free强化学习方法(如GRPO)面临两个根本性困难:

  1. 训练效率不可接受:Agent完成一次完整探索需要10+小时
  2. 稀疏奖励导致信用分配困难:长时间执行后,很难将最终的成功/失败归因到具体的某个决策

6.2 TEMPO方法论

TEMPO(Test-time scaled Value Estimation with Macro-step Policy Optimization)将长程任务拆分为多个macro-step,每个macro-step包含多轮模型与环境的交互。在每个macro-step结束时,同一个Agent从actor切换为critic,通过test-time scaling的推理分析来估计当前状态的预期剩余回报。

import torch
from typing import List, Dict, Any, Optional

class TEMPOTrainer:
    """
    TEMPO: Test-time scaled Value Estimation with Macro-step Policy Optimization
    
    核心思想:将长程任务拆分为多个macro-step,
    在每个macro-step结束时,Agent切换为critic角色,
    通过test-time scaling推理来估计当前状态的预期剩余回报。
    """
    
    def __init__(self, model, tokenizer, 
                 macro_step_size: int = 10,
                 n_critic_rollouts: int = 8):
        self.model = model
        self.tokenizer = tokenizer
        self.macro_step_size = macro_step_size
        self.n_critic_rollouts = n_critic_rollouts
    
    def train_epoch(self, environment, n_episodes: int):
        """一轮TEMPO训练"""
        for episode in range(n_episodes):
            trajectory = self.rollout_with_macro_steps(environment)
            self.update_policy(trajectory)
    
    def rollout_with_macro_steps(self, env) -> List[Dict]:
        """执行带有macro-step划分的 rollout"""
        trajectory = []
        state = env.reset()
        done = False
        step_count = 0
        
        while not done:
            # Actor阶段:执行一个macro-step
            macro_actions = []
            for _ in range(self.macro_step_size):
                if done:
                    break
                action = self.act(state)
                next_state, reward, done, info = env.step(action)
                macro_actions.append({
                    "state": state,
                    "action": action,
                    "reward": reward,
                    "next_state": next_state,
                    "done": done,
                })
                state = next_state
                step_count += 1
            
            # Critic阶段:评估当前状态的预期剩余回报
            if not done:
                value_estimate = self.estimate_value(
                    state, 
                    trajectory, 
                    env.get_privileged_info()
                )
            else:
                value_estimate = 0.0
            
            # 记录macro-step
            trajectory.append({
                "macro_actions": macro_actions,
                "value_estimate": value_estimate,
                "final_reward": reward if done else None,
            })
        
        return trajectory
    
    def act(self, state) -> str:
        """Actor: 生成动作"""
        prompt = self.build_actor_prompt(state)
        inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
        outputs = self.model.generate(
            **inputs, 
            max_new_tokens=256,
            temperature=1.0,
            top_p=0.95,
        )
        action = self.tokenizer.decode(
            outputs[0, inputs.input_ids.shape[1]:],
            skip_special_tokens=True
        )
        return action
    
    def estimate_value(self, state, history, privileged_info) -> float:
        """
        Critic: 通过test-time scaling推理估计价值
        
        通过多次rollout和推理分析,估计当前状态的预期剩余回报。
        关键发现:在长程任务中,"评价比生成更简单",
        即使Agent当前无法解决问题,作为critic时仍能做出准确的价值估计。
        """
        prompt = self.build_critic_prompt(state, history, privileged_info)
        
        value_estimates = []
        for _ in range(self.n_critic_rollouts):
            inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
            outputs = self.model.generate(
                **inputs,
                max_new_tokens=512,
                temperature=0.7,
                # 启用思考模式进行深度分析
                chat_template_kwargs={"enable_thinking": True},
            )
            analysis = self.tokenizer.decode(
                outputs[0, inputs.input_ids.shape[1]:],
                skip_special_tokens=True
            )
            # 从分析文本中提取价值估计
            value = self.extract_value_from_analysis(analysis)
            value_estimates.append(value)
        
        # 聚合多个critic rollouts的估计
        return torch.mean(torch.tensor(value_estimates)).item()
    
    def update_policy(self, trajectory):
        """基于TEMPO的trajectory更新策略"""
        # 对每个macro-step计算优势函数
        advantages = []
        returns = []
        G = 0
        
        for macro_step in reversed(trajectory):
            if macro_step["final_reward"] is not None:
                G = macro_step["final_reward"]
            else:
                G = macro_step["value_estimate"] + 0.99 * G  # 折扣因子
            returns.insert(0, G)
            advantages.insert(0, G - macro_step["value_estimate"])
        
        # 使用PPO-like的目标函数更新策略
        # 实际实现中,会基于advantages进行策略梯度更新
        loss = self.compute_policy_loss(trajectory, advantages)
        loss.backward()
        # ... 优化器step

6.3 TEMPO训练效果

根据官方公布的数据,经过TEMPO训练的模型在ARC-AGI-3任务上:

  • 平均score比baseline checkpoint提高31.5%
  • 比GRPO提高20.6%
  • 在达到相同关卡的情况下,TEMPO模型以更少的通关步数获得了更高的分数

6.4 递归自我评价:TEMPO的意外发现

在TEMPO训练过程中,研究团队发现了一个出乎意料的现象:Agent的自我评价能力显著强于预期。即使面对Agent当前还无法解决的问题,当它作为critic时,仍能从两个表面相似的状态中识别出真正突破了环境规律的那个状态,并给出差异显著的价值估计。

这一发现验证了一个重要假设:在长程复杂任务上,“评价比生成更简单”。这意味着,即使模型当前的生成能力不足以解决某个问题,它仍然可能具备对其自身决策轨迹进行有效评估的能力。这为未来的模型自我改进提供了重要的理论支撑。

6.5 从陌生环境中探索与持续学习

为了实现真正的通用Agent,dots studio的研究团队构建了数千个不依赖先验知识的新颖超长程环境,专门训练模型在陌生环境中在线学习知识、更新记忆的能力。核心发现是:只要任务长度显著超过模型的上下文长度,通过TEMPO方法训练模型解决问题后,模型就能自行学会生成有助于未来决策的记忆。

在ARC-AGI-3(ARC Prize今年推出的新测试,重点不再是静态推理题,而是测试AI能否在陌生环境中自主学习)的验证中,dots3-note preview展现出了令人印象深刻的研究性思维:

  1. 主动假设验证:Agent通过与环境交互观察,主动提出并验证假设
  2. 动态记忆更新:将验证后的规则写入外部记忆文件(memory.md),在后续决策中持续使用
  3. 跨任务泛化:这一能力能够泛化到模型从未训练过的其他类型的陌生环境中,如在《杀戮尖塔2》游戏中,Agent持续运行并更新记忆,表现出对游戏规则的逐步理解与策略优化

这种在测试时持续学习的能力,是dots3-note preview区别于传统静态模型的核心差异化特征之一。


七、VibeSearchBench与VibeLifeBench:面向真实场景的评测基准

7.1 VibeSearchBench:当用户没有一次说清需求

传统的搜索评测通常假设用户能一次性给出清晰的查询。但在真实生活中,用户的需求往往是逐步披露的——先有一个模糊的想法,再在多轮对话中不断补充条件和限制。

VibeSearchBench覆盖20个领域、200项任务,模拟真实用户的搜索行为:

  • 多轮需求澄清:用户逐步补充需求细节
  • 跨模态信息整合:结合文本、图像、位置等多源信息
  • 偏好理解:从模糊描述中推断用户真正想要什么

7.2 VibeLifeBench:当外部条件不断变化

VibeLifeBench强调时间和环境变化,覆盖10个领域、20项任务,每项任务包含20到30个阶段,并设置1247项atomic checks,用于检查:

  • 状态一致性:Agent能否在长时间执行中保持一致的状态追踪
  • 工具执行正确性:工具调用是否按预期执行
  • 最终交付质量:最终结果是否满足用户需求

7.3 评测结果揭示的行业现状

测试结果显示,即便是Claude Opus 5、GPT-5.5这样的全球头部模型,在这两套评测基准中也没有达到设定的及格水平。VibeLifeBench上,dots3-note preview以28.1分领先多数同量级模型,但整体分数仍然偏低。这些结果说明了一个核心问题:模型在高难度单点任务上已足够强,但把这种能力稳定维持数小时甚至更久,仍是Agent力所不及的地方。这正是dots3系列后续版本重点突破的方向。


八、MTP多token预测与投机解码

8.1 MTP加速推理

dots3 note内置了一个1.13B参数的共享多token预测(MTP)层,可以在生成当前token的同时,并行预测后续最多3个token。这相当于内置了一个"草稿模型",无需额外部署独立的草稿模型即可实现投机解码(Speculative Decoding)。

import torch
import torch.nn.functional as F

class MTPDecoding:
    """
    MTP (Multi-Token Prediction) 多token投机解码
    
    内置的MTP层可以在单次前向中并行生成多个候选token,
    通过校验机制接受正确预测,大幅减少解码前向次数。
    """
    
    def __init__(self, model, mtp_head, n_speculative_tokens=3):
        self.model = model
        self.mtp_head = mtp_head  # 1.13B共享MTP层
        self.n_speculative_tokens = n_speculative_tokens
    
    @torch.no_grad()
    def generate_with_mtp(self, input_ids, max_new_tokens=1024, 
                          temperature=0.7, top_p=0.95):
        """
        使用MTP投机解码加速生成
        
        流程:
        1. 主模型前向 → 获取当前token的logits
        2. MTP Head → 并行预测后续n个token
        3. 校验 → 接受正确预测的token,丢弃错误的
        4. 重复直到完成
        """
        device = input_ids.device
        batch_size = input_ids.shape[0]
        
        for _ in range(max_new_tokens // (self.n_speculative_tokens + 1) + 1):
            # Step 1: 主模型前向 → 获取当前token logits
            main_outputs = self.model(input_ids, use_cache=True)
            main_logits = main_outputs.logits[:, -1, :]  # [B, vocab_size]
            
            # 采样当前token
            next_token = self.sample(main_logits, temperature, top_p)
            
            # Step 2: MTP Head → 并行预测后续token
            # MTP基于当前层的隐藏状态,预测后续n个token
            draft_tokens = []
            hidden_state = main_outputs.last_hidden_state[:, -1:, :]
            
            for _ in range(self.n_speculative_tokens):
                mtp_logits = self.mtp_head(hidden_state)
                draft_token = self.sample(mtp_logits[:, -1, :], temperature, top_p)
                draft_tokens.append(draft_token)
                
                # 更新隐藏状态用于下一个MTP预测
                # MTP层共享主模型的embedding
                draft_embed = self.model.get_input_embeddings()(draft_token)
                hidden_state = self.mtp_head.forward_embed(draft_embed)
            
            # Step 3: 校验 — 并行前向所有草稿token
            draft_ids = torch.cat([next_token] + draft_tokens, dim=-1)
            verify_outputs = self.model(
                torch.cat([input_ids, draft_ids[:, :-1]], dim=-1),
                use_cache=False
            )
            
            verify_logits = verify_outputs.logits[:, -self.n_speculative_tokens:, :]
            
            # 校验每个草稿token
            accepted_tokens = [next_token]
            for i, draft_token in enumerate(draft_tokens):
                target_logits = main_logits if i == 0 else verify_logits[:, i-1, :]
                target_prob = F.softmax(target_logits, dim=-1)
                draft_prob = F.softmax(
                    verify_logits[:, i, :] if i < len(draft_tokens) - 1 
                    else self.mtp_head(hidden_state)[:, -1, :], 
                    dim=-1
                )
                
                # 拒绝采样校验
                p_accept = torch.min(
                    torch.ones_like(target_prob[0, draft_token[0]]),
                    draft_prob[0, draft_token[0]] / target_prob[0, draft_token[0]]
                )
                
                if torch.rand(1).item() < p_accept.item():
                    accepted_tokens.append(draft_token)
                else:
                    # 拒绝: 从target分布重新采样
                    corrected = self.sample(target_logits, temperature, top_p)
                    accepted_tokens.append(corrected)
                    break
            
            # 将接受的token追加到输入
            new_tokens = torch.cat(accepted_tokens, dim=-1)
            input_ids = torch.cat([input_ids, new_tokens], dim=-1)
            
            # 检查是否达到EOS
            if (new_tokens == self.model.config.eos_token_id).any():
                break
        
        return input_ids
    
    def sample(self, logits, temperature, top_p):
        """带temperature和top-p的采样"""
        logits = logits / temperature
        
        # Top-p (nucleus) sampling
        sorted_logits, sorted_indices = torch.sort(logits, descending=True)
        cumulative_probs = torch.cumsum(F.softmax(sorted_logits, dim=-1), dim=-1)
        
        # 移除累积概率超过top_p的token
        sorted_indices_to_remove = cumulative_probs > top_p
        sorted_indices_to_remove[..., 1:] = sorted_indices_to_remove[..., :-1].clone()
        sorted_indices_to_remove[..., 0] = 0
        
        indices_to_remove = sorted_indices_to_remove.scatter(
            -1, sorted_indices, sorted_indices_to_remove
        )
        logits[indices_to_remove] = float('-inf')
        
        probs = F.softmax(logits, dim=-1)
        return torch.multinomial(probs, num_samples=1)

8.2 MTP投机解码加速效果

在vLLM Ascend推理框架中,启用MTP投机解码后:

  • TPOT(单token生成耗时)降低50%以上
  • 在高并发在线业务场景中,生成效率显著提升
  • 无需额外的草稿模型部署,内置MTP层直接使用

九、昇腾适配与国产算力部署

9.1 昇腾0 Day适配

华为昇腾在dots3 note发布当天就完成了0 Day适配,这是国产模型与国产算力深度融合的里程碑事件。适配覆盖了Atlas 800 A3和Atlas 900 A3 SuperPoD超节点。

9.2 昇腾适配架构

┌──────────────────────────────────────────────────────────────────┐
│              dots3-note × 昇腾适配架构                           │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │                  Atlas 900 A3 SuperPoD                    │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │   │
│  │  │ Atlas    │  │ Atlas    │  │ Atlas    │  │ Atlas    │ │   │
│  │  │ 800 A3  │  │ 800 A3  │  │ 800 A3  │  │ 800 A3  │ │   │
│  │  │ Node 1  │  │ Node 2  │  │ Node 3  │  │ Node N  │ │   │
│  │  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘ │   │
│  │       │            │            │            │       │   │
│  │       └────────────┴────────────┴────────────┘       │   │
│  │                    │ 超节点互联                       │   │
│  └────────────────────┼──────────────────────────────────┘   │
│                       │                                       │
│                       ▼                                       │
│  ┌──────────────────────────────────────────────────────────┐ │
│  │              vLLM Ascend 推理框架                          │ │
│  ├──────────────────────────────────────────────────────────┤ │
│  │                                                          │ │
│  │  1. 全模态端到端适配                                       │ │
│  │     ┌──────────────┐ ┌──────────────┐ ┌──────────────┐  │ │
│  │     │ 视觉编码器     │ │ 音频编码器    │ │ LLM主干推理   │  │ │
│  │     │ (MoE ViT)    │ │ (Dense)      │ │ (MoE 46层)   │  │ │
│  │     └──────────────┘ └──────────────┘ └──────────────┘  │ │
│  │                                                          │ │
│  │  2. FlashComm 通信优化                                     │ │
│  │     AllReduce → ReduceScatter + AllGather 拆分           │ │
│  │     列向独立算子前移至两阶段通信之间执行                     │ │
│  │     → 消除多卡间重复计算,降低推理时延                      │ │
│  │                                                          │ │
│  │  3. FUSED_MC2 通算融合                                    │ │
│  │     dispatch → gmm1 → swiglu → gmm2 → combine           │ │
│  │     合并为单一大算子 → Kernel Launch减少 + 中间张量不落盘  │ │
│  │     → MoE推理吞吐显著提升                                  │ │
│  │                                                          │ │
│  │  4. MTP 投机推理原生支持                                   │ │
│  │     单次前向并行生成多Token候选 → 校验复用                 │ │
│  │     → TPOT降低50%+                                       │ │
│  │                                                          │ │
│  └──────────────────────────────────────────────────────────┘ │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

9.3 昇腾部署命令

# 使用vLLM Ascend部署dots3-note(Atlas 800 A3集群)
vllm serve dots-studio/dots3-note-prev-fp8 \
  --served-model-name dots3-note-prev \
  --host 0.0.0.0 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --moe-backend deep_gemm \
  --max-model-len 262144 \
  --enable-auto-tool-choice \
  --tool-call-parser dots \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'

十、评测表现与竞品对比

10.1 推理与Agent任务

dots3 note在多个关键benchmark上的表现可圈可点:

评测基准dots3 noteDeepSeek-v4-flashHy3GLM-5.2GPT-5.5
Terminal-Bench 2.175.171.781.082.788.3
ARC-AGI-2 (public)81.435.822.861.485.0
SWE-bench Verified78.478.084.2-88.6
ClawEval (Pass³)73.468.562.478.972.1
WildClawBench61.753.654.266.068.0
IMOAnswerBench90.990.091.091.592.1
Codeforces (Rating)3,0562,7582,8513,3293,362
IFEval93.994.192.094.894.3

关键发现:

  • 在ARC-AGI-2(需要抽象推理的视觉任务)上,dots3 note以81.4分大幅领先其他同量级模型,仅次于GPT-5.5
  • 在Agent任务(ClawEval、WildClawBench)上,dots3 note以16B激活参数取得了与激活参数数倍于己的模型相当的成绩
  • 在IMOAnswerBench上,同系列模型IMO满分的能力得到了验证

10.2 多模态视觉任务

评测基准dots3 noteSeed 2.1 turboQwen3.7PlusKimi K3Gemini-3.5-flash
MMMU pro79.180.180.580.984.6
MathVision87.789.989.593.191.6
ZeroBench@519.018.013.024.021.0
CharxivReasoning83.183.184.283.580.6
PerceptionBench53.448.352.358.560.9
MME Video-V239.336.332.532.552.1

10.3 模型能力矩阵对比图

┌──────────────────────────────────────────────────────────────────────┐
│             dots3-note vs 同类开源模型 能力矩阵对比                   │
├──────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  能力维度        dots3 note   DS-v4-flash   Hy3       GLM-5.2       │
│  ──────────     ──────────   ──────────   ──────    ──────────      │
│  推理能力          ████████    ████████    ████████  █████████       │
│                   ════════    ════════    ════════  ═════════       │
│  代码能力          ███████     ████████    ████████  █████████       │
│                   ════════    ════════    ════════  ═════════       │
│  Agent能力         ████████    ██████      ██████    █████████       │
│                   ════════    ════════    ════════  ═════════       │
│  长上下文(512K)    █████████   ██████      ██████    ████████        │
│                   ════════    ════════    ════════  ═════════       │
│  多模态视觉        ████████    ██          ██        ██████          │
│                   ════════    ════════    ════════  ═════════       │
│  多模态音频        ████████    ██          ██        ██              │
│                   ════════    ════════    ════════  ═════════       │
│  昇腾适配          █████████   ██████      ██████    ██████          │
│                   ════════    ════════    ════════  ═════════       │
│  激活效率          █████████   █████████   ████████  ██████          │
│  (16B/13B/21B/39B)════════    ════════    ════════  ═════════       │
│                                                                      │
│  ████████ = 评分区间  (每格≈12.5分)                                  │
│                                                                      │
│  注: dots3 note 以16B激活参数在Agent、长上下文、多模态和昇腾适配      │
│  方面建立了差异化优势,尤其在"激活效率"维度上表现突出                  │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

十一、部署实践与上手指南

11.1 硬件要求

配置精度显存需求GPU数量建议
推荐配置FP8~160GB8×H100 80GB单节点部署
全精度BF16~580GB8×H100 80GB需要大显存
昇腾配置FP8适配优化8×Atlas 800 A3国产算力

11.2 完整部署流程

# 1. 使用SGLang部署(推荐,支持完整的MTP投机解码)
docker run --gpus all --ipc=host -p 8000:8000 \
  lmsysorg/sglang:dev-dots3-note \
  sglang serve \
  --model-path dots-studio/dots3-note-prev-fp8 \
  --served-model-name dots3-note-prev \
  --host 0.0.0.0 \
  --port 8000 \
  --context-length 524288 \
  --enable-dp-attention \
  --dp-size 8 \
  --tp-size 8 \
  --ep-size 8 \
  --moe-dense-tp-size 1 \
  --page-size 64 \
  --trust-remote-code \
  --attention-backend fa3 \
  --moe-a2a-backend deepep \
  --enable-multimodal \
  --speculative-algorithm NEXTN \
  --speculative-num-steps 3 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 4 \
  --speculative-draft-model-path dots-studio/dots3-note-prev-fp8

# 2. 使用vLLM部署(成熟稳定)
vllm serve dots-studio/dots3-note-prev-fp8 \
  --served-model-name dots3-note-prev \
  --host 0.0.0.0 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --moe-backend deep_gemm \
  --max-model-len 262144 \
  --speculative-config '{"method":"mtp","num_speculative_tokens":3}' \
  --enable-auto-tool-choice --tool-call-parser dots

11.3 客户端调用示例

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="EMPTY"
)

# 文本推理
response = client.chat.completions.create(
    model="dots3-note-prev",
    messages=[{"role": "user", "content": "解释MoE架构的工作原理"}],
    temperature=1.0,
    top_p=0.95,
    max_tokens=2048,
    extra_body={"chat_template_kwargs": {"enable_thinking": True}},
)
print(response.choices[0].message.content)

# 多模态:图像理解
response = client.chat.completions.create(
    model="dots3-note-prev",
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {"url": "https://example.com/chart.png"}
            },
            {"type": "text", "text": "分析这张图表中的趋势"},
        ]
    }],
    max_tokens=1024,
)
print(response.choices[0].message.content)

# 工具调用(Agent模式)
response = client.chat.completions.create(
    model="dots3-note-prev",
    messages=[{"role": "user", "content": "查询北京今天天气,并帮我安排行程"}],
    tools=[{
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取某城市的天气信息",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        }
    }],
    tool_choice="auto",
)
print(response.choices[0].message)

十二、dots3系列路线图与行业影响

12.1 dots3系列层级规划

dots3系列将包含三个层级的模型,分别面向不同场景:

┌──────────────────────────────────────────────────────────────────┐
│                    dots3 系列模型路线图                           │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  层级       模型        定位              目标场景                │
│  ──────   ──────────   ──────────────   ────────────────────     │
│                                                                  │
│  轻量级    note        最轻量级          长程Agent、多模态        │
│            (已开源)     280B/16B         日常任务处理             │
│                        512K上下文        个人助理、工具调用       │
│                                                                  │
│  中级      jazz        能力与速度平衡    复杂推理、编程           │
│            (即将发布)   更大激活参数      专业领域应用             │
│                        中等上下文        企业级工作流             │
│                                                                  │
│  旗舰级    aria        最强能力          前沿研究、极限推理       │
│            (即将发布)   最大参数规模      科学发现、IMO级任务      │
│                        全量上下文        长程复杂研究             │
│                                                                  │
│  ──────────────────────────────────────────────────────────────  │
│                                                                  │
│  正式版 dots3-note 也将于近期开源,届时将有更完整的               │
│  技术报告、训练细节和更稳定的模型权重发布。                       │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

12.2 行业影响与思考

内容平台为什么要做模型?

小红书的这一动作引发了行业对"内容平台自研大模型"的深度思考:

  1. 成本控制:月活超3亿的平台,海量搜索和推荐场景的API调用成本会随规模急剧膨胀,自研模型是长期成本最优解
  2. 数据闭环:平台拥有海量图文和消费决策数据,自研模型可以将数据优势转化为模型能力优势
  3. 场景深耕:小红书在生活决策(旅行、婚庆、装修等)场景有独特的数据积累,通用模型难以覆盖这类长尾但高价值的需求
  4. 生态控制力:模型能力一旦成为核心链路的一部分,完全依赖外部供给存在风险和不确定性

开源的双重意义

  • 直接收益:获取开发者社区的测试反馈、生态支持和硬件适配
  • 战略意义:面向技术社区的公开表达,证明小红书"不只是在应用层接入AI,也在参与底层能力的建设"

十三、总结与展望

dots3 note preview的发布,是内容平台入局开源大模型赛道的一个标志性事件。它以280B总参数/16B激活参数的MoE架构、512K超长上下文、全模态理解和TEMPO长程强化学习训练等一系列技术创新,在推理、Agent和多模态任务上展现了令人印象深刻的竞争力。

值得关注的几个关键点:

  1. MoE架构的极致效率:16B激活参数在多个benchmark上比肩甚至超越数倍参数量的模型,证明了MoE架构在效率上的巨大优势
  2. DSA + SWA的混合注意力:为512K上下文提供了可行的技术路径,实现了稀疏而不疏漏的长程建模
  3. TEMPO训练方法:为长程Agent任务的强化学习训练开辟了新思路,self-critiquing能力可能是通向通用Agent的关键
  4. 昇腾0 Day适配:国产模型+国产算力的完整技术栈,对信创和政企场景有特殊意义
  5. Apache 2.0全面开源:降低了开发者使用门槛,促进了生态建设

当然,预览版也明确标注了自身局限:强化学习训练仍不充分,模型在幻觉控制、文本与多模态能力平衡、稳定性等方面还有待改善。正式版即将发布,届时将有更完整的技术报告和更稳定的模型。

可以说,dots3 note preview的开源,不仅是一次技术发布,更是内容平台在AI时代重新定位自身的宣言。当平台开始从"使用AI"转向"构建AI",大模型竞争的格局正在悄然改变。


参考来源: