介绍
本文为我为公司所写 AI 项目的调研文件,希望能对有类似需求的创业公司有所帮助,以下为文件全文
大语言模型
在介绍大语言模型前,先来厘清几个基本概念
人工智能、机器学习、深度学习之间的关系
什么是机器学习?
机器学习的基本思路
- 把现实生活中的问题抽象成数学模型,并且很清楚模型中不同参数的作用
- 利用数学方法对这个数学模型进行求解,从而解决现实生活中的问题
- 评估这个数学模型,是否真正的解决了现实生活中的问题,解决的如何?
简单来说,通过训练集,不断识别特征,不断建模,最后形成有效的模型,这个过程就叫“机器学习”!
机器学习根据训练方法大致可以分为 3 大类:
- 监督学习 :监督学习是指我们给算法一个数据集,并且给定正确答案。机器通过数据来学习正确答案的计算方法。
- 非监督学习:非监督学习中,给定的数据集没有“正确答案”,所有的数据都是一样的。无监督学习的任务是从给定的数据集中,挖掘出潜在的结构。
- 强化学习:强化学习更接近生物学习的本质,因此有望获得更高的智能。它关注的是智能体如何在环境中采取一系列行为,从而获得最大的累积回报。通过强化学习,一个智能体应该知道在什么状态下应该采取什么行为。
什么是 NLP?
NLP(Natural Language Processing) 即 自然语言处理,是一个特定的领域,它专注于使计算机能够理解、解释和生成人类语言。NLP结合了计算机科学、人工智能和语言学,以解决与语言相关的各种问题。
NLP 领域广泛使用机器学习技术。在机器学习出现之前,NLP 主要依赖于手工编写的规则和基于词典的方法。随着机器学习的发展,特别是深度学习技术的出现,NLP 的许多任务(如文本分类、情感分析、机器翻译等)都得到了显著改进。机器学习为 NLP 提供了强大的算法和模型,使得计算机能够从大量文本数据中学习语言的模式和结构,而不是依赖于人工编写的规则。
随着机器学习技术的进步,特别是深度学习技术的发展,NLP 领域也取得了显著的进步。例如,卷积神经网络(CNN)和递归神经网络(RNN)在处理语言数据方面表现出色,而 Transformer 架构的出现更是推动了 NLP 领域的快速发展。
机器学习是 NLP 的一种重要工具和手段,而 NLP 是机器学习应用的一个重要领域。LLM 是 NLP 领域中的一个特定技术,它是基于深度学习的模型,特别是神经网络,用于处理和生成自然语言文本。
NLP 发展到今天已经进入到了 LLM 的时代,随着模型越来越大。NLP 也进入到了新的研究范式里面。学术界按发展时间线将 NLP 归纳到四个范式:
- 传统的基础学习范式。
- 基于 word2vec 、cnn、rnn 的全监督深度学习范式
- 基于预训练 + fine-tune 的范式
- 基于预训练 + Prompt + 预测的范式
什么是大语言模型?
大型语言模型(LLMs)是机器学习的产物。它们是基于机器学习算法,特别是深度学习中的神经网络技术构建的。
从机器学习的观点来说,神经网络是一种具有特定模型结构的函数形式,而大语言模型则是一种基于 Transformer
结构的神经网络模型。因此,可以将大语言模型看作一种拥有大规模参数的函数,它的构建过程就是使用训练数据对于模型参数的拟合过程。
神经网络
神经网络:它使用类似于人脑的分层结构中的互连节点或神经元。它可以创建自适应系统,计算机使用该系统来从错误中进行学习并不断改进。因此,人工神经网络可以尝试解决复杂的问题,例如更准确地总结文档或人脸识别。
Transformer
Transformer 在 2017 年由 Google 在题为《Attention Is All You Need》的论文中提出。Transformer 是一个完全基于注意力机制的编解码器模型,它抛弃了之前其它模型引入注意力机制后仍然保留的循环与卷积结构,而采用了自注意力(Self-attention)机制,在任务表现、并行能力和易于训练性方面都有大幅的提高。
在 Transformer 出现之前,基于神经网络的机器翻译模型多数都采用了 RNN 的模型架构,它们依靠循环功能进行有序的序列操作。虽然 RNN 架构有较强的序列建模能力,但是存在训练速度慢,训练质量低等问题。
与基于 RNN 的方法不同,Transformer 模型中没有循环结构,而是把序列中的所有单词或者符号并行处理,同时借助自注意力机制对句子中所有单词之间的关系直接进行建模,而无需考虑各自的位置。具体而言,如果要计算给定单词的下一个表征,Transformer 会将该单词与句子中的其它单词一一对比,并得出这些单词的注意力分数。注意力分数决定其它单词对给定词汇的语义影响。之后,注意力分数用作所有单词表征的平均权重,这些表征输入全连接网络,生成新表征。
Transformer 模型本质上都是预训练语言模型,大都采用自监督学习 (Self-supervised learning) 的方式在大量语料上进行训练,也就是说,训练这些 Transformer 模型完全不需要人工标注数据。
如何构建一个大语言模型?
自行构建大模型需要许多资源和能力,包括数学、工程师、计算机科学领域的知识和能力。还包括训练所需的数学和硬件等资源。 以数学为例,所涉及的数学知识包括:
构建大型语言模型(LLM)所需的数学知识大多属于大学水平。以下是对这些知识的简要分类:
构建 LLM 的主要步骤:
- 确定 LLM 的用例:这是构建 LLM 的第一步,也是至关重要的一步。确定用例有助于决定模型的大小、训练数据的需求和所需的计算资源。
- 创建模型架构:定义神经网络架构,这是模型的核心,决定了其能力和性能。文章推荐使用变换器(Transformer)架构,因为它能够有效处理文本中的长距离依赖关系,并且可以高效地处理可变长度的输入。
- 创建变换器的组件:包括嵌入层(Embedding Layer)、位置编码器(Positional Encoder)、自注意力机制(Self-Attention Mechanism)、前馈网络(Feed-Forward Network)、归一化层(Normalization Layers)和残差连接(Residual Connections)。
- 组装编码器和解码器:编码器将输入序列转换为加权嵌入,而解码器则使用这些嵌入来生成输出。
- 数据整理:数据的质量对于构建有效的 LLM 至关重要。需要大量的数据来训练模型,以便它能够有效地学习语言和语义关系。
- 训练自定义 LLM:通过将大量文本数据通过神经网络来初始化模型的参数。这个过程包括前向传播和反向传播。
- 评估定制的 LLM:在训练和微调之后,测试模型是否按预期执行其预期用例。使用未见过的数据集进行测试,以确保模型能够泛化到新数据上。
- 微调 LLM:在初始训练之后,微调可以使 LLM 适应特定的用例。
以下是一个机器学习产品的全流程预览:
所涉及到的技术栈全景:
以上这些步骤是最为粗粒度的,具体到每一步都有涉及到更多具体任务的子步骤。笼统地讲,大语言模型的构建过程可以分为预训练和微调两个阶段
预训练阶段旨在通过大规模无标注文本建立模型的基础能力,而微调阶段则使用有标注数据对于模型进行特定任务的适配,从而更好地解决下游的自然语言处理任务。
大规模预训练
OpenAI 前首席科学家 Ilya Sutskever
在公开采访中指出大规模预训练本质上是在做一个世界知识的压缩,从而能够学习到一个编码世界知识的参数模型,这个模型能够通过解压缩所需要的知识来解决真实世界的任务。这一过程对于算力需求量极高,一般来说训练百亿模型至少需要百卡规模的算力集群(如A100 80G)联合训练数月时间(与具体的算力资源相关);而训练千亿模型则需要千卡甚至万卡规模的算力集群,对于算力资源的消耗非常惊人。
预训练主要包括以下几个步骤:
- 原始数据的收集
-
数据准备,常用的专用文本数据分为三种 多语文本、科学文本、代码
-
- 数据预处理
- 典型的预训练数据预处理流程如下图:
- 典型的预训练数据预处理流程如下图:
- 分词
- 预训练过程中的数据调度方法
- 完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据。数据调度(Data Scheduling)主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程,Data Curriculum),具体的数据调度流程如图所示。
- 完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据。数据调度(Data Scheduling)主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程,Data Curriculum),具体的数据调度流程如图所示。
指令微调与人类对齐
目前来说,比较广泛使用的微调技术是“指令微调”(也叫做有监督微调,Supervised Fine-tuning, SFT),通过使用任务输入与输出的配对数据进行模型训练,可以使得语言模型较好地掌握通过问答形式进行任务求解的能力。
人类对齐是指:大语言模型与人类的期望、需求以及价值观对齐(Alignment)
-
基于人类反馈的强化学习对齐方法 RLHF(Reinforcement Learning from Human Feedback),在指令微调后使用强化学习加强模型的对齐能力。在 RLHF 算法中,需要训练一个符合人类价值观的奖励模型(Reward Model)。为此,需要标注人员针对大语言模型所生成的多条输出进行偏好排序,并使用偏好数据训练奖励模型。用于判断模型的输出质量。由于强化学习需要维护更多的辅助模型进行训练,通常来说对于资源的消耗会多于指令微调,但是也远小于预训练阶段所需要的算力资源。
成本分析
如果要研发一个大语言模型 --LLM,看得见的成本主要体现在以下 3个方面(当然还有其他的,这里只说主要的):
- 研发人员:算法工程师、软件工程师等
- 硬件及算力资源:GPU、CPU 服务器
- 数据成本:训练 LLM 需要大量的文本数据,这些数据可能来自网络爬虫、开源数据集等。获取和处理这些数据需要大量的时间和金钱
研发人员
实际上要真正要研发一个具有 10 亿参数以上规模的大语言模型,技术团队至少要有以下的配备:
- 研究科学家:负责设计模型架构、开发新的训练方法和技术、探索前沿AI理论
- 机器学习工程师:实现和优化模型训练流程、开发数据处理管道、调优模型性能
- 数据科学家:收集和清洗大规模训练数据、设计数据标注方案、分析模型输出质量
- 软件工程师:构建分布式训练系统、开发模型服务和 API、维护基础设施和工具
- 硬件工程师:优化 GPU/TPU 等硬件性能、管理大规模计算集群
- 质量保证工程师:设计全面的测试方案、评估模型的鲁棒性和安全性、监控模型的长期性能
创业团队在人员短缺的情况下可能一人身兼多职,有可能从数据的收集、清洗,到模型的训练和评估全都一个人干了。具有一定规模的团队会分的比较清楚,每一个岗位又会扩展出一组人员,比如一组人专门搞 Pre-training
我们以市场上常见的 “算法工程师” 为例,说明一下人才画像和成本情况。
人材画像
算法工程师在自研大模型科技公司中需具备将理论转化为实用产品、构建和优化模型、熟练使用开发框架、进行底层后端性能优化以及硬件适配的能力,以确保模型的高效运行和业务问题的有效解决。
一个广义上的 “算法工程师” 在一个自研大模型的科技公司所需要具体的能力包括:
- 应用(Application):能够将理论和模型转化为实际可用的产品或服务,能够将模型应用于解决具体业务问题,比如自然语言处理、图像识别、推荐系统等。
- 模型(Model):涉及构建、训练和优化机器学习或深度学习模型,可能需要设计和实现新的模型架构,或者对现有模型进行优化以提升性能,这通常需要深厚的数学和统计学基础。
- 框架(Framework):指的是使用特定的编程框架来开发模型,如 TensorFlow、PyTorch 等,能够高效地实现算法,并进行模型训练和部署。
- 底层后端(Backend):偏向于底层和性能优化方面的技术,如:
- 机器学习编译器(ML Compiler):一种将高级的机器学习模型转换成高效的底层代码的工具。这通常涉及到模型优化、算子融合、内存管理等。大模型开发时需要使用ML编译器来优化模型,以便在特定的硬件平台上获得更好的性能。例如,通过编译器优化可以减少模型推理时的延迟,提高吞吐量,降低能耗。
- kernel: 核函数是一种用于支持向量机(SVM)和其他核方法中的函数,它能够隐式地将输入数据从原始特征空间映射到一个高维特征空间,使得在原始空间中非线性可分的数据在新空间中变得线性可分。核函数是提升机器学习模型性能的关键,它通过高效处理非线性问题,简化复杂计算,从而显著提高预测准确性并优化大模型开发效率
- CUDA 开发:需要使用CUDA来编写自定义的GPU加速代码,以便充分利用GPU的并行处理能力,提升模型的训练和推理性能。(CUDA是NVIDIA推出的一个并行计算平台和编程模型,它允许开发者直接使用 C、C++ 和其他语言来编写在 NVIDIA GPU 上运行的程序。)
- 硬件(Hardware):指的是对用于运行模型的硬件有深入理解,如 GPU、TPU 等。在大模型研发中,硬件优化是提高效率和降低成本的关键。需要了解如何优化模型以适应特定硬件,或者选择合适的硬件来加速模型训练和推理。
成本
从招聘市场来看,一位具有 3年左右经验的普通算法工程师年薪约 30-50w 。
而具有 3-5 年甚至更多年经验的优秀的算法工程师年薪约为 70-80w
可见,如从 0 开始招聘大模型研发团队的成本是高昂的。
GPU 算力
我们以 Autodl 算力租赁平台为例,一张消费级的 RTX 4090 显卡每小时的租用费用为 2.28 ¥
训练大模型,一般使用 GPU 集群,假设集群内有 8000 张显卡,那么一个月的训练费用为 1300多万。当然也可以不用这么多卡训练,但理论上集群卡数越多,训练得越快,卡少了,自然速度会慢好几个量级。
可见作为计算资源的 GPU 算力的成本是比较昂贵的。
构建大语言模型驱动的应用程序
是否自行构建大语言模型 ?
对于我们来说,从头开始预训练 LLM 是一种不切实际的、偏离构建产品的做法。 开发和维护机器学习基础设施需要大量资源。这包括收集数据、训练和评估模型以及部署它们。即使拥有计算能力、数据和技术实力,预训练的 LLM 可能在几个月内就会过时。
那么退而求其次,对最好的开源模型进行微调呢?
我认为先不要微调,直到我们证明有必要。
什么时候微调才是真正正确的选择?
如果在用于训练现有模型的大多数开放网络规模的数据集中,没有适用于我们的用例需要的数据;并且如果我们已经构建了一个最小可行产品(MVP),证明现有模型不足以满足需求 —— 此时,才是选择微调的正确时机。(但要小心:如果优质的训练数据对模型构建者来说不容易获得,那么我们又从哪里获得它呢?)
我认为现阶段,我们应该构建以 LLM 为驱动的应用程序,而不是直接构建大模型本身。
由 LLM 驱动的应用程序并不是科研探索项目;对它们的投资应该与它们对企业战略目标和竞争优势的贡献相称。
从哪儿开始?
如果团队想要构建一个 LLM 产品,我们应该从哪里开始?
- 从推理 API 和私有化部署开始
- 从提示工程开始,只有在提示工程无法达到所需性能水平时,才应考虑微调。
对于大模型的调用,我们可以先从使用模型厂商提供的 API 或从私有化部署开源大模型开始,通过提示词工程,一步一步得到想要的答案。当提示词工程无法满足要求时,再考虑进行模型的微调。
做什么产品呢?
经过之前对市场需求的了解和对同行的了解,基本上可以确定我们最开始要做的是: **“基于大语言模型的 RAG 技术落地应用解决方案 ”**产品
RAG
RAG(Retrieval Augmented Generation,检索增强生成)是 LLM 在处理任务时的一种机制。当用户提出一个问题时,RAG系 统会在大量的文档中检索与问题相关的信息,LLM 利用这些信息生成回答,其优势在于充分结合了检索和生成能力,只需外挂上知识库,即可为模型提供额外的信息输入,提高其回答的准确性,减少 “幻觉”。
结合领域专业数据或企业私有数据,我们可以在多个场景下构建符合企业个性化需求的 AI 解决方案,如:智能客服,法律咨询小程序,牙医辅助问诊助手,教务智能助手等。
RAG pipeline
下图为一个经典的 RAG 流程
以下是一些同行公司:(当然还有其他许多的公司,本文作为示例并未收录全部)
如果用一句话形容这些公司是做什么的,可以参考 Vectara 官网上的这句:
如何构建一个基于大语言模型的 RAG 应用
目标
实践表明,RAG 不仅能有效提供知识、改善输出,还比微调需要更少的努力和成本。那么问题很自然的就来到如何构建一个基于大语言模型的 RAG 应用。
要想成功,我们的产品不能仅仅是别人 API 的一层薄薄的套壳,但是我们可以先从薄的这层起步。
构建一个原型应用(Prototype Application) 是容易的,目前我已经实现了从开源大模型的部署,到利用 LlamaIndex 框架开发基于调用 API 和本地 LLM 的 RAG 后端代码。只要加上前端页面就是一个可用的 RAG 原型应用。
以下是我在上述过程中写的一些总结文章:
- 如何用 30秒和 5 行代码写个 RAG 应用?
- 提速 RAG 应用:用 DeepSeek API 替换本地 Ollama 模型,LlamaIndex 实战解析
- 提升RAG应用性能:使用智谱AI的GLM-4和Embedding-3模型优化文档检索
- Milvus实战:如何用一个数据库提升你的AI项目性能
- 如何用 LlamaIndex 实现 agent
- 如何在服务器上部署开源大模型 GLM-4-9B-Chat 并应用到RAG应用中
完成原型应用是远远不够的,如果说我们的目标只是构建一个基于本地知识库能够进行自然语言交互的带有图形界面的知识库问答系统的话,那么这个事儿就可以放弃了,因为开源世界已经有很多答案了,比如:
-
ragflow(github.com/infiniflow/…)
-
AnythingLLM(github.com/Mintplex-La…)
-
MaxKB(github.com/1Panel-dev/…)
-
QAnything(github.com/netease-you…)
以上这些产品我全部都部署使用过,功能上各有千秋,这些产品各自也在迭代演进中。目前看,无论开源、闭源 RAG 产品有不少,限于篇幅的原因就不一一列举了。总的来看,这个赛道进入的玩家越来越多,从市场和技术前景考量是好事情,因为是大家共同的判断,都认为 RAG 有前景才会投入。从竞争的角度考量,往后的竞争只会越来越激烈。不过对于后发公司,先发公司并没有拉开无法追赶的领先优势,原因是:技术的更新太快了,每个月甚至每半个月都有新的技术和解决方案在或大或小的领域发生。刚刚拉开的领先优势可能过一个月就因为技术淘汰而荡然无存了。
如果我们不以 构建一个基于本地知识库能够进行自然语言交互的带有图形界面的知识库问答系统为目标的话,那么我们的目标是什么?
理论上讲,我们的 MVP(最小可行产品) 在我的电脑上已经完成了,它就是一个利用 LlamaIndex 通过调用本地开源大语言模型实现的 RAG 原型应用。然后呢? 这个问题其实并不好回答。
前文说到我们不能仅仅是别人 API 的一层薄薄的套壳 那么就一定要走向自主研发的道路。我认为,对于我们来说,无论是 LLM 还是 RAG ,这条道路就是对 AI 祛魅的过程
具体来说,对于我们:
- 随着开发的推进,对技术了解的越来越深入, AI 对我们来说会从黑盒变成白盒
- 相应的,我们需要解决的问题也越来越复杂,比如如何提高回答的准确率、如何识别各种类型的文件。
对于客户:
- 需要 AI 解决的问题越来越具体,使用 AI 越来熟练
- 越来越习惯使用 AI,进而对 AI 的要求越来越高
在技术层面,总结来说就是一个从黑盒到白盒过程的求索过程 。听起来有点儿虚,具体来说会涉及到 RAG 流程中每一个环节的细致优化。但从产品层面讲,都是实实在在的。比如可以立即着手参照现有产品进行功能开发,如上传文档、管理文档、用户体系、认证权限、数据安全、用户交互等一系列传统软件产品的功能。
总结来说,对于自研产品,我们目前比较现实的做法就是迭代式开发,在学习中逐渐打磨自己的产品。在技术的投资上,要和企业的战略目标相称,否则不建议盲目的大规模投资。
在产品形态上,各个公司基于自己的考量有各种选择,有选择向下做 PaaS 平台的,做基座的,我觉得我们适合选择向上,做产品包装,做 SaaS 化的 RAG ,也就是 RAGaaS
这条路对于我们这种技术实力一般的公司不容易,任重道远!
前提
想实现既定的战略目标需要一些前提,这些前提很具体,比如需要投入研发人员。研发人员包括:
- 后端,需要会使用 Python 语言进行编程
- 前端
- 产品
- 测试
算法工程师
暂时不需要招算法工程师这种昂贵的资源,因为对我们来说,现有的瓶颈并不是缺少算法人材,现有人材也可以自学需要的知识。简单讲,还不到那一步,到了那一步再说。另外,需要研发团队全员对 AI 产品有认知、有热情、有学习的动力。大家都是从不会到会,如果不能持续学习,就会后劲不足。
从资源上,至少需要少量的 GPU 算力,起初可以使用少量消费级别的显卡 如 RTX 4090,后期按需申请更多资源。
其实还有一个前提,就是项目的原始驱动,我们做这个产品的目的是什么? 一定是以变现能力为前提的,所以我们要从用户和市场的角度考虑,有没有客户? 有什么客户? 客户需要什么?解决了客户的什么问题 ? 需要私有化部署大模型吗?需要一个私有化部署的产品吗? 这才是我们真正的驱动来源。四个字:价值变现!
什么时候开始?
种一棵树最好的时间是十年前 其次是现在
总结
做一个 RAG 应用的原型设计很容易,但使其高性能、健壮且可扩展到大型知识语料库却很困难。比如如下图所示,在面对的问题不止冰山上面的,在冰山底下隐藏着更多难题: