基于 RAG(检索增强生成)的智能家电客服助手,支持自定义语气风格,适配不同品牌调性,让 AI 学习产品知识,为用户提供专业、准确的咨询服务。

项目能做什么?
先看效果 —— 在终端里直接和AI对话:

核心能力有五条:
- 智能问答:回答用户关于智能家电的各种问题
- 精准回复:基于产品知识库,避免 AI 随意编造
- 风格统一:始终保持专业的客服语气,提升用户体验
- 数据安全:所有知识库存储在本地,不上传云端
- 定制能力:通过替换知识库数据,可适配不同品牌、不同场景的沟通风格
为什么会做这个项目?
说来也巧,本来就是突然想到之前看过的一个视频,里面展示的是模拟朋友语气的AI聊天器,好奇心驱动下就查了查怎么实现的。没想到一查还就陷进去了,想着与其看一百篇理论文章,不如自己动手写一个,就简单搭建了一个模拟器,还真成了!再联想到前几天和某平台客服交流的经历,一下子恍然大悟,于是这个项目就应运而生了。
关于项目的具体介绍可前往 Github: 基于 RAG 的智能家电客服助手 查看 README,相关代码也已经**开源到 Github ** ,里面详细介绍了项目内容,本地部署方法等等。
下面的内容主要是关于本项目用到的技术,踩坑经历以及后续计划等等,希望对大家有帮助,各位大佬如果有任何建议或者指正都可以提出来,任何反馈都感激不尽!
一. 项目技术
技术选型
| 开发语言 | Python 3.9+ | AI生态最成熟,代码简洁 |
| 向量数据库 | ChromaDB | 轻量、本地存储,不需要单独部署服务 |
| Embedding模型 | BAAI/bge-m3 | 中文语义理解强,性价比高 |
| 大语言模型 | DeepSeek-V3 | 中文能力突出,响应速度极快 |
| API服务 | 硅基流动 | 提供稳定的模型 API 服务 |
关于RAG vs 微调的选择:
最开始我也想过要不要做微调(Fine-tuning),但仔细分析后发现:
| 知识更新 | 改chat.txt即可 | 需要重新训练模型 |
| 硬件要求 | 普通电脑足够 | 需要GPU(至少10GB显存) |
| 成本 | API按量付费,几块钱能用很久 | 训练成本高 |
| 可控性 | 完全控制知识来源 | 知识被"写进"模型,难以调试 |
对于个人项目来说,RAG是更务实的选择。
核心流程
整个程序的核心流程可以拆成五步:
用户输入
↓
① 读取知识库(chat.txt)
↓
② 向量化存储(ChromaDB)
↓
③ 检索最相似的3条话术
↓
④ 拼接System Prompt + Context
↓
⑤ 大模型生成回复
↓
返回结果
关键代码解析
知识入库
先把 chat.txt 里的客服话术读进来:
with open('chat.txt', 'r', encoding='utf-8-sig') as f:
lines = [line.strip() for line in f.readlines() if line.strip()]
然后调用硅基流动的 Embedding API,把每条话术转成向量,存入 ChromaDB:
def get_embeddings_batch(texts):
url = f"{BASE_URL}/embeddings"
headers = {"Authorization": f"Bearer {API_KEY}"}
data = {"model": EMBEDDING_MODEL, "input": texts}
response = requests.post(url, json=data, headers=headers)
return [item["embedding"] for item in response.json()["data"]]
#批量向量化(一次搞定,比逐条快10-50倍)
embeddings = get_embeddings_batch(lines)
# 存入向量数据库
collection.add(
documents=lines,
embeddings=embeddings,
ids=[f"id_{i}" for i in range(len(lines))]
)
检索 + 生成
用户提问时,先检索最相似的话术,再让大模型参考这些话术生成回复:
def chat(user_input):
# 第一步:把用户问题转成向量,检索最相似的3条
vec = get_embeddings_batch([user_input])[0]
results = collection.query(query_embeddings=[vec], n_results=3)
context = "\\n".join(results['documents'][0])
# 第二步:构造System Prompt,把检索结果作为参考
system_prompt = f"""
你是一个专业的客服助手。参考以下话术回答用户:
—话术参考—
{context}
—参考结束—
"""
# 第三步:调用大模型生成回复
response = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V3",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_input}
]
)
return response.choices[0].message.content
整个核心逻辑就这两块:入库和检索生成,加起来总共几十行代码
二. 踩坑记录
1. Windows 编码问题(BOM 头)
现象:AI 回复出现乱码 原因:Windows 记事本保存 UTF-8 文件时默认添加 BOM 头(\\ufeff) 解决方案:
# 使用 utf-8-sig 自动跳过 BOM 头
with open('chat.txt', 'r', encoding='utf-8-sig') as f:
lines = f.readlines()
2. 角色边界混淆
现象:AI 把“用户”的话也当成参考内容 原因:chat.txt 中混入了“用户:”前缀 解决方案:
-
知识库只保留“客服:”开头的标准话术
-
System Prompt 中明确“你只需模仿客服角色”
3. 日常寒暄无法处理
现象:说“再见”时 AI 回复“抱歉,暂时无法回答” 原因:chat.txt 中没有告别语,触发“不知道就说不知道”规则 解决方案:
-
在知识库中补充日常用语
-
或在 System Prompt 中设置例外规则
4. 向量检索不准确
现象:用户问的问题,AI 检索到的 context 完全不相关 原因:知识库中的数据太短或太分散 解决方案:
-
合并相关话术为更完整的段落
-
增加 n_results 参数(检索更多条)
-
使用更好的 Embedding 模型
三 .成本分析
这也是我做项目时很关心的问题。硅基流动,我的实际使用情况是:
| BAAI/bge-m3 | 向量化 | ≈ 0.07元 / 1M tokens |
| DeepSeek-V3 | 对话生成 | 输入 ≈ 2元 / 1M tokens,输出 ≈ 8元 / 1M tokens |
单次对话(约500 tokens输入 + 100 tokens输出):≈ 0.001-0.003元
也就是说,1块钱能对话300-1000次,个人学习和测试成本很小。
四 .后续计划
这部分的话是我的一些后续计划,如果条件允许,我会慢慢迭代并上传,在这里也欢迎大家提建议!您的建议对项目迭代意义非凡!
-
□ Web 界面:基于 FastAPI + Vue 构建可视化聊天界面
-
□ 多知识库:支持切换不同产品线的知识库
-
□ 对话记忆:支持多轮对话上下文关联
-
□ 数据导入:支持 JSON、CSV、PDF 等多种数据格式
-
□ 即时通讯接入:支持接入微信、钉钉、飞书等平台
五. 写在最后
做完这个项目,我最深的感受是:
技术没有想象中的那么难,但坑比想象中的多。
RAG的原理看起来很简单——检索 + 生成。但真正做起来,数据格式、编码问题、角色边界、模型语言切换……每一个细节都可能让你排查半天。
但正是这些"坑",让我真正理解了RAG的工作机制,也让我学会了如何一步步调试、优化。
几点心得:
数据决定上限 —— chat.txt 的质量决定了AI能回答得多好,代码只是把这个质量发挥出来
编码问题最隐蔽 —— 一个看不见的BOM头能让你排查一整天,工具链的细节很重要
先跑起来再说 —— 别想太多,从最小可用版本开始,然后再逐步优化
项目已开源至Github: 基于 RAG 的智能家电客服助手 如果您也喜欢或者给您提供了一丝灵感,欢迎 Star 🌟 支持!也欢迎 Fork 项目进行二次开发,或提交 Issue 和 我 一起完善。
如果您也在做类似的项目,欢迎交流讨论。

![[特殊字符]DeepSeek‑Harness(DSH)小白保姆教程-171主机测评](https://www.171host.com/wp-content/uploads/2026/08/20260816085112-6a817a009aabf-220x150.png)