书名:动手构建大模型
ISBN:978-7-115-66896-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [加]路易斯-弗朗索瓦·布沙尔(Louis-François Bouchard) [英]路易·彼得斯(Louie Peters)
译 孟二利 鲁 骁 刘春晓 王 斌
责任编辑 武少波
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Building LLMs for Production
Copyright ©2024 by Towards AI, Inc
Simplified Chinese translation copyright © 2025 by Posts & Telecom Press Published by arrangement with Towards AI, Inc.
ALL RIGHTS RESERVED.
本书中文简体字版由Towards AI, Inc授权人民邮电出版社有限公司出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书采用创新且实用的教学策略,巧妙融合理论基础与实践应用,深入剖析自然语言处理(Natural Language Processing,NLP)领域的新进展,以及大语言模型(Large Language Model,LLM)的原理。书中不仅系统阐述了 LLM 的理论基础,还通过实际项目案例展示了如何将这些模型应用于构建RAG系统。本书遵循由浅入深的路径,从LLM的基础知识入手,详细阐释了模型的训练流程,并深入探讨了如何利用提示技术与模型进行高效交互。书中还重点介绍了两个在业界得到广泛认可的框架——LlamaIndex和LangChain,它们是开发RAG应用的强大工具。书中的项目案例不仅为读者提供了宝贵的实践经验,也能够加深读者对相关概念的理解和应用。此外,书中进一步探讨了包括智能体和微调在内的高级技术,这些技术能够显著提升问答系统的性能。
本书既适合无人工智能或NLP背景的读者入门学习,也可作为人工智能等专业本科生、研究生、博士后研究人员、讲师及行业从业者的进阶参考。
本书是关于构建LLM应用的非常全面的教材,旨在帮助读者深入理解从基础理论到高级实践的各方面内容。书中所涉及的应用主题(包括提示技术、RAG、智能体、微调、部署与优化等),对应着AI工程师必备的核心技能。
——Jerry Liu,LlamaIndex联合创始人兼首席执行官
对于任何涉足LLM领域的人士而言,本书实为良好的参考指南。作者深入浅出地解析了各种复杂的概念,使之更易于被读者领悟和实践……本书是新老AI从业者藏书中的佳品良作。
——Shashank Kalanithi,Meta数据工程师
本书是为你量身打造的。书中包含详细的概念解释和实例代码,旨在帮助你快速使用和部署LLM,并提升其性能。强烈推荐!
——Luis Serrano,博士,Serrano.Academy创始人,Grokking Machine Learning作者
本书全面而深入地介绍了LLM的相关知识,以实用为导向,平衡了理论知识与应用知识。书中不仅提供了直观的概念解释、实例应用,还附有代码片段,对于那些期望迅速且高效地掌握该领域知识的读者而言,具有很高的参考价值。
——Jeremy Pinto,蒙特利尔学习算法研究所高级应用研究科学家
本书汇集了丰富的资源,自基础知识开始介绍,逐步引导读者深入理解LLM,涵盖从理论知识到编程实践,直至现代框架的应用等方面的内容。同时也对研究趋势和框架进行了深入分析,助力读者培养对未来技术发展方向的敏锐洞察力。极力推荐!
——Pete Huang,The Neuron联合创始人
若你有意将LLM应用于生产环境,本书将为你提供指导,助你洞悉这些模型的发展历程,包括从基础的Transformer到更为先进的高级RAG。本书内容深入浅出,囊括众多实践项目,你可以轻松复制、粘贴代码并在本地设备中运行,亲身体验现代AI技术的魅力。
——Rafid Al-Humaimidi,AWS(Amazon Web Service)高级软件工程师
作为一名致力于追求提示工程和生成式AI领域术语规范性的研究者,我对本书的全面性感到惊叹。Towards AI出色地整合了现代生成式AI应用实践者所需的技术资源。
——Sander Schulhoff,Learn Prompting创始人兼首席执行官
本书能够帮助个人和企业充分利用LLM的潜力,不仅展示了如何运用新的AI模型及库来打造功能强大的工具,还介绍了如何有效规避当前技术应用中的潜在陷阱……对于任何希望构建LLM产品的人士而言,本书实为良好的参考读物。
——Ken Jee,数据科学主管和播客主持人(Ken’s Nearest Neighbors,Exponential Athlete)
本书详细地提供了从基础到深入的概念解释、实例及全面的细节。Louis与Towards AI团队共同撰写了这部针对开发者的专著,旨在帮助读者拓展AI领域的专业知识,并将其应用于实际项目。本书必将成为个人及技术团队书架上非常有益的参考资料。
——Alex Volkov,Weights & Biases的AI布道者兼ThursdAI.news主持人
本书深入探讨了LLM的核心内容,包括其历史演变过程,并为未来的AI工程师提供了能够使他们在专业领域脱颖而出的工具和技术。本书将带领读者深入研究提示工程、智能体、SFT、RLHF及量化等重要且具有挑战性的主题。
——Greg Coquillo,AI产品负责人,LinkedIn达人
对致力于开发面向客户的LLM应用的专业人士而言,本书是一本实用的阅读材料,也可视为AI工程领域的学习指南。书中提供了诸多实际应用案例,涵盖了 RAG 及提示工程等诸多方面。诚挚建议,不妨亲自翻阅此书。
——Ahmed Moubtahij,工程师,自然语言处理科学家/机器学习工程师
本书是一份内容详细的指导手册(包含代码示例),全面介绍了从架构基础到提示工程、微调、RAG、构建智能体等关键内容。
——Letitia Parcalabescu,NLP博士候选人,YouTube主播
本书全面且均衡地涵盖了LLM的基础知识,成功地在理论与实践之间找到了恰当的平衡……不论AI领域如何演进,此书无疑将成为我反复阅读的宝贵资料。
——Tina Huang,Lonely Octopus创始人,YouTube主播,Meta前员工
本书对LLM落地过程中遇到的实际问题进行了深入分析,并提供了多种解决方案。强烈建议阅读!
——Nick Singh,DataLemur网站创始人,Ace the Data Science Interview作者
在人工智能领域从业的数年中,我亲身体验了高等教育课程与业界实际需求之间的显著差异。本书完整覆盖了这一领域的知识体系,内容涵盖从Transformer到高级RAG部署的全流程。对致力于行业应用的人工智能工程师而言,本书实为良好的参考读物。
——Jack Blandin,Lambda League创始人,高级机器学习工程师
路易斯-弗朗索瓦·布沙尔
我的AI探索之旅始于2019年,当时我正处于攻读系统工程学士学位的最后一年。其间,我荣获了一次表情符号分类比赛的奖项,并在全班同学面前展示了我的工作成果。尽管当时这对我来说是一项挑战,但我意外地爱上了这种体验。我开始享受在众人面前发表演讲,并乐于阐述我的工作流程和实验过程。同时,我也开始将数学和研究应用于实际问题,这让我感到异常激动。2020年1月,我开始攻读人工智能(计算机视觉)硕士学位,并加入了一家初创公司,担任AI部门的负责人。在此期间,我组建了团队,并参与了一些早期的计算机视觉研发项目。同时,我也开设了自己的YouTube频道,分享AI的相关知识。这段初创公司的经历让我深刻体会到学术界与工业界之间的差异。到了2022年,我继续在蒙特利尔学习算法研究所攻读医学人工智能博士学位,因为我对研究充满热情,并期望解决医疗领域的实际问题。同年,我与他人联合创办了Towards AI,该团队致力于降低人们接触AI的门槛,并教授行业技能。2024年初,我对纯研究的热情逐渐消退。经过数月的深思熟虑,我决定放弃博士学位,转而专注于AI在现实世界中的应用,并通过我的公司Towards AI以及我在YouTube上的教育工作,为各种应用构建解决方案。
路易·彼得斯
我对AI的兴趣最初源于科幻文学和影视作品。然而,自2012年AlexNet问世之后,我开始更加密切地关注并追踪机器学习领域的发展。到了2018年,我深信AI即将对世界产生深远的影响,因此我决定转行,投身于AI创业领域。我认识到AI具有巨大的正面影响和潜在的负面影响,尤其让我感到兴奋的是它在促进生物学研究、开发清洁能源及解决贫困问题方面存在巨大潜力。作为Towards AI的首席执行官兼联合创始人,我致力于使AI更易于被个人和企业理解与应用。除了管理我们的图书和课程,我还负责撰写一份每周向超过12万名订阅者发送的AI简报。我拥有帝国理工学院物理学教育背景,并曾就职于摩根大通集团从事投资研究工作,我始终密切关注AI所带来的颠覆性社会影响和经济影响,以及持续推动AI在更多实际场景中落地的技术突破。
Towards AI团队
Towards AI的使命是通过课程、博客、教程、新闻、图书和Discord社区,让AI技术触手可及。自2019年以来,我们已经帮助超过40万人了解AI知识,超过2 500人曾为我们撰写文章。现在,我们还提供LLM培训和咨询服务,帮助企业快速掌握最新的AI工具和模型,或基于它们来构建自己的应用。
我们代表Towards AI,向每一位为本书作出贡献的人士致以诚挚的谢意。特别感谢那些慷慨分享其智慧与见解的杰出人士,在此向你们表达敬意。Ala Falaki和Omar Solano凭借其卓越的技术写作才能,为本书增色不少。同时,我们也对Fabio、Pratik、Rafid和Iva所做的基础工作表示感谢,他们早期的辛勤付出为本书的出版奠定了重要基础。
我们亦衷心感谢Rucha Bhide的深度参与——从构思到写作再到编辑,她严谨的校订和对本书各方面的贡献都是弥足珍贵的。
没有Towards AI团队全体的共同努力和坚持,本书是不可能完成的。我们对大家的辛勤劳动和持续卓越的贡献表示感谢!
——路易斯-弗朗索瓦·布沙尔& 路易·彼得斯,Towards AI联合创始人
本书介绍了自然语言处理(Natural Language Processing,NLP)的基础知识和一些新兴的技术,特别关注大语言模型(Large Language Model,LLM)的发展,并帮助读者深入理解神经网络的内部工作机制。更重要的是,本书重点介绍了如何构建实用的LLM系统。书中提供了独特的、易于上手的实用方法,兼顾理论和实践,面向所有希望构建可满足实际需求的LLM产品的读者。本书还探讨了各种方法,以将基础 LLM 应用于特定任务,从而提高准确性、可靠性和可扩展性。此外,本书还介绍了未来人工智能(Artificial Intelligence,AI)开发者所需的技术栈——提示工程、微调、检索增强生成(Retrieval-Augmented Generation,RAG)和各种工具的使用方法,以解决“开箱即用”LLM可靠性不足的问题。
本书从基础知识开始介绍,通过探索Transformer架构的细节来介绍这些模型的训练原理,以及如何使用提示技术与它们进行交互。随后,本书将焦点转向工业界所关注的应用层面,介绍了两个广为人知的框架——LlamaIndex和LangChain,这两个框架可用于构建RAG系统。书中包含了一系列项目案例,可以让读者实践操作,有助于读者深入理解和应用理论知识。此外,本书还探讨了一些高级技术,例如,使用智能体或微调来增强某个应用的功能。最后,本书讨论了应用的部署,并提供了一些优化流程的高效策略。
本书旨在为那些尚未接触AI或NLP领域的读者提供专业指导。书中深入浅出地探讨了各个核心主题,目的是让读者在即将开展的项目中能够熟练运用AI的强大功能,或者将现有的项目提升至更高水平。掌握一定Python编程语言的基础知识有助于读者更顺利地理解代码并实现其功能,同时,本书对LLM的高级应用场景也进行了详细的阐释。
本书的每一章都围绕一个新主题展开,部分章会给出应用项目,并提供相应的实现指南(采用Google Colab Notebook形式),供读者亲手运行代码并重现书中的结果。这种理论与实践相结合的内容组织方法,不仅有助于读者深入理解各个概念,还能使读者更加有效地将所学知识应用到实际工作中。
LLM是一个快速发展且竞争激烈的领域,新的模型和技术不断涌现。随着技术的发展,LLM将不断解锁新的能力,当前LLM开发栈是可以移植的,并且对于将未来模型适配到特定数据和行业仍至关重要。能够熟练使用当前模型的人最有可能在未来获得优势!我们专注于教授使用LLM构建生产级产品的核心原理,这将使本书的内容在特定模型和代码迭代后依然实用。
本书各章的内容概述如下。
第1章:LLM简介
运用AI进行项目开发的第一步是掌握其背后的核心原理。我们没有必要从头开始构建个人模型,因为可以借助OpenAI等提供的专用API(Application Program Interface,应用程序接口)进行开发,同时对规模法则、上下文窗口、提示词等概念的理解,也能够帮助我们认识到LLM的强大之处。第1章主要介绍LLM的组成,这对于深入理解后续内容具有重要意义。此外,本章还将提供简单的项目案例,演示如何使用LLM进行翻译等,以便使读者能够将所学知识应用于实际任务。
第2章:LLM架构和概况
本章将深入分析各种模型架构,并探讨其在不同应用场景中的设计选择。我们将着重阐述Transformer架构及其组件,以及生成式预训练Transformer(Generative Pre-trained Transformer,GPT)架构的系列模型,这些模型构成了诸如ChatGPT等产品的技术基础。本章还将介绍这些模型的训练目标,介绍一系列模型并探索它们的实际应用,最后我们将探讨它们如何为各行各业赋能。
至此,我们的理论学习旅程暂告一段落,但本书真正的探索之路从这里才正式开始!
第3章:LLM实践
在实践中,LLM仍然存在诸多局限(幻觉、延迟等)。突破这些局限使LLM适用于生产环境,正是我们撰写本书的初衷。本章将探讨这类模型的多个已知问题,如幻觉,即模型高度自信生成实际上错误的回复,以及可能产生性别或种族方面的偏见。我们将强调利用基准测试来评价模型回复的重要性,并通过实验调整不同的超参数来控制模型的输出,例如,尝试不同的解码方法,或通过调整温度参数来调节模型的创造力。随着模型的发展,即使未来模型变得更易于处理,但只要它们不是有意识的,那么我们相信LLM的局限性仍将持续存在。
第4章:提示技术简介
一本关于LLM的书必须包含提示技术的相关内容,即如何与模型进行对话。与指令微调的LLM(经过训练以遵循指令的语言模型,如ChatGPT)互动的最佳方式莫过于直接提问或者明确我们的期望。这个过程被称为提示,现在已经演变成一种复杂且极具技巧性的实践技术。在本章中,我们将通过代码示例测试不同的提示技术。这些技术包括小样本提示,即可以通过向模型提供一些示例来说明我们的期望,以及链式提示技术,这种技术在为模型赋予角色时非常有用。另外本章还将介绍更多先进的方法。
第5章:RAG
本章探讨RAG技术,主要介绍RAG的使用原则和向量数据库的重要性,以及如何将这些信息存储在数据库中,以实现更高效便捷的检索。此外,本章还将介绍如何构建 RAG管道,并强调其在开发智能、可靠的聊天机器人系统中的重要性。
第6章:LangChain和LlamaIndex简介
本章介绍当前广泛使用的两个框架——LangChain和LlamaIndex,它们可以减少LLM的幻觉和偏见,简化LLM的应用,让我们可以轻松地在自己的流程中集成LLM。本章的目标是学习这两个框架的基础知识,并了解它们的应用场景。
第7章:使用LangChain进行提示
LangChain为多种提示技术提供了丰富的接口,使整个操作流程变得直观。本章将介绍如何使用不同的提示类型来为模型设定基本规则、管理人机互动及聊天机器人的回复,从而实现对整个互动过程的追踪。此外,本章还强调使用输出解析器来管理模型输出的重要性,也将讨论如何以特定格式接收回复,以及提供解决格式问题的方案。本章专注于使用外部资源来增强模型的回复,并在多个项目中进行实践。
第8章:索引、检索与数据预处理
本章重点介绍索引创建、从各种数据源加载数据的不同方法,以及将大量信息切分成较小部分的技巧,并探讨如何将这些信息存储在数据库中,以便更容易和更快速地访问。本章还将演示一些令人兴奋的项目实践,例如,构建YouTube视频摘要器,为你的知识库创建语音助手,以及搭建客服问答聊天机器人等。
第9章:高级RAG
本章将介绍针对给定RAG管道的进阶优化技术。我们将重点关注LlamaIndex库,这个库会不断引入新的解决方案(在未来仍会如此),如查询扩展、递归检索和从小到大的检索等。本章将集中讨论可能遭遇的各类挑战、优化策略及聊天机器人性能评价的过程。此外,本章还涵盖LangSmith服务,该服务可为解决问题提供支持。
第10章:智能体
本章将介绍智能体的概念,这些智能体可以与外部环境进行交互。它们不仅可以从各种资源访问数据、调用API,还可以使用运行函数等工具,并在没有指导的情况下完成任务。这些智能体通常根据用户要求制定行动规划,然后按照规划一步一步地执行。本章将给出若干项目来展示如何通过工具提升管道性能,还将探讨BabyAGI和AutoGPT等智能体,其中的示例可以帮助我们创建自主的AI智能体。
第11章:微调
在追求提升模型或RAG管道性能的过程中,最终且至关重要的技术策略无疑是对LLM进行微调,以满足特定应用或场景的需求,这也是本章将介绍的内容。或者,我们也可以运用RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)过程,来引导模型更加精准地遵循用户预设的指令。这一过程可能涉及调整模型以采用某些风格,或者根据不同的场景需求使用不同的工具。微调可能会消耗大量资源和时间,于是我们引入LoRA和QLoRA技术,这些技术将显著减少所需的资源。此外,我们还将介绍如何使用外部服务来微调专有API,例如用医疗数据微调专有API。
第12章:部署与优化
使用LLM时,一个重要的考虑事项是部署过程,尤其是当你想托管自己的模型而不是依赖专有API时。因为这些模型往往具有资源密集性,所以部署的成本可能十分高昂。鉴于此,我们将在本章中探讨部署过程中面临的挑战,并提供一些优化建议以降低成本,降低延迟和对模型的占用,包括模型蒸馏、量化和剪枝等内容。
本书专注于讨论核心的技术栈,致力于使 LLM 适用于特定应用,并使其达到足够的准确性和可靠性阈值,以便付费客户进行扩展使用。具体来说,本书涵盖提示工程、微调、RAG和部署等内容。
使用这些模型构建自己的生产应用和产品仍然需要大量的开发工作,因此阅读本书需要具备一定的Python知识。当然,本书的前几章仍然相对简单易懂。同时,我们也建议读者查阅我们提供的Python资源和其他资源,以深化对AI技术的理解。浏览towardsai.net/book上列出的部分Python资源应该足够让你为阅读本书做好准备。当你对自己的编程技能信心倍增时,就可以回到书中以代码为中心的章节继续学习了。
尽管很多优秀的AI实验室和开源开发者在诸如RLHF等领域付出了重大努力,以使基础模型能适应人类需求,但现成的基础模型仍然存在限制,不易于在生产中直接使用,除非面对的是最简单的任务。
在适应特定应用和场景时,有多种策略可对现成的基础 LLM 进行调优。我们需要做出一个根本的决策:是选择通过API直接使用LLM,还是选择一个更为灵活、允许我们全面访问模型权重的平台使用LLM。尽管有些人可能想尝试训练自己的模型,然而,从实际操作和经济成本来看,这种方法通常只适用于领先的AI实验室和科技公司。现如今,已有超过500万人在OpenAI、Anthropic、Nvidia和Hugging Face等平台上积极构建LLM。本书将引导你突破LLM的局限性,使用关键技术栈开发适合生产环境的LLM产品!
像GPT-4这样的LLM通常缺乏领域特定的知识,其在专业领域生成准确或相关的回复时面临挑战。一些LLM在处理大量数据时也会遇到困难,这同样限制了它们在数据密集型场景中的实用性。另外,它们难以处理新术语或技术术语,这可能导致误解或生成错误信息。幻觉,即LLM生成虚假或误导性信息,使得它们的应用进一步复杂化。幻觉是模型训练目标(下一个Token预测)的直接结果——在某种程度上,这是一种允许模型回复具备创造性的特性。然而,LLM很难知道它自己到底是在根据记忆的事实还是凭空想象回答问题。这会导致在LLM辅助的工作流程中出现许多错误,并且这些错误还非常难以识别。除了幻觉,LLM有时也无法有效利用可用数据,从而产生无关或错误的回复。
由于上述这些限制,LLM通常只能作为在生产中提高性能和生产力的“Copilot”,人类仍然需要全程参与,而不是完全自动化。从一个基本的LLM提示词到达目标Copilot所需的足够准确性、可靠性和可观察性,仍然还有很长的路要走。这段旅程被称为“进军999”(March Of 9s),该术语在汽车自动驾驶的开发中被广泛使用,描述了可靠性的逐步提高,通常以9的数量(如99.9%的可靠性)来衡量。
我们认为,基于LLM产品的“进军999”工程的关键开发技术包括提示工程、RAG、微调和自定义UI/UX(与ChatGPT和Claude一样)。在短期内,通过结合LLM、提示工程、RAG和微调工作流程,AI可以在各个行业中协助许多人工任务。我们认为最成功的AI公司,应该能够利用现有强大的LLM,针对特定行业或细分市场提供高度定制化的解决方案,并利用刚刚提到的4个关键开发技术,为产品的开发提供大量行业特定数据和经验。
RAG只是通过某个知识库来增强LLM,要求模型在回答时使用和引用这些知识,而不是依赖在模型权重中可能记住或没有记住的内容。RAG的优点如下。
● 可以基于现有选择数据来限制LLM的回答,减少幻觉。
● 可以通过明确标注每条评论的出处(如Perplexity AI的做法),确保解释的准确性、对错误的核查以及对版权问题的妥善处理。
● 可以为LLM提供私有/特定或更及时的数据。
● 不过度依赖黑箱LLM经训练/微调后所知道和记住的内容。
● 可以改进任意LLM的回复,而不需要进一步的训练及高额成本。
另一种提高LLM性能的方法是使用良好的提示技术。这种策略能够满足大多数应用的需求,特别是对于简单或定义明确的任务。目前已经有多种提示技术可以提高模型的性能,这些技术可以很简单,例如,给模型详细的指示或将大任务分解成小任务,使其更容易处理。我们将在相关章节中详细阐述模型如何生成答案和提示词,以下是一些必须了解的提示技术。
● 思维链(Chain of Thought,CoT)提示。它要求模型在得出最终答案之前逐步思考问题。该技术的关键思想是,LLM不能仅仅思考和计划要说的内容,还需要一步一步的额外信息来解决问题。但当前LLM的问题在于,它只会基于你的问题和已生成的内容(每次生成一个词,并使用之前生成的多个词作为上下文)生成答案。要求模型按照步骤进行,可以让模型明确在生成真正答案之前必须采取的步骤,从而在采取行动之前模拟某种头脑风暴(或规划)的过程。通过要求LLM逐步推理问题,我们就可以利用模型的全部能力进行思考,通过提供更多不限于问题的内容,帮助它得出正确答案。
● 小样本提示(few shot prompting)。这种方法指的是我们向模型展示一些给定的问题与答案示例,这些问题与我们预期要问的问题类似。就像是向模型展示我们希望它以何种模式进行回复。
● 自我一致性(self consistency)。这种方法指的是向模型的多个版本提出相同的问题,然后选择最常出现的答案。这就类似于向多位专家求教之后基于专家投票进行决策,这种方法有助于获得更可靠的答案。
简而言之,好的提示技术就是通过清晰的指示引导模型,将任务分解为更简单的部分,并使用特定的方法来提高模型性能。这基本上和我们在学校开始新项目时必须遵循的步骤一样,任课教授会假设你已经了解了概念(就像LLM掌握了整个互联网的知识一样),并要求你能够智能地应用它们(一步一步走,和他人合作,参考过去的示例等)。
微调就像是给语言模型增加额外的课程,以改进其在特定任务上的输出结果。例如,如果你希望模型将普通自然语句转换为SQL数据库查询语句,那么就可以专门针对这个任务进行训练。或者,如果需要模型以JSON格式(一种编程中使用的结构化数据格式)给出回复,那么也可以对其进行微调。这个过程还可以帮助模型学习某个特定领域或主题的特定知识。然而,高效的微调训练需要一个大型、高质量且已针对特定任务进行标注的数据集。模型在适应新数据或快速变化的数据以及处理超出训练数据范围的查询方面存在局限性。在这些情况下,使用RAG等其他方法可能更为合适。使用RAG可以更灵活地控制模型所用的信息,使实验阶段更快、更透明且更易于管理,而且成本也更低,因为我们无须重新训练模型,只需“注入”与提示词相关的知识即可。
上述技术的一部分将会集成到下一代基础模型中,还有一部分则会通过添加诸如LlamaIndex和LangChain等框架来解决,特别是针对RAG工作流。要获得最好的解决方案,则需要针对特定行业和应用来定制这些工具。我们认为提示技术和RAG将会长期存在——随着时间的推移,提示技术将成为与人沟通一样必要的技能。
这一代AI模型的潜力使得它们能够处理的任务范围超越了经典的NLP任务。它们的应用场景非常广泛,例如复杂算法解释、机器人构建、软件开发辅助和学术概念诠释等。像DALL-E、Stable Diffusion和Midjourney这样的文生图应用正在革新动画、游戏、艺术、电影和建筑等领域。此外,生成式AI模型在复杂的软件开发中也展示了变革性能力,例如,使用GitHub Copilot等工具进行软件开发。
生成式AI的突破让我们面临一个极其活跃的市场及动态的市场格局。为了更好地理解这一格局,我们可以将其分割成价值链,这使我们能识别出各种参与者、他们的角色以及他们在这一快速发展的市场中所面临的潜在机会和挑战。生成式AI的价值链和贡献者包括:
● AI硬件设计商和制造商,如Nvidia、TSMC、Broadcom和谷歌(TPU);
● AI云平台,如Azure、AWS、谷歌、Together AI、Coreweave和Oracle;
● 提供API访问的闭源基础模型训练商,如OpenAI、Cohere和Anthropic;
● 开放模型权重的基础模型构建商,如 Meta、Mistral和谷歌;
● 访问完整模型的开源平台,如Hugging Face;
● 访问LLM的2C产品,如ChatGPT、Perplexity和Bing;
● 个人生成式AI开发者,如初创公司、副业项目、个人工具;
● 企业内部LLM管道开发,以辅助内部工作流程或改进外部产品。
除了生成式AI的构建者外,我们还有广泛的生成式AI用户群体。具体可能包括使用生成式AI来完成个人任务与使用生成式AI来提高工作效率的个体,还有使用生成式AI来提高生产力或创新性的公司,以及使用生成式AI的国家、地区和其他组织。
随着AI的不断发展,生成式AI的实用性和经济性将很大程度上依赖于其响应速度和定价,而更快更便宜的模型也将支持构建更先进的RAG、微调和智能体管道,来进一步提升性能。随着AI技术不断被采用,AI监管也将成为影响未来AI创新速度的重要指导因素。在未来几年内,我们可能会看到AI行业将更注重质量、能力、实际效果和专有AI解决方案。
所有的代码、Google Colab Notebook、GitHub仓库、研究论文、文档和其他资源都可以在towardsai.net/book访问。
为执行本书所提供的程序代码,必须确保相应的编程环境已配置妥当。请确保所使用的Python版本不低于3.8.1,可通过以下任一选项来配置编程环境。
● 在你的计算机上安装一个代码编辑器。比较流行的编程环境是Visual Studio Code,它使用Python虚拟环境来管理Python库。
● 使用Google Colab Notebook。
注意:考虑到LLM领域的快速变化,其生态系统也可能会发生重大变化。因此,本书中的代码会定期更新到网站towardsai.net/book上,建议定期查看该网站。
在终端执行python命令以确认Python版本是否不低于3.8.1,然后按照以下步骤创建虚拟环境。
1)使用以下命令创建虚拟环境:python -m venv my_venv_name。
2)激活虚拟环境:source my_venv_name/bin/activate。
3)在虚拟环境中安装所需库并运行书中的代码片段。
可以使用pip包管理器安装一些必要的库,其中的requirements文本文件的链接可在towardsai.net/book中找到,具体如下。
deeplake==3.6.19 openai==0.27.8 tiktoken==0.4.0 transformers==4.32.0 torch==2.0.1 numpy==1.23.5 deepspeed==0.10.1 trl==0.7.1 peft==0.5.0 wandb==0.15.8 bitsandbytes==0.41.1 accelerate==0.22.0 tqdm==4.66.1 neural_compressor===2.2.1 onnx===1.14.1 pandas==2.0.3 scipy==1.11.2
请注意,本书中代码的测试和验证均基于上述指定的版本,以保证代码可复现。但在生产环境中,我们建议使用这些软件包的最新版本,需注意版本不一致可能导致运行结果略有差异。此外,特定示例可能需要安装额外的软件包,具体要求将在示例中明确提出。以下代码给出了使用pip安装软件包的方法。
pip install deeplake # 或者(安装特定版本) # pip install deeplake==3.6.5
Google Colab是一个免费的基于云的Jupyter Notebook环境。数据科学家和工程师广泛使用它来训练使用CPU、GPU和TPU的机器学习和深度学习模型。Google Colab具有如下一系列功能:
● 免费访问GPU和TPU以加速模型训练;
● 基于Web界面在虚拟机上运行服务,从而免除了在本地安装软件的需求;
● 与Google Drive和GitHub无缝集成。
只需要一个谷歌账户即可使用Google Colab。在Google Colab中创建的每个Notebook都存储在你的Google Drive中,非常便于访问。在本书中,我们会频繁使用不同模型提供商提供的API,因为这也是访问模型更容易的方式。
一种很方便的在Colab中使用API密钥的方法如下。
1)将API密钥保存在你的Google Drive下名为.env的文件中。例如,保存OpenAI密钥的文件格式如下。
OPENAI_API_KEY=your_openai_key
2)在Colab示例上挂载你的Google Drive。
3)使用dotenv库将它们作为环境变量加载,代码如下。
from dotenv import load_dotenv load_dotenv(‘/content/drive/MyDrive/path/to/.env’)
本书提供如下资源:
● 配套代码文件;
● 本书思维导图;
● 异步社区7天VIP会员。
要获得以上资源,您可以扫描下方二维码,根据指引领取。

作者、译者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”,输入错误信息,单击“提交勘误”按钮即可(见下页图)。本书的作者、译者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作译者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域四十余年的发展与积淀。异步图书面向各行业的信息技术用户。
NLP模型的演变是一段充满创新的故事。从早期的统计模型到第一个大语言模型(Large Language Model,LLM)的诞生,这段历程见证了语言处理模型的兴起。这一时间线展示了模型构建的进程,并没有涉及深入的技术研究,所以如果某些模型的细节看起来比较复杂,不用担心,我们将在后续内容中深入探讨关键概念。
一个早期的语言建模成果是词袋(Bag of Words,BOW)模型,该模型始于1954年,能够基于文档中的词频统计进行文档分类。尽管词袋模型十分简洁,但是它无法考虑词序或上下文。随后,TF-IDF于1972年出现,这种方法对词袋模型进行了改进,能够基于词的罕见程度或出现频率来调整词频的计算方法。该方法会赋予罕见词更高的权重(相比于常见词),提高了模型检测相关文档的能力。2013年引入的Word2Vec标志着一个革命性的突破,这个模型使用词嵌入来捕捉词语之间微妙的语义关联,这是先前的模型无法做到的。如Word2Vec描述的那样,词嵌入是可以捕捉语义关联的高维向量。
随后,循环神经网络(Recurrent Neural Networks,RNN)被引入语言处理任务。RNN擅长从序列中学习模式,能够有效地处理不同长度的文档,并计算文档嵌入和添加词语上下文。1997年,在原有的RNN基础上,发展出了可以处理长期依赖关系的长短期记忆(Long Short-Term Memory,LSTM)模型,以及能够理解上下文的双向循环神经网络(bidirectional RNN)。2014年的编码器-解码器(encoder-decoder)架构RNN则在之前的基础上进行了进一步的改进。
2017年Transformer架构的推出标志着该领域的范式发生转变。Transformer通过其注意力机制(attention mechanism)极大地改善了嵌入计算以及输入和输出之间的对齐方式,彻底改变了NLP任务。在生成输出的过程中,模型的注意力机制允许它选择性地关注输入中最相关的元素。这一突破为2018年BERT的出现提供了基础。BERT使用了双向Transformer,大大提高了各种传统NLP任务的性能。
在接下来的数年中,模型的发展浪潮席卷而来。每一个新推出的模型,如RoBERTa、XLM、ALBERT和ELECTRA,都引入了自己独特的增强和优化策略,不断地拓展着NLP的可行性边界。
LLM是一类复杂的神经网络,其特点是参数量庞大,动辄以数十亿计,这也使它们能够熟练地处理、理解和生成文本。LLM的主要目标是根据前面的一系列词来预测下一个词。正如自GPT-3出现以来我们看到的那样,词语预测也意味着需要解释和创建类似人类给出的文本,捕捉自然语言的细微差别,包括句法结构(词的组织排列)和语义特征(词义)。因为这些模型在大量文本数据上进行了训练,所以能够掌握各种语言模式和结构。
LLM的核心训练目标是预测句子中的下一个词。这个看似简单的目标促使LLM学习语言中的复杂模式和结构,进而由于规模效应(即通过增加模型参数、数据和算力,使模型获得较小模型不具备的新能力)而产生一系列涌现能力(emergent ability)。凭借这些能力,LLM能够回答问题、总结材料,甚至在某些专业考试中表现出色,如通过美国的医学执照考试。
LLM的文本生成是一个自回归(autoregressive)过程,意味着它们将根据已经生成的Token(词元)序列生成下一个Token。注意力机制是这一过程中的关键组件,它通过建立词汇之间的联系确保了文本连贯且符合上下文。
这些模型已经在众多NLP任务中引发了创新,包括机器翻译、自然语言生成、词性标注、句法分析、信息检索等,尽管这些模型并没有在这些特定领域进行过直接训练或微调。
某些关键概念,如模型规模、涌现能力、架构设计和训练数据规模等,将LLM与语言模型区分开来。要理解LLM的卓越特性,需要先了解与之相关的基础术语和概念。
语言模型强大的基础在于其架构设计。RNN因具备处理序列数据的能力,曾被广泛用于文本处理。RNN会维护一个内部状态,该状态会保留历史词汇的信息,从而加深对序列的理解。然而,RNN在处理长序列时会遇到挑战,因为它们会遗忘较早的信息,而偏向于最近处理的输入。这主要是梯度消失(vanishing gradient)问题导致的。
梯度消失指的是在训练过程中用于更新网络权重的梯度(更新权重的目的是进行更好的预测),在序列的每个时间步中向后传播时会变得越来越小。这样会导致与早期输入相关的权重变化很小,从而阻碍网络从数据中学习和记住长期依赖(long-term dependency)关系的能力。
然而,基于Transformer架构的模型解决了这些问题,并逐渐成为NLP任务的首选架构。Transformer在Vaswani等人发表的一篇极具影响力的文章“Attention Is All You Need”中被提出,它是NLP领域的一个关键性创新成果,包括GPT-4、Claude和LLaMA(Large Language Model Meta AI,Meta人工智能大语言模型)在内的目前尖端的模型都是基于Transformer构建的。该架构最初被设计为编码器-解码器框架,在这种架构下,可以使用编码器来处理输入文本,识别重要部分并创建输入的表示。同时,解码器能够将编码器输出的高维向量转换回人类可读的文本。这些架构在摘要生成等任务中非常有用,在摘要生成中,需要处理的文本将传递给编码器,解码器会生成该文本的摘要。Transformer 架构在广泛的任务中可以提供额外的灵活性,因为该架构的组件,即编码器和解码器可以联合使用或独立使用。一些模型可以仅使用编码器将文本转换为向量表示,而仅解码器架构则构成了LLM的主干网络。第2章将介绍Transformer的每一个组件。
随着LLM的兴起,语言建模(language modeling)已成为NLP的重要组成部分。这意味着需要基于大规模语料库学习语言中单词的概率分布。这个学习过程通常涉及使用经典的统计方法或新的深度学习技术来预测序列中的下一个词。
LLM的训练目标与此类似,其基于文本中已出现的文本来预测下一个词、标点符号或其他元素。因为这些模型能够根据上下文预测下一个词,并理解其训练数据中的词汇分布,所以能够熟练处理文本。例如,模型在对“I live in New”开头的句子进行补全时,大概率会选择“York”而不是像“shoe”这样的无关词。
在实践中,模型处理的是词的一部分,称为Token,而不是完整的词。这种方法可以使模型理解不同词的构成成分。例如,模型可以理解“studying”这样的词实际上是由“study”和“ing”两部分组成的。
分词(tokenization)是与LLM交互的第一步。它指的是将输入文本分解为称为Token的较小部分。Token可以从单个字符到整个单词不等,这些Token的大小可以极大地影响模型的性能。一些模型采用了子词分词(subword tokenization),将词分解成保留有意义语言元素的更小片段。
以句子“The child’s coloring book.”为例。
如果分词器在每个空格后拆分文本,输出结果如下。
[“The”, “child's”, "coloring", “book.”]
在这种方法中,你会注意到标点符号仍然附着在“child’s”和“book.”这样的词上。
另一种分词方法是基于空格和标点符号来拆分文本,此时的输出结果如下。
["The", “child”,”'”,”s”,”coloring”,”book”,”.”]
分词过程依赖于具体的模型。模型在发布的同时会给出预训练的分词器和模型的权重。还有一些更高级的分词技术,如字节对编码(Byte-Pair Encoding,BPE),这是大多数模型所使用的分词技术。BPE大体上是通过查看文本语料库(训练数据),根据字节出现频率确定分割数据最有效的方法。首先,它会为每个单个字符创建一个Token。其次,它会将出现次数最多的那些双字节数据(对)当作一个新的Token。最后重复这个过程多次,直到形成完整的Token集合。理论上来说,这一过程可以将文本高效地组织成Token,有效地表示了文本的分布。如下所示,这种方法也会将“coloring”这样的词分成两部分。
[“The”, “child”, “’”, “s”, "color", "ing", "book”, “.”]
子词分词通过将句子拆分为有意义的片段,进一步增强了模型的语言理解能力,如将“coloring”拆分为“color”和“ing”。这扩大了模型的词汇量,并提高了其掌握语言结构和形态细微差别的能力。模型理解了一个单词的“ing”部分表示现在时态,可以简化我们在不同时态中表示单词的方式。我们不再需要为单词的基本形式(如“play”)和其现在时形式(如“playing”)分别保留单独的条目。这种方法虽然增加了表示一段文本的Token数量,但大大减少了需要在字典中保留的Token数量。
分词过程会扫描整个文本以识别独立的Token,然后对这些Token进行索引以创建字典。这个字典会为每个Token分配一个唯一的Token ID(数值而非字符串),从而实现文本的标准化数字表示。在与模型交互时,将文本转换为Token ID能够使模型高效地处理和理解输入,因为它可以快速参考字典来解码每个Token的含义。
一旦有了Token,就需要将Token转换成计算机可以理解的某种形式,即嵌入(embedding)[1]向量。
[1] embedding既有动作过程的含义,也有动作结果的含义。为了便于区分,前者我们统一译为嵌入,后者我们统一译为嵌入向量。——译者注
嵌入是一种将Token(即词或词片段,或者更准确地说是它们的数值型ID)转换成计算机可以处理的数值的方法。嵌入可以帮助模型理解构成语句的词语之间的关系,正如我们稍后讨论注意力机制时看到的那样,上述能力需要通过注意力机制来实现。
嵌入为每个Token赋予了一个独特的数值型ID(高维空间中的向量),以捕捉其含义。虽然这些向量的绝对位置本身没有特定的含义,但向量之间的空间距离在一定程度上反映了向量之间的关系。例如,尽管“happy”和“joyful”是两个不同的词,但在嵌入空间中它们的嵌入向量很接近。
嵌入这一步至关重要,因为它能够帮助模型以数值的方式理解语言,消除了人类语言和机器处理之间的差距。
一开始,每个Token都被分配一组随机数值作为初始嵌入向量。随着模型的训练,即其读取大量文本并从中学习,它会不断调整这些数值。最终使含义相似的Token具有相近的数值集。这种调整是模型在基于Token的不同上下文中学习时自动完成的。
虽然数值集或向量的概念听起来很深奥,但实际上它们只是模型高效地存储和处理Token信息的一种方式。我们之所以采用向量,是因为它们能够直接表示Token之间的关系。本质上,向量不过是一系列的数字列表而已。
在第2章中,我们将探讨更多有关嵌入向量如何在Transformer架构中创建和使用的内容。
LLM在大量文本语料库上进行训练,其目标是正确预测序列的下一个Token。正如前文所述,训练的目标是调整模型的参数,以最大化正确预测的概率。通常来说,LLM基于来自互联网的庞大通用数据集(如The Pile或CommonCrawl)进行训练。有时,更特定的数据集(如StackOverflow Posts)也会被加入训练集中使模型获取领域特定的知识。这个阶段也被称为预训练(pre-training)阶段。
在训练过程中会调整模型的权重,以增加正确预测序列中下一个Token的概率。这种调整基于训练数据,引导模型朝着准确的Token预测方向发展。
预训练后,模型通常会针对某个特定任务进行微调(fine-tuning)。这一阶段需要在面向某个特定任务(如文本翻译)或特定领域(如生物医学、金融等)的较小规模数据集上进行进一步训练。微调使模型能够调整其对特定任务或领域的先验知识,从而提高其性能。
微调过程可能会很复杂,特别是对于像GPT-4这样的高级模型来说更是如此。这些模型采用先进的技术,并利用大量数据进行训练才最终达到较高的性能水平。
在训练或微调阶段之后,模型可以通过预测序列中的后续Token来生成文本。这是通过将序列输入模型,然后模型生成潜在的下一个Token的概率分布来实现的,本质上也就是为词表中的每个词分配一个得分。之后,根据其得分来选择下一个Token。模型每次预测生成一个词,而整个生成过程将不断循环往复,从而生成任意长度的序列。当模型预测到一个特定的“文本结束”Token时,就会遵循以前看到过的典型回复停止生成过程。该“文本结束”Token是模型在训练过程中学到的。因此,输出序列的长度并不是固定的,而是完全取决于它的训练数据(复制其所见过的常规回复风格)和给出的指令。模型的上下文窗口也会限制模型在单次请求中可以处理的Token数目。
上下文窗口(context window),也称为上下文长度(context length)或上下文大小(context size),是LLM的一个关键特征。它指的是模型在单次请求中可以处理的最大Token数。上下文窗口会影响模型可以处理的文本长度上限,进而直接影响模型的性能和输出结果。
语言模型中的上下文窗口代表模型可以同时处理的输入Token数目。如GPT-4,截至2024年1月,它的上下文窗口大约为32K,相当于90页文本。虽然模型能生成的Token数目存在固有的限制,但是最近的技术进步已经将这个数字扩展到了令人惊讶的地步,如Anthropic的Claude的上下文窗口已经达到100K Token,大约相当于156页文本。而谷歌的Gemini,甚至支持数百万Token的处理能力。
上下文窗口主要能够在训练和推理期间扩展模型的注意力,从而提供对上下文更深入的理解。这一特性在向语言模型输入大量特定数据并提出与这些数据相关的问题时特别有益。例如,在分析特定公司或问题的长篇文档时,更大的上下文窗口允许模型回顾并记住更多独特的信息,从而产生更准确和定制化的回复。
规模法则(scaling law)描述了语言模型的性能与多个因素之间的关联关系,这些因素包括模型的参数量、训练数据集的规模、计算资源的投入和网络的架构。Chinchilla论文对这些定律进行了深入的探讨,并为高效地分配资源以实现模型的成功训练提供了宝贵的见解。
按照这篇论文作者的观点,以下因素决定了语言模型的性能。
● 模型的参数量(N)表示模型从数据中学习的潜力。参数本质上是构成模型的可学习权重,它们就像可以调节的旋钮。拥有数百万或数十亿这样的旋钮,可以让模型调整给定的输入以得到期望的输出。这就像你会调节声音系统的低音、混响或增益旋钮,以获得特定歌曲的最佳音质。
● 训练数据集(D)的规模指的是训练模型的数据规模。数据集的规模可以用Token数来度量,而Token可以是从单个字符到一小段文本块的任意内容,更大的数据集会为模型提供更多的信息,从而提高其性能。
● FLOPS(Floating-Point Operations Per Second,每秒浮点操作数)用于评估训练期间消耗的计算资源。
在Chinchilla论文中,作者在一个包含1.4万亿(2T)Token的数据集上训练了一个包含700亿(70B)个参数的Chinchilla模型。这种做法与论文中提出的规模法则相符:对于具有X个参数的模型而言,最佳的训练应涉及大约X × 20个Token。例如,一个具有1 000亿(100B)个参数的模型,理想情况下应在大约2万亿(2T)个Token上进行训练。
通过上述做法,尽管Chinchilla模型的规模比其他LLM要小,但它的性能超过了所有模型。而且它在使用更少内存和计算开销的情况下改进了语言建模和特定任务的性能。感兴趣的读者可以找到论文“Training Compute-Optimal Large Language Models”进行阅读。
最近,很多模型在更大的训练集与模型参数比率下进行了训练。例如,LLaMA 3模型以更小的模型尺寸展现了更强大的性能。这是因为优化了LLM的使用成本或“推理成本”,而不是优化了初始模型训练的成本。
我们提供给LLM作为指令的文本(或者是图像、数字、表格等)通常称为提示词(prompt)。作为生成回复的起点,提示词是提供给LLM的初始输入或查询,用以指导其输出。提示过程(prompting)指的是通过提供此输入与LLM互动以引导模型输出特定信息、回复或行动的过程。输出的质量在很大程度上取决于提示词与模型训练数据的对齐程度以及模型对给定上下文的理解能力。
提示工程(prompt engineering)是一种精心设计和优化提示词的实践,旨在提高模型输出的质量、相关性和准确性。通过优化提示词的结构、措辞和上下文,提示工程的目标是在不改变模型底层架构的情况下提高模型在特定任务上的性能,从而成为增强LLM实际应用价值的关键技术。提示工程师的任务通常包括尝试不同的输入格式、测试措辞或结构的变化,并分析提示词中的微小变化如何影响模型的性能。
提示词可以是一个简单的问题,也可以是一个带有额外上下文、示例和信息的更复杂的输入,以指导模型生成所需的输出。结果的有效性在很大程度上取决于提示词的精确性和相关性。
简洁、描述性强且长度适宜(取决于任务)的提示词通常会带来更有效的结果,它们能够使LLM充分发挥创造力,同时引导其给出期望的输出。使用特定的词语或短语可以帮助模型生成相关内容。创建有效的提示词需要明确目的,保持描述的简单性,同时也可以战略性地使用关键词,注意要确保其可操作性。在最终使用前测试提示词对于确保输出内容相关且无错至关重要。
关于提示技术的内容和实际示例将在第4章深入介绍。
LLM中的涌现能力是指,随着模型规模的增长,模型意外出现的新技能。这些能力包括回答问题和材料总结等,并没有在模型训练过程中明确学习过。与之相反,当模型的规模增加时,这些能力会自发地出现,因此这里用了“涌现”的说法。
当更大的模型展现出某种能力,而较小的模型却没有这种能力时,这种能力即可被认为是涌现的——这种涌现能力也是LLM成功的关键因素之一。例如,像思维链(指示模型执行一系列中间步骤后再提供最终结果)提示或指令遵循(在各种任务上微调模型)这样的方法,只有对达到一定规模的模型,才能带来性能的提升,这强调了模型规模在实现高级能力中的重要性。
扩大语言模型主要体现在增加计算量、扩展模型参数和扩大训练数据集的规模。有时,即使减少训练计算量或减少模型参数,新的能力也可能会出现,特别是使用高质量数据训练模型时。简而言之,涌现能力的出现受到数据数量、质量以及模型参数量等因素的影响。LLM中的涌现能力具有不可预测性,并不能仅仅依据在较小模型中观察到的趋势来预测。
LLM本质上是学习自然语言模式的概率模型。当这些模型的规模扩大时,它们的模式识别能力不仅在数量上有所提高,在质量上也会发生变化。
传统的模型需要针对特定领域进行重训练(微调)和架构调整才能执行特定任务。然而,涌现能力的出现表明,模型正在以超出其预训练的方式进行学习和泛化,这些方式并未被明确编程到模型中。当这些能力在模型的规模-性能曲线上被描绘出来时,我们将会发现一个明显的模式。一开始,模型的表现几乎是随机的,一旦达到某个规模阈值后,其性能会显著提高。这种现象称为相变(phase transition),代表了一种显著的行为变化,而这种变化在较小规模的模型中并不明显。
更令人惊讶的是这些能力的表现方式。随着模型规模的增长,LLM的性能会从接近零迅速且不可预测地提升,有时甚至能够达到最先进的水平。这种现象表明,这些能力的产生源自模型规模的变化,而不是明确的模型编程。这也是许多科学家认为过去几十年AI几乎没有“真正”进步而只是利用改进的计算资源(即GPU)对现有技术进行扩展的原因。
模型规模的增长和训练数据集的扩展为当今LLM的出现提供了基础。例如Cohere Command、GPT和LLaMA,它们中的每一个都代表了语言建模演变中的重要里程碑。
然而,随着语言模型规模的不断扩大,涌现出来的风险也成为一个关注点。这些风险包括了社会层面的多重挑战,这些挑战与模型的准确性、偏见和毒性内容紧密相关。通过引导模型尽量“有益、无害且诚实”可以降低这些风险。其他风险包括潜在的漏洞或有害内容的生成,这些风险在未来的语言模型中可能更常见,或者虽存在于当前模型中但尚未表现出来。
例如,WinoGender基准可以评价职业背景中的性别偏见。评价结果表明,虽然扩大模型的规模可以提高模型的性能,但也可能放大偏见,尤其是在模糊的场景中。较大的模型往往更倾向于记住更多训练数据,像去重等手段可以降低这种风险。
大多数已知的涌现能力与“智能”相关,它们增强了模型的意识、回复能力和知识储备。现在,人们已经创建了很多基准测试来衡量这些新能力。它们使我们能够跟踪语言模型各项属性的进步速度。一些流行的基准测试包括以下几个。
● BIG-Bench套件包含了200多个测试基准任务,涵盖算术运算(例如,“Q:132加762是多少?A:894”)、国际音标转写和单词重组等。这些任务能够评估模型计算、处理和使用罕见词以及运用字母表的能力(例如,“English: The 1931 Malay census was an alarm bell. 国际音标: ðə 1931 ‘meIleI ‘sensəs wɑz ən ə’lɑrm bel.”)。在测试中,像GPT-3和LaMDA这样的模型在这些任务上的表现通常从接近零开始,但在模型达到某个规模后会显著高于随机水平,从而表现出涌现能力。关于该基准测试的更多详细信息可以在其Github仓库中找到。
● TruthfulQA基准测试评价的是模型提供真实回复的能力。它包括两个任务:生成任务,即模型用一两句话回答问题;多项选择任务,即模型从4个选项或是非题中选择正确答案。
● MMLU是通过57个不同领域的任务评估模型掌握的世界知识和解决问题的能力,具体任务包括小学数学、美国历史和计算机科学。在测试中,虽然某些规模的GPT、Gopher和Chinchilla模型在所有主题上的平均表现并不优于随机猜测,但更大规模的模型能够表现出更高的性能,显示出这种能力的涌现。
● WiC基准测试则侧重于语义理解,要求模型通过二分类判断不同上下文中的目标词(动词或名词)是否具有相同的含义。在测试中,即使在大规模情况下,像Chinchilla这样的模型在一开始也无法在单样本任务中超过随机表现。然而,当像PaLM(Pathways Language Model,路径语言模型)这样的模型扩展到更大的规模时,超越随机表现的能力开始显现,表明这种能力会在更大规模下涌现。
● LMSYS基准测试旨在评估语言模型在各种领域(如客服、技术支持和一般对话)中有效进行多轮对话的能力。该基准测试通过将模型与真实用户随机配对,让用户与模型进行对话,然后根据连贯性、相关性和在对话过程中保持上下文的能力来评价模型的表现。这些评分被汇总以评估模型在动态的现实世界对话环境中的表现。早期的模型通常在保持一致性以及提供符合上下文的对话方面存在困难。然而,随着像Claude和GPT这种大规模模型的出现,它们在LMSYS上的表现显著提高,在多轮对话中的交流能力显著提升,这表明模型在多轮对话中涌现出理解能力。
像GPT-3和PaLM这样的LLM标志着基准测试结果的重大飞跃。由OpenAI开发的GPT-3和由谷歌开发的PaLM证明了,通过扩大模型规模和数据量,可以解锁超越早期模型的涌现能力。LLM中的涌现能力描述了模型复杂性提高的同时LLM中出现复杂行为的现象。从GPT-1到“无限注意力”模型的发展历程体现了LLM在规模、算力和架构方面的不断进步,最终展现出了我们今天所见证的非凡能力。
GPT-3及其后续版本是非常出名的LLM,但LLM的旅程始于2017年发表的一篇开创性的文章“Attention is All You Need”。不久之后,谷歌发布了BERT,随后OpenAI发布了第一个GPT模型,为NLP领域的快速演变奠定了基础。多年来,众多里程碑式的模型共同推动了LLM能力的显著进步。截至2024年4月,以下模型在该领域脱颖而出,具有关键性贡献。
● [2018] BERT
BERT是一个双向Transformer,通过全局注意力机制和组合训练目标,在NLP任务中取得了令人印象深刻的结果。
● [2018] GPT-1
OpenAI发布的生成式、基于仅编码器Transformer架构的GPT-1,奠定了GPT系列模型的基础。它率先将无监督预训练和有监督微调相结合,用于自然语言文本预测。
● [2019] CTRL
CTRL与GPT有点类似,引入了控制码,实现了有条件的文本生成。这个功能增强了对文本生成内容和风格的控制。
● [2019] Transformer-XL
Transformer-XL通过重复使用先前计算的隐藏状态,能够使模型保持更长的上下文记忆。这一改进显著提升了模型处理长文本序列的能力。
● [2019] ALBERT
ALBERT在BERT的基础上,利用句子顺序预测任务代替下一句预测(Next Sentence Prediction,NSP)任务,并采用参数缩减技术,从而得到了一个更高效的BERT版本。这些变化降低了模型内存使用量并加快了训练速度。
● [2019] RoBERTa
RoBERTa通过引入动态掩码语言建模(Masked Language Modeling,MLM)技术,摒弃了下一句预测任务。该模型使用了BPE分词器,并采用了更好的超参数,提升了BERT模型的性能。
● [2019] XLM
XLM是一种多语言Transformer,使用多种目标任务进行预训练,这些任务包含因果语言建模、掩码语言建模和翻译语言建模等。XLM适用于多语言NLP任务。
● [2019] XLNet
XLNet结合了Transformer-XL的优势和一种广义自回归的预训练方法,能够学习双向依赖关系,并在性能上优于传统的单向模型。
● [2019] PEGASUS
PEGASUS的特点是具有一个双向编码器和一个从左到右的解码器,并且使用掩码语言建模和间隔句子生成(gap sentence generation)等目标任务进行预训练,优化了其在摘要任务上的性能。
● [2019] DistilBERT
DistilBERT是BERT的一个更小、更快的版本,保留了其95%以上的性能。该模型使用蒸馏技术训练,以压缩预训练的BERT模型。
● [2019] XLM-RoBERTa
XLM-RoBERTa是RoBERTa的多语言版本,使用多语言语料库进行训练,主要使用掩码语言建模作为目标任务,增强了其多语言能力。
● [2019] BART
BART具有一个双向编码器和一个从左到右的解码器,通过故意破坏文本然后学习重建原文的方法进行训练,适用于一系列生成和理解任务。
● [2019] ConvBERT
ConvBERT的创新之处在于用包含卷积的模块替换传统的自注意力块,可以更有效地处理文本中的全局和局部上下文。
● [2019] GPT-2
在GPT-1架构的基础上,GPT-2将模型规模扩展到15亿个参数,其使用统一的输入、输出和任务信息格式,展示出在一系列任务中的通用性。
● [2020] Funnel Transformer
Funnel Transformer的创新之处是逐步将隐藏状态序列压缩为更短的序列,在保持性能的同时有效地降低了计算成本。
● [2020] Reformer
Reformer提供了一个更高效的Transformer版本。它将局部敏感哈希用于注意力机制,并采用轴向位置编码等优化技术,以提高模型效率。
● [2020] T5
T5将NLP任务视为文本到文本的问题。它通过混合无监督任务和有监督任务进行训练,适用于各种应用。
● [2020] Longformer
Longformer调整了Transformer架构以适应更长的文档。它用稀疏注意力矩阵替换了传统的注意力矩阵,提高了训练效率,能够更好地对长文本进行处理。
● [2020] ProphetNet
ProphetNet使用未来N-gram预测(future N-gram prediction)这一目标任务进行训练,结合了独特的自注意力机制。该模型的目标在于改进诸如摘要和问答等序列到序列(sequence-to-sequence)任务。
● [2020] ELECTRA
ELECTRA 提出了一种新方法,使用替换Token检测(replaced Token detection)这一目标任务进行训练。它在很多NLP任务的性能上优于BERT,并且效率较高。
● [2020] GPT-3
2020年发布的GPT-3标志着一个重大的飞跃,其拥有1 750亿个参数,引入了上下文学习(In-Context Learning,ICL),也称情境学习。该模型在各种NLP任务中均表现出色,包括推理和领域适应,凸显了扩大模型规模的潜力。
● [2021] Codex
OpenAI于2021年7月推出了Codex。它是一个在GitHub代码语料库上微调的GPT-3变体,展现出先进的编程和数学问题求解能力,验证了特定领域训练的潜力。
● [2021] LaMDA
DeepMind的研究人员推出了LaMDA(Language Models for Dialog Applications,面向对话应用的语言模型)。LaMDA专注于对话应用,拥有约1 370亿个参数,旨在增强对话生成和对话式AI。
● [2021] Gopher
2021年,DeepMind推出了拥有约2 800亿个参数的Gopher,它在MMLU基准测试中具有接近人类水平的表现,但也面临容易产生偏见和错误信息等挑战。
● [2021] Switch Transformers
Switch Transformers引入了一种稀疏激活专家模型,这是MoE(Mixture of Experts,混合专家)模型的一种新变体。这种设计使模型能够更高效地处理更广泛的任务,是规模化扩展Transformer架构的重要一步。
● [2022] InstructGPT
2022年发布的InstructGPT是GPT-3的增强版,利用RLHF来改进指令遵循和内容安全,可以更好地和人类偏好对齐。
● [2022] Chinchilla
DeepMind的Chinchilla于2022年推出,拥有约700亿个参数,该模型基于规模法则优化了计算资源的使用,在基准测试中实现了显著的精度提升。
● [2022] PaLM
PaLM由谷歌研究院于2022年推出。PaLM拥有惊人的5 400亿个参数,展现出卓越的小样本学习性能,这得益于谷歌的Pathways系统所支持的分布式计算技术。
● [2022] ChatGPT(GPT-3.5 Instruct)
2022年11月,OpenAI推出了基于GPT-3.5的ChatGPT,专为对话式AI量身定制,展示了类人的沟通和推理能力。
● [2023] LLaMA
Meta AI于2023年2月发布了LLaMA。它推出了从70亿到650亿不等的一系列参数规模的LLM。LLaMA通过非商业许可证向科研界提供其模型权重,打破了大模型只能受限访问的传统。
● [2023] GPT-4
2023年3月,GPT-4扩展了其多模态输入的能力,而且其在各种任务中的表现优于先前的模型,代表了LLM发展的又一个重要里程碑。
● [2024] Gemini 1.5
谷歌的Gemini 1.5相比之前的模型版本进行了重大升级,采用了新的MoE架构,并具备多模态能力。Gemini 1.5 Pro支持更先进的长上下文理解能力,其上下文窗口高达100万个Token。截至2024年9月,该模型的上下文窗口是最大的。可以通过谷歌提供的专用API访问该模型。
● [2024] 无限注意力
谷歌在2024年发布了一篇论文,探讨了可以无限扩展模型上下文窗口大小的技术,据推测该论文是Gemini 1.5 Pro模型的基础。该论文引发猜测的原因在于,与Gemini模型一起发布的那篇论文提到,该模型在处理多达1 000万个Token时表现异常出色,然而,具有这类性能规格的模型尚未正式推出。这种方法被描述为一种即插即用的解决方案,可以在无上下文窗口限制的情况下显著增强任何模型的小样本学习性能。
● [2024] Gemma
谷歌还发布了两个版本的Gemma模型,它们分别拥有20亿个参数和70亿个参数。这些模型是使用与Gemini模型相同的某些技术开发的,现在其权重已公开。用户可以访问预训练模型和指令微调后的模型。
● [2024] Claude 3和3.5系列模型
Anthropic推出的模型,是首批在不同基准测试中表现都与GPT-4相当甚至更好的模型。它的上下文窗口有200K个Token,该模型以其卓越的记忆能力而闻名。
● [2024] Mistral
在发布了关于MoE架构的详细做法后,Mistral现在已向公众提供了8×220亿个参数的基础模型。这个模型是当时可用的最佳开源模型。尽管如此,它的性能仍然无法超越像GPT-4或Claude这样的闭源模型。
● [2024] LLaMA 3.0和3.1系列模型
Meta AI的开源模型在2024年经过在更大且质量更高的数据集(包括使用更多的合成数据)上的训练后,实现了巨大的飞跃,显著缩小了开源模型与GPT-4之间的性能差距。
● [2024] OpenAI o1系列模型
OpenAI推出了o1-preview,这是一个新的推理模型系列的首个版本,这些模型在科学、编程和数学等复杂任务中表现出显著的适应性。这些模型通过在回复前进行先进推理,性能超过了前代模型,在测试中的表现可与相关领域中的博士研究生相媲美。这是扩大“推理时计算”(inference time compute)的第一步——仅仅通过让模型在任务上工作更长时间,就能实现更强的模型能力。
更新的和更强大的LLM在不断出现,而且这里并没有列举所有重要的模型,第2章将会介绍更多模型。如果想深入了解这些模型,建议阅读文章“A Survey of Large Language Model”。
现在,我们可以结合所学的知识,演示如何通过OpenAI的API与其专有LLM进行交互,指示模型执行翻译任务。API是一套规则和工具,它支持不同的软件应用之间相互交流。它能够充当中介,接收你的请求,告诉系统你想要它做什么,并将系统的响应返回给你。要使用像OpenAI提供的LLM一样的大模型生成文本,首先需要为Python环境获取一个API密钥。以下是生成密钥的步骤。
1)创建并登录OpenAI账户。
2)登录后,从右上角菜单中选择“Personal”,然后单击“View API keys”。
3)在API密钥页面找到“Create new secret key”按钮,单击它以生成新的密钥。记得要安全地保存此密钥,因为稍后会用到它。
生成API密钥后,可以使用以下格式将其安全地存储在.env文件中。
OPENAI_API_KEY=”<YOUR-OPENAI-API-KEY>”
.env文件必须和Python脚本放在同一目录下。
每次启动以下Python脚本时,API密钥将会自动加载到名为“OPENAI_API_KEY”的环境变量中。最后,openai Python库将使用此变量指定的密钥与OpenAI的API进行交互,代码如下。
from dotenv import load_dotenv load_dotenv()
现在,模型已经准备就绪,可以进行交互了!以下是一个使用该模型将英语翻译成法语的示例。在下面的代码中,提示词会作为用户消息发送,并通过openai Python库基于API发送请求和返回数据。如果大家不理解所有的细节也不用担心,因为我们将在第7章中更全面地使用OpenAI API。现在大家最好关注一下messages参数,该参数会接收提示词,指示模型执行翻译任务。
from dotenv import load_dotenv
load_dotenv()
import os
import openai
# 要翻译的英文文本
english_text = “Hello, how are you?”
response = openai.ChatCompletion.create(
model=”gpt-3.5-turbo”,
messages=[
{“role”: “system”, “content”: “You are a helpful assistant.”},
{“role”: “user”, “content”: f’’’Translate the following English text to French:
“{english_text}”’’’}
],
)
print(response[‘choices’][0][‘message’][‘content’])运行上述代码,输出结果如下。
Bonjour, comment ça va?
可以使用dotenv将敏感信息(如API密钥)安全地存储在单独的文件中,避免在代码中意外暴露。当处理开源项目或与他人共享代码时,这一点尤为重要,因为这能够确保敏感信息的安全性。
小样本学习是LLM重要的涌现能力之一。小样本学习意味着在模型进行预测之前可以为其提供少量示例,这些示例在推理过程中可以“教导”模型,并作为“过滤器”帮助模型识别数据集中的相关模式。小样本学习允许模型无须进一步训练就可以适应新任务。虽然像GPT-3这样的LLM在语言建模任务(如机器翻译)中表现出色,但在需要更复杂推理的任务中,其表现可能会有所波动。
在小样本学习中,提供的示例有助于模型发现数据集中的相关模式。数据集在训练过程中被有效地编码到模型的权重中,因此模型会寻找与提供的样本显著相关的模式,并利用这些模式生成输出。因此,通过增加更多的示例,模型的精度能够提高,从而提供更有针对性和相关性的回复。
下面是一个小样本学习的示例,我们通过不同的消息类型向模型提供示例,教它如何用表情符号描述电影(我们将在本书后续内容中讨论不同的消息类型)。例如,电影《泰坦尼克号》可能会用游轮、海浪、心形等表情符号来表示,而电影《黑客帝国》可能会用眼镜、药丸、计算机等符号来表示。模型捕捉到了这些模式,并成功地使用玩具的表情符号准确描述了电影《玩具总动员》,代码如下。
运行上述代码,输出结果如下。
有趣的是,这个模型仅通过两个示例就能识别出复杂的模式,将电影标题与一系列表情符号关联起来。这种能力只有在模型对电影的故事和表情符号的含义有深入理解的情况下才能实现,这样它就可以将两者结合起来,并根据自己的解释来回答问题。
NLP技术的进步催生了今天先进且高度复杂的基于Transformer的模型。LLM是一种极为强大的架构,其在大量文本数据上进行训练,能够理解和生成几乎接近人类语言的文本。LLM基于Transformer架构设计,擅长捕捉语言中的长期依赖关系,并通过自回归过程来生成文本。
2020年和2021年是LLM发展的关键年份。在此之前,语言模型的主要目标是生成连贯且符合上下文的信息。然而,随着近年来相关技术的不断发展,LLM的进步引发了范式上的转变。
从预训练语言模型到LLM的演进,呈现出若干显著的标志性节点,例如规模法则的影响以及包括上下文学习、思维链提示和指令遵循等涌现能力的出现。这些涌现能力构成了LLM成功的核心要素,它们在小样本学习和增强提示等场景中得到了体现。然而,模型规模的扩大也带来了偏见和毒性等挑战,还需要审慎考虑。
新能力的涌现改变了NLP领域对这些模型的看法和使用方法。虽然传统NLP主要关注针对特定任务的模型,但模型的规模扩展激发了对通用模型的研究,这些模型能够处理一系列没有在训练中明确包含的任务。
这种转变在一些示例中表现得尤为明显,其中一些规模化的、小样本提示的通用模型已经超越了那些经过微调的任务特定模型。此外,通用模型仅需极少量示例即可执行任务的能力,已经将它们的应用范围扩展到了传统NLP研究之外,包括将自然语言指令翻译成机器人执行命令、用户交互以及多模态推理等。LLM的涌现能力正在将研究焦点转向通用模型,开启了超出传统NLP研究的新应用领域。
有关测试基准和优化技术的研究论文可以从链接towardsai. net/book获取。