当前位置: 首页 > news >正文

零基础上手 AI 客服系统:30 分钟搭建你的第一个 Agent

💻完整可运行代码:https://github.com/Lee985-cmd/AI-30-Day-Challenge

⭐ 项目已开源,欢迎 Star 支持!


一、为什么做这个?

传统客服太贵了:

  • 10 人团队 = 每月 5-8 万
  • 响应慢(排队 10+ 分钟)
  • 服务质量不稳定

AI 客服能解决:

  • ✅ 成本降低 80%(每月 100-200 元 API 费用)
  • ✅ 响应时间 3 秒(提升 60-200 倍)
  • ✅ 24/7 在线,永不疲倦

数据说话:

  • 某电商平台:人工客服工作量减少 70%
  • 某 SaaS 公司:AI 客服解决率 85%,满意度 4.5/5

二、技术选型

核心架构

用户提问 → [意图识别 Agent] → [知识库检索 RAG] → [对话管理 Agent] → 回答

技术栈

模块技术选型原因
Agent 框架LangChain生态完善
大模型通义千问 qwen-plus中文强、成本低(¥0.004/1K tokens)
向量数据库Chroma轻量级、无需服务器
Embeddingall-MiniLM-L6-v2本地运行、完全免费
Web 框架FastAPI + Streamlit快速开发

为什么用阿里百炼?

  • 比 OpenAI 便宜 5-10 倍
  • 中文能力更强
  • 国内直接使用,无需翻墙

三、快速上手(30 分钟)

第 1 步:安装依赖

pip install langchain langchain-community dashscope chromadb fastapi uvicorn streamlit sentence-transformers

第 2 步:配置 API Key

# PowerShell(永久设置,需要管理员权限) [System.Environment]::SetEnvironmentVariable("DASHSCOPE_API_KEY", "sk-your-api-key", "User")

⚠️不要用 .env 文件,容易泄露!

获取 API Key:https://dashscope.console.aliyun.com/

第 3 步:准备知识库

创建docs/product_faq.md

## Q1: 如何退货? A: 购买后 7 天内可申请无理由退货。操作步骤:登录账号 → 我的订单 → 选择订单 → 申请退货。退货需要将商品寄回指定地址,运费由买家承担。 ## Q2: 发货时间? A: 工作日 24 小时内发货,周末和节假日顺延。 ## Q10: 如何申请退款? A: 退款是指退回已支付的款项。订单未发货:直接申请退款。已发货:拒收或退货后申请退款。退款 3-5 个工作日原路返回。注意:退款和退货不同,退款是退钱,退货是退商品。

第 4 步:构建知识库(RAG)

# knowledge_base.py from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma class KnowledgeBase: def __init__(self): # 使用本地 Embedding 模型(完全免费) self.embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/all-MiniLM-L6-v2" ) self.vector_db = None def build_knowledge_base(self, doc_path): print("正在加载文档...") loader = TextLoader(doc_path, encoding='utf-8') documents = loader.load() print("正在切分文档...") text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 ) texts = text_splitter.split_documents(documents) print("正在创建向量索引...") self.vector_db = Chroma.from_documents( documents=texts, embedding=self.embeddings, persist_directory="./chroma_db" ) print(f"✅ 知识库构建完成!共 {len(texts)} 个文档块") def search(self, query, k=3): results = self.vector_db.similarity_search(query, k=k) return "\n\n".join([doc.page_content for doc in results])

运行:

kb = KnowledgeBase() kb.build_knowledge_base("docs/product_faq.md") # 测试检索 context = kb.search("怎么退货?") print(context)

第 5 步:实现意图识别

# intent_agent.py from langchain_community.chat_models import ChatTongyi from langchain_core.prompts import PromptTemplate from langchain_classic.chains import LLMChain import os class IntentAgent: def __init__(self): api_key = os.getenv("DASHSCOPE_API_KEY") os.environ["DASHSCOPE_API_KEY"] = api_key self.llm = ChatTongyi(model="qwen-plus", temperature=0) prompt = PromptTemplate( input_variables=["user_input"], template="""你是一个电商客服意图识别专家。请判断用户的意图属于哪一类。 可选类别:售前咨询、售后问题、物流查询、发票问题、投诉建议、其他 用户输入:{user_input} 请只输出类别名称,不要解释。 类别:""" ) self.chain = LLMChain(llm=self.llm, prompt=prompt) def classify(self, user_input): result = self.chain.invoke({"user_input": user_input}) if isinstance(result, dict): return result.get("text", "").strip() return str(result).strip() # 测试 agent = IntentAgent() print(agent.classify("我想退货")) # 输出:售后问题

第 6 步:实现对话管理

# dialogue_agent.py from langchain_community.chat_models import ChatTongyi from langchain_classic.chains import ConversationalRetrievalChain from langchain_core.prompts import PromptTemplate from typing import Dict, List import os class DialogueAgent: def __init__(self, knowledge_base): api_key = os.getenv("DASHSCOPE_API_KEY") os.environ["DASHSCOPE_API_KEY"] = api_key self.llm = ChatTongyi(model="qwen-plus", temperature=0.7) self.kb = knowledge_base self.conversation_histories: Dict[str, List[tuple]] = {} qa_prompt = PromptTemplate( template="""你是一个专业的电商客服助手。请根据以下上下文回答用户问题。 规则: 1. 只使用提供的上下文信息回答,不要编造 2. 如果上下文中没有答案,说"抱歉,我暂时无法回答这个问题,建议您联系人工客服" 3. 语气友好、专业、简洁 上下文: {context} 用户问题:{question} 客服回答:""" ) self.chain = ConversationalRetrievalChain.from_llm( llm=self.llm, retriever=knowledge_base.vector_db.as_retriever(search_kwargs={"k": 3}), combine_docs_chain_kwargs={"prompt": qa_prompt}, return_source_documents=True ) def chat(self, user_input: str, user_id: str = "default_user") -> dict: # 获取该用户的对话历史 if user_id not in self.conversation_histories: self.conversation_histories[user_id] = [] history = self.conversation_histories[user_id] # 格式化聊天历史为列表格式 chat_history_list = history[-5:] if len(history) > 5 else history # 调用 Chain result = self.chain.invoke({ "question": user_input, "chat_history": chat_history_list }) answer = result["answer"] source_docs = result.get("source_documents", []) # 保存对话历史 history.append((user_input, answer)) if len(history) > 10: self.conversation_histories[user_id] = history[-10:] return { "answer": answer, "confidence": min(0.9, len(source_docs) * 0.3) if source_docs else 0.0 }

第 7 步:启动服务

# api.py from fastapi import FastAPI from pydantic import BaseModel from knowledge_base import KnowledgeBase from intent_agent import IntentAgent from dialogue_agent import DialogueAgent import os app = FastAPI(title="AI Customer Service API") kb = None intent_agent = None dialogue_agent = None class ChatRequest(BaseModel): user_id: str message: str @app.on_event("startup") async def startup(): global kb, intent_agent, dialogue_agent api_key = os.getenv("DASHSCOPE_API_KEY") print("正在初始化知识库...") kb = KnowledgeBase() kb.build_knowledge_base("docs/product_faq.md") print("正在初始化意图识别 Agent...") intent_agent = IntentAgent() print("正在初始化对话 Agent...") dialogue_agent = DialogueAgent(knowledge_base=kb) print("✅ 服务初始化完成!") @app.post("/chat") async def chat(request: ChatRequest): # 1. 意图识别 intent = intent_agent.classify(request.message) # 2. 对话处理 result = dialogue_agent.chat(request.message, user_id=request.user_id) # 3. 判断是否需要人工介入 need_human = result["confidence"] < 0.5 return { "intent": intent, "answer": result["answer"], "confidence": result["confidence"], "need_human": need_human } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)

启动:

python api.py

第 8 步:测试接口

curl -X POST http://localhost:8000/chat \ -H "Content-Type: application/json" \ -d '{ "user_id": "user_001", "message": "我想退货" }'

返回结果:

{ "intent": "售后问题", "answer": "购买后 7 天内可申请无理由退货。操作步骤:登录账号 → 我的订单 → 选择订单 → 申请退货。退货需要将商品寄回指定地址,运费由买家承担。", "confidence": 0.9, "need_human": false }

四、效果演示

真实对话案例

案例 1:退货咨询

用户:如何退货? AI:购买后 7 天内可申请无理由退货。操作步骤:登录账号 → 我的订单 → 选择订单 → 申请退货。退货需要将商品寄回指定地址,运费由买家承担。 意图:售后问题 | 置信度:90%

案例 2:多轮对话(记忆功能)

用户:如何退款? AI:您好!关于退款流程: • 若订单未发货,您可直接申请退款; • 若订单已发货,请先拒收包裹,或收到货后寄回商品再申请退款。 退款将在审核通过后3-5个工作日到账。 用户:我刚问的什么问题? AI:您刚才问的是"如何申请退款"。

案例 3:知识库外问题

用户:你们公司成立几年了? AI:抱歉,我暂时无法回答这个问题,建议您联系人工客服。 置信度:0% | ⚠️ 自动转人工

性能指标

指标数值
意图识别准确率95%+
知识库回答覆盖率85%
平均响应时间2-3 秒
人工介入率15%
API 成本约 0.005 元/次

五、踩坑记录

坑 1:LangChain 版本兼容性

错误:ModuleNotFoundError: No module named 'langchain.document_loaders'

解决:

# 旧导入 ❌ from langchain.document_loaders import TextLoader # 新导入 ✅ from langchain_community.document_loaders import TextLoader

详见:LangChain 导入修复指南

坑 2:多轮对话记忆丢失

问题:每次对话都是独立的

解决:手动管理对话历史

self.conversation_histories: Dict[str, List[tuple]] = {} def chat(self, user_input: str, user_id: str = "default_user"): if user_id not in self.conversation_histories: self.conversation_histories[user_id] = [] history = self.conversation_histories[user_id] chat_history_list = history[-5:] result = self.chain.invoke({ "question": user_input, "chat_history": chat_history_list }) history.append((user_input, result["answer"]))

坑 3:退货和退款混淆

问题:RAG 检索到错误的答案

解决:优化知识库内容

## Q1: 如何退货? A: 购买后 7 天内可申请无理由退货。操作步骤:登录账号 → 我的订单 → 选择订单 → 申请退货。退货需要将商品寄回指定地址,运费由买家承担。 ## Q10: 如何申请退款? A: 退款是指退回已支付的款项。订单未发货:直接申请退款。已发货:拒收或退货后申请退款。退款 3-5 个工作日原路返回。注意:退款和退货不同,退款是退钱,退货是退商品。
  • ✅ 区分相似概念(退货 vs 退款)
  • ✅ 添加关键词提高检索准确率

六、进阶优化

1. 情感分析(识别用户情绪)

from transformers import pipeline sentiment_analyzer = pipeline("sentiment-analysis") label, score = sentiment_analyzer(user_input)[0] if label == "NEGATIVE" and score > 0.9: need_human = True # 自动转人工

2. 数据监控

import json from datetime import datetime def log_conversation(user_id, user_input, intent, answer, confidence): log_entry = { "timestamp": datetime.now().isoformat(), "user_id": user_id, "input": user_input, "intent": intent, "answer": answer, "confidence": confidence } with open("logs/conversations.jsonl", "a", encoding="utf-8") as f: f.write(json.dumps(log_entry, ensure_ascii=False) + "\n")

七、部署上线

Docker 部署

FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "api.py"]
# 构建镜像 docker build -t ai-customer-service . # 运行容器 docker run -d -p 8000:8000 \ -e DASHSCOPE_API_KEY=sk-your-api-key \ ai-customer-service

八、源码下载

完整代码已开源到 GitHub:

🔗 https://github.com/Lee985-cmd/AI-30-Day-Challenge

一键运行:

# 克隆项目 git clone https://github.com/Lee985-cmd/AI-30-Day-Challenge.git cd AI-30-Day-Challenge/projects/ai-customer-service # 安装依赖 pip install -r requirements.txt # 配置 API Key(PowerShell 管理员权限) [System.Environment]::SetEnvironmentVariable("DASHSCOPE_API_KEY", "sk-your-api-key", "User") # 启动服务 python ai_customer_service/api.py # 访问 API 文档 # http://localhost:8000/docs

九、写在最后

AI 客服不是替代人工,而是增强人工。

  • 85% 的常见问题→ AI 自动解决
  • 15% 的复杂问题→ 人工专注处理
  • 效率提升:10 倍
  • 成本降低:80%

你现在需要做的:

  1. 下载源码,跑通示例
  2. 替换成你的产品文档
  3. 接入你的业务系统
  4. 上线测试,持续优化

🔗 相关资源

  • 💻GitHub 仓库:https://github.com/Lee985-cmd/AI-30-Day-Challenge
  • 📂本项目代码:projects/ai-customer-service/
  • 📖30 天完整教程:https://blog.csdn.net/m0_67081842?type=blog

💡 如果觉得这个项目对你有帮助,欢迎:

  • Star 支持一下
  • 🔀Fork并二次开发
  • 📢 分享给需要的朋友

作者:Lee
身份:职场宝爸 / AI 学习者 / Agent 实践者
CSDN:https://blog.csdn.net/m0_67081842

http://www.jsqmd.com/news/657897/

相关文章:

  • 别再手动调参了!用sklearn的GridSearchCV给随机森林回归模型找个‘最优解’(附空气污染预测实战代码)
  • 智能代码生成质量保障(2024年Gartner验证的TOP3工业级检测工具链深度拆解)
  • WarcraftHelper终极指南:5步解决魔兽争霸3现代系统兼容性问题
  • AI Agent\+PHP实现智能接口限流,避开算力成本陷阱(结合今日AI热点)
  • SQLAlchemy进阶:高级特性与性能优化
  • 避坑指南:杰理AC696X的PWM驱动RGB灯,硬件IO与映射模式到底怎么选?
  • Power Query功能区 - 视图
  • 全面掌握FanControl:Windows风扇控制软件的深度实战指南
  • SQL窗口函数实战:三种方法精准计算数据百分位排名
  • 一站式IT运维管理平台:NeatLogic ITOM 15分钟快速上手终极指南
  • 当Photoshop遇见AI:SD-PPP如何重构创意工作流
  • 暗黑3终极自动化助手:D3KeyHelper完整配置指南
  • TypeScript项目结构设计:lib、src、dist的职责划分
  • 【仅限头部科技公司内部使用的】个性化适配策略矩阵(含12个行业模板+5类敏感代码拦截规则)
  • 2026最权威的降AI率神器解析与推荐
  • Linux内核参数对容器网络的影响:conntrack、tcp_tw_reuse等调优实测
  • ChatLog:解锁QQ群聊天记录的深度洞察力,让数据说话
  • Wan2.2-I2V-A14B实战教程:Prompt工程技巧——用分句控制镜头转场节奏
  • 卡梅德生物技术快报|Pull Down 实验全流程解析 —— 植物蛋白互作筛库实战方案
  • 风吸式太阳能杀虫灯
  • WaveTools深度解析:鸣潮游戏体验的全面效率革命
  • YLB3118@ACP# 国产高性能 PCIe 3.0 转 8 口 SATA 3.0 控制芯片
  • FRED应用:LED手电筒模拟
  • 内存映射文件(mmap)加速大文件读写
  • 第10课:插件系统模块——实现功能可扩展
  • 别让自激毁了你的设计:VCA810 AGC电路PCB布局布线实战避坑指南
  • 如何高效采集小红书无水印内容:XHS-Downloader一站式解决方案
  • Git 使用技巧
  • [特殊字符] Local Moondream2隐私保护机制:所有数据本地处理不外传
  • 避坑指南:STM32驱动DS18B20时延时不精准、读数跳变的5个常见问题与解决方法