LangChain 101 第2部分ab. 关于(大型语言)模型的一切你需要知道的

LangChain 101 第2部分ab. 揭秘所有你需要了解的(大型语言)模型

这是LangChain 101课程的第2ab部分。强烈建议查看第一部分,以更好地理解本文的背景(请关注作者以不错过下一部分):

LangChain 101:第1部分。构建简单的问答应用程序

在本文中,我将向您介绍LangChain的基础知识,这是一个用于构建大型应用程序的框架…

pub.towardsai.net

Models组件是Langchain的支柱。它是负责生成使技术感觉神奇的令牌的核心。

Models组件允许使用不同的语言模型,包括ChatGPT、GPT-4、LLAMA等。这些模型可用于多个任务,最常见的是回答问题和生成文本。

Models组件使用起来很简单。要生成文本,可以将模型传递一个提示,它将创建一个回答。同样,翻译一句话或回答一个问题也是如此。

Models组件也非常多样化。您可以将它与其他LangChain组件相结合,创建更复杂的系统。例如,您可以将Models组件与Prompts组件结合使用,创建一个能够生成不同类型创意文本格式(如代码、脚本、诗歌或音乐作品、信件或电子邮件等)的聊天机器人。将Models和Indexes组件结合使用,创建一个可以使用来自各种源的信息回答问题的搜索引擎。

所有代码(包括colab笔记本)和额外材料都可在GitHub上找到。

概览

LangChain支持各种不同的模型,因此您可以选择最适合您需求的模型:

  • LLMs使用将文本输入转换为文本输出的API
  • 聊天模型使用处理聊天消息并生成响应的模型
  • 文本嵌入模型将文本转换为数值表示

分词

分词将人类语言分解成词汇或子词的较小单元,以将文本转换为机器可读的数值表示。进一步说,在我们谈论文本生成或代码生成时,我们将其理解为不同类型的令牌生成。

文本生成

假设我们想生成这个短语的后续:

“巴黎是城市……”。

编码器会为我们拥有的所有令牌发送logits(如果您不知道什么是logits,请将其视为分数),可以使用softmax函数将其转换为选择生成的令牌的概率。

阅读有关文本生成的更多信息:

LLM如何生成文本?

本文不讨论变压器或大型语言模型的训练方式。相反,我们将集中讨论如何使用…

pub.towardsai.net

.from_pretrained(<model>)

在许多预训练的语言模型中,分词器和模型架构是设计和训练在一起的。这种耦合的原因是分词器和模型架构必须兼容,以确保一致的分词和解码。

如果分词器和模型架构不同或不同步,可能会导致分词错误、嵌入不匹配和错误的预测。

API密钥

您首先需要为您想要使用的LLM提供程序获取一个API密钥。我们必须在性能和成本之间权衡选择专有或开源基础模型。

许多开源模型组织和托管在Hugging Face作为社区中心。开源模型通常比专有模型更小,能力更低,但更具成本效益。

示例:BLOOM(BigScience),LLaMA(Meta),Flan-T5(Google)等。

专有模型是公司拥有的闭源基础模型。它们通常比开源模型更大,因此具有更好的性能,但可能具有昂贵的API。

示例:OpenAI,co:here,AI21 Labs,Anthropic等。

嵌入

嵌入是单词或实体的紧凑数值表示,有助于计算机更有效地理解和处理语言。这些表示编码了单词的含义和上下文,使机器能够更有意义和高效地与语言交互。

  • OpenAI嵌入
  • HuggingFace嵌入
  • GPT4All嵌入
  • Spacy嵌入
  • 假嵌入

下面,您可以看到几个主题的九个句子的嵌入。为了更好的可视化,热图值进行了预排序。

  1. 长途飞行的最佳旅行颈枕
  2. 轻便的徒步旅行背包
  3. 户外探险用的防水行李袋
  4. 适用于感应式炉灶的不锈钢炊具套装
  5. 高质量的厨师刀套装
  6. 烘焙用高性能立式搅拌机
  7. 小说文学的新作品
  8. 励志传记和回忆录
  9. 个人成长的顶级自助书籍

可以看出,句子1与2和3的相似度较高,与其他句子的相似度较低。可以看到所有句子可以归为三个群组。

大型语言和聊天模型

语言模型是自然语言的概率模型,可以根据训练它的一个或多个语言的文本语料库生成一系列单词的概率。

大型语言模型是使用深度学习技术在大量文本数据上进行训练的先进语言模型。

语言模型通常支持聊天模型,但它们的API更加结构化。这些模型接收一个聊天消息列表作为输入,并返回一个聊天消息。

向GPT提问

无需连接LangChain即可向模型提问。在下面的示例中,我们准备一个提示,连接到openai包,并返回提取的响应。

import openaidef get_completion(prompt, model="gpt-3.5-turbo"):    """    使用指定的模型为给定的提示生成完整的生成。    参数:        prompt (str): 生成完成的输入提示。        model (str): 用于生成完成的模型的名称。    返回:        str: 生成的完成文本。    """    # 创建一个带有用户提示的消息字典列表    messages = [{"role": "user", "content": prompt}]    # 使用OpenAI API生成聊天完成    response = openai.ChatCompletion.create(        model=model,        messages=messages,        temperature=0,  # 将温度设置为0以获取确定性输出    )    # 提取并返回生成的完成内容    return response.choices[0].message["content"]

正如可以看到的,简单的问题模型可以回答正确。但对于复杂的请求,LangChain可能是前进的方向。

内存需求有多大?

要确定模型的大小(以字节为单位),您需要将参数乘以所选择的精度大小。

假设我们选择的精度是bfloat16(16位=2字节)。我们想要使用BLOOM-176B模型。这意味着我们需要1760亿个参数* 2字节= 352GB

机器学习中使用混合精度方法,训练和推理理想情况下都使用FP32进行,但计算使用FP16/BF16进行以提高训练速度。权重以FP32为单位,使用FP16/BF16梯度进行更新。在推理过程中,半精度权重通常提供与FP32相似的质量,从而可以使用较少的GPU更快地进行处理。

量化是一种压缩技术,可减少模型的内存使用量并增强推理效率。后训练量化是将预训练模型的权重转换为较低精度的过程,而无需重新训练。

在代码中,您可能会看到以下量化参数:

# 配置BitsAndBytesConfig进行4位量化bnb_config = BitsAndBytesConfig(    load_in_4bit=True,    bnb_4bit_use_double_quant=True,    bnb_4bit_quant_type="nf4",    bnb_4bit_compute_dtype=torch.bfloat16,)

要全面了解量化,请查看我关于该主题的文章:

如何在小内存中适应大型语言模型:量化

如何在本地计算机上运行LLM

pub.towardsai.net

仅使用CPU运行模型

可能令人惊讶的是,您可以仅使用CPU运行LLM:

# 检查模型版本 https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/tree/main!wget --output-document=llama-2-7b-chat.bin https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/resolve/main/llama-2-7b-chat.ggmlv3.q8_0.binfrom langchain.llms import CTransformers# 为Llama-2-7B-Chat模型初始化本地CTransformers包装器llm = CTransformers(    model="llama-2-7b-chat.bin",  # 下载的GGML模型的位置    model_type="llama",  # 指定模型类型为Llama    config={        "max_new_tokens": 256,        "temperature": 0.1,    },  # 设置特定配置)# 使用提供的提示、llm和verbose设置初始化LLMChain实例llm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)

回复可能需要几分钟的时间,但它展示了在Raspberry设备上甚至可以运行llms的可能性!

这是第1ab部分的结尾。下一部分(cde)将专门讲解微调模型。

拍拍手并关注我,这会激励我写新文章 🙂