一、什么是大模型
大模型其实就是一种非常强大的计算工具,用来解决复杂问题,做出智能决策。为了让小白也能理解,我们可以把大模型比作一个超级聪明的大脑。 截止到目前,语言模型已经演化了四代,可以简单理解为:
第一代大模型:统计语言模型(Statistical Language Model, SLM)
想象一下,你和朋友在玩一个猜单词的游戏。你只能根据前面的几个单词,猜下一个单词是什么。比如,“我吃了一个___”,你可能会猜“苹果”或“香蕉”。统计语言模型就是用类似的方法来预测下一个单词。它根据之前几个单词的组合(n-gram)来猜测下一个单词,使用马尔可夫假设,即每个单词只依赖于前面固定数量的单词。。
第二代大模型:神经语言模型(Neural Language Model, NLM)
这时候,游戏升级了。你的朋友变得更聪明了,不仅会根据前几个单词猜下一个单词,还会理解整个句子的意思,比如“我在森林里看到了一只___”,他能猜出“熊”而不是“香蕉”。神经语言模型就是这样,它用神经网络来理解句子的上下文。RNN等技术可以处理序列数据,并且学习到每个单词在句子中的意思,这就是所谓的词嵌入(word2vec是其中一种方法)。
第三代大模型:预训练语言模型(Pre-trained Language Model, PLM)
接着,游戏又升级了。你的朋友现在成了一个读了很多书的专家。他不仅能猜出下一个单词,还能根据丰富的知识理解句子的深层含义。预训练语言模型就是这样,它们先在大量的无标注数据上进行“预习”(预训练),学会了丰富的语言知识。然后,在特定任务上进行“复习”(微调),比如情感分析或翻译。像ELMo、BERT和GPT-1/2就是这种模型。
第四代大模型:大语言模型(Large Language Model, LLM)
现在,你的朋友不仅是一个专家,还是一个超级聪明的助手。他不仅能理解和回答各种问题,还能创造性地解决复杂问题。大语言模型就是这样,通过增加模型参数和训练数据,它们变得非常强大,不仅能完成复杂任务,还能展现出一些以前模型无法做到的能力,比如推理和规划。像GPT-3、ChatGPT、Claude、Llama就是这种模型。
二、大模型是怎么构建的
通常来说,大模型的构建过程可以分为预训练(Pretraining)、有监督微调(Supervised Fine-tuning, SFT)、基于人类反馈的强化学习对齐(Reinforcement Learning from Human Feedback, RLHF) 三个阶段。
1、预训练(Pretraining)
想象你要成为一个百科全书般的专家。首先,你需要读大量的书、看很多视频,去获取各种各样的知识。这些知识可能不完全和你未来的工作直接相关,但它们为你打下了一个坚实的基础。
预训练就是这个过程。在预训练阶段,模型会读取大量的文本数据(就像你在广泛阅读),学习语言的基本结构、词汇和常见的表达方式。这让模型在理解语言上变得很有基础,但它还没有专门为某个特定任务做优化。
通俗的来讲,如果那你想学会做饭,首先,你要学会一些基本的做饭技巧,比如切菜、炒菜、煮饭。这时候,你可能还不知道怎么做一道具体的菜,但你掌握了做饭的基础技能。
2、有监督微调(Supervised Fine-Tuning, SFT)
在读完大量书之后,你决定专门学习一个特定的技能,比如写作或编程。你找了一些老师,按照他们的指导,专门练习这些技能,变得更加擅长。
有监督微调就是这个阶段。在这一步,模型已经具备了基础的语言能力,但现在我们给它一些特定的任务(比如翻译、问答),并且告诉它如何完成这些任务(这就是“有监督”的部分)。模型通过学习这些例子,变得在特定任务上更加优秀。
通俗的来讲,接下来,你想学做一道具体的菜,比如炒牛肉。你找到一个食谱,按照上面的步骤一步一步练习,这样你就能专门把这道菜做好。
3、基于人类反馈的强化学习对齐(Reinforcement Learning from Human Feedback, RLHF)
最后,你开始在实际生活中应用你的技能,但你有一个导师会根据你的表现给你反馈。比如,当你写了一篇文章后,导师会告诉你哪里写得好,哪里需要改进。你根据这些反馈不断调整自己的方式,逐渐变得更加出色。
基于人类反馈的强化学习对齐就是这样的过程。在这一阶段,模型已经能够完成任务了,但我们希望它的表现更符合人类的期望。于是,我们让人类来评估模型的输出,告诉它哪些回答好,哪些需要改进。模型根据这些反馈不断调整自己,最终变得更加贴近人类的需求。
通俗的来说,最后,你把做好的菜给别人尝,他们告诉你哪里好吃,哪里不够好。你根据他们的反馈,调整做菜的方式,比如放少点盐或者多炒一会儿,直到这道菜变得非常好吃。
三、开源大模型和闭源大模型
构建大模型不仅需要海量的数据,更依赖于强大的计算能力,以确保模型能够快速迭代和优化,从而达到预期的性能水平。鉴于此,全球范围内能够独立承担起如此庞大计算成本的机构屈指可数。大模型可以分为开源大模型和闭源大模型。
1、开源大模型
开源大模型就像一本你可以随意拿到的公开食谱。这本食谱不仅让你知道每道菜的做法,还允许你自己尝试、修改,甚至加入自己的创意,然后再分享给别人。 开源的特点:
- 公开透明:所有人都可以看到模型的代码和设计,就像你可以看到所有的食谱步骤。
- 自由使用和修改:你可以根据自己的需求修改模型,就像你可以根据自己的口味调整食谱。
- 社区合作:很多人可以一起改进这个模型,分享他们的修改成果,类似于很多厨师一起改进一道菜的做法。
2、闭源大模型
闭源大模型就像一家著名餐厅的秘密食谱。这个食谱只有餐厅的厨师知道,别人看不到也用不了。你只能吃这家餐厅做好的菜,但你不能知道他们是怎么做的。
闭源的特点:
- 不公开:模型的代码和设计对外是保密的,就像你不知道餐厅的秘密食谱。
- 限制使用:你不能自己修改或使用模型,只能按照餐厅提供的方式来品尝菜肴,也就是按照模型提供的接口使用它的功能。
- 公司控制:模型的所有权和控制权都掌握在公司手里,只有他们能决定怎么改进或分发这个模型。
四、大模型时代挖掘模型能力的开发范式
进入大模型时代,人工智能领域的边界正以前所未有的速度扩展,而如何充分挖掘大模型的内在潜能,成为了应用开发者面前的一道关键课题。
在这一背景下,不同的应用场景催生了多样化的应用开发策略,这些策略不仅展现了大模型应用开发的丰富可能性,也预示着未来AI技术在各行业落地的广阔前景。
1、Prompt工程
想象你在和一个超级聪明的朋友聊天,他能回答你几乎所有的问题,但你要知道怎么问才能得到最好的答案。Prompt工程就是研究如何问出正确的问题,让模型给出更好的回答。
示例:生成文本的不同要求
假设你在使用一个大模型生成一段关于猫的文字,结果可能会根据你的“Prompt”(问题)不同而大不相同。
-
Prompt 1: “写一段关于猫的简短介绍。”
- 输出: “猫是一种小型、柔软的哺乳动物,通常被人类作为宠物饲养。”
-
Prompt 2: “用有趣的语言写一段关于猫的故事。”
- 输出: “在一个阳光明媚的下午,小猫咪米娅决定挑战它的终极任务——捉住那只在院子里飞来飞去的蝴蝶!”
通过改变你的提问方式(Prompt),你可以控制模型生成的内容风格和形式
2、Embedding辅助
想象你有一位懂很多语言的朋友,但有些词他不太明白。这时,你用一本特别的词典,把那些词解释清楚给他看,这样他就能更好地理解你的意思。Embedding辅助就像这个词典,它帮助模型理解和处理数据,比如把单词转化成模型能理解的数字形式。
示例:文本分类任务
假设你在做一个文本分类任务,比如判断一段评论是“积极的”还是“消极的”。你可以用Embedding来帮助模型理解评论中的词语关系。
-
文本 1: “这家餐厅的服务太棒了,食物也非常美味。”
- Embedding表示:模型将这段话转化为一组数字,表示“服务”和“美味”这些词语在上下文中的意义,从而判断这是一个积极的评论。
-
文本 2: “食物太咸了,服务员也很慢。”
- Embedding表示:模型将这段话转化为另一组数字,表示“咸”和“慢”这些词语的消极意义,从而判断这是一个消极的评论。
Embedding辅助模型更好地理解文本的含义和情感。
3、参数高效微调
想象你在做菜,菜已经快做好了,但你需要加一点盐或者调料让它更好吃。参数高效微调就像是在原本的模型上做一点小调整,让它在某些特定任务上表现得更好。
示例:在小数据集上优化模型
假设你已经有一个大模型,它在很多任务上表现都不错,但你现在有一个特定的任务,比如在一个新的语言上进行情感分析。你可以通过参数高效微调让模型在这个新任务上表现更好。
- 现有模型: 已经能很好地处理英文情感分析。
- 新任务: 你希望模型能够处理西班牙文的情感分析,但你只有一个很小的西班牙文数据集。
微调过程:
- 你可以使用这个小数据集,微调模型的一部分参数(而不是全部),让模型适应西班牙文的情感分析。
- 结果: 经过微调,模型现在在西班牙文情感分析上表现得很好,尽管你只有很少的训练数据。
通过参数高效微调,你可以在特定任务上提高模型的表现,而不需要从头开始训练一个新的大模型。
五、客户端和服务端
通常,一个完整的大模型应用包含一个客户端和一个服务端。
客户端接收到用户请求后,将请求输入到服务端,服务端经过计算得到输出后,返回给客户端回复用户的请求。
-
客户端
在大模型应用中,客户端需要接受用户请求,并且能将回复返回给用户。 目前,客户端通常使用 Gradio 和 Streamlit 进行开发。
-
Gradio 有输入输出组件、控制组件、布局组件几个基础模块,其中
-
输入输出组件用于展示内容和获取内容,如:
Textbox
文本、Image
图像 -
布局组件用于更好地规划组件的布局,如:
Column
(把组件放成一列)、Row
(把组件放成一行)- 推荐使用
gradio.Blocks()
做更多丰富交互的界面,gradio.Interface()
只支持单个函数交互
- 推荐使用
-
控制组件用于直接调用函数,无法作为输入输出使用,如:
Button
(按钮)、ClearButton
(清除按钮)
Gradio的设计哲学是将输入和输出组件与布局组件分开。输入组件(如
Textbox
、Slider
等)用于接收用户输入,输出组件(如Label
、Image
等)用于显示函数的输出结果。而布局组件(如Tabs
、Columns
、Row
等)则用于组织和排列这些输入和输出组件,以创建结构化的用户界面。
-
Streamlit 中没有gradio的输入和输出概念,也没有布局组件的概念。
-
Streamlit每个组件都是独立的,需要用什么直接查看官方文档即可,大致有如下几种组件:
-
-
页面元素
- 文本
- 数据表格
- 图标绘制(柱状图,散点图等等)
- 输入(文本框,按钮,下拉框,滑块,复选框,文件上传,等等)
- 多媒体(图片,音频,视频)
- 布局和容器
- Chat(聊天对话控件)
- 状态(进度条,加载中,等等元素)
- 第三方组件(提供了更加丰富的组件)
-
-
-
应用逻辑
- 导航和页面(可以切换页面)
- 执行流程
- 缓存和状态
- 连接和加密(可连接数据库,也可以对内容进行加密处理)
- 自定义组件
- 公共组件(用户信息存储,帮助,以及输出html)
- Config(使用配置文件,来定义一些内容)
-
工具
- 应用测试
- 命令行
-
-
-
服务端
在大模型应用中,服务端需要与大模型进行交互,大模型接受到用户请求后,经过复杂的计算,得到模型输出。
目前,服务端主要有以下两种方式:
-
直接调用大模型API:将请求直接发送给相应的服务商,如openai,讯飞星火等,等待API返回大模型回复
- ✔️ 优点:
-
- 便捷性: 不需要关心模型的维护和更新,服务商通常会负责这些工作。
- 资源效率: 避免了本地硬件投资和维护成本,按需付费,灵活调整成本支出。
- 稳定性与安全性: 专业团队管理,可能提供更好的系统稳定性和数据安全性措施。
- 扩展性: API服务易于集成到现有的应用和服务中,支持高并发请求。
- ✖️ 缺点:
-
- 网络延迟: 需要稳定的网络连接,可能会受到网络延迟的影响。
- 数据隐私: 数据需要传输到服务商的服务器,可能涉及数据安全和隐私问题。
- 成本控制: 高频次或大量数据的调用可能会导致较高的费用。
- 依赖性: 受制于服务商的政策变化,如价格调整、服务条款变更等。
-
大模型本地部署 :在本地GPU或者CPU上,下载模型文件,并基于推理框架进行部署大模型
- ✔️ 优点:
-
- 数据主权: 数据完全在本地处理,对于敏感数据处理更为安全。
- 性能可控: 可以根据需求优化配置,减少网络延迟,提高响应速度。
- 成本固定: 初始投入后,长期运行成本相对固定,避免了按使用量付费的不确定性。
- 定制化: 更容易针对特定需求进行模型微调或扩展。
- ✖️ 缺点:
-
-
硬件投资: 需要强大的计算资源,如高性能GPU,初期投资成本较高。
-
运维复杂: 需要自行管理模型的更新、维护和故障排查。
-
技术门槛: 对于非专业团队而言,模型的部署和优化可能较为复杂。
-
资源利用率: 在低负载情况下,本地硬件资源可能无法充分利用。
-