在家构建您的迷你 ChatGPT

这篇文章分为三个部分;他们是:

  • 什么是指令遵循模型?
  • 如何查找遵循模型的指令
  • 构建一个简单的聊天机器人
  • 废话不多说直接开始吧!!!

alt 

什么是指令遵循模型? 

语言模型是机器学习模型,可以根据句子的先验单词来预测单词概率。如果我们向模型询问下一个单词并将其反馈给模型以要求更多,则该模型正在进行文本生成。

文本生成模型是许多大型语言模型(例如 GPT3)背后的思想。然而,指令遵循模型是经过微调的文本生成模型,可以了解对话和指令。它的运作方式就像两个人之间的对话,当一个人说完一句话后,另一个人做出相应的反应。

因此,文本生成模型可以帮助您用前导句完成一个段落。但是遵循模型的说明可以回答您的问题或根据要求做出回应。

这并不意味着您不能使用文本生成模型来构建聊天机器人。但是,您应该通过遵循指令的模型找到质量更好的结果,该模型针对此类用途进行了微调。

如何查找遵循模型的指令

现在你可能会发现很多遵循模型的说明。但要构建聊天机器人,您需要一些可以轻松使用的东西。

您可以搜索的一个方便的存储库是 Hugging Face。那里的模型应该与 Hugging Face 的 Transformers 库一起使用。这很有帮助,因为不同模型的工作方式可能略有不同。让你的 Python 代码支持多种模型是很乏味的,但是 Transformer 库统一了它们并隐藏了代码中的所有这些差异。

 通常,模型后面的指令在模型名称中带有关键字“instruct”。在Hugging Face上用这个关键词搜索,可以找到一千多个模型。但并不是所有的都可以工作。您需要检查每个模型并阅读其模型卡以了解该模型的功能,以便选择最合适的模型。

选择有几个技术标准:

  • 模型接受的训练内容:具体来说,这意味着模型可以说哪种语言。用小说中的英文文本训练的模型可能对德国物理聊天机器人没有帮助。
  • 它使用的深度学习库是什么: Hugging Face 中的模型通常是使用 TensorFlow、PyTorch 和 Flax 构建的。并非所有模型都有适用于所有库的版本。您需要确保安装了特定的库,然后才能使用变压器运行模型。
  • 模型需要什么资源:模型可能非常庞大。通常它需要 GPU 才能运行。但有些模型需要一个非常高端的GPU,甚至多个高端GPU。您需要验证您的资源是否可以支持模型推理。

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

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

为此任务选择的模型是falcon-7b-instruct。这是一个70亿参数的模型。您可能需要在现代 GPU(例如 nVidia RTX 3000 系列)上运行,因为它被设计为在 bfloat16 浮点上运行以获得最佳性能。也可以选择使用 Google Colab 上的 GPU 资源,或 AWS 上合适的 EC2 实例。

要使用 Python 构建聊天机器人,如下所示简单:

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

input("> ")函数接受用户的一行输入。"> "您将在屏幕上看到您输入的字符串。按 Enter 键后将捕获输入。

剩下的问题是如何获得响应。在 LLM 中,您以一系列令牌 ID(整数)的形式提供输入或提示,它将使用另一个令牌 ID 序列进行响应。您应该在与 LLM 交互之前和之后在整数序列和文本字符串之间进行转换。令牌 ID 特定于每个型号;也就是说,对于相同的整数,不同的模型意味着不同的单词。

Hugging Face 库transformers就是为了让这些步骤变得更简单。您只需创建一个管道,并指定模型名称和其他一些参数即可。以 tiiuae/falcon-7b-instruct 为模型名称,使用 bfloat16 浮点运算,并允许模型在可用的情况下使用 GPU 的管道设置如下:


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",
)

创建管道是"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,
)

您在变量中提供了提示prompt以生成输出序列。你可以要求模型给你几个选项,但你在这里设置,num_return_sequences=1所以只有一个。您还让模型使用采样生成文本,但仅从 10 个最高概率的标记 ( top_k=10) 中进行。返回的序列将不包含您的提示,因为您有return_full_text=False. 最重要的参数是eos_token_id=newline_token 和pad_token_id=tokenizer.eos_token_id。这些是为了让模型连续生成文本,但仅限于换行符。换行符的标记 ID 是 193,从代码片段的第一行获取。

返回的sequences是一个字典列表(在本例中为一个字典的列表)。每个字典包含标记序列和字符串。我们可以轻松打印字符串,如下所示:

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

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

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

请注意如何dialog更新变量以跟踪每次迭代中的对话框,以及如何使用它prompt为管道的下一次运行设置变量。

当你尝试向聊天机器人询问“什么是相对论”时,它听起来并不是很有知识。这就是您需要进行一些即时工程的地方。您可以让Bob成为物理学教授,这样他就可以得到关于这个主题的更详细的答案。这就是它的魔力,可以通过简单的提示更改来调整响应。您所需要的只是在对话框开始之前添加描述。更新后的代码如下(现在看到的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 停止它或满足max_length=500管道输入中的最大长度 ( )。最大长度是您的模型一次可以读取的数量。您的提示不得超过这么多令牌。这个最大长度越高,模型运行速度就越慢,并且每个模型都对可以设置这个长度的大小有限制。该falcon-7b-instruct模型仅允许您将其设置为 2048。另一方面,ChatGPT 是 4096。

您可能还注意到输出质量并不完美。部分是因为您在发送回用户之前没有尝试完善模型的响应,部分是因为我们选择的模型是一个包含 70 亿个参数的模型,这是其系列中最小的模型。通常,使用较大的模型您会看到更好的结果。但这也需要更多的资源来运行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用GPT作为SQL查询引擎的自然语言

​生成的AI输出并不总是可靠的,但是下面我会讲述如何改进你的代码和查询的方法,以及防止发送敏感数据的方法。与大多数生成式AI一样,OpenAI的API的结果仍然不完美,这意味着我们不能完全信任它们。幸运的是,现在我们可以…

Android11 相机拍照权限,以及解决resolveActivity返回null

一、配置拍照和读写权限 <uses-permission android:name"android.permission.CAMERA"/> <uses-feature android:name"android.hardware.camera" /><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&…

CAN转EtherNet/IP网关can协议是什么意思

你是否曾经遇到过不同的总线协议难以互相通信的问题&#xff1f;远创智控的YC-EIP-CAN网关为你解决了这个烦恼&#xff01; 远创智控YC-EIP-CAN通讯网关是一款自主研发的设备&#xff0c;它能够将各种CAN总线和ETHERNET/IP网络连接起来&#xff0c;解决不同总线协议之间的通信…

【Ajax】笔记-使用fetch函数发送AJAX请求

fetch()函数说明与使用方法详解 fetch()是XMLHttpRequest的升级版,用于在JavaScript脚本里面发出 HTTP请求,本文章向大家介绍fetch()的用法,主要包括fetch()的用法使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有一定的参考价值&#xff0c;需要的朋友可以参…

IDE /完整分析C4819编译错误的本质原因

文章目录 概述基本概念代码页标识符字符集和字符编码方案源字符集和执行字符集 编译器使用的字符集VS字符集配置 有何作用编译器 - 源字符集编译器 -执行字符集 Qt Creator下配置MSVC编译器参数动态库DLL字符集配置不同于可执行程序EXE总结 概述 本文将从根本原因上来分析和解…

Vuex的使用

1. 是什么&#xff1a; vuex 是一个 vue 的 状态管理工具 &#xff0c;状态就是数据。 大白话&#xff1a;vuex 是一个插件&#xff0c;可以帮我们 管理 vue 通用的数据 (多组件共享的数据) 2. 场景&#xff1a; ① 某个状态 在 很多个组件 来使用 (个人信息) ② 多个组…

Vue基础 --- 路由

1. 前端路由的概念与原理 1.1 什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2 SPA 与前端路由 SPA 指的是一个 web 网站只有唯一的一个 HTML 页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。 此时&#xff0c;不同…

echarts统计图x轴文字过长,以省略号显示,鼠标经过提示全部内容

效果图如下 主要代码如下&#xff1a; //1.js代码内加入extension方法&#xff0c;chart参数是echarts实例 function extension(chart) {// 注意这里&#xff0c;是以X轴显示内容过长为例&#xff0c;如果是y轴的话&#xff0c;需要把params.componentType xAxis改为yAxis/…

国产内存惹人爱,光威的价格战太凶猛,海外品牌已无力招架

现阶段&#xff0c;真的很适合升级内存条和SSD&#xff01;当然了&#xff0c;我说的是国产的品牌&#xff0c;经过这几年的发展&#xff0c;国产内存和SSD的表现都有了质的飞跃&#xff0c;像是光威之类的品牌&#xff0c;更是成功在玩家群体中获得了良好的口碑&#xff0c;而…

使用镜像搭建nacos集群

安装并配置 docker 1 先安装docker //1.查看操作系统的发行版号 uname -r//2.安装依赖软件包 yum install -y yum-utils device-mapper-persistent-data lvm2//3.设置yum镜像源 //官方源&#xff08;慢&#xff09; yum-config-manager --add-repo http://download.docker.co…

mysql进阶1——proxysql中间件

文章目录 一、基本了解二、安装部署三、proxysql管理配置3.1 内置库3.1.1 main库表3.1.2 stats库表3.1.3 monitor库 3.2 常用管理变量3.2.1 添加管理用户3.2.2 添加普通用户3.2.3 修改监听套接字 四、多层配置系统4.1 系统结构4.2 修改变量加载配置4.3 启动加载流程 一、基本了…

Jmeter(二十三):快速生成测试报告

一、jmeter配置 首先要保证jmeter命令是ok的,如果你在cmd中输入jmeter -v,有出现如下截图所示的信息,那就说明jmeter环境ok; 二、jmeter执行结合命令 生成HTML测试报告 1.完成脚本的调试、参数化、断言等操作。然后在聚合报告中指定日志文件存储路径,路径中最好不要包含有…

利用官网文档快速上手 Android 开发

官网学习链接&#xff1a;官网链接 官网教程

electron-egg 加密报错

electron框架&#xff1a;electron-egg 解决方式 npm uninstall bytenode npm install bytenode1.3.6node:internal/modules/cjs/loader:928 throw err; ^ Error: Cannot find module ‘node:assert/strict’ Require stack: D:\electron-egg-test\new-electron-egg\electr…

SpringBoot与文档excel,pdf集成案例分享

一、文档类型介绍 1、Excel文档 Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具&#xff0c;在系统开发中&#xff0c;经常用来把数据转存到Excel文件&#xff0c;或者Excel数据导入系统中&#xff0c;这就涉及数据转换问题。 2、PDF文档 PDF是可移植文档格…

干翻Dubbo系列第四篇:Dubbo3第一个应用程序细节补充

前言 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽都顺利。 如…

Higress非K8S安装

Higress非K8S安装 文章目录 Higress非K8S安装环境安装安装higress进入到higress 的目录下修改下nacos的地址启动Higress登录higress管理页面 Higress 是基于阿里内部构建的下一代云原生网关&#xff0c;官网介绍&#xff1a;https://higress.io/zh-cn/docs/overview/what-is-hi…

HuggingGPT Solving AI Tasks with ChatGPT and its Friends in Hugging Face

总述 HuggingGPT 让LLM发挥向路由器一样的作用&#xff0c;让LLM来选择调用那个专业的模型来执行任务。HuggingGPT搭建LLM和专业AI模型的桥梁。Language is a generic interface for LLMs to connect AI models 四个阶段 Task Planning&#xff1a; 将复杂的任务分解。但是这里…

外文期刊影响因子去哪里查询,如何查询

期刊影响因子(Impact factor&#xff0c;IF)&#xff0c;是代表期刊影响大小的一项定量指标。也就是某刊平均每篇论文的被引用数&#xff0c;它实际上是某刊在某年被全部源刊物引证该刊前两年发表论文的次数&#xff0c;与该刊前两年所发表的全部源论文数之比。那么&#xff0c…

《嵌入式 - 工具》J-link读写MCU内部Flash

1 J-Link简介 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR&#xff0c;ADS&#xff0c;KEIL&#xff0c;WINARM&#xff0c;RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真&#xff0c;是学…