自然语言处理NLP入门 -- 第十节NLP 实战项目 2: 简单的聊天机器人
一、为什么要做聊天机器人?
在互联网时代,我们日常接触到的“在线客服”“自动问答”等,大多是以聊天机器人的形式出现。它能帮我们快速回复常见问题,让用户获得及时的帮助,并在一定程度上减少人工客服的压力。
同时,聊天机器人也是了解自然语言处理(NLP)最好的实战项目之一。因为它整合了文字理解(NLU)、对话管理、文本生成(NLG)等多方面知识,既能看到很直观的对话效果,也能结合深度学习模型让机器人变得更智能。
二、聊天机器人的基本架构
无论是使用 GPT,还是纯 Python 实现,一个对话系统一般都包含以下部分:
- 接收用户输入:如文本或语音转文本。
- 自然语言理解(NLU):理解用户的意图和关键信息。例如,“想查天气”就是“意图”,“北京”就是“实体”。
- 对话管理(DM):根据用户意图和上下文,决定下一步要做什么。
- 如果是纯 Python 规则式,可以用
if
条件来判断; - 如果是 GPT/OpenAI API,就把这些上下文打包成提示,让大模型处理。
- 如果是纯 Python 规则式,可以用
- 自然语言生成(NLG):把处理好的结果转成人类可读的文本回复。
- 输出结果:返回给用户。
除了以上通用流程,不同的实现会稍微有不同的细节。例如,GPT/OpenAI API 能直接做很强大的语言理解和生成,我们就无需复杂的意图识别或模板来写回复。
三、第一种实现方式:纯 Python 规则式聊天机器人
如果你不想依赖太多库,也不想担心 Python 版本的问题,可以先尝试最简单的规则式聊天机器人。它的原理很直接:对用户输入进行简单匹配,然后返回事先准备好的答复。
1. 规则式实现思路
- 关键点:围绕几个常见的问题设计关键词,用户输入中若包含某些关键词,就执行相应的回复。
- 优点:简单易懂,不需要训练模型,也没有环境限制。
- 缺点:无法应对复杂语言变化,无法记住对话上下文,显得“智商”不够。
2. 示例代码
def simple_rule_based_bot(user_message):# 小写化,去掉空格等,做个最简单的预处理msg_lower = user_message.strip().lower()# 定义一些关键词对应的回答if "你好" in msg_lower or "hello" in msg_lower:return "你好,我是一个简单的聊天机器人!有什么可以帮你的?"elif "天气" in msg_lower:return "今天阳光明媚,适合出行哦。(仅供演示,实际需查询天气API)"elif "再见" in msg_lower or "bye" in msg_lower:return "感谢和你聊天,下次见!"else:return "抱歉,我不太明白。可以换个问题吗?"if __name__ == "__main__":print("欢迎使用简易聊天机器人(规则式),输入‘退出’可结束。")while True:user_input = input("你:")if user_input.lower() == "退出":print("机器人:再见!")breakbot_reply = simple_rule_based_bot(user_input)print("机器人:", bot_reply)
运行方式:
- 将以上代码保存为
rule_based_bot.py
。 - 在命令行或 PowerShell 中执行:
python rule_based_bot.py
- 就可以和机器人进行简易的文本对话了。
示例输出:
欢迎使用简易聊天机器人(规则式),输入‘退出’可结束。
你:天气
机器人: 今天阳光明媚,适合出行哦。(仅供演示,实际需查询天气API)
你:温度
机器人: 抱歉,我不太明白。可以换个问题吗?
你:再见
机器人: 感谢和你聊天,下次见!
你:退出
机器人:再见!
解析:
simple_rule_based_bot
函数中,我们只做了最简单的字符串包含判断。- 这种方式对于特定场景,假如你只想实现FAQ(常见问题库)或极简功能,可以快速搭建并投入使用。
四、第二种实现方式:用 GPT 或 OpenAI API 生成对话
1. GPT 的优势
- GPT(Generative Pre-trained Transformer)是一个通过海量文本训练的大模型,具有非常强的理解和生成自然语言的能力。
- 相较于规则式聊天机器人,GPT 不仅可以对关键词做匹配,更可以理解语义并输出高质量的、几乎像人类一样的自然回复。
2. 如何开始使用 OpenAI API?
- 注册获取 API Key
- 到 OpenAI 平台注册账号,然后在“View API keys”处创建一个“Secret Key”。
- 安装
openai
包pip install openai
- 编写简单的 Python 调用
import openaiopenai.api_key = "你的OpenAI_API_Key"def gpt_chat(prompt):response = openai.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": prompt}],max_tokens=150,temperature=0.7)return response.choices[0].message.contentif __name__ == "__main__":print("欢迎使用GPT聊天机器人,输入‘退出’可结束。")while True:user_message = input("你:")if user_message.lower() == "退出":print("再见!")break# 我们简单地把用户输入封装到一个 prompt 中prompt = f"用户说:{user_message}\n请以聊天机器人的口吻回复用户:"reply = gpt_chat(prompt)print("机器人:", reply)
运行方式:
- 保存为
gpt_bot.py
- 在命令行中执行
python gpt_bot.py
- 输入任意文字后,就可以获得 GPT 的回复了。
示例输出:
欢迎使用GPT聊天机器人,输入‘退出’可结束。
你:请问几天发货?
机器人: 亲爱的客人,一般来说我们会在您下单后的1-2个工作日内发货哦。如果有特殊情况会提前告知您的,请您放心等待哦。有任何其他问题都可以随时和我联系哦,我会尽力帮助您的!祝您购物愉快!
你:发什么快递
机器人: 您好,请问您需要寄送什么物品呢?我们可以提供国内外各种快递服务,您可以告诉我您的需求,我可以为您推荐适合的快递公司和服务。
你:退出
再见!
注意:
- 使用 OpenAI API 是收费的,每次请求都会消耗一定的 Token(计费单位)。
- 你可以在 OpenAI 平台里查看余额和使用量。
3. 如何让机器人“记住”上下文?
如果想要更智能的对话,需要把对话历史一起传给 GPT,让它“记住”之前的交互。例如:
def gpt_chat(history):# history 是一个字符串,包含之前几轮用户与机器人的对话response = openai.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "user", "content": history}],max_tokens = 150,temperature = 0.7)return response.choices[0].message.contentif __name__ == "__main__":conversation_history = """你是一个礼貌、友善的聊天机器人。以下是对话:\n"""while True:user_input = input("用户:")if user_input.lower() == "退出":print("机器人:再见!")break# 在对话历史里追加用户这句话conversation_history += f"用户:{user_input}\n"# 调用 GPTreply = gpt_chat(conversation_history + "机器人:")# 把机器人回复也加入到对话历史conversation_history += f"机器人:{reply}\n"print(f"机器人:{reply}")
示例输出:
用户:请问今天天气怎么样?
机器人:您好!今天的天气是晴朗的,气温适中,适合出门活动哦。您有什么计划吗?
用户:请问中国的首都是哪里?
机器人:中国的首都是北京。您还有其他问题需要我回答吗?
用户:请问我要退货能退钱吗?
机器人:根据商家的退货政策,一般情况下您可以退货并退款。建议您查看购买时的退货政策或与商家沟通具体退货流程。如果有任何问题,我可以帮助您进一步了解。您还有其他问题需要我回答吗?
用户:退出
机器人:再见!
提示:
- 这样每次请求都把完整的对话上下文传给 GPT;
- 但是如果对话过长,就会消耗大量 Token 并且容易超出模型的最大上下文长度;
- 可以在实现中做一些截断策略,例如只保留最近几轮对话放进 Prompt。
五、难点总结
- 规则式机器人的最大难点是“扩展性”,如果需求一旦复杂,需要大量 if-else/规则,会变得难以维护。
- GPT/OpenAI API 的难点在“Prompt 设计”和“上下文管理”:
- 如果 Prompt 写得不清晰,GPT 可能会给出风马牛不相及的回答;
- 若对话太长,可能出现记忆混乱或超出上下文长度。
- 费用与服务稳定性:
- GPT 调用需要计费,一旦用户请求量很大,需要考虑预算;
- 若网络环境不稳定或者 API 有限制,也会影响使用体验。
六、课后练习
-
练习:加入 FAQ 知识库
- 可以把常见问题和回答存在一个字典或 JSON 文件中,当检测到用户的问题在FAQ里,就直接返回固定答案;
- 如果没匹配到,再把问题交给 GPT 处理。
- 这样能有效降低 API 调用次数,也让回复更准确。
-
练习:带上下文记忆的 GPT 聊天
- 在上面 “如何让机器人记住上下文” 的示例基础上,完善对话历史的管理。
- 尝试只保留最近 3 轮对话,以防 Token 超限,同时还能保留一定的上下文。
-
练习:调用第三方 API
- 如果你想让机器人回答天气问题,可以在 Python 里调用真实的天气 API(如和风天气等),获取实时天气信息,然后在 GPT 生成的回复里把具体天气情况填充进去。
- 体验一下把外部信息传递给 GPT 的 Prompt 写法,例如:
你是天气机器人,现在用户想知道的城市是:{城市},实时天气是:{天气接口返回的数据}。 请生成简洁的回答。
七、总结与展望
- 规则式聊天机器人:简单易做,可以快速实现 FAQ 功能,适合小型或需求非常固定的场景;
- GPT / OpenAI API:几行代码就能实现一个非常强大的对话系统,并且可以持续对 Prompt 进行微调或改进;
- 结合两者:有些团队在生产环境会先尝试“规则 + 大模型”双管齐下——如果是常见问题,就用规则式快速回复;否则把问题交给 GPT 做更智能的回答。
对于初学者来说,用 GPT 这种高阶大模型做聊天机器人,是个非常有趣且容易出成果的方式。不过,你也要注意流量、费用和响应速度等实际问题。
通过以上两种方案的示例,你已经了解如何做一个初步可用的聊天机器人。可以说,这是一段非常棒的 NLP 实战之旅。
愿你在这个过程中不断积累经验,打造出自己的“超级聊天机器人”!祝学习愉快,也期待你今后的更多探索。
相关文章:
自然语言处理NLP入门 -- 第十节NLP 实战项目 2: 简单的聊天机器人
一、为什么要做聊天机器人? 在互联网时代,我们日常接触到的“在线客服”“自动问答”等,大多是以聊天机器人的形式出现。它能帮我们快速回复常见问题,让用户获得及时的帮助,并在一定程度上减少人工客服的压力。 同时&…...
【网络安全 | 渗透工具】小程序反编译分析源码 | 图文教程
未经许可,禁止转载。 本文仅供学习使用,严禁用于非法渗透测试,笔者不承担任何责任。 文章目录 1、下载Proxifier2、下载反编译工具unveilr3、寻找小程序文件包4、对文件包进行反编译5、对源码进行分析6、渗透思路6.1、查找敏感信息泄露6.2、解析加解密逻辑6.3、枚举 API 接口…...

uniapp 系统学习,从入门到实战(六)—— 样式与布局
全篇大概 4700 字(含代码),建议阅读时间 30min 📚 目录 Flex 布局在 UniApp 中的应用响应式设计与适配多端使用 SCSS 提升样式开发效率实战案例演示总结 1. Flex 布局在 UniApp 中的应用 1.1 基础布局实现 通过 display: flex 快速构建弹性容器&#…...

‘ts-node‘ 不是内部或外部命令,也不是可运行的程序
新建一个test.ts文件 let message: string = Hello World; console.log(message);如果没有任何配置的前提下,会报错’ts-node’ 不是内部或外部命令,也不是可运行的程序。 此时需要安装一下ts-node。 npm install...

mysql 全方位安装教程
下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包,小的安装包是一个安装器。 我们不用登录,直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…...
22-接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 方法一:双指针法 思路 使用两个指针 left 和 right 分别指向数组的两端,同时记录左边的最大高度 leftMax 和右边的最大高度 rig…...
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成 在现代企业级应用开发中,处理多个数据源是一个常见的需求。本文将详细介绍如何使用Spring Boot结合达梦数据库(DM),并通过MyBatis Plus来简化数据库操作&…...

leetcode28 找出字符串第一个匹配值的下标 KMP算法
KMP 算法——快速的从主串中找到模式串 当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。 KMP 算法 比较指针不回溯,仅仅是后移模式串。 每次不匹配的时候,找之前已匹配部分…...

【Bug】natten:安装报错(临近注意力机制的高效cuda内核实现)
正常安装natten报错 pip install natten 报错 可以尝试使用以下网站进行安装 https://shi-labs.com/natten/ 可以根据自己的cuda与pytorch版本进行安装 之间复制命令即可,不需要进行任何修改...
AI 实战2 - face -detect
人脸检测 环境安装源设置conda 环境安装依赖库 概述数据集wider_face转yolo环境依赖标注信息格式转换图片处理生成 train.txt 文件 数据集展示数据集加载和处理 参考文章 环境 安装源设置 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/f…...

Spring Boot 项目开发流程全解析
目录 引言 一、开发环境准备 二、创建项目 三、项目结构 四、开发业务逻辑 1.创建实体类: 2.创建数据访问层(DAO): 3.创建服务层(Service): 4.创建控制器层(Controller&…...

从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制
引言 在数据库开发中,PreparedStatement(预处理语句)是防止SQL注入、提升性能的重要工具。它通过分离SQL结构与参数值,不仅增强了安全性,还能利用预编译优化执行效率。本文将从Java JDBC驱动和MySQL 8源码的双重视角&…...

mysql的主从同步
1、异步复制:这是MySQL默认的复制模式。在这种模式下,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。这种模式的优点是实现简单,但缺点是如果主库崩溃,已经提交的事务可能…...
工程化与框架系列(10)--微前端架构
微前端架构 🏗️ 微前端是一种将前端应用分解成更小、更易管理的独立部分的架构模式。本文将详细介绍微前端的核心概念、实现方案和最佳实践。 微前端概述 🌟 💡 小知识:微前端的核心理念是将前端应用分解成一系列独立部署、松耦…...
【3天快速入门WPF】11-附加属性
目录 1. 步骤1:定义附加属性2. 示例代码3. 步骤2:在XAML中使用附加属性3.1. 示例代码4. 步骤3:扩展使用场景4.1. 示例代码5. 总结上一篇讲到了依赖属性,本篇主要想说一下附加属性。 在WPF中,附加属性(Attached Property)是一种特殊的依赖属性,允许你在不属于某个类的控…...
MySQL并发知识(面试高频)
mysql并发事务解决 不同隔离级别下,mysql解决并发事务的方式不同。主要由锁机制和MVCC(多版本并发控制)机制来解决并发事务问题。 1. mysql中的锁有哪些? 表级锁: 场景:表级锁适用于需要对整个表进行操作的情况,例如…...
现存脑容知识库
Redis import queue import threading import asyncio 异步:在一个线程内,等待的时候可以切换到其他任务。 多线程:每个线程独立运行,同时处理多个任务。 回调函数 网络请求(JavaScript)在浏览器中&a…...

Mysql-如何理解事务?
一、事务是什么东西 有些场景中,某个操作需要多个sql配合完成: 例如: 李四这个月剩下的前不够交房租了,找张三借1000元急用: (1)给张三的账户余额 减去1000元 updata 账户表 set money money -…...

dify绑定飞书多维表格
dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…...

QT播放视频保持视频宽高比消除黑边
QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候,由于框架的大小发生变化,导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定,Widget的宽高比和视频宽高比…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...