文章目录
1.大预言模型理论简介
一.什么是大型语言模型
1.1概念
大语言模型(LLM,Large Language Model),也称大型语言模型,是一种旨在理解和生成人类语言的人工智能模型。
LLM 通常指包含数百亿(或更多)参数的语言模型,它们在海量的文本数据上进行训练,从而获得对语言深层次的理解。
大型语言模型相比小型语言模型参数规模大,在解决复杂任务时表项出惊人的潜力,称为“涌现能力”
1.2LLM的发展历程
20 世纪 90 年代采用统计学习方法来预测词汇,在理解复杂语言规则方面存在一定局限性
2003年将深度学习的思想融入语言模型,强大的神经网络模型为计算机提供强大的“大脑”
2018年,Transformer架构的神经网络模型,通过大量文本数据训练,深入理解语言规则和模式
1.3常见的LLM模型
1.3.1闭源LLM
1.3.1.1 GPT系列
OpenAI 公司在 2018 年提出的 GPT(Generative Pre-Training) 模型是典型的生成式预训练语言模型 之一。
GPT 模型的基本原则是通过语言建模将世界知识压缩到仅解码器 (decoder-only) 的 Transformer 模型中,这样它就可以恢复(或记忆)世界知识的语义,并充当通用任务求解器。它能够成功的两个关键点:
训练能够准确预测下一个单词的 decoder-only 的 Transformer 语言模型
扩展语言模型的大小
1.3.1.1.1 ChatGPT
基于GPT模型的会话应用
本质上来说是一个 LLM 应用,是基于基座模型开发出来的,与基座模型有本质的区别。
1.3.1.1.2 GPT-4
将文本输入扩展到多模态信号。规模是 GPT-3 的 10 倍以上。
1.3.1.2 Claude 系列
Claude 系列模型是由 OpenAI 离职人员创建的 Anthropic 公司开发的闭源语言大模型。
1.3.1.3 PaLM/Gemini 系列
PaLM 系列语言大模型由 Google 开发。其初始版本于 2022 年 4 月发布,并在 2023 年 3 月公开了 API。2023 年 5 月,Google 发布了 PaLM 2,2024 年 2 月 1 日,Google 将 Bard(之前发布的对话应用) 的底层大模型驱动由 PaLM2 更改为 Gemini,同时也将原先的 Bard 更名为 Gemini。
目前的 Gemini 是第一个版本,即 Gemini 1.0,根据参数量不同分为 Ultra, Pro 和 Nano 三个版本。
1.3.1.4 文心一言
文心一言是基于百度文心大模型的知识增强语言大模型,包括 NLP 大模型、CV 大模型、跨模态大模型、生物计算大模型、行业大模型。
1.3.1.5 星火大模型
讯飞星火认知大模型是科大讯飞发布的语言大模型,支持多种自然语言处理任务。
1.3.2 开源LLM
1.3.2.1 LLaMA系列
- LLaMA 系列模型是 Meta 开源的一组参数规模 从 7B 到 70B 的基础语言模型。
- 在数万亿个字符上训练的,展示了如何仅使用公开可用的数据集来训练最先进的模型,而不需要依赖专有或不可访问的数据集。
- 使用了大规模的数据过滤和清洗技术,以提高数据质量和多样性,减少噪声和偏见。
- 使用了高效的数据并行和流水线并行技术,以加速模型的训练和扩展。
- 通过使用更少的字符来达到最佳性能,从而在各种推理预算下具有优势。
- 与 GPT 系列相同,LLaMA 模型也采用了 decoder-only 架构,同时结合了一些前人工作的改进:
- Pre-normalization 正则化:为了提高训练稳定性,LLaMA 对每个 Transformer子层的输入进行了 RMSNorm 归一化,这种归一化方法可以避免梯度爆炸和消失的问题,提高模型的收敛速度和性能
- SwiGLU 激活函数:将 ReLU 非线性替换为 SwiGLU 激活函数,增加网络的表达能力和非线性,同时减少参数量和计算量;
- 旋转位置编码(RoPE,Rotary Position Embedding):模型的输入不再使用位置编码,而是在网络的每一层添加了位置编码,RoPE 位置编码可以有效地捕捉输入序列中的相对位置信息,并且具有更好的泛化能力。
- LLaMA2 在 LLaMA 系列模型的基础上进行了改进,提高了模型的性能和效率:
- 更多的训练数据量:LLaMA2 在 2 万亿个 token 的数据上进行预训练,相比LLaMA1 的训练数据量增加了40%。LLaMA2 能够接触到更多的文本信息,从而提高了其理解和生成文本的能力。
- 更长的上下文长度:LLaMA2 的上下文长度增加了一倍,从 LLaMA1 的 2048个 token 增加到了 4096。这使得 LLaMA2 能够处理更长的文本序列,改善了对长文本的理解和生成能力。
- 分组查询注意力(GQA,Grouped-Query Attention):通过将查询(query)分组并在组内共享键(key)和值(value),减少了计算量,同时保持了模型性能,提高了大型模型的推理效率。
1.3.2.2 通义千问
通义千问由阿里巴巴基于“通义”大模型研发
是一个 decoder-Only 的模型,采用 SwiGLU 激活、RoPE、multi-head attention的架构。
所有模型均支持长度为 32768 token 的上下文
1.3.2.3 GLM系列
GLM 系列模型是清华大学和智谱 AI 等合作研发的语言大模型。
ChatGLM3-6B 支持正常的多轮对话的同时,原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
开源了对话模型 ChatGLM3-6B、基础模型 ChatGLM3-6B-Base、长文本对话模型 ChatGLM3-6B-32K、多模态 CogVLM-17B 、以及 智能体 AgentLM 等全面对标 OpenAI:
1.3.2.4 Baichuan系列
由百川智能开发的开源可商用的语言大模型。其基于Transformer 解码器架构(decoder-only)。
开源了预训练和对齐模型,预训练模型是面向开发者的“基座”,而对齐模型则面向广大需要对话功能的普通用户。
二、LLM的能力与特点
2.1 LLM的能力
2.1.1 涌现能力
区分大语言模型(LLM)与以前的预训练语言模型(PLM)最显著的特征之一是它们的涌现能力 。涌现能力是一种令人惊讶的能力,它在小型模型中不明显,但在大型模型中特别突出。类似物理学中的相变现象,涌现能力就像是模型性能随着规模增大而迅速提升,超过了随机水平,也就是我们常说的量变引起质变。
涌现能力可以与某些复杂任务有关,但我们更关注的是其通用能力。接下来,简要介绍三个 LLM 典型的涌现能力:
1. 上下文学习:上下文学习能力是由 GPT-3 首次引入的。这种能力允许语言模型在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出的方式来执行任务,而无需额外的训练或参数更新。
2. 指令遵循:通过使用自然语言描述的多任务数据进行微调,也就是所谓的指令微调。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。
3. 逐步推理:小型语言模型通常难以解决涉及多个推理步骤的复杂任务,例如数学问题。然而,LLM 通过采用 思维链(CoT, Chain of Thought) 推理策略,利用包含中间推理步骤的提示机制来解决这些任务,从而得出最终答案。据推测,这种能力可能是通过对代码的训练获得的。
2.1.2 作为基座模型支持多元应用的能力
借助于海量无标注数据的训练,获得可以适用于大量下游任务的大模型(单模态或者多模态)。这样,多个应用可以只依赖于一个或少数几个大模型进行统一建设。
2.1.3 支持对话作为统一入口的能力
让大语言模型真正火爆的契机,是基于对话聊天的 ChatGPT。
用户对于对话交互具有特殊偏好
2.2 LLM的特点
-
巨大的规模: LLM 通常具有巨大的参数规模,可以达到数十亿甚至数千亿个参数。这使得它们能够捕捉更多的语言知识和复杂的语法结构。
-
预训练和微调: LLM 采用了预训练和微调的学习方法。首先在大规模文本数据上进行预训练(无标签数据),学习通用的语言表示和知识。然后通过微调(有标签数据)适应特定任务,从而在各种 NLP 任务中表现出色。
-
上下文感知: LLM 在处理文本时具有强大的上下文感知能力,能够理解和生成依赖于前文的文本内容。这使得它们在对话、文章生成和情境理解方面表现出色。
-
多语言支持: LLM 可以用于多种语言,不仅限于英语。它们的多语言能力使得跨文化和跨语言的应用变得更加容易。
-
多模态支持: 一些 LLM 已经扩展到支持多模态数据,包括文本、图像和声音。使得它们可以理解和生成不同媒体类型的内容,实现更多样化的应用。
-
伦理和风险问题: 尽管 LLM 具有出色的能力,但它们也引发了伦理和风险问题,包括生成有害内容、隐私问题、认知偏差等。因此,研究和应用 LLM 需要谨慎。
-
高计算资源需求: LLM 参数规模庞大,需要大量的计算资源进行训练和推理。通常需要使用高性能的 GPU 或 TPU 集群来实现。
三、LLM的应用与影响
LLM 的出现让人们重新思考了 通用人工智能(AGI) 的可能性。AGI 是一种像人类一样思考和学习的人工智能。LLM 被认为是 AGI 的一种早期形式,这引发了对未来人工智能发展的许多思考和计划。
2.检索增强生成RAG简介
一、什么是RAG
为了解决大型语言模型在生成文本时面临的一系列挑战,提高模型的性能和输出质量
研究人员提出了一种新的模型架构:检索增强生成(RAG, Retrieval-Augmented Generation)
该架构巧妙地整合了从庞大知识库中检索到的相关信息,并以此为基础,指导大型语言模型生成更为精准的答案
目前 LLM 面临的主要问题有:
-
信息偏差/幻觉: LLM 有时会产生与客观事实不符的信息,导致用户接收到的信息不准确。RAG 通过检索数据源,辅助模型生成过程,确保输出内容的精确性和可信度,减少信息偏差。
-
知识更新滞后性: LLM 基于静态的数据集训练,这可能导致模型的知识更新滞后,无法及时反映最新的信息动态。RAG 通过实时检索最新数据,保持内容的时效性,确保信息的持续更新和准确性。
-
内容不可追溯: LLM 生成的内容往往缺乏明确的信息来源,影响内容的可信度。RAG 将生成内容与检索到的原始资料建立链接,增强了内容的可追溯性,从而提升了用户对生成内容的信任度。
-
领域专业知识能力欠缺: LLM 在处理特定领域的专业知识时,效果可能不太理想,这可能会影响到其在相关领域的回答质量。RAG 通过检索特定领域的相关文档,为模型提供丰富的上下文信息,从而提升了在专业领域内的问题回答质量和深度。
-
推理能力限制: 面对复杂问题时,LLM 可能缺乏必要的推理能力,这影响了其对问题的理解和回答。RAG 结合检索到的信息和模型的生成能力,通过提供额外的背景知识和数据支持,增强了模型的推理和理解能力。
-
应用场景适应性受限: LLM 需在多样化的应用场景中保持高效和准确,但单一模型可能难以全面适应所有场景。RAG 使得 LLM 能够通过检索对应应用场景数据的方式,灵活适应问答系统、推荐系统等多种应用场景。
-
长文本处理能力较弱: LLM 在理解和生成长篇内容时受限于有限的上下文窗口,且必须按顺序处理内容,输入越长,速度越慢。RAG 通过检索和整合长文本信息,强化了模型对长上下文的理解和生成,有效突破了输入长度的限制,同时降低了调用成本,并提升了整体的处理效率。
二、RAG的工作流程
- 数据处理阶段
对原始数据进行清洗和处理。
将处理后的数据转化为检索模型可以使用的格式。
将处理后的数据存储在对应的数据库中。 - 检索阶段
将用户的问题输入到检索系统中,从数据库中检索相关信息。 - 增强阶段
对检索到的信息进行处理和增强,以便生成模型可以更好地理解和使用。 - 生成阶段
将增强后的信息输入到生成模型中,生成模型根据这些信息生成答案。
三、RAG VS Finetune
在提升大语言模型效果中,RAG 和 微调(Finetune)是两种主流的方法。
3.LangChain
一、什么是LangChain
LangChain 框架是一个开源工具,充分利用了大型语言模型的强大能力,以便开发各种下游应用。它的目标是为各种大型语言模型应用提供通用接口,从而简化应用程序的开发流程。具体来说,LangChain 框架可以实现数据感知和环境互动,也就是说,它能够让语言模型与其他数据来源连接,并且允许语言模型与其所处的环境进行互动。
利用 LangChain 框架,我们可以轻松地构建如下所示的 RAG 应用。在下图中,每个椭圆形代表了 LangChain 的一个模块,例如数据收集模块或预处理模块。每个矩形代表了一个数据状态,例如原始数据或预处理后的数据。箭头表示数据流的方向,从一个模块流向另一个模块。在每一步中,LangChain 都可以提供对应的解决方案,帮助我们处理各种任务。
二、LangChain的核心组件
LangChian 作为一个大语言模型开发框架,可以将** LLM 模型(对话模型、embedding 模型等)、向量数据库、交互层 Prompt、外部知识、外部代理工具**整合到一起,进而可以自由构建 LLM 应用。 LangChain 主要由以下 6 个核心组件组成:
- 模型输入/输出(Model I/O):与语言模型交互的接口
- 数据连接(Data connection):与特定应用程序的数据进行交互的接口
- 链(Chains):将组件组合实现端到端应用。比如后续我们会将搭建检索问答链来完成检索问答。
记忆(Memory):用于链的多次运行之间持久化应用程序状态; - 代理(Agents):扩展模型的推理能力。用于复杂的应用的调用序列;
- 回调(Callbacks):扩展模型的推理能力。用于复杂的应用的调用序列;
三、LangChain的稳定版本
2024 年 1 月 9 日,LangChain 正式发布了其稳定版本 v0.1.0,其涵盖了模型的输入与输出处理、数据连接、链式操作、记忆机制、代理服务以及回调处理等关键组件
-
兼容性与支持:LangChain v0.1.0 版本兼顾了对 Python 和 JavaScript 的支持,同时保持了向后兼容性,确保开发者能够在升级过程中无缝过渡,享受到更加安全稳定的开发体验。
-
架构改进:通过将核心组件 langchain-core 与合作伙伴包进行有效分离,LangChain 的架构设计变得更加条理清晰和稳固,为未来的系统化扩展和安全性提升奠定了坚实基础。
-
可观察性:LangChain 通过与 LangSmith 的深度集成,提供了业界领先的调试和观测功能。这使得开发者能够对 LLM 应用中的每一步操作及其输入输出有一个清晰的认识,极大地简化了调试和问题排查的流程。
-
广泛的集成:LangChain 拥有近 700 个集成,覆盖了从 LLM 到向量存储、工具和智能体(Agent)等多个技术领域,极大地降低了在各种技术栈上构建 LLM 应用的复杂度。
-
可组合性:借助 LangChain 表达式语言(LCEL),开发者可以轻松地构建和定制 chain,充分利用数据编排框架的优势,包括批量处理、并行化操作和备选方案等高级功能。
-
流式处理:LangChain 对流式处理进行了深度优化,确保所有利用 LCEL 创建的 chain 均能支持流式处理,包括中间步骤的数据流传输,从而为用户提供更加流畅的体验。
-
输出解析:LangChain 提供了一系列强大的输出解析工具,确保 LLM 能够以结构化的格式返回信息,这对于 LLM 执行具体行动计划至关重要。
-
检索能力:LangChain 引入了先进的检索技术,适用于生产环境,包括文本分割、检索机制和索引管道等,使得开发者能够轻松地将私有数据与LLM的能力相结合。
-
工具使用与智能体:LangChain 提供了丰富的智能体和工具集合,并提供了定义工具的简便方法,支持智能体工作负载,包括让LLM 调用函数或工具,以及如何高效地进行多次调用和推理,极大地提升了开发效率和应用性能。
四、LangChain的生态
-
LangChain Community: 专注于第三方集成,极大地丰富了 LangChain 的生态系统,使得开发者可以更容易地构建复杂和强大的应用程序,同时也促进了社区的合作和共享。
-
LangChain Core: LangChain 框架的核心库、核心组件,提供了基础抽象和 LangChain 表达式语言(LCEL),提供基础架构和工具,用于构建、运行和与 LLM 交互的应用程序,为 LangChain 应用程序的开发提供了坚实的基础。我们后续会用到的处理文档、格式化 prompt、输出解析等都来自这个库。
-
LangChain CLI: 命令行工具,使开发者能够通过终端与 LangChain 框架交互,执行项目初始化、测试、部署等任务。提高开发效率,让开发者能够通过简单的命令来管理整个应用程序的生命周期。
-
LangServe: 部署服务,用于将 LangChain 应用程序部署到云端,提供可扩展、高可用的托管解决方案,并带有监控和日志功能。简化部署流程,让开发者可以专注于应用程序的开发,而不必担心底层的基础设施和运维工作。
-
LangSmith: 开发者平台,专注于 LangChain 应用程序的开发、调试和测试,提供可视化界面和性能分析工具,旨在帮助开发者提高应用程序的质量,确保它们在部署前达到预期的性能和稳定性标准。
4.开发LLM应用的整体流程
一、何为大模型开发
-
将开发以大语言模型为功能核心、通过大语言模型的强大理解能力和生成能力、结合特殊的数据或业务逻辑来提供独特功能的应用称为大模型开发。
-
通过调用 API 或开源模型来实现核心的理解与生成,通过 Prompt Enginnering 来实现大语言模型的控制,因此,虽然大模型是深度学习领域的集大成之作,大模型开发却更多是一个工程问题。
-
一般不会去大幅度改动模型,而是将大模型作为一个调用工具,通过 Prompt Engineering、数据工程、业务逻辑分解等手段来充分发挥大模型能力,适配应用任务,而不会将精力聚焦在优化模型本身上。
-
以调用、发挥大模型为核心的大模型开发与传统的 AI 开发在整体思路上有着较大的不同。大语言模型的两个核心能力:指令遵循与文本生成提供了复杂业务逻辑的简单平替方案。
传统的 AI 开发:首先需要将非常复杂的业务逻辑依次拆解,对于每一个子业务构造训练数据与验证数据,对于每一个子业务训练优化模型,最后形成完整的模型链路来解决整个业务逻辑。
大模型开发:用 Prompt Engineering 来替代子模型的训练调优,通过 Prompt 链路组合来实现业务逻辑,用一个通用大模型 + 若干业务 Prompt 来解决任务,从而将传统的模型训练调优转变成了更简单、轻松、低成本的 Prompt 设计调优。
- 同时,在评估思路上,大模型开发与传统 AI 开发也有质的差异。
传统 AI 开发:需要首先构造训练集、测试集、验证集,通过在训练集上训练模型、在测试集上调优模型、在验证集上最终验证模型效果来实现性能的评估。
大模型开发:流程更为灵活和敏捷。从实际业务需求出发构造小批量验证集,设计合理 Prompt 来满足验证集效果。然后,将不断从业务逻辑中收集当下 Prompt 的 Bad Case,并将 Bad Case 加入到验证集中,针对性优化 Prompt,最后实现较好的泛化效果。
二、大模型开发的一般流程
- 确定目标
- 设计功能
- 搭建整体架构:采用的特定数据库 + Prompt + 通用大模型的架构
- 搭建数据库
- Prompt Engineering
- 验证迭代
- 前后端搭建
- 体验优化
三、搭建LLM项目的流程简析(以知识库助手为例)
步骤一:项目规划与需求分析
1.项目目标:基于个人知识库的问答助手
2.核心功能
- 将爬取并总结的MD文件及用户上传文档向量化,并创建知识库;
- 选择知识库,检索用户提问的知识片段;
- 提供知识片段与提问,获取大模型回答;
- 流式回复;
- 历史对话记录
3.确定技术架构和工具
- 框架:LangChain
- Embedding模型:GPT、智谱、M3E
- 数据库:Chroma
- 大模型:GPT、讯飞星火、文心一言、GLM 等
- 前后端:Gradio 和 Streamlit
步骤二:数据准备与向量知识库搭建
1.收集和整理用户提供的文档
可以使用 LangChain 的文档加载器模块方便地加载用户提供的文档,或者使用一些成熟的 Python 包进行读取。
由于目前大模型使用 token 的限制,我们需要对读取的文本进行切分,将较长的文本切分为较小的文本,这时一段文本就是一个单位的知识。
2.将文档词向量化
使用文本嵌入(Embeddings)技术对分割后的文档进行向量化,使语义相似的文本片段具有接近的向量表示。然后,存入向量数据库,完成 索引(index) 的创建。
利用向量数据库对各文档片段进行索引,可以实现快速检索。
3.将向量化后的文档导入Chroma知识库,建立知识库索引
Langchain 集成了超过 30 个不同的向量数据库。Chroma 数据库轻量级且数据存储在内存中,这使得它非常容易启动和开始使用。
将用户知识库内容经过 Embedding 存入向量数据库,然后用户每一次提问也会经过 Embedding,利用向量相关性算法(例如余弦算法)找到最匹配的几个知识库片段,将这些知识库片段作为上下文,与用户问题一起作为 Prompt 提交给 LLM 回答。
步骤三:大模型集成于API连接
- 集成 GPT、星火、文心、GLM 等大模型,配置 API 连接。
- 编写代码,实现与大模型 API 的交互,以便获取问题回答。
步骤四:核心功能实现
- 构建 Prompt Engineering,实现大模型回答功能,根据用户提问和知识库内容生成回答。
- 实现流式回复,允许用户进行多轮对话。
- 添加历史对话记录功能,保存用户与助手的交互历史。
步骤五:核心功能迭代优化
- 进行验证评估,收集 Bad Case。
- 根据 Bad Case 迭代优化核心功能实现
步骤六:前端与用户交互界面开发
- 使用 Gradio 和 Streamlit 搭建前端界面。
- 实现用户上传文档、创建知识库的功能。
- 设计用户界面,包括问题输入、知识库选择、历史记录展示等。
步骤七:部署测试与上线
- 部署问答助手到服务器或云平台,确保可在互联网上访问。
- 进行生产环境测试,确保系统稳定。
- 上线并向用户发布。
步骤八:维护与持续改进
5.环境配置
1.阿里云服务器
- 新建立的阿里云服务器要点击远程连接然后重置密码.
- 把默认密码root输入会显示不支持用户名密码登录,说是由于SSH服务对应配置文件/etc/ssh/sshd_config中的参数PasswordAuthentication被设置为no,表示禁止以密码方式登录ECS实例,需要修改为yes。但是连接不上咋改
- 方法二:简单处理方式:在云服务器管理控制台页面,点击‘远程连接’附近三点,选择重置实例密码。再次登录就可以啦。
- 如果不重置密码,vscode的ssh连接和MobaXterm的ssh连接都会失败
2.Jupyter
建议直接下载Anaconda,自带python和Jupyter,无需再下载python了,下载的时候注意选择注册python为默认解释器,另外要配置五个环境变量:在path里面配置,注意路径需要根据自己的情况调整
D:\WorkSoftware\Install\Anaconda3
D:\WorkSoftware\Install\Anaconda3\Scripts
D:\WorkSoftware\Install\Anaconda3\Library\bin
D:\WorkSoftware\Install\Anaconda3\Library\mingw-w64\bin
D:\WorkSoftware\Install\Anaconda3\Library\usr\bin
单元格编辑
Enter: 进入编辑模式。
Esc: 退出编辑模式。
单元格操作
A: 在当前单元格上方插入一个新的单元格。
B: 在当前单元格下方插入一个新的单元格。
D (两次按下): 删除当前单元格。
Z: 撤销删除操作。
C: 复制当前单元格。
V: 粘贴之前复制的单元格。
X: 剪切当前单元格。
Y: 将当前单元格转换为代码单元格。
M: 将当前单元格转换为 Markdown 单元格。
Shift + M: 切换单元格的 Markdown 渲染状态。
代码执行和调试
Shift + Enter: 运行当前单元格,并跳转到下一个单元格。
Ctrl + Enter: 运行当前单元格,但不跳转到下一个单元格。
Alt + Enter: 运行当前单元格,并在下方插入一个新的单元格。
Esc: 进入命令模式。
Enter: 进入编辑模式。
Ctrl + Shift + -: 分割当前单元格为两个单元格。
Ctrl + Shift + P: 打开命令面板,可以搜索和执行各种命令
导航和窗口管理
Up / Down 或 K / J: 在单元格之间上下移动。
Home / End: 跳转到 Notebook 的开始或结束。
Ctrl + Home / Ctrl + End: 跳转到当前 Notebook 的第一个或最后一个单元格。
Tab: 在 Notebook 视图中切换到下一个面板(例如,从编辑器到输出或元数据面板)。
Shift + Tab: 在 Notebook 视图中切换到上一个面板。
其他有用的快捷键
H: 显示或隐藏 Notebook 的侧边栏。
M: 将当前单元格转换为 Markdown 单元格。
Y: 将当前单元格转换为代码单元格。
3.全新环境配置
(此处用的是Ubuntu阿里云服务器2核4G)
基础环境配置(git和conda)
- 生成 ssh key ssh-keygen -t rsa -C “youremail@example.com” 提示保存在一个默认目录直接回车,这个默认目录跟下面cat后面的相对应
- 将公钥添加到github: 命令行输入cat ~/.ssh/id_rsa.pub 复制输出内容,打开 github,点击右上角头像,选择 settings -> SSH and GPG keys -> New SSH key,将复制的内容粘贴到 key 中,点击 Add SSH key。
- 安装conda环境
安装
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
初始化
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh
新建终端,检查conda是否安装成功
conda --version
-
新建虚拟环境 conda create -n llm-universe python=3.10
-
激活虚拟环境 conda activate llm-universe
-
克隆当前仓库 git clone git@github.com:datawhalechina/llm-universe.git
-
安装所需的包 pip install -r requirements.txt 通常可以通过清华源加速安装 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple(不用这么麻烦,可以参考下面链接配置下载源)
-
建议先看第二个链接,直接看第一个链接会被带着去pip一个Jupyter,我最后只保留Anaconda自带的Jupyter,把pip下载的删了,而且普通命令行还删不掉,需要用管理员打开powershell
4.vscode配置
下载python插件和Jupyter插件
为Jupyter配置python:打开一个jupyter notebook,选择右上角的Python解释器,点击选择 Python 后进入环境列表,并选择我们配置好的环境 llm-universe
6.在别人的笔记看到的关于各种名词的解释
1.Encoder/Decoder
编码器/解码器和它们的名字一样,所做的事情就是对数据进行编解码,那么在NLP任务中,码是什么,为什么要这么做?
机器是绝对看不懂汉字的(当然,英文也看不懂),在这种情况下,它更不可能做好有关文本的任务。
回想我们在用计算机算数之前做了什么?把它们变成二进制,这样机器就能计算了;但还不够,如果输出也是一堆灯管的或明或暗,也不够我们看懂,所以需要再把它转成十进制数(或者说,屏幕上显示的数)
所以这里,我们同样要做类似的过程,把文本转化成向量,模型操作向量,输出转回文本(或者其他形式),这就是Encoder/Decoder做的事情。
注意,这里还涉及了“如果把文本转换成向量,那么向量是什么意思?”等等的语义问题,具体可以另外参考”Word Embedding 嵌入”所做的事情,这里就略去。
总结:输入序列 + Encoder = 向量;输入向量 + 模型 = 输出向量;输出向量 + Decoder = 输出序列
2.Attention
就像人类的注意力指人会有关注的焦点一样*(比如此时此刻你正在阅读这段括号里的内容,而看不到其他文字,即使它们在你的视野里)*,你可以把Attention理解为机器的关注焦点。
Attention的出现让语言模型可以更像人类一样理解内容(或者说:记住),同样以你正在阅读的这段文本为例,你明确地知道这段内容是属于“Attention”小标题下的,相当于在你脑内的模型中,给“Attention”了一个很高的重要性。
小学的时候,老师会教你概括每个自然段,再去理解全文,现在我们也是这样教会机器读书的。
3.Transformer
正如机器是由若干精密零件组成的,我们不会用齿轮去做计时,但是可以用多个齿轮和指针拼成钟表。前面所说的Encoder/Decoder/Embedding/Attention可以视为齿轮、指针,Transformer就像是告诉我们如何组合齿轮的说明书,在这里,它叫做架构。
至于具体的实现细节,你可以不必关心。而我,也并不完全懂,交给搜索引擎吧。
4.BERT = Bidirectional Encoder Representation from Transformers
名字很长,而且和BARD很像,但是它们不属于同一个层次的概念(BARD和BERT的关系就像是鱼香肉丝和青椒的关系,如果你所在的地方鱼香肉丝不放青椒,那就换成西红柿炒蛋和蛋。)
BERT的概念和GPT可以类似同级的,它们都是“预训练语言模型”(针对广大食客的预制菜)
衍生自Transformer的双向编码器表达?没关系,没有人会用中文叫它。只需要记住,BERT是在Transformer架构的基础上,发展出来的预训练语言模型。
5.GPT = Generative Pre-Trained Transformer
就像前面所说的,GPT和BERT同属一个层次的概念(注意不要把GPT和chatGPT弄混淆,可以理解为chatGPT是在拆开预制菜的包装后,另外放香菜特意满足一部分食客的成品菜)
仅供了解,技术细节同样可以忽略。(一切底层的事务都已经被安排好了,只考虑应用的话,我们只需关注如何调用接口,也就是到档口点菜。)
6.LLaMA
如果你前面都看了,那么对此你只需要记住这些关键词:开源、和GPT BERT同级。