在家构建您的迷你聊天Chat gpt

news2024/12/24 7:40:55
推荐:使用 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 实例也是选项。falcon-7b-instruct

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

1

2

3

while True:

    user_input = input("> ")

    print(response)

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

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

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

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

1

2

3

4

5

6

7

8

9

10

11

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

1

print(sequences[0]["generated_text"])

语言模型是无记忆的。它不会记住您使用该模型的次数以及您之前使用的提示。每次都是新的,因此您需要向模型提供上一个对话框的历史记录。这很容易做到。但是,由于它是一个知道如何处理对话的指令遵循模型,因此您需要记住识别哪个人在提示中说了什么。假设这是爱丽丝和鲍勃(或任何名字)之间的对话。您在提示中说出的每个句子中都加上姓名前缀,如下所示:

1

2

Alice: What is relativity?

Bob:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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'])

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

1

2

3

4

5

> 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 (mvrlink.com)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么,包含哪些组件? docker的基本机构是c/s模式,即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信,发送容器管理…

SaaS系统相比传统软件,为何数据更安全?

随着云计算、5G等技术的不断进步,SaaS行业步入了快速发展的阶段,应用场景也日趋多元化。预计2023年底,中国SaaS行业市场规模将达到555.1亿元。 中研网对于SaaS发展态势预测这样评价: 当前,我国在多个维度上具备发展 S…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

【ChatGPT】自我救赎

ChatGPT辅助学习C之【在C中如果大数据类型转小数据类型会发生什么呢?】&#xff0c;今天问ChatGPT一个问题&#xff0c;让它解析下面这个C程序&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() {int a;long long b532165478…

haproxy基本编译环境部署

前提&#xff1a;haproxy支持基于lua实现功能扩展&#xff08;需要安装比较新的lua语言&#xff0c;方便进行haproxy编译&#xff09;。 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz lua -v # 检查环境 yum list lua # 查看可以安装环境 同时还需要gcc&#xff0c;gcc-c&…

rocketMq消息队列详细使用与实践整合spring

文章目录 一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实战2、其他更多消息类型&#xff1a…

CSS实现图像填充文字

效果如下 具体代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS图像填充文字</title><style>.text {background-image: url(./imgs/1.webp);/* 一定要让背景透明&#xff0c;这样后面的背…

Linux使用mount挂载

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 格式化分区 sudo mkfs -t ext4 /dev/mmcblk0p1 格式化分区 实际使用中推荐这个&#xff0c;它是 mkfs 命令的个变种&#xff0c;可以自动识别文件系统类型为 ext4&#xff0c;并使用 ext4 文件系统的默认参数来创建…

【源码篇】ArrayList源码解析

文章目录 ArrayList源码解析1、ArrayList简介2、ArrayList继承关系2.1 Seralizable接口2.2 Cloneable接口2.3 RandomAccess接口 3、源码解析3.1 构造方法源码解析3.1.1 无参构造源码解析3.1.2 有参构造源码解析 3.2 add方法源码解析3.2.1 add(E e)方法源码解析3.2.2 add(int in…

Azure通过自动化账户实现对资源变更

Azure通过自动化账户实现对资源变更 创建一个自动化账户第一种方式 添加凭据&#xff08;有更改资源权限的账户&#xff0c;没有auth认证情况&#xff09;创建一个Runbook&#xff0c;测试修改 AnalysisServices 定价层设置定时任务&#xff1a;开始定时任务&#xff1a; 第二种…

Redis基础 (三十八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 NoSQL 1.2 Redis 二、安装 2.1 安装方式 &#xff1a; 三、目录结构 3.1 rpm -ql redis 3.2 /etc/redis.conf 主配置文件 3.3 /var/lib/redis …

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来(非单步预测)

【MATLAB第68期】基于MATLAB的LSTM长短期记忆网络多变量时间序列数据多步预测含预测未来&#xff08;非单步预测&#xff09; 输入前25个时间&#xff0c;输出后5个时间 一、数据转换 1、原始数据 5列时间序列数据&#xff0c;70行样本 705 数据矩阵结构 2、数据转换 将…

MySQL的查询方法

单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 要求&#xff1a; 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、…

Unity之ShaderGraph 节点介绍 数学节点

数学 高级Absolute&#xff08;绝对值&#xff09;Exponential&#xff08;幂&#xff09;Length&#xff08;长度&#xff09;Log&#xff08;对数&#xff09;Modulo&#xff08;余数&#xff09;Negate&#xff08;相反数&#xff09;Normalize&#xff08;标准化矢量&…

11_Pulsar Adaptors适配器、kafka适配器、Spark适配器

2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 2.3.2.Spark适配器 2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 Pulsar 为使用 Apache Kafka Java 客户端 API 编写的应用程序提供了一个简单的解决方案。 在生产者中, 如果想不改变原有kafka的代码架构, 就切换到Pulsar的…

C#之控制台版本得贪吃蛇

贪吃蛇小时候大家都玩过&#xff0c;具体步骤如下: 1.给游戏制造一个有限得空间。 2.生成墙壁&#xff0c;小蛇碰撞到墙壁或者咬到自己的尾巴&#xff0c;游戏结束。 3.生成随机的食物。 4.吃掉食物&#xff0c;增加自身的体长&#xff0c;并生成新的食物。 具体代码如下&…

一文解决JWT相同签名不匹配问题【JWT signature does not match locally computed signature.】

今天做项目的时候&#xff0c;涉及到一个支付记账的功能&#xff0c;想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输&#xff0c;想着要是被中途抓包修改了不就麻烦了&#xff0c;所以考虑到这种安全性的需求&#xff0c;就利用上了JWT来进行数据的封装传递&…

IO学习-消息队列

1&#xff0c;要求用消息队列实现AB进程间的对话 a,A进程先发送一句话给B进程&#xff0c;B进程接收后打印。 b,B进程回复一句话给A进程&#xff0c;A进程接收后打印。 c,重复a,b步骤&#xff0c;当收到quit后要结束进程。 A进程 B进程 运行结果&#xff1a; 2&#xff0c;…

力扣 494. 目标和

题目来源&#xff1a;https://leetcode.cn/problems/target-sum/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;将该问题转为01背包问题。 假设加法的总和为x&#xff0c;那么减法对应的总和就是sum - x。所以我们要求的是 x - (sum - x) target。x …

学会RabbitMQ的延迟队列,提高消息处理效率

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ灵活运用&#xff0c;怎么理解五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么…