当前位置: 首页 > news >正文

大规模语言模型:从理论到实践(1)

1、绪论

        大规模语言模型(Large Language Models,LLM)是由包含数百亿以上参数的深度神经网络构建的语言模型,采用自监督学习方法通过大量无标注文本进行训练。自2018年以来,多个公司和研究机构相继发布了多种模型,如BERT和GPT,并在自然语言处理任务中取得了显著的成果。尤其是2022年11月发布的ChatGPT,引发了广泛关注,使得用户能够通过自然语言与系统交互,完成多种任务,包括问答、分类、摘要、翻译和聊天等。本文主要介绍大规模语言模型的基本概念、发展历程和构建流程。

1.1、大规模语言模型基本概念

       直接计算整个句子的联合概率是不现实的,因为涉及到的参数非常庞大。使用链式法则可以将这个复杂的计算分解为几个较小的、易于估计的条件概率。 语言是人类与动物的重要区别,许多知识以自然语言的形式记录和传播。语言模型的目标是建模自然语言的概率分布。词汇表 V 上的语言模型使用链式法则可表示为:

P(w_1 w_2 \ldots w_m) = P(w_1) P(w_2 | w_1) P(w_3 | w_1 w_2) \ldots P(w_m | w_1 w_2 \ldots w_{m-1}) = \prod_{i=1}^{m} P(w_i | w_1 w_2 \ldots w_{i-1})        

        这表示词序列的生成过程为单词逐个生成。例如,对于句子“把努力变成一种习惯”,其概率计算为:

        通过上述过程将联合概率转换为多个条件概率的乘积。为减少模型的参数空间,可以假设任意单词 w_i 的出现概率只与过去 n-1 个词相关:

P(w_i | w_1 w_2 \ldots w_{i-1}) = P(w_i | w_{i-n+1} \ldots w_{i-1})

        这种模型称为 n 元语法或 n 元文法(n-gram)模型。

Q:能举例说明一下直接计算句子得联合概率和使用链式法则计算的方式的区别吗?

A: 

1. 词汇表和语料库

首先,我们需要一个词汇表(vocabulary)和一个训练好的语料库。语料库中的文本数据将用于统计各个词及其组合出现的频率。

2. 频率统计

在语料库中,统计每个词的出现频率以及每对或三词组合的出现频率。例如:

  • 计算“我”的出现次数 C(我)

  • 计算“我 爱”的出现次数 C(我 爱)

  • 计算“我 爱 学习”的出现次数 C(我 爱 学习)

3. 计算联合概率

通过频率统计,我们可以使用最大似然估计(MLE)来估计联合概率:

                        P(我 爱 学习)=C(我 爱 学习)/C(所有句子)

其中,C(所有句子)是语料库中所有句子的总数。

4. 链式法则

由于直接计算联合概率可能非常稀疏,因此通常采用链式法则将其分解为条件概率:

                        P(我 爱 学习)=P(我)×P(爱∣我)×P(学习∣我 爱)

这样,我们可以分别估计每个词的概率和条件概率,通常通过相似的方法进行统计。

        大规模语言模型(LLM)通过分析大量无标注文本来理解和生成自然语言。然而,由于语言的复杂性和多样性,传统的 n 元语言模型在处理稀疏数据时存在一些挑战。具体来说:

  1. 零概率问题:在训练语料中,某些词组可能未出现,这会导致模型计算联合概率时出现零值。因此,平滑技术被引入,以确保每个可能的字符串都有非零的概率。

  2. 平滑技术:通过调整概率分布,使得低概率的词组概率提高,而高概率的词组概率降低,从而使整体分布更加均匀。这有助于减少零概率现象,使模型更为鲁棒。

  3. 缺点

    • n 元语言模型只能建模长度不超过 n 的上下文。

    • 依赖人工设计的平滑规则。

    • 随着 n 的增大,数据稀疏性和模型参数量急剧增加,导致学习困难。

        为了解决这些问题,研究者们转向基于神经网络的语言模型(NLM)。Bengio等人在2000年提出了使用前馈神经网络来估计词的条件概率,这种方法使用词向量(Word Embedding)将词映射为低维稠密向量,能更好地捕捉词之间的相似性。随着深度学习的发展,循环神经网络(RNN)、卷积神经网络(CNN)等方法也被广泛应用于语言模型。这些神经网络模型能够处理长距离依赖关系,并在一定程度上减少数据稀疏问题。

        神经语言模型的训练可以基于大规模无标注文本,这使得自监督学习成为一种主流方法。受计算机视觉领域预训练的启发,自然语言处理也逐渐采用预训练模型的方法。例如,动态词向量模型ELMo、生成式预训练模型GPT和BERT等,代表了基于Transformer的预训练语言模型的最新进展。这些模型在预训练阶段学习了丰富的语言知识,然后通过微调(fine-tuning)来适应特定任务。用户只需在预训练模型上进行监督训练,而无需设计新的网络结构,从而大幅提升了性能。

        在2020年,OpenAI发布了包含1750亿参数的生成式大规模预训练语言模型GPT-3(Generative Pre-trained Transformer 3),这标志着大规模语言模型时代的到来。GPT-3的庞大参数量使得在不同任务上进行微调需要消耗巨大的计算资源,这一预训练微调范式变得不再适用。

新的学习方法

为了应对这一挑战,研究人员开始探索新的方法:

  1. 语境学习(In-context Learning, ICL):直接利用大规模语言模型在少样本场景下进行任务,取得良好效果。

  2. 提示词(Prompt)学习:通过设计提示词来引导模型进行特定任务,而无需进行复杂的微调。

  3. 模型即服务(Model as a Service, MaaS):提供基于模型的服务,使得用户能够方便地使用大规模模型。

  4. 指令微调(Instruction Tuning):通过特定指令进一步优化模型在某些任务上的表现。

        随着这些方法的出现,众多公司和研究机构相继发布了各自的大规模语言模型,如Google的PaLM、Meta的LaMDA、百度的T0等。

缩放法则

Kaplan等人提出了缩放法则(Scaling Laws),强调模型的性能与以下三个因素密切相关:

  • 参数数量

  • 数据集大小

  • 计算量

        研究表明,如下图所示,随着这三者的指数增加,模型的效果会线性提升。具体而言,模型的损失值会随着规模的增加而降低,这为进一步提升大模型规模提供了定量分析依据。

1.2、大规模语言模型发展历史

        尽管大规模语言模型的发展历程不足五年,但其进展速度惊人。截至2023年6月,国内外已发布超过百种大模型,如下图所示,从2019年至2023年5月,比较有影响力且模型参数量超过100亿的大规模语言模型的发展可以粗略分为以下三个阶段:

  1. 基础模型阶段

  2. 能力探索阶段

  3. 突破发展阶段

这些阶段反映了大规模语言模型在技术、应用和研究方面的快速演变。

        大规模语言模型的发展经历了基础模型的建立、能力的探索以及突破性进展,各阶段展现出不同的技术创新和应用潜力,推动了自然语言处理领域的快速发展。

典型开源大模型汇总 ​​​​​​​

典型闭源大模型汇总 

 

  • 基础模型阶段(2018-2021)

  1. 2017年:Vaswani等人提出了Transformer架构,突破了机器翻译任务的瓶颈。
  2. 2018年:Google和OpenAI分别推出了BERT(1.1亿参数和3.4亿参数的BERT-Large)和GPT-1(1.17亿参数),开启预训练语言模型时代。
  3. 2019年:OpenAI发布了GPT-2(15亿参数),Google随后发布了T5(110亿参数)。
  4. 2020年:OpenAI推出了GPT-3(1750亿参数),成为当时最大规模的语言模型。
  5. 国内也推出了如清华大学的ERNIE、百度的ERNIE和华为的盘古-α等大规模语言模型。
  6. 研究集中在各种模型结构(仅编码器、编码器-解码器、仅解码器)和预训练微调。
  • 能力探索阶段(2019-2022)

  1. 探索方法:研究人员探索如何在不进行特定任务微调的情况下,利用大规模语言模型的能力。
  2. 2019年:Radford等人研究了GPT-2的零样本学习能力。
  3. GPT-3:Brown等人提出了通过语境学习(In-Context Learning)进行少样本学习,展示了模型在多个任务上的强大能力。
  4. 指令微调:提出统一生成式自然语言理解框架,利用大量任务进行有监督微调,提升了模型性能。
  5. 2022年:Ouyang等人提出了InstructGPT,结合监督微调和强化学习,提升模型对人类指令的响应能力。
  • 突破发展阶段(2022至今)

  1. ChatGPT发布(2022年11月):通过简单对话框,实现问题回答、文稿撰写、代码生成等多种功能,超越传统自然语言处理系统。
  2. GPT-4发布(2023年3月):具备多模态理解能力,在多种基准考试中表现出色,展现近乎通用人工智能的能力。
  3. 许多公司和研究机构相继发布类似系统,如Google的Bard、百度的文心一言、科大讯飞的星火大模型等。
  4. 从2022年开始,大规模语言模型呈现爆发式增长,各类模型不断涌现。

1.3、大规模语言模型构建流程 

        根据OpenAI联合创始人Andrej Karpathy在微软Build 2023大会上公开的信息,如下图所示,OpenAI的大规模语言模型构建流程可分为四个主要阶段:

1. 预训练(Pretraining)

        在预训练阶段,模型利用大量多样化的数据,包括互联网网页、维基百科、书籍、GitHub、论文和问答网站等,构建一个包含数千亿到数万亿单词的语料库。训练过程中,使用由数千块高性能GPU和高速网络组成的超级计算机,通常需要数十天来完成深度神经网络的参数训练,从而构建基础语言模型(Base Model)。

  • 建模能力:模型能够生成文本,并在接收输入提示(Prompt)后补全句子。研究人员认为,语言模型在训练中也隐含构建了事实性知识(Factual Knowledge)和常识知识(Commonsense),即世界知识(World Knowledge)。

  • 计算资源:例如,GPT-3的训练总计算量达到3640PFlops,使用1000块NVIDIA A100 80G GPU,训练时间约为一个月。其他模型如OPT和BLOOM的训练也消耗了相应的计算资源和时间。

2. 有监督微调(Supervised Finetuning)

        在这一阶段,利用少量高质量的数据集,包括用户输入的提示词和对应的理想输出结果进行训练。

  • 例子:

    • 提示词(Prompt):复旦大学有几个校区?

    • 理想输出:复旦大学现有4个校区,分别是邯郸校区、新江湾校区、枫林校区和张江校区。

        使用这些有监督数据,通过与预训练阶段相同的训练算法在基础模型上进行进一步训练,得到有监督微调模型(SFT模型)。训练后的SFT模型具备初步的指令理解能力和上下文理解能力,可以完成开放领域问题、阅读理解、翻译、生成代码等任务,具备一定的泛化能力。

  • 计算需求:SFT模型训练需要的计算资源相对较少,通常使用数十块GPU,训练时间为数天。许多类似ChatGPT的模型,如Alpaca、Vicuna、MOSS等,都属于这一类型。

3. 奖励建模(Reward Modeling)

        在奖励建模阶段,目标是构建一个文本质量对比模型。对于同一个提示词,SFT模型生成的多个输出结果的质量进行排序。

  • 工作原理:奖励模型(RM模型)通过二分类模型来判断输入的两个输出结果的优劣。RM模型不同于基础模型和SFT模型,不能单独提供给用户使用。训练RM模型通常需要数十块GPU,耗时几天。

  • 数据需求:RM模型的训练需要大规模的对比数据,标注过程需耗费大量人力,标注人员必须认真遵循规范,以确保一致性。此阶段的难点在于如何界定RM模型的泛化边界,以确保模型能够高质量地评估所有生成输出。如下图所示,给出了 InstructGPT 系统中奖励模型训练样本标注示例

4. 强化学习(Reinforcement Learning)

        在强化学习阶段,利用数十万用户提供的提示词,通过之前训练的奖励模型(RM模型)评估SFT模型对用户提示的文本补全结果的质量。这一阶段的提示词数量与有监督微调阶段相似,通常在十万量级,并且不需要人工提前指定每个提示词的理想回复。

  • 工作原理:通过强化学习,调整SFT模型的参数,使得最终生成的文本能够获得更高的奖励(Reward)。这一过程相较于预训练阶段所需的计算量少得多,通常只需要数十块GPU,经过几天即可完成训练。

  • 效果对比:根据文献,强化学习在模型参数量相同的情况下,通常能获得比有监督微调更好的效果。然而,截止到2023年9月,关于为何强化学习能够取得更好结果的原因尚未有完整和广泛认可的解释。

  • 潜在问题:Andrej Karpathy指出,强化学习也存在问题,例如它可能导致基础模型的熵降低,从而减少模型输出的多样性。经过强化学习训练后的RL模型,最终提供给用户的就是一个具备理解用户指令和上下文能力的类ChatGPT系统。

  • 挑战:由于强化学习方法的稳定性较低,并且超参数众多,使得模型收敛难度增加。此外,RM模型的准确性对结果也有重要影响,因此在大规模语言模型中有效应用强化学习仍然面临诸多挑战。

        这四个阶段在数据规模、算法类型和所需资源上存在显著差异,形成了一个逐步优化的模型构建流程,从基础的语言理解到复杂的任务执行能力,确保了模型在实际应用中的有效性和灵活性。

​​​​​​​

1.4、 本专栏后文内容安排

后文围绕大规模语言模型的构建和评估展开,主要涵盖三个部分:

第一部分:预训练相关内容

  • 第2章:介绍大规模语言模型的基础理论,包括语言模型的定义、Transformer架构和大规模语言模型框架,以LLaMA的模型结构为例提供代码实例。

第二部分:理解与指令遵循

  • 第3章和第4章:聚焦于大规模语言模型的预训练阶段,讨论分布式训练中的数据并行、流水线并行和模型并行等技术,以及Zero系列优化方法。同时,介绍预训练所需的数据分布和数据预处理方法,以Deepspeed为例展示如何进行大规模语言模型的预训练。

  • 第5章和第6章:探讨如何在基础模型上利用有监督微调和强化学习方法,提升模型对指令的理解和人类回答能力。包括高效微调方法(如Lora、Delta Tuning)、有监督微调数据构造、强化学习基础及近端策略优化(PPO)。并以DeepSpeed-Chat和MOSS-RLHF为例,展示如何训练类ChatGPT系统。

第三部分:扩展应用与评价

  • 后续章节:将讨论大规模语言模型的应用场景和评价方法,重点分析模型的性能和实用性。

相关文章:

大规模语言模型:从理论到实践(1)

1、绪论 大规模语言模型(Large Language Models,LLM)是由包含数百亿以上参数的深度神经网络构建的语言模型,采用自监督学习方法通过大量无标注文本进行训练。自2018年以来,多个公司和研究机构相继发布了多种模型&#…...

C#如何锁定和解除鼠标及键盘BlockInput

在C#中,"BlockInput"通常指的是一个功能或方法,用于阻止或暂停用户输入一段时间。这在某些特定的应用场景下非常有用,比如在游戏中防止玩家连续快速点击导致游戏逻辑错误,或者在UI应用中防止用户在某个操作正在进行时进…...

Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!

在人工智能的图像生成领域,我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer(MMDiT)驱动的文本到图像模型,它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…...

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10: 这个语句的意思是,从查询结果中跳过前100000条记录,然后返回接下来的10条记录。这通常用于分页查询中,当你需要跳过大量的记录以获取后续的记录时。例如,如果你…...

RabbitMQ 实现消息队列负载均衡

在现代应用程序中,消息队列是一种重要的架构模式,用于解耦服务、处理异步任务和实现负载均衡。其中,RabbitMQ是一个广泛使用的开源消息代理,提供了高可用性、可靠性和灵活性。本文将展示如何使用Python及其pika库来实现RabbitMQ&a…...

嵌入式linux中HTTP协议原理基本分析

第一:HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 HTTP的发展是由蒂姆伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维…...

thinkphp和vue基于Workerman搭建Websocket服务实现用户实时聊天,完整前后端源码demo及数据表sql

最近接了一个陪玩小程序,其中有一个实时聊天的项目,需要搭建Websocke服务,通过多方考虑选择了通过GatewayWorker框架(基于Workerman),将代码提取了出来,用到的框架封装到了vendor目录下,完整前后…...

浅谈射频应用

射频(Radio Frequency,缩写为RF)是一种高频交流变化电磁波的简称,其频率范围广泛,从几十千赫兹跨越至几百吉赫兹。射频技术在多个领域有着广泛的应用: 1、通信领域:射频技术是现代通信领域的重要…...

SAP(PP生产制造)拆解工单业务处理

1、BOM维护 要拆解的成品或半成品要和原成品、半成品BOM一致 2、创建拆解工单 CO01选择拆解工单的类型,以及填写拆解的物料和拆解工厂 维护工单组件 注意: 1、拆解入库组件的数量需要维护为负数 2、拆解工单投料组件数量维护为正数 3、拆解工单收发…...

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作:点击按键和释放按键,也就是按键按下和松开。按键按下的对应的事件是KEYDOWN,按键松开对应…...

deque

deque 底层数据结构 动态开辟的二维数组第一维数组中存放的是第二维数组的指针每个第二维数组大小为512字节。假如存放的是**_Tp类型,每个第二维数组存放512/(sizeof(_Tp**))个元素按照第一维数组大小二倍进行扩容 举例 当deque进行push_back,将下半部分空间元素…...

YOLOv11改进策略【卷积层】| CVPR-2020 Strip Pooling 空间池化模块 处理不规则形状的对象 含二次创新

一、本文介绍 本文记录的是利用Strip Pooling模块优化YOLOv11的目标检测网络模型。Strip Pooling结合了长而窄的卷积核形状在一个空间维度上的长程关系捕捉能力和在另一个空间维度上的局部细节捕捉能力,有效地处理复杂的场景信息。这一机制通过采用 1 N 1N 1N或 N 1 N1 N1的…...

yt-dlp下载视频

插件官方下载地址 通过以下命令行使用 yt-dlp下载 (base) D:\tool\video>cd D:\tool\video (base) PS D:\tool\video> .\vdownlod.bat 此处输入链接或者(base) D:\tool\video>yt-dlp -f bv[extmp4]ba[extm4a] --cookies d:\Downloads\www.youtube.com_cookies.txt -…...

oracle insert忽略主键冲突,忽略重复记录

在INSERT语句中使用IGNORE_ROW_ON_DUPKEY_INDEX提示: INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name, index_name) */ INTO table_name(column1, column2) VALUES(value1, value2); 或 INSERT /* IGNORE_ROW_ON_DUPKEY_INDEX(table_name(column_name)) */ …...

小新学习k8s第四天之发布管理

一、金丝雀发布(灰度发布) Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的…...

01_IAR新建CC2530工程

IAR建立CC2530工程 前言 ​ 由于很多Zigbee商家提供的教程未有从零建立CC2530工程的讲解,可能会导致后面的开发中出现一些琐碎的问题。本文将以LED流水灯为例,从0到1用IAR建立CC2530工程。 IAR介绍 ​ IAR Embedded Workbench被广泛应用于消费电子、…...

原生鸿蒙的竞争力到底如何?

目录 1. 崛起与挑战2. 安全机制3. 自动化检测前移4. 深入探讨开发者服务优势 1. 崛起与挑战 长期以来,移动操作系统市场被IOS和安卓所垄断,一直都难以推出完整的自主系统,面临诸多挑战,如推广困难、应用适配难度大,以及…...

数字化生态平台:关键功能全解析

​在当今数字化浪潮中,数字化生态平台正发挥着举足轻重的作用。那么,它的关键功能究竟有哪些呢?让我们一探究竟。 首先,数据集成与管理是数字化生态平台的重要功能之一。它能够从多个来源收集数据,包括企业内部系统、外…...

c 到 c++ 过渡

c基础入门 #include <iostream> #include <cmath> #include <unistd.h> // 总结&#xff1a;按照书写依次往下&#xff0c;先看 iostream 再看 cxxx 最后 xxx.husing namespace std; // 本质&#xff1a;自定义作用域&#xff0c;作用域就在该命名空间内部。…...

[linux驱动开发--环境搭建] qemu-9.1+linux-kernel-6.11

本文档模拟vexpress-a9开发板&#xff0c;作为铁头娃&#xff0c;要学就学最新的包 已经上传到github仓库 目录 编译qemu-9.1编译linux-kernel-6.11编译busybox-1.36.1NFS挂载 1. qemu-stable-9.1源码编译安装 1.1. 下载qemu源码的stable-9.1分支 仓库地址 mkdir qemu_9.…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...