Python 实现简易聊天机器人:从零认识对话流程
1. 引言
聊天机器人(Chatbot)是很多人接触自然语言处理与实际项目开发的第一站。表面上它只是一个「你问我答」的窗口,背后却隐藏着一条完整的对话流程:接收输入 → 理解意图 → 生成回复 → 返回结果。
本文不使用任何第三方 NLP 框架,只基于 Python 标准库,从零实现一个能在终端运行的简易聊天机器人。通过这篇文章,你将理解聊天机器人最基本的骨架,并掌握如何逐步扩展它。
2. 认识对话流程
一个最简聊天机器人,本质上是一个无限循环:
等待用户输入
↓
处理输入内容
↓
生成回复
↓
打印回复并继续等待
用伪代码表示就是:
while True:
user_input = input("你: ")
if user_input == "退出":
break
reply = generate_reply(user_input)
print("机器人:", reply)
这个循环就是「对话流程」的核心。后续无论是关键词匹配、规则引擎,还是深度学习模型,都只是不断替换 generate_reply 内部实现而已。
3. 环境准备
本文只需要 Python 3.6 及以上版本,无需安装任何第三方库。
在终端中确认 Python 环境:
python --version
如果显示 Python 3.x.x,即可直接开始。
4. 第一版:关键词匹配机器人
先实现最基础的版本。机器人根据用户输入中是否包含某些关键词,返回预设的回答。
def generate_reply(user_input: str) -> str:
"""根据关键词生成回复"""
rules = [
("你好", "你好呀,很高兴见到你!"),
("名字", "我叫小简,是一个用 Python 写的聊天机器人。"),
("时间", "我现在还不会看时间,你可以教教我。"),
("天气", "我这里看不到外面的天气,建议你打开窗户看看。"),
("再见", "再见啦,期待下次聊天!"),
]
for keyword, reply in rules:
if keyword in user_input:
return reply
return "这个问题我还不太明白,换个说法试试?"
def main():
print("小简:你好,我是聊天机器人小简。输入「退出」结束对话。")
while True:
user_input = input("你: ").strip()
if not user_input:
continue
if user_input in ("退出", "拜拜"):
print("小简:再见啦!")
break
print("小简:", generate_reply(user_input))
if __name__ == "__main__":
main()
运行效果示例:
小简:你好,我是聊天机器人小简。输入「退出」结束对话。
你: 你好
小简: 你好呀,很高兴见到你!
你: 你叫什么名字
小简: 我叫小简,是一个用 Python 写的聊天机器人。
你: 退出
小简:再见啦!
这个版本已经具备完整对话流程,但缺点也很明显:规则写死在代码中,应答过于机械。
5. 第二版:规则文件驱动
为了让机器人更容易维护,把问答规则从代码中抽离到 JSON 文件。
创建 rules.json:
[
{
"keywords": ["你好", "嗨", "hello"],
"reply": "你好呀,很高兴见到你!"
},
{
"keywords": ["名字", "你是谁"],
"reply": "我叫小简,是一个用 Python 写的聊天机器人。"
},
{
"keywords": ["时间", "几点"],
"reply": "我现在还不会看时间,你可以教教我。"
},
{
"keywords": ["天气"],
"reply": "我这里看不到外面的天气,建议你打开窗户看看。"
}
]
修改主程序,启动时加载规则:
import json
from pathlib import Path
def load_rules(path: str = "rules.json") -> list[dict]:
"""从 JSON 文件加载问答规则"""
rule_file = Path(path)
if not rule_file.exists():
return []
with rule_file.open("r", encoding="utf-8") as f:
return json.load(f)
def generate_reply(user_input: str, rules: list[dict]) -> str:
"""按规则顺序匹配关键词"""
for rule in rules:
if any(keyword in user_input for keyword in rule["keywords"]):
return rule["reply"]
return "这个问题我还不太明白,换个说法试试?"
def main():
rules = load_rules()
print("小简:你好,我是聊天机器人小简。输入「退出」结束对话。")
while True:
user_input = input("你: ").strip()
if not user_input:
continue
if user_input in ("退出", "拜拜"):
print("小简:再见啦!")
break
print("小简:", generate_reply(user_input, rules))
if __name__ == "__main__":
main()
这样,以后添加新问答只需要修改 rules.json,不用动 Python 代码。
6. 第三版:加入上下文记忆
前面的机器人没有记忆,每次回复都是独立的。我们让它记住用户说过的上一句话,并支持「重复一遍」这类需要上下文的指令。
import json
from pathlib import Path
class SimpleBot:
"""带简单上下文的聊天机器人"""
def __init__(self, rules: list[dict]):
self.rules = rules
self.last_input = ""
def generate_reply(self, user_input: str) -> str:
# 优先处理上下文相关指令
if "重复" in user_input and "上一句" in user_input:
if self.last_input:
return f"你上一句说的是:{self.last_input}"
return "你还没说过上一句呢。"
# 记录当前输入,供下一轮使用
self.last_input = user_input
for rule in self.rules:
if any(keyword in user_input for keyword in rule["keywords"]):
return rule["reply"]
return "这个问题我还不太明白,换个说法试试?"
def load_rules(path: str = "rules.json") -> list[dict]:
rule_file = Path(path)
if not rule_file.exists():
return []
with rule_file.open("r", encoding="utf-8") as f:
return json.load(f)
def main():
bot = SimpleBot(load_rules())
print("小简:你好,我是聊天机器人小简。输入「退出」结束对话。")
while True:
user_input = input("你: ").strip()
if not user_input:
continue
if user_input in ("退出", "拜拜"):
print("小简:再见啦!")
break
print("小简:", bot.generate_reply(user_input))
if __name__ == "__main__":
main()
运行效果:
你: 你好
小简: 你好呀,很高兴见到你!
你: 重复上一句
小简: 你上一句说的是:你好
通过类封装,机器人的状态得以保留,这是从「应答器」走向「对话系统」的重要一步。
7. 对话流程的完整结构
经过上面三个版本,一个聊天机器人的对话流程可以抽象为以下结构:
理解这个流程后,你可以把其中任意环节替换成更强大的实现:
- 预处理可以加入分词、拼写纠正、大小写归一;
- 规则匹配可以替换为正则表达式或意图识别模型;
- 生成回复可以接入大语言模型 API;
- 上下文记忆可以升级为多轮对话历史管理。
8. 进一步改进方向
如果你想继续完善这个小项目,可以从以下几个方向入手:
8.1 使用正则表达式
对于「帮我查一下北京天气」这类有变量的问题,关键词匹配就力不从心了。可以用 re 模块提取关键信息:
import re
def extract_city(text: str) -> str | None:
match = re.search(r"(.+?)(的)?天气", text)
if match:
return match.group(1)
return None
8.2 接入大模型 API
把 generate_reply 的规则匹配替换为调用大模型接口,你的机器人马上就能「聪明」起来。核心思路不变,只是回复生成方式升级。
8.3 增加 Web 界面
用 Flask 或 FastAPI 把终端对话改成网页聊天窗口,让机器人真正面向用户。
9. 总结
本文从零实现了一个 Python 简易聊天机器人,核心收获如下:
- 聊天机器人本质是一个「输入 → 处理 → 回复」的循环;
- 关键词匹配是最简单的对话实现方式;
- 将规则外置到配置文件,可以降低维护成本;
- 加入上下文记忆后,机器人开始具备连续对话能力;
- 无论后续接入多么复杂的模型,对话流程的骨架基本不变。
完整代码可以根据版本逐步扩展。建议你从第一版开始手敲一遍,再逐步加入规则文件与上下文功能,这样对对话流程的理解会更加深刻。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)