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 简易聊天机器人,核心收获如下:

  • 聊天机器人本质是一个「输入 → 处理 → 回复」的循环;
  • 关键词匹配是最简单的对话实现方式;
  • 将规则外置到配置文件,可以降低维护成本;
  • 加入上下文记忆后,机器人开始具备连续对话能力;
  • 无论后续接入多么复杂的模型,对话流程的骨架基本不变。

完整代码可以根据版本逐步扩展。建议你从第一版开始手敲一遍,再逐步加入规则文件与上下文功能,这样对对话流程的理解会更加深刻。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐