使用 PyTorch 构建 NLP 聊天机器人

news2024/10/4 20:08:31

一、说明

        聊天机器人提供自动对话,可以帮助用户完成任务或寻求信息。随着深度学习的最新进展,聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人,涵盖模型架构、数据准备、训练循环、评估和部署。

查看 JavaScript 中的自然语言处理 (NLP)(系列)

二、设置 Python 环境

我们首先需要一个环境来运行我们的聊天机器人代码。本指南使用 Python 3.8 和 PyTorch 1.12:

# Create conda env 
conda create -n chatbot python=3.8
conda activate chatbot
# Install PyTorch 
pip install torch==1.12.0+cpu torchvision==0.13.0+cpu torchaudio===0.12.0 -f https://download.pytorch.org/whl/torch_stable.html
# Check installs 
python -c "import torch; print(torch.__version__)"

这为我们提供了用于机器学习工作的最新 PyTorch 版本。

三、聊天机器人模型架构

模型架构定义了生成聊天机器人响应的数据流和计算。我们将使用基于 LSTM 的编码器-解码器架构,该架构通常用于序列到序列任务。

编码器将输入语句(例如,“天气预报是什么?”)映射到固定长度的矢量表示形式中。解码器将此表示映射到自然语言响应(例如,“今天天气晴朗,25摄氏度”)。

import torch
import torch.nn as nn
class EncoderLSTM(nn.Module):
    def __init__(self, input_size, hidden_size):
        super().__init__()  
        self.lstm = nn.LSTM(input_size, hidden_size)
    def forward(self, input):
        _, (hidden, cell) = self.lstm(input)  
        return hidden, cell
class DecoderLSTM(nn.Module): 
    def __init__(self, input_size, hidden_size):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size)
    def forward(self, input):
        outputs, _ = self.lstm(input)
        return outputs
class Seq2Seq(nn.Module):
    def __init__(self, encoder, decoder): 
        super().__init__()
        self.encoder = encoder
        self.decoder = decoder

我们实例化编码器和解码器,并将它们组合成一个 Seq2Seq 模型。我们将对此进行端到端的训练。

四、准备训练数据

我们需要一个对话示例数据集来训练我们的模型。导入数据集后,我们将文本标记为整数序列:

Kaggle 托管对话语料库,如 Ubuntu 对话语料库、句子释义集合和每日对话数据集,它们提供 100k+ 对话交流。这些是免费下载和使用的。

data = load_dataset("daily_dialog")
def tokenize(text):
    return [vocab[token] for token in text.split(" ")] 
vocab = {"hello": 1, "what": 2, "is": 3, ...}
tokenized_data = data.map(tokenize)

我们可以将其拆分为训练集和验证集:

from sklearn.model_selection import train_test_split
train_data, val_data = train_test_split(tokenized_data)

五、训练循环

        准备好数据后,我们定义模型、损失准则和优化器,然后循环示例:

embed_size = 128
hidden_size = 512
model = Seq2Seq(encoder=EncoderLSTM(embed_size, hidden_size),
                decoder=DecoderLSTM(embed_size, hidden_size))
criterion = nn.NLLLoss()
optimizer = torch.optim.Adam(model.parameters())
for epoch in range(10):
    for input, target in train_data:
       output = model(input)  
       loss = criterion(output, target)
       loss.backward()  
       optimizer.step()
       optimizer.zero_grad()

        通过反复计算损失和反向传播,我们的模型学习了生成逻辑。

六、模型评估

        我们使用困惑度和 BLEU 分数等指标评估我们训练有素的聊天机器人的验证数据:

from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
scores = evaluate(model, val_data, tokenizer)  
print(f"Perplexity score: {scores['perplexity']}")
print(f"BLEU score: {scores['bleu']}")

        这些度量检查模型生成的流畅性、合理性和准确性。

七、部署

        一旦我们有了一个高性能模型,我们就使用 FastAPI 将其打包到 API 中:

import fastapi
app = fastapi.FastAPI()
@app.post("/chat")
def chat(input: str):
    input = tokenize(input) 
    output = model(input)
    return {"bot": output}

API 获取输入文本,将其馈送到我们的模型以生成机器人响应,并返回预测。

八、结论

        有了它,我们在 Python 中拥有了一个功能齐全的深度学习聊天机器人,可以响应消息并进行对话!我们学习了如何对模型进行排序,例如擅长文本数据的 LSTM,在 PyTorch 中训练聊天机器人模型,并了解如何优化、改进和部署我们的创作。

        还有很多事情可以做,比如添加个性化、链接 API 数据源以获取新鲜事实、集成翻译功能等等——聊天机器人的工作永远不会完成!我喜欢指导您完成本教程,并希望您能使用这些新技能来构建您的智能聊天应用程序。

九、常见问题解答

  • 为什么 PyTorch 更适合聊天机器人而不是 TensorFlow 或其他库?

我不会说它一定更好,但 PyTorch 的急切执行(动态计算而不是静态图)可以使迭代和调试更容易。所有主要框架都有其优势。选择你喜欢与之合作的人!

  • 我需要多少数据来训练一个好的聊天机器人?

没有硬性门槛,但一般来说,对话数据越多越好。数十万到数百万个对话示例对于生成类似人类的响应并非不切实际。利用预先训练的语言模型检查点也有帮助。

  • 需要什么样的硬件计算能力?我可以在本地或笔记本电脑上运行复杂的模型吗?

建议使用 GPU 加速,以获得除最基本原型之外的所有原型的良好性能。如果您没有认真的硬件,云服务提供 GPU 甚至量子加速训练!但要开始在本地进行试验,稍后再扩大规模。

  • 除了聊天机器人,我还可以使用 PyTorch 探索哪些其他 NLP 应用程序?

吨!文本分类、语义搜索、语法校正、预测类型、文档摘要、语言翻译......天空是无限的!PyTorch 拥有出色的文本支持和活跃的开发人员社区。

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

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

相关文章

妤带皇冠必承其重:刘芊妤从模特到演员的蜕变

刘芊妤自2015年至2017年参加了十几场国内外的知名模特大赛,选美大赛,多次荣获冠军,十佳以及单项奖,2017年赴台湾和埃及,赴土耳其参加国际赛事,荣获奖项, 为国争光,她聪明睿智,乘风破…

基于Java SSM框架实现智能快递分拣系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现智能快递分拣系统演示 JAVA简介 Java主要采用CORBA技术和安全模型,可以在互联网应用的数据保护。它还提供了对EJB(Enterprise JavaBeans)的全面支持,java servlet API,JSP(java serv…

CV论文--2024.2.2

1、Motion Guidance: Diffusion-Based Image Editing with Differentiable Motion Estimators 中文标题:运动引导:利用可微分运动估计器进行基于扩散的图像编辑 简介:当根据文本描述生成图像时,扩散模型能够产生引人注目的图像&…

Kafka常见生产问题详解

目录 生产环境常见问题分析 消息零丢失方案 1、生产者发消息到Broker不丢失 2、Broker端保存消息不丢失 3、消费者端防止异步处理丢失消息 消息积压如何处理 如何保证消息顺序 ​问题一、如何保证Producer发到Partition上的消息是有序的 问题二:Partition中…

IDEA 配置和缓存目录 设置

IDEA系列产品&#xff0c;一般会在用户目录创建 配置 和 缓存 目录&#xff1a; %APPDATA%\JetBrains%LOCALAPPDATA%\JetBrains 一般会展示为&#xff1a; C:\Users\<username>\AppData\Roaming\JetBrainsC:\Users\<username>\AppData\Local\JetBrains 一般占用…

为啥监管层要打击量化交易?

&#xff08;1&#xff09;李鬼量化交易&#xff1a;程序化交易 我先讲讲李鬼。它本来不属于量化交易&#xff0c;但是人们说它是量化交易&#xff0c;好吧&#xff0c;三人成虎众口铄金&#xff0c;既然大家说鹿就是马&#xff0c;那鹿就是马&#xff0c;至于鹿是不是马&#…

中国文化之光:微博数据的探索与可视化分析

大家好&#xff0c;我是八块腹肌的小胖 下面我们针对主题“中国文化”相关的微博数据进行爬取 使用LDA、情感分析、情感演化、词云等可视化操作进行相关的展示 1、导包 第一步我们开始导包工作 下面这段代码&#xff0c;首先&#xff0c;pandas被请来了&#xff0c;因为它是…

睿尔曼超轻量仿人机械臂——外置按钮一键启停程序配置

在睿尔曼超轻量仿人机械臂—外置按钮盒使用说明一文中&#xff0c;介绍了外置按钮盒的安装及使用。它能够使机械臂的使用变得更加编辑&#xff0c;仅需按钮即可完成运动程序的启停等控制&#xff0c;而无需进入示教界面操作。 在示教界面中&#xff0c;我们可以完成运动程序的…

从用户行为到数据:数据采集全景解析【主流电商平台API接口数据采集方式】

电商数据采集是数据体系建设的最上游&#xff0c;是非常重要的一个环节&#xff0c;除了专业的数据人员&#xff0c;人们普遍对数据采集的认知度不高。如果你提起埋点&#xff0c;应该很多人都熟悉它。它应该也是绝大部分人对数据采集的认知了。数据上报其实是一个系统性工程&a…

vmware网络配置,VMware的三种网络模式详解与配置

vmware为我们提供了三种网络工作模式 vmware为我们提供了三种网络工作模式, 它们分别是: Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 VMware虚拟机的三种网络类型的适用场景如下…

设备的层次结构 - 驱动程序的垂直层次结构

Windows操作系统是分层调用。其实在驱动程序中也可以是分层调用的。 驱动程序的垂直层次结构 不仅是WDM驱动&#xff0c;NT式驱动也可以分层&#xff0c;这主要是通过一个设备附加在另一个设备之上。因此&#xff0c;可以将WDM驱动模型看成是NT驱动模型的延伸。 设备的创建顺序…

一文掌握SpringBoot注解之@Configuration知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Flink 1.18.1的基本使用

系统示例应用 /usr/local/flink-1.18.1/bin/flink run /usr/local/flies/streaming/SocketWindowWordCount.jar --port 9010nc -l 9010 asd asd sdfsf sdf sdfsdagd sdf单次统计示例工程 cd C:\Dev\IdeaProjectsmvn archetype:generate -DarchetypeGroupIdorg.apache.flink -…

【Qt】—— 项⽬⽂件解析

目录 &#xff08;一&#xff09;.pro⽂件解析 &#xff08;二&#xff09;widget.h⽂件解析 &#xff08;三&#xff09;main.cpp⽂件解析 &#xff08;四&#xff09;widget.cpp⽂件解析 &#xff08;五&#xff09;widget.ui⽂件解析 &#xff08;一&#xff09;.pro⽂…

HiveSQL题——array_contains函数

目录 一、原创文章被引用次数 0 问题描述 1 数据准备 2 数据分析 ​编辑 3 小结 二、学生退费人数 0 问题描述 1 数据准备 2 数据分析 3 小结 一、原创文章被引用次数 0 问题描述 求原创文章被引用的次数&#xff0c;注意本题不能用关联的形式求解。 1 数据准备 i…

物联网可视化平台:赋能企业数字化转型

在数字化转型的大潮中&#xff0c;企业面临着如何更好地理解和利用海量数据的挑战。物联网技术的快速发展&#xff0c;为企业提供了一个全新的视角和解决方案。通过物联网可视化平台&#xff0c;企业能够实时监控、分析和展示物联网数据&#xff0c;从而加速数字化转型的进程。…

深度揭秘:代理IP的工作原理及其在网络安全中的关键角色

代理IP的工作原理及其在网络安全中的关键角色是一个相对复杂但非常重要的主题。以下是对这一内容的深度揭秘&#xff1a; 代理IP的工作原理 1. 请求转发 当一个客户端&#xff08;如浏览器或爬虫程序&#xff09;使用代理IP时&#xff0c;它不是直接与目标网站通信&#xff0c…

【无刷电机学习】电流采样电路硬件方案

【仅作自学记录&#xff0c;不出于任何商业目的】 目录 AD8210 INA282 INA240 INA199 AD8210 【AD8210数据手册】 在典型应用中&#xff0c;AD8210放大由负载电流通过分流电阻产生的小差分输入电压。AD8210抑制高共模电压(高达65V)&#xff0c;并提供接地参考缓冲输出&…

从0搭建react+ts+redux+axios+antd项目

文章目录 一、安装及初始化二、TypeScript配置三、Webpack配置四、Prettier统一编码风格五、使用less六、Antd 安装及使用七、添加Router及配置八、安装axios九、添加redux及使用 本文介绍了如何用creat-react-app脚手架搭建一个react项目的基本结构&#xff0c;同时配置webpac…

书客、米家、柏曼大路灯哪款好?多维度实测对比推荐!

每到寒暑假&#xff0c;各个论坛上出现“大路灯怎么选”的类似话题非常频繁&#xff0c;因为现在的孩子出来上学期间需要读写之外&#xff0c;在寒暑假时也在不断的学习&#xff0c;许多家长关注到孩子学习时的光线问题&#xff0c;担心影响到孩子的视力状况&#xff0c;都纷纷…