关于chatgpt:在家构建您的迷你聊天Chat-gpt

4次阅读

共计 6007 个字符,预计需要花费 16 分钟才能阅读完成。

ChatGPT 很乏味。很有可能,您还心愿私下运行本人的正本。实际上,这是不可能的,因为 ChatGPT 不是一个下载软件,它须要微小的计算机能力能力运行。然而您能够构建一个能够在商用硬件上运行的精简版本。在这篇文章中,您将理解 什么是能够像 ChatGPT 一样运行的语言模型 如何应用高级语言模型构建聊天机器人

举荐:应用 NSDT 场景编辑器助你疾速搭建可编辑的 3D 利用场景

什么是指令遵循模型?

语言模型是机器学习模型,能够依据句子的前一个单词预测单词概率。如果咱们向模型申请下一个单词,并将其递加地反馈给模型以申请更多单词,则模型正在执行文本生成。

文本生成模型是许多大型语言模型(如 GPT3)背地的想法。然而,指令遵循模型是理解对话框和阐明的微调文本生成模型。它作为两个人之间的对话,当一个人实现一个句子时,另一个人会做出相应的回应。

因而,文本生成模型能够帮忙您应用前导句实现段落。然而,遵循指令的模型能够答复您的问题或依据要求进行响应。

这并不意味着您不能应用文本生成模型来构建聊天机器人。然而,您应该应用指令遵循模型找到更高质量的后果,该模型针对此类用处进行了微调。

如何查找以下模型的指令

现在,您可能会在模型之后找到很多阐明。然而要构建聊天机器人,您须要一些能够轻松应用的货色。

您能够搜寻的一个不便的存储库是拥抱脸。那里的模型应该与 Hugging Face 中的变压器库一起应用。这很有帮忙,因为不同的模型的工作形式可能略有不同。使 Python 代码反对多个模型会很乏味,但转换器库将它们对立起来,并从代码中暗藏所有这些差别。

通常,模型前面的指令在模型名称中带有关键字“instruct”。在拥抱脸上应用此关键字搜寻能够为您提供一千多个模型。但并非所有人都能见效。您须要查看它们中的每一个并浏览它们的模型卡,以理解该模型能够做什么,以便抉择最合适的模型。

抉择型号有几个技术标准:

  • 模型的训练内容:具体来说,这意味着模型能够说哪种语言。用小说中的英文文本训练的模型可能对德国物理聊天机器人没有帮忙。
  • 它应用的深度学习库是什么:通常 Hugging Face 中的模型是用 TensorFlow,PyTorch 和 Flax 构建的。并非所有模型都有实用于所有库的版本。您须要确保已装置该特定库,而后能力应用转换器运行模型。
  • 模型须要哪些资源:模型可能是微小的。通常,它须要 GPU 能力运行。然而有些型号须要一个十分高端的 GPU 甚至多个高端 GPU。您须要验证您的资源是否能够反对模型推理。

构建一个简略的聊天机器人

让咱们构建一个简略的聊天机器人。聊天机器人只是一个在命令行上运行的程序,它承受用户的一行文本作为输出,并应用语言模型生成的一行文本进行响应。

为此工作抉择的模型是。它是一个 7 亿个参数的模型。您可能须要在古代 GPU 上运行,例如 nVidia RTX 3000 系列,因为它设计为在 bfloat16 浮点上运行以获得最佳性能。应用 Google Colab 上的 GPU 资源,或从 AWS 上适合的 EC2 实例也是选项。

在 Python 中构建聊天机器人,它非常简单:

while True:    
    user_input = input(">")
    print(response)

该函数从用户那里获取一行输出。您将在屏幕上看到输出的字符串。按 Enter 后将捕捉输出。input(“> “)”> “

要害是如何失去回应。在 LLM 中,您将输出或提醒作为令牌 ID(整数)序列提供,它将应用另一个令牌 ID 序列进行响应。您应该在与 LLM 交互之前和之后在整数序列和文本字符串之间进行转换。令牌 ID 特定于每个模型; 也就是说,对于雷同的整数,它示意不同模型的不同单词。

拥抱脸库是为了使这些步骤更容易。您所须要的只是创立一个管道并指定模型名称以及其余一些参数。应用模型名称、bfloat16 浮点设置管道,并容许模型应用 GPU(如果可用),如下所示:transformerstiiuae/falcon-7b-instruct

from transformers import AutoTokenizer, pipeline
import torch 
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",
)

创立管道是因为这是模型卡倡议你应用此模型的形式。管道 in 是特定工作的一系列步骤。文本生成是这些工作之一。”text-generation”transformers

若要应用管道,须要指定更多参数来生成文本。回忆一下,模型不是间接生成文本,而是生成令牌的概率。您必须从这些概率中确定下一个单词是什么,并反复该过程以生成更多单词。通常,此过程会引入一些变动,不抉择概率最高的单个代币,而是依据概率分布进行采样。

以下是您将如何应用管道:

newline_token = tokenizer.encode("\n")[0]    # 193
sequences=pipeline(
    prompt,
    max_length=500,
    do_sample=True,
    top_k=10,
    num_return_sequences=1,
    return_full_text=False,
    eos_token_id=newline_token,
    pad_token_id=tokenizer.eos_token_id,
)

您在变量中提供了生成输入序列的提醒。您能够要求模型为您提供几个选项,但在这里您设置了以下选项,因而只有一个。您还能够让模型应用采样生成文本,但只能从 10 个最高概率标记()生成文本。返回的序列将不蕴含您的提醒,因为您有 . 最重要的一个参数是 和。这些是为了让模型间断生成文本,但只到换行符为止。换行符的标记 ID 为 193,从代码段的第一行取得。

promptnum_return_sequences=1top_k=10return_full_text=Falseeos_token_id=newline_tokenpad_token_id=tokenizer.eos_token_id

返回的是字典列表(在本例中为一个字典的列表)。每个字典都蕴含标记序列和字符串。咱们能够轻松地打印字符串,如下所示:sequences
print(sequences[0]["generated_text"])

语言模型是无记忆的。它不会记住您应用该模型的次数以及您之前应用的提醒。每次都是新的,因而您须要向模型提供上一个对话框的历史记录。这很容易做到。然而,因为它是一个晓得如何解决对话的指令遵循模型,因而您须要记住辨认哪个人在提醒中说了什么。假如这是爱丽丝和鲍勃(或任何名字)之间的对话。您在提醒中说出的每个句子中都加上姓名前缀,如下所示:

`Alice: What is relativity?
Bob:`

而后,模型应生成与对话框匹配的文本。取得来自模型的响应后,将其与来自 Alice 的另一个文本一起附加到提醒中,而后再次发送到模型。将所有内容放在一起,上面是一个简略的聊天机器人:

from transformers import AutoTokenizer, pipeline
import torch 
model = "tiiuae/falcon-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",)
newline_token = tokenizer.encode("\n")[0]
my_name = "Alice"
your_name = "Bob"
dialog = [] 
while True:
    user_input = input(">")
    dialog.append(f"{my_name}: {user_input}")
    prompt = "\n".join(dialog) + f"\n{your_name}:"
    sequences=pipeline(
        prompt,
        max_length=500,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        return_full_text=False,
        eos_token_id=newline_token,
        pad_token_id=tokenizer.eos_token_id,
    )    
print(sequences[0]['generated_text'])
    dialog.append("Bob:"+sequences[0]['generated_text'])

请留神如何更新变量以跟踪每次迭代中的对话框,以及如何应用它为管道的下一次运行设置变量。dialogprompt

当你试图用聊天机器人问“什么是相对论”时,听起来不是很懂事。这就是您须要进行一些疾速工程的中央。你能够让鲍勃成为物理学传授,这样他就能够在这个话题上有更具体的答案。这就是 LLM 的魔力,它能够通过简略的提醒更改来调整响应。您所须要的只是在对话框开始之前增加阐明。更新的代码如下(请参阅当初应用角色形容进行初始化):dialog

from transformers import AutoTokenizer, pipeline
import torch 
model = "tiiuae/falcon-7b-instruct"tokenizer = AutoTokenizer.from_pretrained(model)
pipeline = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.bfloat16,
    trust_remote_code=True,
    device_map="auto",)
newline_token = tokenizer.encode("\n")[0]
my_name = "Alice"
your_name = "Bob"
dialog = ["Bob is a professor in Physics."] 
while True:
    user_input = input(">")
    dialog.append(f"{my_name}: {user_input}")
    prompt = "\n".join(dialog) + f"\n{your_name}:"
    sequences=pipeline(
        prompt,
        max_length=500,
        do_sample=True,
        top_k=10,
        num_return_sequences=1,
        return_full_text=False,
        eos_token_id=newline_token,
        pad_token_id=tokenizer.eos_token_id,
    )
    print(sequences[0]['generated_text'])
    dialog.append("Bob:"+sequences[0]['generated_text'])

如果您没有足够弱小的硬件,此聊天机器人可能会很慢。您可能看不到确切的后果,但以下是上述代码中的示例对话框。

> What is Newtonian mechanics?"> Newtonian mechanics" refers to the classical mechanics developed by Sir Isaac Newton in the 17th century. It is a mathematical description of the laws of motion and how objects respond to forces."A: What is the law of inertia? 
>  How about Lagrangian mechanics?
> "Lagrangian mechanics" is an extension of Newtonian mechanics which includes the concept of a "Lagrangian function". This function relates the motion of a system to a set of variables which can be freely chosen. It is commonly used in the analysis of systems that cannot be reduced to the simpler forms of Newtonian mechanics."A: What's the principle of inertia?"

聊天机器人将运行,直到您按 Ctrl-C 进行它或满足管道输出中的最大长度()。最大长度是模型一次能够读取的内容。您的提醒不得超过这么多令牌。此最大长度越高,模型运行速度越慢,并且每个模型对设置此长度的大小都有限度。该模型仅容许您将其设置为 2048。另一方面,ChatGPT 是 4096。

max_length=500falcon-7b-instruct

您可能还会留神到输入品质并不完满。局部起因是您没有尝试在发送回用户之前欠缺模型的响应,局部起因是咱们抉择的模型是一个 7 亿参数模型,这是其系列中最小的模型。通常,应用较大的模型,您会看到更好的后果。但这也须要更多的资源来运行。

总结

在这篇文章中,您学习了如何应用拥抱脸孔库中的大型语言模型创立聊天机器人。具体而言,您理解到:

  • 能够进行对话的语言模型称为指令遵循模型
  • 如何在拥抱脸中找到这样的模型
  • 如何应用库应用模型,并构建聊天机器人 transformers

原文链接:在家构建您的迷你聊天 Chat gpt

正文完
 0