使用大型语言模型开发的一切你需要知道的事项

大型语言模型开发的一切你需要知道的美丽时尚秘籍

由Stable Diffusion生成的图片

以简单的方式解释开发基于LLM的应用所需的核心技术。

本文旨在以简单的方式解释开发基于LLM的应用所需的关键技术。它适用于软件开发人员、数据科学家和人工智能爱好者,他们对机器学习概念有基本的理解,并希望深入探讨。本文还提供了许多有用的链接供进一步学习。这将会很有趣!

1. 大型语言模型(LLM)简介

我想你已经听说过很多关于LLM的内容,所以我不会给你太多的负担。我们只需要知道:大型语言模型(LLM)是一个型神经网络模型,它基于先前预测的标记预测下一个标记。就这些。

模型参数数量的比较.看看GPT-3的规模有多大.而且没人知道GPT-4…

LLM的普及度归功于其多功能性和效果的出色。它们可以完美地处理诸如翻译、摘要、意义分析等任务。

LLM的功能

使用LLM的一些项目示例:

  • Notion AI — 有助于提高写作质量、生成内容、纠正拼写和语法、编辑语音和语调、翻译等。
  • GitHub Copilot — 通过提供自动完成风格的建议来改进您的代码。
  • Dropbox Dash — 提供自然语言搜索功能,并明确引用答案来源的文件。

如果您想详细了解LLM的工作原理,我强烈建议阅读马克·里德尔(Mark Riedl)所写的优秀文章“非常温和地介绍大型语言模型,不带炒作”

2. 开源与闭源模型

虽然存在一些差异,但我将以下列作为主要差异:

  • 隐私 — 大型公司选择自托管解决方案的最重要原因之一。
  • 快速原型 — 对于小型创业公司来说,快速测试其想法而不过度支出很好。
  • 生成质量 — 要么您对模型进行微调以适应特定任务,要么使用付费API。

没有明确的答案,何者更好或更差。我强调了以下几点:

如果您对细节感兴趣,我建议阅读我的文章“您不需要托管LLM,对吗?”

  • LLaMA-2,由Meta提供
  • Falcon,由阿布扎比技术创新研究所提供
  • Mistral,由Mistral AI提供
  • GPT-4,由OpenAI提供
  • Bard,由Google提供
  • Claude,由Anthropic提供

探索LLM Collection以查看所有模型。

3. 触发器工程的艺术

我知道,很多人认为这是伪科学或者只是一时的炒作。但事实是,我们仍然没有完全理解LLM是如何工作的。为什么它们有时能提供高质量的回答,而有时却会虚构事实(产生幻觉)?或者为什么在提示中加入”让我们逐步思考”会突然提高质量?

给模型添加情绪色彩可以提高质量。来源

鉴于这一切,科学家和爱好者只能尝试不同的提示,试图使模型表现更好。

用LLM解决问题的各种方法的示意图

我不会用复杂的提示链来让你感到乏味;相反,我将给出一些可立即提高性能的示例:

  1. “让我们逐步思考” — 适用于推理或逻辑任务
  2. “深呼吸,逐步解决这个问题” — 对前一个观点的改进版本。可以增加几个百分点的质量。
  3. “这对我的职业非常重要” — 只需将其添加到提示的末尾,你会注意到质量提高了5-20%。

此外,我将立即分享一个有用的提示模板:

让我们将X命令与清晰思维相结合,以快速准确地逐步解读答案。在回答中提供细节并包含来源。这对我的职业非常重要。

其中X是你正在解决的任务的行业,例如编程。

我强烈推荐花几个晚上探索即时工程技术。这不仅可以让您更好地控制模型的行为,还可以帮助改善质量并减少幻觉。为此,我推荐阅读即时工程指南

  • prompttools — 即时测试和实验,支持LLMs(例如OpenAI,LLaMA)。
  • promptfoo — 测试和评估LLM输出质量。
  • ChatGPT绝佳提示 — 用于ChatGPT模型的提示示例集合。

4. 合并新数据:检索增强生成(RAG)

RAG 是一种将LLM与外部知识库结合的技术。这使得模型可以添加原始训练集中未包含的相关信息或特定数据。

尽管名称令人生畏(有时我们会在其中加入“重新排列器”一词),但它实际上是一种相当古老且令人惊讶地简单的技术:

RAG工作原理的示意图
  1. 将文档转换成数字,我们称之为嵌入
  2. 然后,使用相同的模型将用户的搜索查询也转换为嵌入。
  3. 根据余弦相似度找到前K个最相似的文档。
  4. 要求LLM根据这些文档生成响应。

什么时候使用

  • 需要实时信息:当应用程序需要不断更新的信息,如新闻文章时。
  • 领域特定应用:对于需要LLM训练数据之外的专业知识的应用。例如,公司内部文件。

什么时候不适用

  • 一般对话应用:信息需要是通用的,不需要额外数据。
  • 资源有限的场景:RAG的检索组件需要搜索大型知识库,这可能需要计算资源且速度较慢,但仍比微调更快、更便宜。

使用RAG构建应用

使用LlamaIndex库是一个很好的起点。它使您可以快速将您的数据连接到LLMs。您只需要几行代码:

from llama_index import VectorStoreIndex, SimpleDirectoryReader# 1. 载入您的文档:documents = SimpleDirectoryReader("YOUR_DATA").load_data()# 2. 将它们转换为向量:index = VectorStoreIndex.from_documents(documents)# 3. 提出问题:query_engine = index.as_query_engine()response = query_engine.query("我的老板什么时候生日?")print(response)

在实际应用中,事情显然更加复杂。与任何开发一样,您会遇到许多细微之处。例如,检索的文档可能并不总是与问题相关,或者可能存在速度问题。然而,即使在这个阶段,您也可以显著提高搜索系统的质量。

5. 微调您的LLM

微调是在特定数据集上继续训练预训练LLM的过程。您可能会问,如果我们已经可以使用RAG添加数据,为什么还需要进一步训练模型呢?简单地说,只有通过微调才能使您的模型针对特定领域进行定制或定义其样式。例如,我通过在个人通信中进行微调创建了我的一个副本:

演示尝试在作者的通信上对微调模型

好吧,如果我已经说服您它的重要性,让我们看看它是如何工作的(剧透 – 它并不难):

在特定领域数据上进行微调的经典方法(所有图标来自flaticon)
  1. 获取一个经过训练的LLM,有时被称为基础LLM,您可以从HuggingFace上下载。
  2. 准备训练数据,您只需要编译指令和回答。以下是这样一个数据集的示例。您还可以使用GPT-4生成合成数据
  3. 选择合适的微调方法,LoRAQLoRA目前很受欢迎。
  4. 在新数据上进行微调模型。

何时使用

  • 专业应用: 当应用涉及专业或非常规主题时。例如,需要理解和处理法律术语的法律文件应用。
  • 自定义语言风格: 适用于需要特定语气或风格的应用。例如,创建一个AI角色,无论是名人还是书中的角色。

何时不使用

  • 广泛应用: 应用范围广泛,不需要专业知识。
  • 数据有限: 微调需要大量相关数据。然而,您始终可以使用另一个LLM生成它们。例如,今年早些时候,52k个LLM生成的指令-回答对数据集Alpaca数据集用于创建第一个微调的Llama v1模型

微调您的LLM

您可以找到大量专注于模型微调的文章。仅在VoAGI上就有成千上万篇文章。因此,我不想深入探讨这个话题,只会向您展示一个高级库Lit-GPT,它隐藏了所有的魔法。是的,它不允许对训练过程进行太多自定义,但您可以快速进行实验并获得初始结果。您只需要几行代码:

# 1. 下载模型:python scripts/download.py --repo_id meta-llama/Llama-2-7b# 2. 将检查点转换为lit-gpt格式:python scripts/convert_hf_checkpoint.py --checkpoint_dir checkpoints/llama# 3. 生成指令调整数据集:python scripts/prepare_alpaca.py # 应该使用你的数据集# 4. 运行微调脚本python finetune/lora.py \    --checkpoint_dir checkpoints/llama/    --data_dir your_data_folder/    --out_dir my_finetuned_model/ 

就是这样! 您的训练过程将开始:

请注意,此过程可能需要很长时间。在单个A100 GPU上,将Falcon-7B微调大约需要10小时30GB内存。

当然,我有点过于简化了,我们只是揭开了表面。实际上,微调过程要复杂得多,为了获得更好的结果,您需要了解各种适配器、它们的参数等等。然而,即使经过这样简单的迭代,您也将拥有一个按照您的指示行事的新模型。

6. 部署您的LLM应用

有时,我们只是想轻松按下“部署”按钮…

幸运的是,这是完全可行的。有很多专门用于部署大型语言模型的框架。它们有何优势呢?

  • 大量预构建的包装器和集成。
  • 丰富的可用模型选择。
  • 多种内部优化。
  • 快速原型设计。

选择正确的框架

部署LLM应用的框架选择取决于各种因素,包括模型的大小、应用的可扩展性要求以及部署环境。目前,框架的多样性不是很大,所以理解它们的区别应该不会太困难。在下面,我为您准备了一份速查表,帮助您快速入门:

此外,在我的文章“为LLM提供服务的7种框架”中,我对现有解决方案进行了更详细的概述。如果您计划部署您的模型,我建议您查阅该文章。

LLM推理框架比较

部署示例代码

让我们从理论转向实践,尝试使用文本生成推断来部署LLaMA-2。正如你可能猜到的,你只需要几行代码:

# 1. 创建一个用于存储模型的文件夹:mkdir data# 2. 运行Docker容器(启动RestAPI服务):docker run --gpus all --shm-size 1g -p 8080:80 \    -v $volume:/data \    ghcr.io/huggingface/text-generation-inference:1.1.0    --model-id meta-llama/Llama-2-7b# 3. 现在你可以发送请求了:curl 127.0.0.1:8080/generate \    -X POST \    -d '{"inputs":"告诉我一个笑话!","parameters":{"max_new_tokens":20}}' \    -H 'Content-Type: application/json'

就是这样!你已经建立了一个带有内建日志记录、用于监控的Prometheus端点、令牌流式传输的RestAPI服务,并且你的模型已经完全优化。这难道不是神奇吗?

API文档
  • 为LLMs提供服务的7个框架 — 详细对比介绍了LLMs推断和提供服务的全面指南。
  • 推断端点 — HuggingFace 的产品,允许你在几次点击之间部署任何LLMs。当你需要快速原型设计时,这是一个不错的选择。

7. 幕后剩余事宜

即使我们已经介绍了开发基于LLM的应用程序所需的主要概念,你在未来可能仍会遇到一些方面。因此,我想留下一些有用的链接:

优化

当你启动第一个模型时,你会发现它的速度不如你希望的快,并且消耗大量资源。如果你遇到这种情况,你需要了解如何进行优化。

评估

假设你有一个经过优化的模型。但是,如何确保其质量已经提高?我们应该使用哪些指标?

向量数据库

如果你使用RAG,迟早会从内存存储向数据库转移。为此,了解目前市场上的情况及其局限性非常重要。

LLM 代理

在我看来,LLMs中最有前景的发展。如果你想让多个模型一起工作,我推荐探索以下链接。

  • 基于LLM的自主代理综述 — 这可能是对基于LLM的代理最全面的概述。
  • autogen — 是一个框架,可以使用多个代理进行对话来解决任务的LLM应用程序开发。
  • OpenAgents — 一个在实际应用中使用和托管语言代理的开放平台。

来自人类反馈的强化学习(RLHF)

一旦允许用户访问你的模型,你就开始承担责任。如果它回复粗鲁?或者透露制作炸弹的成分?为了避免这种情况,请查看以下文章:

  • 演示强化学习 (RLHF) 从人类反馈中学习 — 一个详细介绍RLHF技术的概述文章。
  • RL4LMs — 一个模块化的RL库,可以根据人类的偏好微调语言模型。
  • TRL — 一套用于训练使用强化学习的Transformer语言模型的工具,从监督微调步骤(SFT)、奖励建模步骤(RM)到近端策略优化(PPO)步骤。

结论

尽管我们都有些厌倦了炒作,但LLMs将长期存在,理解它们的技术栈并编写简单应用程序将给你带来重要的提升。希望我能在这个领域的一些方面深入你的理解,并向你展示这方面没有复杂或可怕之处。

感谢您的关注,请继续关注我们的新文章!

免责声明:本文所提供的信息截止至2023年11月,但请注意之后可能会有变化。

除非另有注明,所有图片均由作者提供。

如果您有任何问题或建议,欢迎在 LinkedIn 上联系。