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

推荐:使用 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.mzph.cn/news/29932.shtml

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

相关文章

css3背景渐变

1.线性渐变 <style>.box {width: 200px;height: 200px;border: 1px solid black;float: left;margin-left: 50px;}.box1 {background-image: linear-gradient(green, yellow, red);}/* 右上 */.box2 {background-image: linear-gradient(to right top, green, yellow, re…

【前端 | CSS】aligin-items与aligin-content的区别

align-items 描述 CSS align-items 属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式 align-items是针对每一个子项起作用&#xff0c;它的基本单位是每一个子项&#xff0c;在所有情况下都有效果&…

js案例:1.简单计算器

目录 一.效果图 二.实现思路 整体思路 ​ 1.关键是dom操作 ​ 2.设置点击事件 3.数据类型的隐式转换和赋值 三.完整代码 一.效果图 二.实现思路 整体思路 1.关键是dom操作 通过 document.getElementById(id) 获取html中的dom元素 每一个html标签都是一个对象&…

java【native关键字】

描述&#xff1a; native只能修饰方法&#xff0c;表示这个方法的方法体代码不是用java语言实现的&#xff0c;而是由c/c语言编写的。但是对于java程序员来说&#xff0c;可以当作java的方法一样正常去调用它&#xff0c;或者子类重写它 语法&#xff1a; 用在方法的返回值类…

【腾讯云 Cloud Studio 实战训练营】一个新的趋势已来

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

二分法的应用

文章目录 什么是二分法&#x1f3ae;二分查找的优先级二分查找的步骤&#x1f4a5;图解演示&#x1f9e9; 代码演示&#x1fad5;python程序实现&#x1f408;‍⬛C程序实现&#x1f415;‍&#x1f9ba;C程序实现&#x1f42f;Java程序实现&#x1f433; 非常规类二分查找&…

vue3 - 使用reactive定义响应式数据进行列表赋值时,视图没有更新的解决方案

文章目录 1&#xff0c;问题2&#xff0c;原因3&#xff0c;解决方案一、再封装一层数据&#xff0c;即定义属性名&#xff0c;在后期赋值的时候&#xff0c;对此属性进行直接赋值三、使用数组的splice来直接更改原数组三、使用 ref 来定义数据 1&#xff0c;问题 在Vue 3.0 中…

【VS Code插件开发】通用功能(二)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

word横向页面侧面页码设置及转pdf后横线变竖线的解决方案

在处理材料的时候&#xff0c;会遇到同一个文档里自某一页开始&#xff0c;页面布局是横向的&#xff0c;这时候页码要设置在侧面&#xff0c;方法是双击页脚&#xff0c;然后在word工具栏上选择“插入”——>“文本框”——>“绘制竖版文本框”&#xff0c;然后在页面左…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测

岩土工程仪器多通道振弦传感器信号转换器应用于桥梁安全监测 桥梁作为交通运输的重要节点&#xff0c;其安全性一直备受关注。不同于其他建筑物&#xff0c;桥梁所处的环境复杂多变&#xff0c;同时&#xff0c;其所需承受的负荷也相对较大&#xff0c;这就需要对桥梁的安全进…

北京多铁克FPGA笔试题目

1、使用D触发器来实现二分频 2、序列检测器&#xff0c;检测101&#xff0c;输出1&#xff0c;其余情况输出0 module Detect_101(input clk,input rst_n,input data, //输入的序列output reg flag_101 //检测到101序列的输出标志 );parameter S0 2d0;S1 2d1;S2 2d2;S4 …

2023-08-07 LeetCode每日一题(反转字符串)

2023-08-07每日一题 一、题目编号 344. 反转字符串二、题目链接 点击跳转到题目位置 三、题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、…

SpringBoot3文件管理

标签&#xff1a;上传.下载.Excel.导入.导出&#xff1b; 一、简介 在项目中&#xff0c;文件管理是常见的复杂功能&#xff1b; 首先文件的类型比较多样&#xff0c;处理起来比较复杂&#xff0c;其次文件涉及大量的IO操作&#xff0c;容易引发内存溢出&#xff1b; 不同的…

redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

目录 1.缓存 2.redis不仅仅可以做缓存&#xff0c;只不过说他的大部分场景&#xff0c;是做缓存。本地缓存重启后缓存里的东西就没有了&#xff0c;但是redis有。 3.redis有几个特性:查询快&#xff0c;但是是放到内存里的〈断电或者重启&#xff0c;数据就丢了)&#xff0c…

Vue组件化开发思想;Vue的全局组件;Vue的局部组件;Vue的开发模式和解析;Vue CLI安装和使用;Vue项目的创建方式–Vite

目录 1_Vue组件化开发思想1.1_认识组件化开发1.2_Vue的组件化1.3_注册组件的方式 2_Vue的全局组件3_Vue的局部组件4_Vue的开发模式和解析4.1_Vue的开发模式4.2_单文件的特点4.3_如何支持SFC4.4_VSCode对SFC文件的支持 5_Vue CLI安装和使用5.1_Vue CLI脚手架5.2_Vue CLI 安装和使…

基于react-native的简单消息确认框showModel

基于react-native的简单消息确认框showModel 效果示例图组件代码ShowModel/index.jsx使用案例device.js安装线性渐变色 效果示例图 组件代码ShowModel/index.jsx import React, {forwardRef, useImperativeHandle, useState} from react; import {View,Text,Modal,TouchableOp…

06微服务间的通信方式

一句话导读 微服务设计的一个挑战就是服务间的通信问题&#xff0c;服务间通信理论上可以归结为进程间通信&#xff0c;进程可以是同一个机器上的&#xff0c;也可以是不同机器的。服务可以使用同步请求响应机制通信&#xff0c;也可以使用异步的基于消息中间件间的通信机制。同…

Vue2-简介、模板语法、数据绑定、MVVM、数据代理、事件处理

&#x1f954;&#xff1a;成功之后就能光明正大地回望所有苦难 VUE-Day1 Vue简介1、Vue是什么&#xff1f;2、谁开发的&#xff1f; 发展历程&#xff1f;3、Vue的特点4、容器和实例、实例中的el和data总结 Vue模板语法插值语法指令语法 数据绑定1.单向数据绑定&#xff08;v-…

51单片机学习--DS18B20温度读取温度报警器

需要先编写OneWire模块&#xff0c;再在DS18B20模块中调用OneWire模块的函数 先根据原理图做好端口的声明&#xff1a; sbit OneWire_DQ P3^7;接下来像之前一样把时序结构用代码模拟出来&#xff1a; unsigned char OneWire_Init(void) {unsigned char i;unsigned char Ac…