欢迎光临
我们一直在努力

大一升大二暑假,我独立做了一个AI客服:RAG从理论到落地


基于 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),但仔细分析后发现:

对比项RAG微调
知识更新 改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 和 我 一起完善。

    如果您也在做类似的项目,欢迎交流讨论。

    赞(0)
    未经允许不得转载:171主机测评 » 大一升大二暑假,我独立做了一个AI客服:RAG从理论到落地
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址