模型微调过程中微调数据、偏好数据、预训练数据、测评数据...都是什么意思?有什么差别?数据集里找?如何构造?写完这一篇我真的悟了

文摘   2024-08-13 21:51   浙江  


点击箭头处“蓝色字”,关注更多及时AI资讯!


看标题,大家应该也感觉到本人对于模型微调这个数据集的凌乱程度了,果然就是知识看了千千万,一到实操道道坎儿...介于我分析完RAG的数据,优化了流程后还是没办法让模型输出质量达到完全的预期,那么好的,上大招儿了啊!今天我们就来深入剖析一下微调阶段的数据,为微调做准备了啊!


一不小心又写了一万字...但是绝对干货,大家可以mark住先,凌乱的时候来看一看,或许可以帮到你!嘻嘻




模型训练过程中的数据类型


图片展示了模型训练包含的几个典型的过程,以及每个阶段所需要的数据。

预训练阶段:这是指模型在大规模无标注数据上进行的学习过程。通过这个阶段,模型可以学习到语言的基本结构和模式。

指令微调:在这个步骤中,模型被进一步调整以适应特定的任务或领域。这通常涉及到使用一个较小的数据集(称为“指令微调数据集”),该数据集中包含有标签的信息来指导模型的行为。

强化学习:是一种机器学习方法,它允许模型根据其行为的结果不断改进自己。在这个过程中,模型会收到反馈信号(即奖励或惩罚),并据此调整自己的策略。偏好数据可能指的是用户对模型输出的反馈,这些反馈可以帮助模型了解哪些行为是好的,哪些需要改进。

模型测评:最后一步是对模型的表现进行评估。这通常涉及将模型应用于一组测试数据(即“测评数据”),然后比较它的预测与实际结果之间的差异。如果模型表现良好,则说明它已经成功地学会了如何完成任务;否则,就需要回到前面的步骤进行调整和优化。

下面是各个阶段对应的数据特点和获取方法:

如上的四种数据类型(颜色对应)的发展历史:


我们再来结合Llama模型,来看下四种数据类型的实际类型:

1. 预训练所需要的数据量大、算力高,且训练过程复杂

2. 指令微调数据集所需要的数据量小、算力小,提升业务效果明显,训练过程简单

3. 强化学习数据对数据标注的难度大、训练收敛困难、且场景收益有限

所以一般指令微调也是比较主流的高性价比的方案,也是接下来要重点展开讲解的方式!


再来看看Llama的测评数据

测评数据包含语言有关的中英文数据,以及验证逻辑能力有关的代码和数学相关的数据


指令微调与指令微调数据集


经过大规模数据预训练后的语言模型已经具备较强的模型能力,但由于预训练任务形式所限,这些模型更擅长文本补全,不太适合直接解决具体任务。

而指令微调(也称为有监督微调)是在预训练的基础上,通过在多个已知任务上使用添加了自然语言形式指令的训练数据集进行微调,从而激活模型的各方面性能,提高模型对未知任务的泛化能力和与人类期待的一致性,使其可以在新任务上进行零样本推理。

指令微调数据集的构建流程通常需要遵循几个环节:

1. 人工构建或选择现有的自然语言处理基础训练数据集;

2. 在基础训练数据集上人工构建训练任务,一个数据集可以生成一个到多个任务;

3. 为每个任务设计指令集合,将提示与训练样本的输入数据结合,清晰明确地指导模型的学习方向,从而构成指令微调数据集。

例如,对于文本摘要生成任务,可以在输入数据中添加提示“generate a summary of the following text:”,指示模型在生成文本时应包含文本摘要信息。提示的写作方式可根据不同任务和需求灵活设计,以最大化提高模型生成的效果。

指令微调数据集的输入通常是包含指令的文本,这些指令描述了模型需要执行的具体任务或操作。输出则是模型根据指令生成的相应回答或结果。其目的是让模型学习理解各种指令,并按照指令的要求生成准确、合理的输出。

常见的指令微调数据集通常建立在自然语言处理经典数据集基础上,通过添加指令信息来激活模型在各方面的性能。数据集构建时需要考虑现有训练集的规模及特点、指令信息的标注策略,以及数据标注的人为主观因素影响等关键问题。

例如,指令信息标注应注重任务相关性和清晰性,避免歧义与模糊;在需要逻辑推理的任务上,可采用思维链来提高模型表现能力;标注格式需为多个任务设计一致的输入/输出数据格式以保证多任务融合训练。同时,要注意指令的质量、均衡性,避免同质化现象,以及人工标注的规模和时长的标准化等。


指令微调过程中的数据格式变化


在指令微调的训练流程中,不同的数据格式往往在不同阶段起着关键作用,通常分为以下三类:用户准备的微调数据、模型训练的样本数据和Tokenize后的数据。

我们结合图片中的例子来理解一下流程,用户首先提供 Jsonline 格式的原始数据,然后将其转换为 Chatml 格式以适应特定任务需求。接着,数据会被进一步处理,如 Tokenization,最后保存为 .bin 和 .idx 格式的二进制文件,供模型训练时使用。典型的数据格式还包括 CSV、XML、HDF5 等,它们分别适用于不同类型的任务和应用场景。

用户准备的微调数据(Jsonline 格式)

Jsonline 格式是一种文本文件格式,其中每行包含一个 JSON 对象。这种格式通常用于存储结构化数据,例如用户提供的用于微调模型的数据集。这些数据可以包括输入文本、标签或其他相关特征。

下图表示一个单轮数据示例,其中数据含义如下:


1. "chat_rounds": 表示聊天的轮次。

2. "role": 表示说话者的角色,如"system"表示系统,"human"表示用户,bot表示的是大模型的回复

3. "content": 表示该轮对话的具体内容。

下图是多轮数据示例,多个human和bot就是多轮对话

模型训练的样本数据(Chatml 格式):

chatml是openai提出,是一种专为对话系统设计的数据格式。它包含了对话历史、意图、实体等信息,便于模型理解上下文和进行有效的回答生成。将用户提供的 Jsonline 数据转换成 Chatml 格式是为了更好地适应特定任务的需求,并且方便后续处理和分析。结构如下:

但是这个过程很容易被注入,导致数据出现问题,模型的回答不准确,所以openai现在也主推对话模式,删除了chatml相关的资料

https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/chat-markup-language

在微软Azure官网关于使用GPT系列模型的关于chatML的介绍中也写到:

“使用带有完成端点的GPT - 3.5 - Turbo模型仍处于预览阶段,并且仅适用于版本为(0301)的gpt - 35 - turbo,该版本最早将于2024年8月1日退役。强烈建议使用GA Chat Completion API/端点。Chat Completion API是与GPT - 3.5 - Turbo模型进行交互的推荐方法。同时,Chat Completion API也是访问GPT - 4模型的唯一方式。”

在使用 OpenAI 的相关服务时,Chat Completion API 就是一个用于实现聊天回复生成的应用程序编程接口(API),开发人员可以通过调用这个接口,将用户输入的聊天信息传递给模型,并获取模型生成的回复。

简单来说,Chat Completion API 是实现聊天交互的技术接口,而 ChatML 是用于规范聊天消息格式的语言标准

Tokenize 后的数据 (.bin & .idx 格式):

在NLP任务中,Tokenization是指将文本分解成更小的单元,称为tokens,这些tokens可以是单词、子词甚至字符级别,这有助于模型理解和表示文本。

.bin 和 .idx 文件通常是经过序列化并压缩后的二进制格式,用于存储预处理后的数据,以便于快速加载和使用。

Tokenization过程通常由专门的库或工具完成,如NLTK、spaCy或Hugging Face的Transformers库,以支持高效地读取和写入大量数据。

Tokenized数据通常以序列的形式呈现,即一系列整数或字符串,每个代表一个token。这种格式便于神经网络处理。例如,在使用Transformer模型进行机器翻译任务时,源语言和目标语言句子分别被转换为一系列tokens,并作为模型输入传递给编码器和解码器。

下图对比了三种不同的词汇分割方法:

Byte Pair Encoding(BPE)、WordPiece 和 Unigram模型在tokenize各个阶段对数据的处理:


  • Byte Pair Encoding (BPE):



    • 训练:从一个小的词汇开始,并学习合并令牌的规则。

    • 训练步骤:合并对应于最常见对的令牌。

    • 学习:合并规则和一个词汇表。

    • 编码:将单词拆分为字符并应用训练期间学到的合并操作。



  • WordPiece:



    • 训练:从一个小的词汇开始并学习如何合并令牌。

    • 训练步骤:合并与每个单独令牌频率较低的一对。

    • 学习:仅学习一个词汇表。

    • 编码:找到最长的从词首开始且在词汇表中的子词,然后对剩余部分重复此过程。



  • Unigram:



    • 训练:从一个大的词汇开始并学习删除令牌的规则。

    • 训练步骤:通过最小化整个语料库上的损失来移除词汇中所有令牌。

    • 学习:带有每个令牌得分的词汇表。

    • 编码:找到最可能的单词分割方式,使用训练时学到的分数。


不同的词汇分割方法,目标其实都是创建一个能够表示各种不同单词的固定大小的词汇表,来保持模型的效率和准确性。

下图是一段文字被tokenize后的二进制格式的数据形态


指令微调各阶段数据用途&主流格式


除了上面例子中的格式,我们再来综合的看一下各个阶段对应的数据的定义和其他的主流格式:


指令微调过程中的数据构造


指令微调数据集的几种类型

上图片展示了一个通用指令微调数据集的几种类型:

1.人工生成的指令数据集(Human Generated Datasets, HG)

这是由人类专家手工标注生成的指令-响应对数据集,精心标注和创建的指令与响应的配对数据集。

技术和典型方法:

  • 专家标注:邀请领域专家根据特定的规则和标准,对各种指令进行准确和详细的响应标注。

  • 质量控制:采用多重审核机制,确保标注的准确性、一致性和高质量。

优点:

  • 准确性高:人类专家能够提供精准和符合逻辑的响应。

  • 权威性强:基于专业知识,具有较高的可信度。

缺点:

  • 成本高昂:需要耗费大量的人力和时间。

  • 规模有限:相比自动生成,数量通常较少。

2.模型生成的指令数据集(Model Constructed Datasets, MG)

通过之前已经训练好的模型版本,自动生成大量的自指导指令-响应对数据,进一步扩充训练数据。

技术和典型方法:

  • 自监督学习:模型通过对已有数据的学习,生成新的指令和响应。

  • 迭代生成:不断优化模型,生成更优质的数据。

优点:

  • 数据量大:能够快速生成海量的数据。

  • 成本较低:节省人力标注的成本。

  • 数据多样性:生成的数据可以更好地覆盖各种场景,提高数据的多样性

  • 隐私保护:对于隐私敏感场景,用合成数据进行训练和测试更安全

缺点:

  • 质量可能不稳定:相比人类标注,准确性和合理性可能存在偏差。

  • 可能存在模式化:由于是模型生成,可能存在一定的重复性和模式限制。

3. 收集和改进现有数据集(Collection and Improvement of Existing Datasets, CI)

利用现有的高质量数据集,如 HG&C、Self-Instruct 等已有的高质量数据集进行训练,进行收集和改进,以适应特定的训练需求。

技术和典型方法:

  • 数据筛选:从现有数据集中挑选出符合特定要求和标准的数据。

  • 数据清洗:去除噪声、错误或不相关的数据。

  • 数据标注改进:对原有的标注进行补充或修正。

优点:

  • 利用已有资源:节省从头创建数据集的时间和精力。

  • 基于高质量基础:能够在良好的起点上进行改进和优化。

缺点:

  • 可能存在版权和使用限制:需要遵守原数据集的使用规则。

  • 可能存在适应性问题:原数据集不一定完全符合新的训练目标。

4. 结合多种方式的数据集(Dataset Created with Multiple Methods)

将 HG、MG、C 等多种渠道收集和生成的数据进行整合,构建一个综合、全面的大规模数据集。

技术和典型方法:

  • 数据融合技术:采用合适的算法和方法,将不同来源、格式和特点的数据进行融合。

  • 平衡策略:确保不同类型数据在最终数据集中的比例和权重合理。

优点:

  • 综合优势:结合了人工标注的准确性、模型生成的规模性和现有数据集的质量。

  • 全面覆盖:能够涵盖更广泛的指令类型和场景。

缺点:

  • 数据整合难度大:需要处理不同数据之间的差异和冲突。

  • 质量控制复杂:确保整体数据集的质量一致性具有挑战性。


对比来看,HG 数据集质量高但规模有限,MG 数据集规模大但质量不稳定,CI数据集基于现有资源但可能存在适应性问题,而结合多种方式的数据集旨在综合各方优点,但面临整合和质量控制的挑战。在实际应用中,通常会根据具体的需求和资源情况,灵活选择和运用这些数据集类型。


数据集准备的判断标准


图片展示了一个关于模型微调前的数据准备流程,可以帮助我们在做数据准备时进行判断:

是否有开源数据:检查是否存在可以使用的开源数据集。如果存在,那么可以选择使用了这些公开可用的数据,如果没有开源数据,则进入下一步

是否有输入:考虑是否已经有了用于训练或测试的可以给模型输入的数据。如果有输入数据那么对输入数据的质量控制和清洗工作,以确保其安全性和准确性。如果没有输入数据,则由ChatGPT(或者其他LLM模型)来构建输入输出的数据

是否有输出:考虑是否已经有预期的输出结果数据。如果有输出结果,那么接着之前准备好的输入数据,开始拼接模型训练需要的指令;如果没有输出结果数据,则由ChatGPT(或者其他LLM模型)来构建输入输出的数据

拼接人工Prompt:在收集到足够的有效数据后,根据需求手动编写提示语句(prompt),也就是上面讲到的数据格式,以便引导模型产生期望的回答或者行为。

测试用例:最后一步是对整个流程进行验证和评估,通常会设计一些特定场景下的测试案例来检验模型的表现是否符合预期,包括用于模型验证的数据集


数据集的实际情况与应对方案


1.有输入、有输出

这个时候属于比较理想的情况,方案就是内部数据+开源数据集+instruction指令调优

确保数据质量,进行必要的数据清洗和预处理。如果数据量不足,可以考虑以下方法:

1. 数据增强:通过同义词替换、句子重组、回译等方法增加数据多样性。

2. 迁移学习:利用预训练模型在类似任务上的知识,减少所需数据量。

下面介绍几个配合该阶段进行微调的NLP模型和指令微调数据集

Flan (Few-shot Learner for All NLP tasks)指令调优模型

https://github.com/google-research/FLAN/tree/main

FLAN是一个由Google推出的预训练语言模型,旨在处理多种NLP任务。它的设计目标是能够在少量样本的情况下快速适应各种不同的NLP任务。

主要应用在在只有少量标注数据的情况下,通过自然语言指令(instructions)就能完成各种不同的NLP任务,展现出很强的小样本学习和泛化能力。

FLAN的特点包括:


1. 少量样本学习:FLAN能够在给定很少的示例的情况下,快速学习并执行新任务。

2. 多任务能力:它旨在处理多种类型的NLP任务,如文本分类、问答、摘要等。

3. 灵活性:FLAN的设计允许它适应不同的任务需求,而不需要针对特定任务进行大量的重新训练。

FLAN使用提示学习(prompt learning)的方式进行训练。具体来说,就是将每个NLP任务转换为一个自然语言指令instructions,然后用指令和少量示例去"提示"语言模型,使其针对不同任务生成相应的输出,这种instruction-based的微调方式让FLAN具备multi-task learning的能力,大大提高了模型的可用性和适用范围。

图中展示了Flan模型涉及的一些Fine-tuning任务:

TO-SF (Task-Oriented, Sense-Focused)任务,包括常识推理、问答、代码生成等,偏向以完成特定任务为导向。

Muffin (Moderation, Unimodal, Fewshot, Fairness, Instruction) 任务,包括自然语言推理、常识判断、对话生成等,强调在少样本(Fewshot)和公平性(Fairness)约束下完成指令性(Instruction-based)的单模态(Unimodal)任务。

CoT (Chain-of-Thought)任务,要求模型进行算术推理、因果推理等,生成推理链条,而不是直接给出答案。这是最近在推理型任务上取得突破的一种范式。

Natural Instructions v2,包括27个不同的分类、问答等任务,是一个多任务的自然语言指令数据集。

这些都是在Flan基础模型上进行instruction tuning的任务,覆盖了推理、问答、对话、分类等不同NLP方向,让模型习得遵循指令、执行任务的能力,并服从安全、伦理约束,是构建instrction-tuned语言模型的重要环节。

Flan在模型数据准备和构造阶段主要通过以下几个方面发挥作用:

1. 数据多样性。Flan收集了来自互联网论坛、百科、新闻、书籍等多个领域的大量自然语言数据,涵盖了不同主题、风格和语言。这种数据多样性有助于提高下游任务的泛化能力。

2. 高质量instruction数据。Flan的一个重要特点是利用了大量人工标注的instruction数据。这些数据明确告诉模型要执行的任务,有利于模型准确理解用户意图,生成符合要求的输出。高质量的instruction数据是instruction tuning的关键。

3. 多任务学习。Flan将大量不同类型的NLP任务统一为text-to-text的形式,构建了一个巨大的多任务数据集。在预训练阶段,模型在这个数据集上以instruction的形式学习执行各种任务。多任务学习显著提高了模型的通用语言理解和生成能力。

4. 对比学习。Flan还引入了对比学习的思想,通过随机插入无关instruction,生成负样本数据。模型需要学会区分正负样本,加强了instruction和输出之间的关联性,提高了指令理解的准确率。

5. 大规模预训练。Flan在超大规模语料上进行了长时间的预训练,使模型充分学习了语言的统计规律和知识。大规模预训练为下游instruction tuning任务打下了坚实的基础。

Flan在数据准备阶段注重数据的规模、质量和多样性,在模型构造阶段采用了instruction tuning、多任务学习等策略,最终训练出了一个功能丰富、效果突出的语言模型,在众多NLP任务上取得了很好的表现。

P3

https://huggingface.co/datasets/bigscience/P3

P3,全称为"Problems in庞杂、多语言和常识知识"(Problems in Heterogeneous, Multilingual, and Commonsense Knowledge),是一个大规模的、多语言的常识知识问题解答数据集。这个数据集由BigScience项目创建,旨在推动自然语言处理(NLP)领域在多语言和常识推理方面的进步,专注于多语言和常识知识的问题解答。

P3使用 Promptsource 收集提示,Promptsource 是一个用于在数据集上交互式编写提示的界面,并收集特定于提示的元数据(例如评估指标),P3的特点包括:

1. 多语言:P3包含多种语言的问答对,覆盖了广泛的语言和文化背景。

2. 常识知识:数据集中的问题需要对日常常识有深入的理解。

3. 问题解答:P3专注于生成具体答案的问题,而不仅仅是信息检索。

4. 多样性和规模:P3包含的问题类型多样,数据集规模大,适合训练和评估多语言理解模型。

P3数据集通常用于训练和评估多语言的自然语言理解模型,以测试它们在不同语言和常识知识方面的性能。通过这样的数据集,研究人员可以开发出更加健壮和通用的语言处理模型,更好地服务于全球化的应用场景。

NatInstV2(Natural Instructions v2 )

https://arxiv.org/abs/2204.07705

Natural Instructions (NatInst) v2 是一个数据集,提供更广泛的自然语言指令,包含了来自不同领域和任务的指令-输出对,用于训练和测试AI模型,特别是那些需要理解和执行指令的模型,旨在提供自然语言处理(NLP)任务中更真实、更符合人类指令习惯的样本。

数据集覆盖了广泛的任务类型,如问答、文本分类、文本生成等,旨在训练模型理解和执行自然语言指令的能。NatInstV2的指令通常以自然语言的形式提供,并配有相应的输出示例,使模型能够学习将指令映射到正确输出的映射关系。

这个数据集是对于先前版本的扩展和改进,专注于提升数据的多样性和覆盖范围,以便更好地训练和评估AI模型对自然语言指令的理解与响应能力。

NatInst v2、Flan和P3的关系及用途:

NatInst v2 提供了自然语言指令的数据集,可以用来训练和评估模型对指令的理解。

Flan 作为一个多任务NLP模型,可以使用NatInst v2中的数据来提高其在各种任务上的表现,尤其是在少量样本学习方面。

P3 专注于多语言和常识知识,可以与NatInst v2结合使用,以评估和提升模型在处理多语言指令和常识推理方面的能力。

NatInstV2(Natural Instructions v2)和P3(Problems in Heterogeneous, Multilingual, and Commonsense Knowledge)都是用于训练大型语言模型(如Flan)的数据集。它们在模型训练中扮演重要角色,帮助模型学习自然语言理解和生成的能力。


2.有输入、无输出


人工标注:如果数据集不大,可以聘请专家进行标注。

半监督学习:利用已有的有输入有输出的数据,通过某种方式(如聚类、自学习等)为无输出样本生成伪标签,然后进行训练。

迁移学习:使用预训练模型对无输出样本进行预测,将预测结果作为临时标签进行训练。

数据增强:通过对已有数据进行变换(如旋转、缩放、裁剪等),生成新的有输入有输出的样本。

伪标签:利用预训练模型对未标注数据进行预测,生成伪标签,但需注意这可能引入噪声。

关注模型结构调整:比如system+prompt工程,对模型的角色设定,prompt补充描述越清晰,结果效果越好,或者更多地依赖于模型的结构优化和超参数调整,提高模型利用现有数据的能力。

这个阶段涉及到的工具有比如Amazon Mechanical Turk, Labelbox, CrowdFlower等众包标注工具。


3. 无输入、无输出


对于这种情况,数据集是完全缺失的,需要更复杂的策略来构造数据:

数据模拟:基于对问题的理解,构建符合实际场景的模拟数据。例如,在图像分类任务中,可以生成具有不同特征的合成图像。

从其他来源获取数据:搜索并收集与当前任务相关的外部数据集,经过适当的预处理后,与现有数据合并。

使用生成模型:如GAN(生成对抗网络)或VAE(变分自编码器)等,生成符合实际分布的新数据。

数据插补:如果部分数据只是缺失了某些特征,可以使用均值、中位数或其他统计量进行插补,或者使用机器学习方法预测缺失值。

任务重新定义:考虑是否可以将问题转化为已存在数据的任务,或者使用类似任务的数据进行迁移学习。

下图是一个基于开源数据源的的采集,并利用大语言模型进行输入/输出数据的生成的流程


提问,使用开源的指令微调数据集时有哪些注意?


指令微调通常需要以下条件:


1. 明确的输入:模型需要具体的输入数据来处理。在没有输入的情况下,模型缺乏处理的对象。

2. 明确的输出:为了训练模型,需要有期望的输出结果,这样模型才能学习如何根据输入生成正确的输出。

3. 成对的数据:指令微调通常依赖于输入和输出对(即数据对),模型通过这些数据对学习如何响应特定的指令。

然而,即使在无输入无输出的情况下,我们仍然可以采取以下措施:

1. 利用相似任务的数据集:如果开源数据集中的任务与你的目标任务相似,你可以使用这些数据集来对模型进行预训练,然后再针对你的任务进行微调。

2. 数据合成:根据你的领域知识,可能可以合成或生成输入数据和相应的输出。例如,使用语言模型生成文本或使用图像生成器创建图像。

3. 任务重新定义:考虑是否可以将你的任务重新定义为一个已经有可用数据集的任务。

4. 主动学习:如果有一些未标注的数据,可以使用主动学习策略,让模型选择哪些数据最需要人类标注,从而逐步构建数据集。

5. 迁移学习:使用在大型数据集上预训练的模型,如在大量文本上训练的BERT模型,然后在你的特定任务上进行微调,即使只有少量数据。

6. 用户反馈:如果可能的话,可以通过用户反馈来生成输入和输出对,例如,让用户执行任务并提供结果。

但是!直接使用指令微调数据集,还是有以下要关注的点:

1. 指令微调数据集通常是为了对预训练模型进行一般性的指令遵循能力优化,但其内容可能不能完全涵盖你的特定任务或领域的独特特征和需求。

2. 你自己的输入和输出数据更贴合你的实际应用场景和问题,具有更强的针对性。直接使用指令微调数据集可能导致模型在你的具体任务上表现不佳。

所以在结合使用的过程中,可以采取以下方式:

1. 数据扩充:将你的输入输出数据作为基础,随机抽取指令微调数据集中的部分数据添加进来,增加数据的多样性和规模。

2. 任务适配:分析你的任务特点和指令微调数据集中任务的共性,选择与你的任务相关度较高的部分数据进行结合。例如,如果你的任务是情感分析,那么从指令微调数据集中选取类似的情感分类相关的数据。

3. 比例调整:根据实际情况,确定你自己的数据和指令微调数据集数据在混合数据中的比例。比如,如果你对模型在你的特定任务上的表现要求较高,可以让你自己的数据占据较大比例。

扫码关注更多AI资讯

我们一起学AI!




同桌的AI小纸条
一个专注于将先进的AI人工智能技术融入日常生活的频道。关注让AI为我们所用,探索人工智能领域的无限可能,并征服他们,让AI赋能生活快乐每一天!
 最新文章