📍 无忆研习社 › 开源解码 › 深度解读微软 AdNanny:一个 671B 推理大模型如何统一广告离线智能体系

深度解读微软 AdNanny:一个 671B 推理大模型如何统一广告离线智能体系

摘要:微软Bing Ads团队推出AdNanny方案,用DeepSeek-R1 671B统一推理大模型替代多个任务专用小模型,通过推理增强数据构建和多任务自适应训练,在Query-Ad相关性标注、用户画像等离线任务上实现质量提升与运维简化。
字号 100%
行距 2.05
当前可见 60% 的内容
快速摘要:微软 Bing Ads 团队发布了一项名为 AdNanny 的技术方案,其核心思路是用一个基于 DeepSeek-R1 671B 的统一推理大模型,替代广告系统中原本需要多个任务专用小模型才能完成的离线智能任务。 这套方案通过推理增强数据构建、多任务自适应训练以及基于 GRPO 的强化学习对齐,在 Query-Ad 相关性标注、用户画像、查询生成等多个核心任务上均取得了显著的质量提升,同时大幅降低了运维复杂度。如果你对大模型在工业级广告系统中的实际落地感兴趣,或者想理解"一个大模型如何干掉一堆小模型"的技术逻辑,往下看有更详细的拆解。 —— 莫潇羽@无忆研习社

在过去两年里,大语言模型(LLM)的能力边界被不断刷新,从文本理解到代码生成,从多轮对话到复杂推理,几乎每隔几周就能看到新的技术突破。然而在工业界,尤其是在对延迟和稳定性有极端要求的在线广告系统中,LLM 的落地方式一直面临一个尴尬的局面——模型能力越来越强,但实际部署方式却仍然沿用着"一个任务一套模型"的老套路。

微软的 Bing Ads 和 DKI 团队最近公开了一篇名为《AdNanny: One Reasoning LLM for All Offline Ads Recommendation Tasks》的研究论文(论文地址:https://arxiv.org/abs/2602.01563),正式提出了一种用单一推理大模型统一广告离线智能体系的技术路线。这篇文章(莫潇羽@无忆研习社 原创解读),将从技术原理、具体实现方式、训练框架设计等多个维度,为大家做一次尽可能详尽的剖析。


为什么广告系统需要一次"模型整合"

要理解 AdNanny 的价值,首先需要了解当前广告系统在使用大模型时到底遇到了什么问题。

在线广告系统的延迟硬约束

现代搜索广告系统的典型工作流程是:当用户输入一个搜索关键词(Query),系统需要在极短的时间内完成广告候选集的召回、排序和投放决策。这里的"极短时间"不是一个修辞,而是硬性的工程约束——整个端到端的响应时间通常被压缩在个位数毫秒级别。而一个标准的大语言模型,即使经过量化和优化,单次推理也往往需要数百毫秒。这意味着,在线广告系统的核心服务链路上,目前根本无法直接部署一个 LLM 来做实时决策。

因此,业界普遍采用的做法是一种"离线增强 + 在线服务"的混合架构:在离线环节使用 LLM 来完成诸如相关性标注、查询生成、用户画像构建等任务,产出高质量的特征、标签或训练数据,再将这些知识蒸馏(Distillation)到参数量小得多的在线模型中。在线模型虽然能力有限,但推理速度快,可以满足毫秒级的延迟要求。

"一个任务一套模型"带来的碎片化困境

问题出在离线环节。在实际的广告系统中,离线需要处理的任务非常多样化,莫潇羽在这里列举几个典型的:

  • Query-Ad 相关性标注:判断用户搜索词和候选广告之间的语义匹配程度。比如用户搜索"运动鞋推荐",系统需要判断一个卖篮球鞋的广告是"完全相关""部分相关"还是"不相关"。
  • Ad-User 匹配:评估一个广告对特定用户的吸引力和适配度。
  • 查询生成/预测:预测用户可能会输入的搜索词,或者为广告主生成合适的投放关键词。
  • 用户画像构建:基于用户历史行为,提炼出结构化的兴趣标签和消费偏好。
  • 广告创意优化:对广告的标题、描述等创意文案进行质量评估和改写建议。

在传统范式下,每一个这样的任务都会训练一个专门的小规模 LLM(通常是 7B 或 8B 参数量),配备独立的数据清洗管线、训练流程、评估体系和上线机制。这套做法在工程上直接导致了以下几个层面的困难。

第一,知识冗余严重。 这些任务虽然目标不同,但底层所需的知识高度重叠。理解"用户搜索意图"这件事,在相关性标注、查询生成、用户画像三个任务里都是必需的。但由于模型彼此隔离,相同的领域知识不得不在每个模型中各学一遍。

第二,小模型存在能力天花板。 大语言模型的一个基本规律是:模型越大,理解能力和推理能力越强。7B/8B 规模的模型在处理复杂的语义推理任务时,表现明显逊于更大的模型。而在广告场景中,很多决策恰恰需要细致的语义理解——比如区分"苹果手机壳"和"苹果种植技术"这两类搜索意图。

第三,输出缺乏可解释性。 受限于模型规模和训练方式,这些小模型通常只输出一个分类标签或数值分数,而不会给出决策理由。当标注结果出现错误时,工程师很难定位是模型能力不足、训练数据有偏差,还是任务定义本身有问题。

第四,运维成本高企。 假设离线系统中有 10 个不同的任务,就意味着需要维护 10 套独立的 LLM 训练管线。每一套都包含数据采集、预处理、模型训练、评估验证、部署上线、监控报警等环节。任何一个任务的模型需要更新,都要走完一整套流程,工程团队的维护负担可想而知。

莫潇羽@无忆研习社 认为,这种困境的根源在于:行业对 LLM 的使用方式,仍然停留在"前大模型时代"的惯性思维中。过去用传统机器学习模型时,每个任务确实需要一个专属模型,因为那时的模型泛化能力有限。但现在,当一个 671B 参数的推理大模型已经具备了跨任务的通用推理能力时,还沿用"一任务一模型"的策略,就成了一种不必要的浪费。


AdNanny 的核心设计理念

AdNanny 的出发点非常明确:用一个统一的、具备强推理能力的大模型,取代离线广告系统中所有任务专用的小模型。但这并不意味着简单地把一个通用 LLM 拿来用于所有任务——AdNanny 的设计中有几个关键的技术决策,使得这个"统一"在实际工程中成为可能。

基座模型的选择:为什么是 DeepSeek-R1 671B

AdNanny 选择了 DeepSeek-R1 671B 作为基座模型。这个选择背后有几层考量值得展开说明。

DeepSeek-R1 是由 DeepSeek 团队在 2025 年 1 月开源的一个推理增强型大语言模型。它的架构基于 Mixture of Experts(MoE,混合专家模型),总参数量为 671B(6710 亿),但在每次推理时只会激活其中约 37B(370 亿)的参数。这意味着虽然模型的"知识储备"相当庞大,但单次推理的计算成本并不像 671B 这个数字看起来那么恐怖。

从技术架构上看,DeepSeek-R1 继承了 DeepSeek-V3 的核心设计,主要包括以下几个关键组件:

Multi-head Latent Attention(MLA)多头潜在注意力。 这是 DeepSeek 系列模型的标志性创新之一。传统的多头注意力机制在处理长序列时,Key-Value 缓存会占用大量显存。MLA 通过将 Key 和 Value 投影到一个低维的潜在空间中,显著降低了推理时的内存开销,同时保持了对长文本的理解能力。

MoE 稀疏激活架构。 模型共有 61 层,其中大部分层包含 256 个路由专家(Routed Expert)和 1 个共享专家(Shared Expert)。当一个 token(词元)进入 MoE 层时,一个门控网络(Gating Network)会根据 token 的语义特征,动态选择激活其中的 8 个路由专家来处理它(Top-K 路由,K=8 中选 6 个最终参与计算)。这种"按需激活"的设计是 MoE 架构能够在保持大参数量的同时控制计算成本的关键。

推理能力强化。 与普通的语言模型不同,DeepSeek-R1 在训练过程中特别强调了推理能力的培养。它通过大规模的强化学习训练,使模型能够在给出答案之前,生成详细的思维链(Chain of Thought),展示从问题到答案的推理过程。这个特性对 AdNanny 尤为重要,因为广告场景中的很多决策——比如判断一个搜索词和一个广告是否相关——本质上就是一个需要多步推理的语义判断任务。

用莫潇羽的话来总结选择这个基座的逻辑:AdNanny 需要的不是一个"什么都懂一点"的通才模型,而是一个"推理能力过硬、知识容量够大、单次推理成本可控"的专家型模型。DeepSeek-R1 671B 的 MoE 架构恰好同时满足了这三个条件。

定位:离线智能中枢,而非在线服务模型

这一点需要特别强调。AdNanny 的设计目标从一开始就不是直接参与在线广告投放的实时决策。它扮演的是一个离线或近线(near-line)的批处理服务角色,主要职责包括:

  • 为在线模型产出高质量的训练标签和特征
  • 作为离线评估工具,评判不同在线模型的优劣
  • 生成候选查询词和广告创意建议
  • 产出结构化的用户画像

换句话说,AdNanny 是广告系统"幕后的大脑",它的产出会被蒸馏到轻量级的在线模型中,或者直接作为离线分析报告供人工审阅。这种定位既保证了 AdNanny 可以使用大规模模型(因为不需要实时响应),又避免了"LLM 太慢无法上线"的工程困境。


统一任务表达:如何让一个模型理解所有任务

让一个模型同时处理多个截然不同的任务,第一个要解决的问题是:如何用统一的方式向模型描述这些任务,并让模型以统一的格式输出结果。

统一的输入-输出格式设计

AdNanny 将所有离线任务都统一为一种三元组格式:

⟨ 输入(Input), 标签(Label), 自然语言推理(Reasoning)⟩

这里的"输入"根据任务不同会有不同的内容,比如对于相关性标注任务,输入是一对 Query 和 Ad(搜索词和广告);对于用户画像任务,输入是用户的历史行为序列。"标签"是结构化的决策结果,比如"高度相关""部分相关""不相关"。而"自然语言推理"则是模型给出的决策理由,用自然语言解释为什么做出这个判断。

举一个具体的例子来说明。假设任务是判断搜索词"儿童编程课"和广告"某少儿 Python 编程培训班"的相关性。传统的标注模型可能只输出一个标签"相关",但 AdNanny 的输出会是这样的:

标签:高度相关
推理:用户搜索"儿童编程课"表达了为儿童寻找编程教育资源的明确意图。
广告提供的是面向少儿群体的 Python 编程培训课程,目标人群和服务内容
与搜索意图高度吻合。Python 作为一种主流的入门编程语言,适合儿童学习,
因此该广告能够很好地满足用户需求。判定为高度相关。

这种"标签 + 推理"的输出格式带来了几个显著的好处。首先,推理过程本身为标签提供了可解释性,工程师可以直观地看到模型是基于什么逻辑做出的判断。其次,当标注结果出现争议时,推理过程可以作为"证据"供人工审核。最后,也是最关键的——推理过程中蕴含的语义分析模式是可以跨任务共享的。模型在相关性标注任务中学到的"分析用户搜索意图"的推理能力,同样可以用于查询生成和用户画像任务。


推理增强数据构建:从"死记硬背"到"学会思考"

有了统一的任务格式,下一个关键问题是:训练数据从哪里来?尤其是"自然语言推理"这部分,传统的广告标注数据只有离散的标签(比如"相关"或"不相关"),并没有附带推理过程。

AdNanny 团队为此设计了一套三阶段的推理增强数据构建管线(Reasoning-Augmented Data Pipeline)。莫潇羽@无忆研习社 在这里详细拆解一下每个阶段的工作内容。

第一阶段:推理生成(Reasoning Generation)

这个阶段的核心工作是利用 DeepSeek-R1 的原始推理能力,为已有的标注数据补充推理过程。具体的做法是:将已标注的样本(包含输入和标签)输入到 DeepSeek-R1 中,通过精心设计的 Prompt(提示词)引导模型生成一段解释性的推理文本。

这里的 Prompt 设计非常关键。一个好的 Prompt 需要告诉模型:你是一个广告领域的专家标注员,现在需要为你的标注结果提供详细的推理说明。推理应该覆盖哪些维度(比如用户意图分析、广告内容理解、匹配度评估等),采用什么样的逻辑结构,输出什么样的格式。

由于 DeepSeek-R1 本身就是一个推理增强型模型,它在给定标签作为"锚点"的情况下,通常能够生成质量不错的推理过程。但"不错"还不够,因为在工业场景中,训练数据的质量直接决定了最终模型的表现上限。所以还需要后续两个阶段的质量把控。

第二阶段:黄金集验证(Golden Set Validation)

团队维护了一组由资深广告领域专家人工标注的"黄金标准集"(Golden Set)。这个集合中的每个样本都经过多轮人工审核,标签的准确性和推理过程的质量都有保证。

在第二阶段,第一阶段生成的推理样本会在黄金集上进行验证。验证的方式是:将生成的推理过程与黄金集中的专家推理进行对比,评估其逻辑一致性、事实准确性和推理完整性。不通过验证的样本会被标记为低质量样本。

第三阶段:拒绝采样(Rejection Sampling)

拒绝采样是提升数据质量的最后一道关口。其基本原理是:对于同一个输入,让模型多次生成推理过程(通常是多次采样),然后只保留那些推理结果与正确标签一致、且推理过程通过质量检验的样本。那些推理错误或推理质量低下的样本会被"拒绝",不纳入最终的训练集。

用一个更直白的比喻来说,这有点像考试批卷:让模型对同一道题写多份答案,只保留答对了且解题过程也正确的那份。

三阶段数据构建流程:

已标注数据 + Prompt
       │
       ▼
  ┌──────────────┐
  │ 阶段一:推理生成 │  ← DeepSeek-R1 生成推理过程
  └──────────────┘
       │
       ▼
  ┌──────────────┐
  │ 阶段二:黄金集验证 │  ← 与专家标注对比,筛除低质量样本
  └──────────────┘
       │
       ▼
  ┌──────────────┐
  │ 阶段三:拒绝采样 │  ← 多次采样,只保留标签正确+推理优质的样本
  └──────────────┘
       │
       ▼
  高质量推理训练语料

经过这三个阶段的处理,AdNanny 获得了一批"既有正确标签、又有高质量推理过程"的训练数据。这些数据的意义远不止于让模型"知道答案是什么"——更重要的是让模型学会"为什么这个答案是合理的",掌握从问题到答案的推理路径。

莫潇羽在这里特别想强调的一点是,这种推理增强数据构建方式实际上改变了训练的本质。传统的监督学习是一种"模式记忆"——模型看到输入 A 时学会输出标签 B,本质上是在记忆输入到输出的映射关系。一旦遇到训练集中没有出现过的新模式,模型就会束手无策。而推理增强训练则是一种"方法学习"——模型不仅学会了"A 对应 B",还学会了"从 A 推导出 B 的分析方法"。这种分析方法具有更强的迁移性,可以在新的、未见过的输入上发挥作用。这就好比教一个学生做数学题,不仅告诉他答案是 42,还要教他解题思路。掌握了思路的学生面对新题目也能独立解答,而只背答案的学生一旦换了数字就无从下手。

这也正是 AdNanny 能够实现跨任务统一的基础:不同任务虽然表面形态各异,但底层的推理模式——意图识别、语义匹配、逻辑判断——是相通的。通过推理增强数据,这些共通的推理能力可以在一个模型中被统一学习和复用。


多任务自适应训练:防止"偏科"的技术策略

拿到了高质量的推理训练数据之后,下一步就是训练模型。但多任务训练有一个经典的难题:不同任务的难度不同、数据量不同、对模型能力的要求也不同。如果简单地把所有任务的数据混在一起训练,很容易出现"偏科"现象——模型在某些简单任务上过度拟合,而在复杂任务上欠拟合。

AdNanny 采用了一套两阶段的训练策略来解决这个问题。

第一阶段:多任务监督微调(Multi-Task SFT)

第一阶段的核心是在 DeepSeek-R1 671B 的基础上进行监督微调(Supervised Fine-Tuning,简称 SFT),让模型学会以"标签 + 推理"的格式处理各种广告任务。

在这个阶段,AdNanny 引入了一套动态重加权机制(Dynamic Reweighting),在两个粒度上对训练过程进行自适应调节。

实例级动态权重。 对于每一个训练样本,系统会监控模型在该样本上的学习进度。具体来说,通过追踪模型在该样本上的困惑度(Perplexity)随训练轮次的下降情况来评估。如果一个样本的困惑度长期居高不下,说明模型在这个样本上"学得慢",它很可能代表了一种对模型来说比较困难的模式。此时系统会自动提高这个样本的训练权重,让模型在后续训练中更多关注它。相反,如果一个样本的困惑度已经很低了,说明模型已经充分掌握了这个样本的模式,就降低它的权重,避免过度拟合。

这个机制的本质是一种"因材施教"的策略:把更多的学习资源分配给"差生",而不是让"优生"反复复习已经会了的内容。

任务级动态权重。 除了实例级的调节,系统还会在任务级别进行动态平衡。方法是定期在验证集(Validation Set)上评估模型在各个任务上的表现,如果某个任务的表现明显落后于其他任务,就在后续的训练批次中增加该任务样本的采样概率。

这两层动态权重机制共同作用,确保模型在多任务训练中不会出现严重的偏科,各任务的学习进度能够基本保持均衡。

第二阶段:基于广告指标的强化学习对齐(RL Alignment)

仅仅通过监督微调训练出来的模型,可能会出现一个微妙但重要的问题:模型生成的推理过程"看起来很有道理",但实际上对下游业务指标并没有帮助。

举个例子:在查询生成任务中,模型可能会生成一些语义上合理但实际搜索量极低的查询词;在相关性标注任务中,模型的标注结果可能在语义上正确,但对在线模型的训练效果贡献甚微。

为了解决这个问题,AdNanny 在第二阶段引入了基于 GRPO(Group Relative Policy Optimization,组相对策略优化)的强化学习训练。这里有必要先解释一下 GRPO 是什么。

GRPO 的核心原理。 GRPO 是 DeepSeek 团队在 DeepSeekMath 论文中首次提出的一种强化学习算法。它的核心思路可以用一个比喻来理解:假设你是一个写作老师,面前有一个学生写了同一道作文题的多个版本。你不需要一个标准答案来打分(不需要 Critic 模型),而是直接比较这几个版本之间的质量高低——比平均水平好的版本就鼓励,比平均水平差的就惩罚。

用更技术化的语言说,GRPO 的工作流程是这样的:

  • 对于每个输入(Prompt),让当前模型生成多个候选输出(一组"组内样本")
  • 用奖励函数(Reward Function)给每个输出打分
  • 计算组内所有输出的平均得分作为基线(Baseline)
  • 得分高于平均值的输出被视为"好样本",增加其在策略(Policy)中的概率
  • 得分低于平均值的输出被视为"差样本",降低其概率
  • 同时通过 KL 散度约束,防止模型更新幅度过大,保持训练稳定

GRPO 相比传统的 PPO(Proximal Policy Optimization)算法,最大的优势在于不需要训练一个额外的价值网络(Critic/Value Network)。对于 671B 规模的模型来说,省掉 Critic 模型可以节省大量的显存和计算资源。

在 AdNanny 中的应用。 AdNanny 的强化学习阶段,奖励函数直接使用了下游广告系统的业务指标,包括但不限于:

  • Recall@K:在相关性标注场景中,模型标注结果用于训练在线召回模型后,该召回模型在 Top-K 位置的召回率
  • 预估 CTR(Click-Through Rate):模型产出的特征或标签被在线排序模型使用后,对应的点击率预估准确度

通过将这些实际业务指标作为奖励信号,GRPO 训练使得 AdNanny 的输出不仅在语义上合理,更在实际业务效果上有保证。这一步相当于在"语言理解能力"的基础上叠加了"业务目标感知"——模型不再是一个只会"说好话"的语言模型,而是一个能够产出"真正有用的结果"的决策辅助工具。


671B MoE 模型的分布式训练:Megatron 定制化框架

到这里,理论层面的设计已经很清晰了。但从理论到实践之间还有一个巨大的工程挑战:怎么高效训练一个 671B 参数的 MoE 模型?

DeepSeek-R1 671B 的 MoE 架构虽然在推理时只激活 37B 参数,但在训练时需要更新所有 671B 参数的梯度。这意味着模型参数、优化器状态(包括动量和方差等)全部需要存放在 GPU 显存中。以 FP8 精度计算,仅模型参数就需要约 700GB 的显存;如果使用 BF16 精度,则需要约 1.4TB。加上优化器状态和激活值,总显存需求更是惊人。

AdNanny 团队基于 NVIDIA 的 Megatron-LM 框架进行了深度定制,设计了一套针对 DeepSeek-R1 671B 架构的分布式训练方案。莫潇羽@无忆研习社 在这里对这个并行策略做一些详细的解读。

理解 Megatron-LM

Megatron-LM 是 NVIDIA 开发并开源的大模型分布式训练框架,它的核心价值在于提供了多种并行训练策略的高效实现,包括张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)、数据并行(Data Parallelism)和专家并行(Expert Parallelism)。这些并行策略可以灵活组合,以适应不同的模型架构和硬件拓扑。

对于 DeepSeek-R1 这种混合 Dense-MoE 架构(模型中既有标准的 Dense 层,也有 MoE 稀疏层),训练的核心挑战在于:Dense 层和 MoE 层的计算特性完全不同,需要不同的并行策略,而这两种策略又必须在同一个训练流程中无缝衔接。

AdNanny 的三维并行策略

AdNanny 团队最终采用了一套结合了流水线并行、专家并行和数据并行的三维并行方案。以下是各个维度的具体设计:

31 路流水线并行(Pipeline Parallelism, PP=31)。 DeepSeek-R1 有 61 层 Transformer 层。AdNanny 将这些层切分为 31 个流水线阶段(Pipeline Stage),分配到不同的计算节点上。每个节点负责 1 到 2 层。流水线并行的好处是可以将一个超大模型"竖着切"成多段,每段分配到不同的硬件上,解决单机显存不够的问题。

在流水线并行中,一个训练批次(Batch)会被进一步切分为多个微批次(Micro-batch),各微批次在不同的流水线阶段之间顺序流动。这里需要注意的是,流水线并行天然会引入一些"气泡"(Bubble)——即某些阶段在等待上游数据时的空闲时间。Megatron-LM 通过交错的 1F1B(One Forward One Backward)调度策略来尽量减少气泡,提高 GPU 利用率。

8 路专家并行(Expert Parallelism, EP=8)。 对于 MoE 层中的 256 个路由专家,AdNanny 将它们均匀分配到 8 个 GPU 上(每个 GPU 负责 32 个专家)。而共享专家(Shared Expert,每层 1 个,负责处理所有 token 的基础特征)则在 8 个 GPU 上全量复制。

专家并行的关键设计决策是将其限制在单个节点内。因为专家并行需要在不同 GPU 之间交换 token 数据(将 token 路由到它们对应的专家所在的 GPU 上),跨节点的通信带宽远低于节点内通信(节点内通常使用 NVLink,带宽可达 600-900 GB/s,而跨节点通信通常走 InfiniBand,带宽约为节点内的几分之一)。将专家并行限制在单节点内,可以有效避免跨节点通信成为训练的瓶颈。

8 路数据并行(Data Parallelism, DP=8)。 Dense 层(包括 Embedding 层、注意力层等非 MoE 部分)和共享专家的参数在 8 个数据并行组之间复制。每个数据并行组独立处理不同的数据分片,然后通过 All-Reduce 操作同步梯度。

三维并行的组合方式可以用下面这段伪配置来理解:

# AdNanny 并行训练配置(概念示意)
parallel_config:
  pipeline_parallel_size: 31    # 31 个流水线阶段
  expert_parallel_size: 8       # 8 路专家并行(单节点内)
  data_parallel_size: 8         # 8 路数据并行

# 模型切分方式:
# - 61 层 Transformer → 31 个 PP stage(每 stage 1-2 层)
# - 每层 MoE 的 256 个路由专家 → 分配到 8 个 
🔒
该内容仅对更高等级社区用户开放
请谨慎解锁时效性强且发布日期较早的文章
单篇解锁后若未显示全文请刷新页面
您当前:游客 · 可见 60% 内容 · 升级至 注册用户 可见 70%
👀
游客
可见 60%
✓ 当前
注册用户
注册用户
可见 70%
社区精英
社区精英
可见 100%
社区守护
社区守护
可见 100%
仅解锁本文,永久有效。如需PDF珍藏版,请联系站长获取。 当前单篇价格 ¥9.9
✏️ 发表评论

请先登录后发表评论

前往登录
📊 站点统计
今日发布0 篇
文章总数1107 篇
昨日发布1 篇
本月发布31 篇
建站时间456 天
🔍 搜索
站长微语

联系站长

QQ:2805463528
AIGC 技术社区
致力于解码 AI前沿技术 与经验分享
纯粹的技术应用社区

💡 欢迎您的建议与反馈,让社区变得更好

快速通道
联系站长
站长QQ二维码
AI交流群
AI交流群
仍在路上

那些寒夜里追赶过的方向

那些冷眼下没放弃的理想

一篇一篇写到现在

仍在路上

"不羁放纵爱自由"

—— 致敬 Beyond
持续创作中 莫潇羽 · 无忆研习社
▲