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

以简单的方式解释开发基于LLM的应用所需的核心技术。
本文旨在以简单的方式解释开发基于LLM的应用所需的关键技术。它适用于软件开发人员、数据科学家和人工智能爱好者,他们对机器学习概念有基本的理解,并希望深入探讨。本文还提供了许多有用的链接供进一步学习。这将会很有趣!
1. 大型语言模型(LLM)简介
我想你已经听说过很多关于LLM的内容,所以我不会给你太多的负担。我们只需要知道:大型语言模型(LLM)是一个大型神经网络模型,它基于先前预测的标记预测下一个标记。就这些。

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

使用LLM的一些项目示例:
- Notion AI — 有助于提高写作质量、生成内容、纠正拼写和语法、编辑语音和语调、翻译等。
- GitHub Copilot — 通过提供自动完成风格的建议来改进您的代码。
- Dropbox Dash — 提供自然语言搜索功能,并明确引用答案来源的文件。
如果您想详细了解LLM的工作原理,我强烈建议阅读马克·里德尔(Mark Riedl)所写的优秀文章“非常温和地介绍大型语言模型,不带炒作”。
2. 开源与闭源模型
虽然存在一些差异,但我将以下列作为主要差异:
- 隐私 — 大型公司选择自托管解决方案的最重要原因之一。
- 快速原型 — 对于小型创业公司来说,快速测试其想法而不过度支出很好。
- 生成质量 — 要么您对模型进行微调以适应特定任务,要么使用付费API。
没有明确的答案,何者更好或更差。我强调了以下几点:
如果您对细节感兴趣,我建议阅读我的文章“您不需要托管LLM,对吗?”。
流行的开源模型
流行的闭源模型
探索LLM Collection以查看所有模型。
3. 触发器工程的艺术
我知道,很多人认为这是伪科学或者只是一时的炒作。但事实是,我们仍然没有完全理解LLM是如何工作的。为什么它们有时能提供高质量的回答,而有时却会虚构事实(产生幻觉)?或者为什么在提示中加入”让我们逐步思考”会突然提高质量?

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

我不会用复杂的提示链来让你感到乏味;相反,我将给出一些可立即提高性能的示例:
- “让我们逐步思考” — 适用于推理或逻辑任务
- “深呼吸,逐步解决这个问题” — 对前一个观点的改进版本。可以增加几个百分点的质量。
- “这对我的职业非常重要” — 只需将其添加到提示的末尾,你会注意到质量提高了5-20%。
此外,我将立即分享一个有用的提示模板:
让我们将X命令与清晰思维相结合,以快速准确地逐步解读答案。在回答中提供细节并包含来源。这对我的职业非常重要。
其中X是你正在解决的任务的行业,例如编程。
我强烈推荐花几个晚上探索即时工程技术。这不仅可以让您更好地控制模型的行为,还可以帮助改善质量并减少幻觉。为此,我推荐阅读即时工程指南。
有用链接:
- prompttools — 即时测试和实验,支持LLMs(例如OpenAI,LLaMA)。
- promptfoo — 测试和评估LLM输出质量。
- ChatGPT绝佳提示 — 用于ChatGPT模型的提示示例集合。
4. 合并新数据:检索增强生成(RAG)
RAG 是一种将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)
在实际应用中,事情显然更加复杂。与任何开发一样,您会遇到许多细微之处。例如,检索的文档可能并不总是与问题相关,或者可能存在速度问题。然而,即使在这个阶段,您也可以显著提高搜索系统的质量。
阅读资料和有用链接
- 为生产构建基于RAG的LLM应用 — 一篇详细介绍RAG主要组成部分的精彩文章。
- 为什么您的RAG在生产环境中不可靠 — 一篇由 Ahmed Besbes 写的很棒的文章,清楚地解释了使用RAG时可能遇到的困难。
- 使用LlamaIndex构建RAG流水线的7种查询策略 — 一篇有关使用LlamaIndex构建RAG流水线的详细而细致的信息文章。
- OpenAI检索工具 — 如果您想要最小的工作量,可以使用OpenAI的RAG。
5. 微调您的LLM
微调是在特定数据集上继续训练预训练LLM的过程。您可能会问,如果我们已经可以使用RAG添加数据,为什么还需要进一步训练模型呢?简单地说,只有通过微调才能使您的模型针对特定领域进行定制或定义其样式。例如,我通过在个人通信中进行微调创建了我的一个副本:

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

- 获取一个经过训练的LLM,有时被称为基础LLM,您可以从HuggingFace上下载。
- 准备训练数据,您只需要编译指令和回答。以下是这样一个数据集的示例。您还可以使用GPT-4生成合成数据。
- 选择合适的微调方法,LoRA和QLoRA目前很受欢迎。
- 在新数据上进行微调模型。
何时使用
- 专业应用: 当应用涉及专业或非常规主题时。例如,需要理解和处理法律术语的法律文件应用。
- 自定义语言风格: 适用于需要特定语气或风格的应用。例如,创建一个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内存。
当然,我有点过于简化了,我们只是揭开了表面。实际上,微调过程要复杂得多,为了获得更好的结果,您需要了解各种适配器、它们的参数等等。然而,即使经过这样简单的迭代,您也将拥有一个按照您的指示行事的新模型。
阅读和有用的链接
- 使用经微调的LLM创建自己的虚拟聊天助手 — 我的文章中介绍了收集数据集、使用的参数以及有关微调的有用提示。
- 理解参数高效的大型语言模型微调 — 一个优秀的教程,如果您想深入了解微调的概念和流行的参数高效替代方案。
- 使用LoRA和QLoRA微调LLM:来自数百个实验的见解 — 这是我最喜欢的一篇文章,用于理解LoRA的能力。
- OpenAI微调 — 如果您想以最小的努力微调GPT-3.5。
6. 部署您的LLM应用
有时,我们只是想轻松按下“部署”按钮…
幸运的是,这是完全可行的。有很多专门用于部署大型语言模型的框架。它们有何优势呢?
- 大量预构建的包装器和集成。
- 丰富的可用模型选择。
- 多种内部优化。
- 快速原型设计。
选择正确的框架
部署LLM应用的框架选择取决于各种因素,包括模型的大小、应用的可扩展性要求以及部署环境。目前,框架的多样性不是很大,所以理解它们的区别应该不会太困难。在下面,我为您准备了一份速查表,帮助您快速入门:
此外,在我的文章“为LLM提供服务的7种框架”中,我对现有解决方案进行了更详细的概述。如果您计划部署您的模型,我建议您查阅该文章。

部署示例代码
让我们从理论转向实践,尝试使用文本生成推断来部署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服务,并且你的模型已经完全优化。这难道不是神奇吗?

阅读和有用链接
- 为LLMs提供服务的7个框架 — 详细对比介绍了LLMs推断和提供服务的全面指南。
- 推断端点 — HuggingFace 的产品,允许你在几次点击之间部署任何LLMs。当你需要快速原型设计时,这是一个不错的选择。
7. 幕后剩余事宜
即使我们已经介绍了开发基于LLM的应用程序所需的主要概念,你在未来可能仍会遇到一些方面。因此,我想留下一些有用的链接:
优化
当你启动第一个模型时,你会发现它的速度不如你希望的快,并且消耗大量资源。如果你遇到这种情况,你需要了解如何进行优化。
- 加速托管LLMs的7种方法 — 提供了加速LLMs推断以提高标记生成速度和减少内存消耗的技术。
- 优化PyTorch训练LLMs的内存使用 — 该文章提供了一系列技术,可以将PyTorch中的内存消耗减少约20倍,而不影响建模性能和预测准确性。
评估
假设你有一个经过优化的模型。但是,如何确保其质量已经提高?我们应该使用哪些指标?
- 关于评估大型语言模型的一切 — 一篇关于基准和评估指标的良好概述文章。
- evals — 用于评估LLMs和LLM系统的最受欢迎的框架。
向量数据库
如果你使用RAG,迟早会从内存存储向数据库转移。为此,了解目前市场上的情况及其局限性非常重要。
- 关于向量数据库的一切 — 一步步指南,由 Dominik Polzer 编写,让你发现和利用向量数据库的力量。
- 选择向量数据库:2023年的比较和指南 — 比较了Pinecone、Weaviate、Milvus、Qdrant、Chroma、Elasticsearch和PGvector数据库。
LLM 代理
在我看来,LLMs中最有前景的发展。如果你想让多个模型一起工作,我推荐探索以下链接。
- 基于LLM的自主代理综述 — 这可能是对基于LLM的代理最全面的概述。
- autogen — 是一个框架,可以使用多个代理进行对话来解决任务的LLM应用程序开发。
- OpenAgents — 一个在实际应用中使用和托管语言代理的开放平台。
来自人类反馈的强化学习(RLHF)
一旦允许用户访问你的模型,你就开始承担责任。如果它回复粗鲁?或者透露制作炸弹的成分?为了避免这种情况,请查看以下文章:
- 演示强化学习 (RLHF) 从人类反馈中学习 — 一个详细介绍RLHF技术的概述文章。
- RL4LMs — 一个模块化的RL库,可以根据人类的偏好微调语言模型。
- TRL — 一套用于训练使用强化学习的Transformer语言模型的工具,从监督微调步骤(SFT)、奖励建模步骤(RM)到近端策略优化(PPO)步骤。
结论
尽管我们都有些厌倦了炒作,但LLMs将长期存在,理解它们的技术栈并编写简单应用程序将给你带来重要的提升。希望我能在这个领域的一些方面深入你的理解,并向你展示这方面没有复杂或可怕之处。
感谢您的关注,请继续关注我们的新文章!
免责声明:本文所提供的信息截止至2023年11月,但请注意之后可能会有变化。
除非另有注明,所有图片均由作者提供。
如果您有任何问题或建议,欢迎在 LinkedIn 上联系。