当前位置: 首页 > news >正文

自然语言处理NLP入门 -- 第十节NLP 实战项目 2: 简单的聊天机器人

一、为什么要做聊天机器人?

在互联网时代,我们日常接触到的“在线客服”“自动问答”等,大多是以聊天机器人的形式出现。它能帮我们快速回复常见问题,让用户获得及时的帮助,并在一定程度上减少人工客服的压力。
同时,聊天机器人也是了解自然语言处理(NLP)最好的实战项目之一。因为它整合了文字理解(NLU)对话管理文本生成(NLG)等多方面知识,既能看到很直观的对话效果,也能结合深度学习模型让机器人变得更智能。


二、聊天机器人的基本架构

无论是使用 GPT,还是纯 Python 实现,一个对话系统一般都包含以下部分:

  1. 接收用户输入:如文本或语音转文本。
  2. 自然语言理解(NLU):理解用户的意图和关键信息。例如,“想查天气”就是“意图”,“北京”就是“实体”。
  3. 对话管理(DM):根据用户意图和上下文,决定下一步要做什么。
    • 如果是纯 Python 规则式,可以用 if 条件来判断;
    • 如果是 GPT/OpenAI API,就把这些上下文打包成提示,让大模型处理。
  4. 自然语言生成(NLG):把处理好的结果转成人类可读的文本回复。
  5. 输出结果:返回给用户。

除了以上通用流程,不同的实现会稍微有不同的细节。例如,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)

运行方式

  1. 将以上代码保存为 rule_based_bot.py
  2. 在命令行或 PowerShell 中执行:
    python rule_based_bot.py
    
  3. 就可以和机器人进行简易的文本对话了。

示例输出:

欢迎使用简易聊天机器人(规则式),输入‘退出’可结束。
你:天气
机器人: 今天阳光明媚,适合出行哦。(仅供演示,实际需查询天气API)
你:温度
机器人: 抱歉,我不太明白。可以换个问题吗?
你:再见
机器人: 感谢和你聊天,下次见!
你:退出
机器人:再见!

解析

  • simple_rule_based_bot 函数中,我们只做了最简单的字符串包含判断。
  • 这种方式对于特定场景,假如你只想实现FAQ(常见问题库)或极简功能,可以快速搭建并投入使用。

四、第二种实现方式:用 GPT 或 OpenAI API 生成对话

1. GPT 的优势

  • GPT(Generative Pre-trained Transformer)是一个通过海量文本训练的大模型,具有非常强的理解和生成自然语言的能力。
  • 相较于规则式聊天机器人,GPT 不仅可以对关键词做匹配,更可以理解语义并输出高质量的、几乎像人类一样的自然回复。

2. 如何开始使用 OpenAI API?

  1. 注册获取 API Key
    • 到 OpenAI 平台注册账号,然后在“View API keys”处创建一个“Secret Key”。
  2. 安装 openai
    pip install openai
    
  3. 编写简单的 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)
    

运行方式

  1. 保存为 gpt_bot.py
  2. 在命令行中执行 python gpt_bot.py
  3. 输入任意文字后,就可以获得 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。

五、难点总结

  1. 规则式机器人的最大难点是“扩展性”,如果需求一旦复杂,需要大量 if-else/规则,会变得难以维护。
  2. GPT/OpenAI API 的难点在“Prompt 设计”和“上下文管理”:
    • 如果 Prompt 写得不清晰,GPT 可能会给出风马牛不相及的回答;
    • 若对话太长,可能出现记忆混乱或超出上下文长度。
  3. 费用与服务稳定性
    • GPT 调用需要计费,一旦用户请求量很大,需要考虑预算;
    • 若网络环境不稳定或者 API 有限制,也会影响使用体验。

六、课后练习

  1. 练习:加入 FAQ 知识库

    • 可以把常见问题和回答存在一个字典或 JSON 文件中,当检测到用户的问题在FAQ里,就直接返回固定答案;
    • 如果没匹配到,再把问题交给 GPT 处理。
    • 这样能有效降低 API 调用次数,也让回复更准确。
  2. 练习:带上下文记忆的 GPT 聊天

    • 在上面 “如何让机器人记住上下文” 的示例基础上,完善对话历史的管理。
    • 尝试只保留最近 3 轮对话,以防 Token 超限,同时还能保留一定的上下文。
  3. 练习:调用第三方 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的宽高比和视频宽高比…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...