jjzjj

大语言模型的进化树,这是一份超详细ChatGPT「食用」指南

机器之心 2024-02-12 原文

而在实际探索的过程中,实践者可能会苦于寻找适合自己应用的 AI 模型:是选择 LLM 还是微调模型?如果用 LLM,又该选择哪一种?

近日,来自亚马逊、德州农工大学、莱斯大学等机构的学者对 ChatGPT 等语言模型的发展历程进行了一番讨论,其文章也得到了 Yann LeCun 的转推。

论文:https://arxiv.org/abs/2304.13712

相关资源:https://github.com/Mooler0410/LLMsPracticalGuide

本文将从实际应用角度出发,探讨适用 LLM 的任务以及在选择模型时需要考虑的模型、数据和任务等方面实际问题。

1 引言

近年来,发展迅猛的大型语言模型(LLM)已然引发了自然语言处理(NLP)领域的革命。这些模型非常强大,有望解决许多不同种类的 NLP 任务 —— 从自然语言理解(NLU)到生成任务,甚至铺就了通往通用人工智能(AGI)之路。但是,为了有效且高效地利用这些模型,我们需要立足实际地理解它们的能力和局限,还要理解 NLP 所涉及的数据和任务。 

这篇论文重点着眼于在下游 NLP 任务中实际应用 LLM 的各个方面,以给实践者和最终用户提供指引。本指南的目标是为读者提供实际有用的建议,以助其了解是否应该为给定任务选用 LLM 以及如何选择最适用的 LLM—— 这其中需要考虑诸多因素,比如模型大小、计算需求、具体领域是否已有预训练模型等。本文还会从实际应用角度介绍和解释 LLM,这些实用知识能助力实践者和最终用户成功利用 LLM 的力量来解决他们自己的 NLP 任务。

本文的结构为:本文首先会简要介绍 LLM,其中主要会讨论最重要的 GPT 式和 BERT 式架构。然后会深入介绍数据方面影响模型性能表现的关键因素,包括预训练数据、训练数据 / 调优数据、测试数据。在最后也是最重要的部分,本文会深入各种具体的 NLP 任务,介绍 LLM 是否适用于知识密集型任务、传统 NLU 任务和生成任务,此外还会描述这些模型不断获得的新能力以及具有挑战性的现实世界应用场景。我们会提供详细的案例,以彰显 LLM 在实践中有用和有局限的地方。 

为了分析大型语言模型的能力,本文会将它们与微调模型(fine-tuned model)进行比较。对于 LLM 和微调模型的定义,目前而言我们还没有一个得到广泛认可的标准。为了实际有效地区分,本文给出的定义如下:LLM 是指在大规模数据集上预训练得到的大型语言模型并且没有针对具体任务调整数据;微调模型则通常更小一些,它们在经过预训练后还会在更小的具体任务数据集上做进一步微调,以优化它们在该任务上的表现。 

本文总结了在以下方面使用 LLM 的实用指南:

  • 自然语言理解。当实际数据不在训练数据的分布范围内或训练数据非常少时,可利用 LLM 那出色的泛化能力。 
  • 自然语言生成。使用 LLM 的能力为各种应用创造连贯的、上下文相关的和高质量的文本。 
  • 知识密集型任务。利用 LLM 中存储的广博知识来处理需要特定专业知识或一般性世界知识的任务。 
  • 推理能力。理解和利用 LLM 的推理能力来提升各种情形中制定决策和解决问题的能力。

2 模型方面的实用指南

图 1:这幅现代 LLM 的进化树追溯了近些年语言模型的发展历程,其中重点凸显了某些最知名的模型。同一分支上的模型关系更近。基于 Transformer 的模型都不用灰色表示:仅解码器模型是蓝色分支,仅编码器模型是粉色分支,编码器 - 解码器模型是绿色分支。模型在时间轴的竖直位置表示其发布时间。实心方块表示开源模型,空心方块则是闭源模型。右下角的堆积条形图是指各家公司和机构的模型数量。

这一节会简要介绍当前表现最佳的 LLM。这些模型有着各不相同的训练策略、模型架构和用例。为了更清晰地理解 LLM 的整体图景,我们可将其分为两大类:编码器 - 解码器或仅编码器(encoder-only)语言模型和仅解码器(decoder-only)语言模型。图 1 详细展示了语言模型的演化过程。基于这幅进化树,我们可以观察到一些有趣的结论:

a)仅解码器模型正逐渐成为 LLM 发展的主导模型。在 LLM 的早期发展阶段,仅解码器模型的流行程度赶不上仅编码器和编码器 - 解码器模型。但在 2021 年之后,GPT-3 的出现改变了行业图景,仅解码器模型经历了爆发式的发展。与此同时,BERT 也为仅编码器模型带来了初始的爆发式增长,但在那之后,仅编码器模型却渐渐淡出了视野。

b)OpenAI 持续保持着其在 LLM 方向上的领先地位,现在如此,未来很可能也是如此。为了开发可与 GPT-3 和 GPT-4 媲美的模型,其它公司和机构正在奋力追赶。OpenAI 的领先地位可能需要归功于其在技术上持续不懈的投入,即便该技术在早期时并未得到广泛认可。

c)Meta 在开源 LLM 和推动 LLM 研究方面贡献卓越。在对开源社区(尤其是与 LLM 相关的)的贡献方面,Meta 尤为突出,是最慷慨的商业公司之一,因为 Meta 开源了其开发的所有 LLM。

d)LLM 开发有闭源的趋势。在 LLM 发展的早期阶段(2020 年之前),绝大部分模型都是开源的。但是,随着 GPT-3 的推出,公司越来越倾向于选择闭源他们的模型,比如 PaLM、LaMDA 和 GPT-4。也因此,学术研究者越来越难以进行 LLM 训练实验。这就导致了一个结果:基于 API 的研究可能会成为学术界的主导方法。

e)编码器 - 解码器模型依然有发展前景,因为公司和机构依然在积极探索这类架构,并且大部分模型都是开源的。谷歌在开源编码器 - 解码器方面有重大贡献。但是,由于仅解码器模型的灵活性和通用性,谷歌在这个方向上坚持成功的希望似乎更小一些。

表 1 简要总结了各种代表性 LLM 的特点。

表 1:大型语言模型的特点

2.1 BERT 式语言模型:编码器 - 解码器或仅编码器

由于自然语言数据很容易获得,并且还能使用无监督训练范式来更好地利用超大规模数据集,因此最近一段时间,自然语言无监督学习的发展获得了长足的进步。一种常用方法是基于上下文来预测句子中被遮掩的词。这种训练范式被称为掩码语言模型(Masked Language Model)。这种训练方式让模型能更深刻地理解词与其上下文之间的关系。这些模型是在大型文本语料上训练的,使用了 Transformer 架构等技术,并且在许多 NLP 任务上达到过最佳表现,比如情感分析和命名实体识别。著名的掩码语言模型有 BERT、RoBERTa 和 T5。由于其在多种任务上的成功表现,掩码语言模型已经成为自然语言处理领域的一种重要工具。

2.2 GPT 式语言模型:仅解码器

尽管语言模型的架构通常与具体任务无关,但这些方法需要基于具体下游任务的数据集进行微调。研究者发现扩增语言模型的规模就能显著提升其在少样本或零样本时的表现。在提升少样本和零样本时的表现方面,最成功的模型是自回归语言模型,它的训练方式是根据给定序列中前面的词来生成下一个词。这些模型已被广泛用于文本生成和问答等下游任务。自回归语言模型包括 GPT-3、OPT、PaLM 和 BLOOM。变革性的 GPT-3 首次表明通过提示和上下文学习能在少 / 零样本时给出合理结果,并由此展现了自回归语言模型的优越性。

另外还有针对具体任务优化的模型,比如用于代码生成的 CodeX 以及用于金融领域的 BloombergGPT。近期的重大突破是 ChatGPT,该模型是针对对话任务优化的 GPT-3,其能为多种现实世界应用生成更具交互性、更连贯且更贴合上下文的对话。

3 数据方面的实用指南

本节将介绍在为下游任务选择合适模型时数据的关键性作用。数据对模型有效性的影响从预训练阶段就开始了,并会一直持续到训练和推理阶段。

重点 1

(1)当下游任务会用到分布之外的数据时,比如使用对抗样本或数据域变化时,LLM 的泛化能力优于微调模型。

(2)当已标注数据有限时,LLM 优于微调模型;当有丰富的已标注数据时,两者都是合理选择,这取决于具体的任务需求。

(3)建议选择预训练使用的数据域与下游任务数据域相似的模型。

4 NLP 任务方面的实用指南

本节将详细讨论 LLM 在多种下游 NLP 任务上是否有用以及对应的模型能力。图 2 是将所有讨论总结成的一张决策流程图。当面对某个任务时,可基于该流程进行快速决策。

图 2:用户为 NLP 应用选择 LLM 或微调模型时的决策流程。这张决策流程图可帮助用户评估他们手头的下游 NLP 任务是否满足特定条件,并且还能基于评估结果确定他们的应用最适合选择 LLM 还是微调模型。在图中的决策流程中,Y 表示符合条件,N 表示不符合条件。最后一个条件的 Y 旁的黄色圆圈表示目前还没有很适合这类应用的模型。

4.1 传统的 NLU 任务

传统 NLU 任务是 NLP 领域中一些基本任务,包括文本分类、命名实体识别(NER)、蕴含预测(entailment prediction)等。这些任务中的许多都可用作更大型 AI 系统的中间步骤,比如将 NER 用于知识图谱构建。

不适用 LLM:对于大多数自然语言理解任务,比如 GLUE 和 SuperGLUE 中的任务,如果该任务已有丰富的标注良好的数据并且测试集中仅有非常少的数据在分布之外,那么微调模型的表现依然更好。当任务与数据集各不相同时,小型微调模型和 LLM 之间的差距也会不同。

适用 LLM:但是,也有些 NLU 任务更适合用 LLM 处理。其中两项代表性任务是繁杂文本的分类问题和对抗式自然语言推理。

重点 2

对传统自然语言理解任务而言,微调模型通常是比 LLM 更好的选择,但如果该任务需要强大的泛化能力,那么 LLM 可提供帮助。

4.2 生成任务

自然语言生成的目标是创建连贯的、有意义的且符合上下文的符号序列,其大致上包含两大类任务。第一类任务关注的重心是将输入文本转换成新的符号序列,例子包括段落摘要和机器翻译。第二类任务则是「开放式生成」,目标是从头开始生成文本或符号,使之准确匹配输入的描述,比如编写电子邮件、撰写新文章、创造虚构故事以及写代码。

适用 LLM:生成任务需要模型全面理解输入的内容或需求并且还需要一定程度的创造力。这正是 LLM 擅长的。

不适用 LLM:在大多数有丰富资源的翻译任务和资源很少的翻译任务上,微调模型的表现更佳,比如 DeltaLM+Zcode。对于有丰富资源的机器翻译,微调模型稍微优于 LLM。对于资源极少的机器翻译,比如英语 - 哈萨克语翻译,微调模型显著优于 LLM。

重点 3

得益于强大的生成能力和创造力,LLM 在大多数生成任务上都有优势。

4.3 知识密集型任务

知识密集型 NLP 任务是指非常依赖背景知识、特定领域专业知识或一般性真实世界知识的任务类别。这些任务需要的不仅仅是模式识别或句法分析。它们高度依赖记忆和适当利用知识,这些知识关联着我们的真实世界的特定实体、事件和常识。

适用 LLM:一般来说,如果有数以十亿计的训练 token 和参数,LLM 所包含的真实世界知识量可远远超越微调模型。

不适用 LLM:某些其它任务需要的知识不同于 LLM 学习到的知识。所需的知识不是 LLM 学习到的关于真实世界的知识。在这样的任务中,LLM 没有明显优势。

重点 4

(1)得益于庞大的真实世界知识,LLM 擅长处理知识密集型任务。(2)当知识需求与所学知识不匹配时,LLM 会遇到困难;或者当任务只需要上下文的知识时,微调模型可以达到与 LLM 同等的表现。

4.4 在扩展规模方面的能力

扩展 LLM 的规模(比如参数、训练计算等)可以极大助力预训练语言模型。通过扩大模型规模,模型处理多种任务的能力通常能得到提升。反映到某些指标上,模型的性能表现与模型规模呈现幂律关系。举个例子,用于度量语言建模性能的交叉熵损失会随模型规模的指数级增长而线性下降,这也被称为「标度律(scaling-law)」。对于推理等某些关键能力,扩大模型规模就能逐渐将这些能力从非常低的水平提升到一个可使用的水平,甚至可接近人类水平。本小节将从规模对 LLM 的能力和行为的影响方面介绍 LLM 的使用。

推理方面的 LLM 用例:推理涉及到理解信息、进行推论和做出决定,是人类智力的一大核心能力。对 NLP 而言,推理却极具挑战性。现有的许多推理任务可以分为常识推理和算术推理两类。模型增大能极大提升 LLM 的算术推理能力。常识推理不仅需要 LLM 记住事实性知识,还需要 LLM 执行一些有关事实的推理步骤。常识推理能力会随模型大小的增长而逐渐提升。相比于微调模型,LLM 在大多数数据集上都表现更优。

涌现能力方面的 LLM 用例:扩增模型规模还能赋予模型一些超越幂律规则的前所未有的奇妙能力。这些能力被称为「涌现能力(emergent ability)」。正如论文《Emergent Abilities of Large Language Models》中定义的那样:LLM 的涌现能力是指小规模模型不具备但出现在大规模模型中的能力。(有关该论文的更多解读可参阅《Jeff Dean 等人新作:换个角度审视语言模型,规模不够发现不了》)这意味着我们无法基于小规模模型的性能提升而推断预测出这种能力;而在某些任务上,模型的规模一旦超过一定程度,就可能突然获得优异表现。涌现能力通常不可预测并且出人意料,这可能导致模型有能力处理随机出现或意料之外的任务。

不适用 LLM 以及理解涌现:尽管大多数情况下,模型更大,表现也更优,但也依然存在例外情况。

在某些任务上,随着 LLM 规模的提升,模型表现会开始下降。这也被称为反标度现象(Inverse Scaling Phenomenon)。此外研究者还观察到另一个有关规模的有趣现象,即 U 形现象(U-shaped Phenomenon)。顾名思义,该现象是指随着 LLM 模型增大,其在特定任务上的表现一开始会提升,然后会开始下降,之后又会再次提升。

为了推进该领域的研究,我们必需更深入地理解涌现能力、反标度现象和 U 形现象。

重点 5

(1)随着模型规模的指数级增长,LLM 的算术推理和常识推理能力也会上升。(2)随着 LLM 规模的扩增,涌现能力能机缘巧合地发现新用途,比如词处理能力和逻辑能力。(3)模型的能力并不总是会随规模提升,而且我们对大型语言模型的能力与规模的关系的理解还很有限。

4.5 杂项任务

为了更好地理解 LLM 的优势和短板,下面会谈谈上面没有涉及到的其它任务。

不适用 LLM:如果模型目标与训练数据有差异,那么 LLM 在这些任务上通常会遇到困难。

适用 LLM:LLM 尤其适用于某些特定任务。举些例子,LLM 非常擅于模仿人类、LLM 还可用于评估摘要和翻译等某些 NLG 任务的质量、LLM 的某些能力还能带来性能提升之外的其它好处,如可解释性。

重点 6

(1)对于远离 LLM 的预训练目标和数据的任务而言,微调模型和特定领域模型仍有一席之地。(2)LLM 擅于模仿人类、数据标注和生成。它们也可用于 NLP 任务的质量评估,并且有可解释性等好处。

4.6 真实世界「任务」

本小节最后讨论一下 LLM 和微调模型在真实世界「任务」上的应用。这里所用的「任务」一词并不严谨,因为不同于学术场景,真实世界场景通常缺乏形式优良的定义。对模型的很多需求甚至不能被视为 NLP 任务。模型面临的真实世界挑战来自以下三方面:

  • 有噪声的 / 非结构化的输入。真实世界的输入来自真实世界的人,他们大都不是专家。他们并不了解如何与模型适当交互,甚至都可能无法流畅地使用文本。因此,真实世界的输入数据可能很混乱、带有拼写错误、口语化文本和多语言混杂,这不同于预训练或微调使用的定义格式良好的数据。
  • 未被学术界形式化的任务。真实世界场景中的任务通常没有得到学术界的良好定义,并且多样性也远远超出学术研究场景的定义。用户通常提出的查询或请求并不能很好地归入预定义的类别,并且有时单个查询会包含多项任务。
  • 遵从用户的指令。用户的请求可能会包含多个隐含意图(比如对输出格式有具体要求),或者如果没有后续问题,不清楚用户期望的预测结果。模型需要理解用户的意图并提供与这些意图一致的输出。

本质上讲,来自用户请求的这些真实世界难题是因为偏离了针对特定任务设计的任何 NLP 数据集的分布。公共 NLP 数据集并不能反映这些模型的使用方式。

重点 7

相比于微调模型,LLM 更适合用于处理真实世界场景。但是,评估模型在真实世界中的有效性依然是一个悬而未决的问题。

5 其它方面

尽管 LLM 适用于多种下游任务,但也有其它一些因素需要考虑,比如效率和可信度。效率方面涉及到的问题包括 LLM 的训练成本、推理延迟度以及高效利用参数的调优策略。在可信度方面则需要考虑 LLM 的稳健性和校准能力、公平和偏见、潜在的错误相关性以及安全性难题。重点 8(1)如果任务对成本敏感或有严格延迟要求,那么应该优先考虑轻量的本地微调模型。在部署和交付模型时,可考虑进行调优以高效利用参数。(2)LLM 的零样本方法能防止其从具体任务的数据集中学习捷径,而这种情况对微调模型来说却很常见。尽管如此,LLM 仍会表现出一定的捷径学习问题。(3)由于 LLM 潜在的有害或有偏见输出以及幻觉(hallucination)问题可能导致严重后果,因此与 LLM 相关的安全问题应得到最大重视。人类反馈等方法有望缓解这些问题。

6 总结和未来挑战 

这份实用指南提供了有关 LLM 的洞见以及在各种 NLP 任务上使用 LLM 的最佳实践方法。希望这能帮助研究者和实践者利用 LLM 的潜力并推动语言技术的创新。 

当然,LLM 也还有一些有待解决的挑战: 

  • 在真实世界数据集上对模型进行评估。尽管现有的深度学习模型主要是在 ImageNet 等标准学术数据集上进行评估,但标准学术数据集是有局限的,并不能确切反映模型在真实世界中的表现。随着模型的进步,有必要在反映真实需求的更多样化、复杂和真实的数据上评估它们。在学术数据集和真实世界数据集上评估模型,能模型得到更严格的测试,还能让我们更好地理解它们在真实世界应用中的有效性。这能确保模型有能力解决真实世界难题并交付实际可用的解决方案。 
  • 模型合准(Model Alignment)。确保日益强大和自动化的模型与人类价值观和优先项保持一致是非常重要的。我们必须想出办法,确保模型的行为符合预期,并且不要为我们不想要的结果而优化模型。要从模型开发过程一开始就整合合准技术,这是很重要的。在评估和确保合准方面,模型透明性和可解释性也很重要。此外,着眼未来,还有更加艰巨挑战正在显现:对超人类的系统执行合准。尽管目前这一任务超出了我们的需求,但重点是要考虑到合准这样先进的系统并为此做准备,因为它们可能会带来独特的复杂性和道德伦理问题。 
  • 安全性合准(Safety Alignment)。尽管讨论 AI 带来的存在主义风险很重要,但我们还是需要切实的研究来确保能安全地开发先进 AI。这包括用于可解释性、可扩展监督与治理以及模型属性的形式验证的技术。在模型的构建过程中,安全不应被视为一个附加组件,而应是整体的组成部分。 
  • 在模型规模变化时预测其表现。当模型大小和复杂性显著提升时,我们很难预测模型会有何表现。应当开发技术来更好预测模型规模提升或使用新架构时模型的表现情况,这能让我们更高效地使用资源以及加快开发进程。有这样一些可能性:训练一个更小的「种子」模型并通过外推方式预测其增长情况,模拟扩大规模或调整模型的效果,以及对不同规模的模型的测试基准进行迭代以构建标度律。这能让我们在构建模型之前就对模型的性能表现有所了解。

有关大语言模型的进化树,这是一份超详细ChatGPT「食用」指南的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

随机推荐