我们将使用一个流行的、轻量级的向量和相似度搜索库 sentence-transformers 来实现检索部分。

项目目标
- 简单对话:能识别问候、感谢、告别等意图,并给出预设回复。
- 知识库问答:能从预先准备好的文本文件(知识库)中,根据用户问题找到最相关的段落并作答。
- 友好的交互:提供清晰的指令,让用户知道如何与机器人交互。
技术选型
- Python: 核心语言。
sentence-transformers: 用于将句子转换成高维向量,这是实现语义搜索的关键。numpy: 用于高效的数值计算,特别是计算向量之间的余弦相似度。Flask(可选): 如果你想把这个机器人做成一个网页应用,Flask 是一个非常好的轻量级选择,本教程我们先实现一个命令行版本。
第一步:安装必要的库
你需要安装 sentence-transformers 和 numpy,打开你的终端或命令行,运行:
pip install sentence-transformers numpy
第二步:项目结构
为了保持代码整洁,我们创建如下文件结构:
customer_service_bot/
├── knowledge_base.txt # 我们的知识库文件
├── bot.py # 机器人的主程序
└── requirements.txt # 项目依赖
第三步:准备知识库
在 customer_service_bot 文件夹下,创建一个名为 knowledge_base.txt 的文件,将你的客服知识写入这个文件,每一行代表一个独立的、完整的知识条目。
knowledge_base.txt 示例内容:

我们的工作时间是周一至周五,上午9点至下午6点。
您可以通过访问官网 'www.example.com/support' 在线提交工单。
重置密码请点击登录页面的“忘记密码”链接,输入您的注册邮箱即可。
我们支持信用卡和支付宝两种支付方式。
订单发货后,系统会自动发送包含物流单号的邮件到您的注册邮箱。
如果您对产品质量不满意,可以在收到货后7天内申请退货。
退货运费由买家承担,除非是商品质量问题。
我们的客服热线是 400-123-4567。
这个知识库是机器人的“大脑”,条目越多、描述越清晰,回答得就越好。
第四步:编写机器人代码 (bot.py)
我们来编写核心代码,将以下代码复制到 bot.py 文件中。
import os
import numpy as np
from sentence_transformers import SentenceTransformer, util
# --- 1. 初始化模型和加载知识库 ---
# 加载预训练的中文句子模型
# 'paraphrase-multilingual-MiniLM-L12-v2' 是一个多语言模型,对中文效果不错
# 第一次运行时会自动下载模型,可能需要一些时间
print("正在加载模型,请稍候...")
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
print("模型加载完成!")
# 加载知识库
def load_knowledge_base(file_path):
"""从文件中加载知识库"""
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# 去除每行的首尾空白字符
knowledge_base = [line.strip() for line in lines if line.strip()]
return knowledge_base
# 加载知识库并为其创建向量表示
KB_FILE = "knowledge_base.txt"
if not os.path.exists(KB_FILE):
print(f"错误:知识库文件 '{KB_FILE}' 未找到!请确保文件在正确的目录下。")
exit()
knowledge_base = load_knowledge_base(KB_FILE)
print(f"已加载 {len(knowledge_base)} 条知识。")
# 将整个知识库转换为向量并缓存,避免每次提问都重新计算
print("正在为知识库创建向量表示...")
kb_embeddings = model.encode(knowledge_base, convert_to_tensor=True)
print("知识库向量表示创建完成!")
# --- 2. 定义规则型回复 ---
def rule_based_response(user_input):
"""根据关键词匹配进行回复"""
user_input = user_input.lower()
# 意图关键词
greetings = ["你好", "您好", "hi", "hello", "在吗"]
thanks = ["谢谢", "感谢", "多谢"]
goodbyes = ["再见", "拜拜", "bye", "回头见"]
if any(g in user_input for g in greetings):
return "您好!我是您的智能客服小助手,很高兴为您服务,请问有什么可以帮您的吗?"
elif any(t in user_input for t in thanks):
return "不客气!如果您还有其他问题,随时可以问我。"
elif any(b in user_input for b in goodbyes):
return "再见!祝您生活愉快!"
return None # 如果没有匹配到规则,返回None
# --- 3. 定义检索型回复 ---
def retrieval_based_response(user_input):
"""通过语义搜索在知识库中查找最相关的答案"""
# 将用户问题也转换为向量
query_embedding = model.encode(user_input, convert_to_tensor=True)
# 计算用户问题与知识库中所有条目的余弦相似度
# util.cos_sim 会返回一个二维矩阵,我们取 [0] 是因为只有一个查询
cosine_scores = util.cos_sim(query_embedding, kb_embeddings)[0]
# 找到得分最高的条目的索引
top_result_idx = np.argmax(cosine_scores)
# 获取最高得分
top_score = cosine_scores[top_result_idx]
# 设置一个相似度阈值,如果低于这个阈值,则认为没有找到合适的答案
# 这个值可以根据你的知识库质量和模型表现进行调整
if top_score < 0.3:
return "抱歉,我还没有学习到这方面的知识,您可以尝试换一种方式问我,或者联系人工客服。"
# 返回得分最高的知识条目
return knowledge_base[top_result_idx]
# --- 4. 主循环 ---
def run_chatbot():
"""运行聊天机器人主循环"""
print("\n" + "="*30)
print("智能客服机器人已启动!")
print("输入 '退出' 或 'bye' 结对话。")
print("="*30 + "\n")
while True:
user_input = input("您: ")
# 检查退出指令
if user_input.lower() in ['退出', 'bye', 'goodbye']:
print("机器人: 再见!祝您生活愉快!")
break
# 1. 尝试规则匹配
rule_response = rule_based_response(user_input)
if rule_response:
print(f"机器人: {rule_response}")
continue # 规则匹配成功,跳过检索
# 2. 规则匹配失败,尝试检索匹配
print("机器人: 正在思考中...")
retrieval_response = retrieval_based_response(user_input)
print(f"机器人: {retrieval_response}")
if __name__ == "__main__":
run_chatbot()
第五步:运行和测试
- 确保你所有的文件都在
customer_service_bot文件夹下。 - 打开终端,进入该文件夹:
cd customer_service_bot - 运行机器人:
python bot.py
首次运行:程序会从网络下载 paraphrase-multilingual-MiniLM-L12-v2 模型,这可能需要几分钟时间,请耐心等待。
测试示例:

==============================
智能客服机器人已启动!
输入 '退出' 或 'bye' 结对话。
==============================
您: 你好
机器人: 您好!我是您的智能客服小助手,很高兴为您服务,请问有什么可以帮您的吗?
您: 你们什么时候上班
机器人: 正在思考中...
机器人: 我们的工作时间是周一至周五,上午9点至下午6点。
您: 怎么重置密码
机器人: 正在思考中...
机器人: 重置密码请点击登录页面的“忘记密码”链接,输入您的注册邮箱即可。
您: 谢谢
机器人: 不客气!如果您还有其他问题,随时可以问我。
您: 你们卖什么
机器人: 正在思考中...
机器人: 抱歉,我还没有学习到这方面的知识,您可以尝试换一种方式问我,或者联系人工客服。
您: 退出
机器人: 再见!祝您生活愉快!
代码详解与扩展思路
-
模型加载 (
SentenceTransformer):- 我们选择了一个多语言模型,因为它对中英文混合场景有较好的支持。
model.encode()是核心功能,它将文本字符串转换成一个768维(对于这个模型)的浮点数向量,这个向量捕捉了文本的语义信息。
-
相似度计算 (
util.cos_sim):- 机器不懂“意义”,但它能理解“距离”,向量空间中,夹角越小的向量,其语义越相似,余弦相似度就是用来计算这个夹角的,结果在-1到1之间,越接近1越相似。
- 我们找到与用户问题向量最接近的知识库向量,就找到了“最相关”的答案。
-
相似度阈值 (
if top_score < 0.3):- 这是一个非常重要的“保底”机制,如果用户的问题非常奇怪,或者知识库里根本没有相关内容,直接返回最“相关”的答案可能会驴唇不对马嘴。
- 设置一个阈值,当最高相似度低于这个值时,就返回一个“我不知道”的友好提示,这比胡乱回答要好得多,你可以根据实际情况调整这个值。
-
扩展思路:
- 增加知识库来源: 可以让机器人从
.csv,.xlsx甚至数据库中读取知识,而不仅仅是.txt文件。 - 集成到网页: 使用
Flask或FastAPI将这个逻辑封装成一个 Web API,然后在前端用 HTML/CSS/JavaScript 构建一个聊天界面,用户就可以在浏览器里与机器人对话了。 - 更复杂的意图识别: 对于规则部分,可以使用更强大的 NLP 库(如
Rasa或spaCy)进行意图和实体识别,从而实现更复杂的逻辑,我想查询订单号 12345 的状态”。 - 引入大语言模型 (LLM): 这是目前最先进的方案,你可以将“从知识库中检索到的最相关文本”和“用户的问题”一起,作为“上下文”发送给一个像 GPT-4、文心一言或通义千问这样的 LLM,然后让它生成一个更自然、更流畅、更具总结性的回答,而不是简单地返回原文,这能极大地提升用户体验。
- 增加知识库来源: 可以让机器人从
这个项目为你提供了一个非常扎实和实用的智能客服机器人基础,你可以在此基础上不断迭代和优化,让它变得更加强大!
标签: Python智能客服机器人交互优化 Python客服机器人高效对话实现 Python智能机器人交互提升技巧