最近在做一个电商项目,客户反馈说传统的在线客服系统功能太单一了,只能记录聊天内容,但没法自动分析出哪些客户有购买意向,导致销售跟进效率很低。这让我开始研究如何给客服系统加上“智能分析”的能力。经过一番对比,我选择了Coze平台来快速实现这个需求。今天就把从零搭建这个智能客服系统的完整过程记录下来,希望能帮到有同样需求的朋友。

智能客服系统示意图

1. 为什么需要智能分析?传统客服的局限性

在开始动手之前,我们先聊聊为什么传统的客服系统满足不了现在的需求。我总结了几点主要的痛点:

  • 信息沉淀难:聊天记录虽然存下来了,但都是非结构化的文本。销售经理想统计“本周有多少人咨询了A产品”或者“哪些对话里提到了竞品B”,只能人工一条条去翻,工作量巨大且容易遗漏。
  • 意向判断靠人工:判断一个客户是随便问问还是真想买,完全依赖客服人员的主观经验。新来的客服可能因为经验不足,错失高意向客户;而老客服也可能因为状态不好,出现误判。
  • 缺乏数据联动:客服对话数据和后端的订单系统、CRM系统是割裂的。我们无法知道某个高意向的对话最终是否转化成了订单,也就无法优化客服话术和策略。
  • 响应速度瓶颈:当咨询量突然增大时(比如大促期间),人工客服根本忙不过来,很多潜在客户的咨询得不到及时响应,直接就流失了。

正是这些痛点,促使我们去寻找一个既能记录对话,又能自动分析客户意图的解决方案。

2. 为什么选择Coze?技术选型的思考

市面上实现类似功能,大体有三种思路:

  • 方案A:完全自研。自己搭建NLP服务,用开源模型(如BERT)做意图识别,自己设计数据库存储对话。优点是控制力强,完全定制。缺点是对算法和工程能力要求极高,开发周期长,维护成本高。
  • 方案B:使用成熟的SaaS客服系统。直接采购市面上带有基础分析功能的客服软件。优点是开箱即用。缺点是功能固定,定制化空间小,数据可能存放在第三方,有隐私顾虑,且高级分析功能往往收费昂贵。
  • 方案C:使用Coze这类AI应用开发平台。它提供了现成的对话管理、意图识别等AI能力,同时允许我们通过API和插件灵活地集成到自己的业务系统中,并掌控数据存储。

我最终选择了Coze,主要是基于以下几点考虑:

  1. 开发效率高:Coze封装了复杂的NLP模型和对话引擎,我无需关心模型训练、部署和调优的细节,可以专注于业务逻辑的实现。
  2. 灵活性与可控性:对话数据可以通过API导出,存储在我们自己的数据库,保证了数据主权和隐私安全。分析逻辑也可以根据我们的业务需求自定义。
  3. 成本可控:相比采购整套SaaS方案,按API调用量或资源包付费的模式,在初期用户量不大时更经济。自研的长期人力成本则更高。
  4. 生态友好:Coze支持通过“插件”或“工作流”的方式扩展功能,未来如果想增加情感分析、自动生成摘要等功能,集成起来会相对顺畅。

简单说,Coze在“能力”、“效率”和“自主权”之间取得了不错的平衡,特别适合需要快速验证和迭代的中小项目。

3. 核心实现:三步搭建智能客服系统

整个系统的核心目标就两个:存好对话分析意向。下面我们分步拆解。

3.1 第一步:设计对话内容存储架构

数据是分析的基础,必须先设计好存储方案。我的原则是:原始对话一份不丢,分析结果结构化存储。

我设计了一个简单的数据模型,主要包含两张表:

  • dialog_session (对话会话表):记录每一次独立的客服对话。
    • session_id (主键):对话唯一标识,可以用Coze返回的Session ID。
    • user_id:客户ID。
    • agent_id:客服机器人或人工客服ID。
    • start_time, end_time:对话起止时间。
    • channel:对话来源(如网站、APP、微信)。
  • dialog_message (对话消息表):记录每一条具体的消息。
    • message_id (主键):消息唯一标识。
    • session_id (外键):关联所属会话。
    • sender_type:发送者类型(useragent)。
    • content:消息文本内容。
    • timestamp:消息发送时间。
  • intention_analysis (意向分析结果表):存储每次分析的结果。
    • analysis_id (主键)。
    • session_id (外键):关联被分析的会话。
    • intention_type:意向分类,如 “高意向购买”“一般咨询”“竞品对比”“投诉建议”
    • confidence_score:模型判断的置信度(0-1)。
    • keywords:提取出的关键词,用JSON数组存储,如 [“价格”, “保修期”, “什么时候发货”]
    • analysis_time:分析时间。

这个结构的好处是清晰、易于扩展。未来如果想增加“情感分析”字段,直接在 intention_analysis 表里加列就行。

数据存储结构示意图

3.2 第二步:实现购买意向分析流程

分析流程在后台异步进行,核心是 “关键词提取” + “意图分类” 两步。

  1. 触发分析:当一场对话结束后(例如,用户2分钟无新消息),系统自动触发分析任务。
  2. 数据准备:从 dialog_message 表中取出该 session_id 下的所有消息,按时间排序,拼接成完整的对话文本。为了提升分析效果,我通常会过滤掉客服的固定问候语(如“您好,请问有什么可以帮您?”)。
  3. 调用Coze API进行分析:这里的关键是设计好给Coze的“提示词”(Prompt),引导它按照我们的业务需求输出结构化结果。
  4. 解析与存储:将Coze API返回的JSON结果解析,并存入 intention_analysis 表。
3.3 第三步:使用Python调用Coze API(附代码示例)

这里是整个流程的技术核心。我写了一个 CozeAnalyzer 类,封装了主要的操作。

首先,确保安装了必要的库:requests, tenacity (用于重试)。

import json
import time
from typing import Dict, List, Optional, Tuple
import requests
from tenacity import retry, stop_after_attempt, wait_exponential

class CozeAnalyzer:
    """Coze对话分析器,封装API调用与错误处理"""

    def __init__(self, api_key: str, base_url: str = "https://api.coze.cn/v1"):
        """
        初始化分析器
        Args:
            api_key: Coze平台的API密钥
            base_url: Coze API基础地址
        """
        self.api_key = api_key
        self.base_url = base_url
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }

    @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
    def analyze_conversation(self, dialog_text: str, session_id: str) -> Optional[Dict]:
        """
        调用Coze API分析对话意向
        Args:
            dialog_text: 拼接好的完整对话文本
            session_id: 当前对话的会话ID,用于日志追踪
        Returns:
            解析后的分析结果字典,调用失败则返回None
        """
        # 构造请求数据,重点在于设计一个清晰的prompt
        prompt = f"""
        你是一个专业的电商客服对话分析助手。请分析以下用户与客服的对话内容,并按要求输出JSON格式的结果。

        对话内容:
        {dialog_text}

        请分析:
        1. **客户购买意向**:判断客户意向属于以下哪一类,并给出置信度(0-1之间的小数)。
           - “高意向购买”:明确询问价格、优惠、库存、付款方式、发货时间等。
           - “一般咨询”:了解产品功能、规格、使用方法,但未提及购买细节。
           - “竞品对比”:将本品与其他品牌产品进行比较。
           - “投诉建议”:表达不满或提出改进意见。
           - “其他”:不属于以上任何一类。
        2. **提取关键词**:从对话中提取3-5个最能反映客户关注点的关键词或短语。

        请严格按以下JSON格式输出,不要有任何额外解释:
        {{
            "intention_type": "判断的意向类别",
            "confidence": 0.95,
            "keywords": ["关键词1", "关键词2", "关键词3"]
        }}
        """

        data = {
            "model": "coze-model",  # 根据Coze平台实际模型名填写
            "messages": [{"role": "user", "content": prompt}],
            "session_id": session_id,  # 传入session_id有助于Coze维护上下文(如需)
            "temperature": 0.1,  # 低温度使输出更稳定、确定性更高
            "max_tokens": 500
        }

        try:
            response = requests.post(
                f"{self.base_url}/chat/completions",  # 此处为示例端点,请以Coze官方文档为准
                headers=self.headers,
                data=json.dumps(data),
                timeout=30  # 设置超时时间
            )
            response.raise_for_status()  # 如果状态码不是200,抛出HTTPError异常
            result = response.json()

            # 解析Coze返回的回复内容,并提取JSON部分
            # 注意:实际API返回结构需根据Coze文档调整
            content = result["choices"][0]["message"]["content"].strip()
            # 有时模型回复会包含markdown代码块,需要清理
            if content.startswith("```json"):
                content = content[7:-3]  # 去除 ```json 和结尾的 ```
            elif content.startswith("```"):
                content = content[3:-3]

            analysis_result = json.loads(content)
            return analysis_result

        except requests.exceptions.RequestException as e:
            print(f"[Error] API请求失败 (Session: {session_id}): {e}")
            # 这里可以加入更详细的日志记录,如请求参数、失败原因等
            return None
        except (KeyError, json.JSONDecodeError) as e:
            print(f"[Error] 解析API响应失败 (Session: {session_id}): {e}. 原始响应: {result.get('content', 'Empty')}")
            return None

    def save_to_database(self, session_id: str, analysis_result: Dict):
        """
        将分析结果保存至数据库(示例函数,需根据实际ORM框架实现)
        Args:
            session_id: 会话ID
            analysis_result: 分析结果字典
        """
        # 这里使用伪代码示意,实际项目中应替换为SQLAlchemy、Django ORM等操作
        print(f"[Info] 正在保存分析结果,会话ID: {session_id}")
        print(f"      意向类型: {analysis_result['intention_type']}")
        print(f"      置信度: {analysis_result['confidence']}")
        print(f"      关键词: {analysis_result['keywords']}")
        # TODO: 执行INSERT操作到 `intention_analysis` 表
        # db.execute("INSERT INTO intention_analysis ... VALUES (...)", ...)

# 使用示例
if __name__ == "__main__":
    # 1. 初始化分析器 (API Key需从Coze平台获取)
    analyzer = CozeAnalyzer(api_key="your_coze_api_key_here")

    # 2. 模拟从数据库获取的对话文本
    sample_dialog = """
    用户:你们这款智能音箱多少钱?
    客服:当前活动价是299元。
    用户:和XX品牌的哪款比,音质怎么样?
    客服:我们的产品在中频人声表现上更出色,这是专业评测报告链接。
    用户:有优惠券吗?今天下单什么时候能发货?
    """

    # 3. 调用分析函数
    result = analyzer.analyze_conversation(sample_dialog, session_id="test_session_123")

    # 4. 如果分析成功,保存结果
    if result:
        analyzer.save_to_database("test_session_123", result)
        print("分析完成并已保存。")
    else:
        print("分析失败。")

这段代码有几个关键点:

  • 错误处理与重试:使用 tenacity 库为API调用添加了指数退避的重试机制,网络波动或服务短暂不可用时能自动重试,提高鲁棒性。
  • 清晰的Prompt工程:Prompt中明确规定了分析维度、分类体系和输出格式,这是获得稳定、结构化结果的关键。
  • 结果解析:处理了模型回复可能包含JSON代码块的情况,确保能正确解析。
  • 超时设置:避免因网络问题导致程序长时间挂起。

4. 生产环境考量:让系统更健壮

开发环境跑通只是第一步,要上线还得考虑更多。

  • 性能优化

    • 异步处理:对话结束触发分析后,应立即将分析任务丢入消息队列(如RabbitMQ、Redis Streams),由后台Worker异步消费和处理。避免阻塞主客服线程。
    • 批量操作:如果需要对历史对话进行批量分析,可以将多个对话文本组合成一个批次请求Coze API(如果API支持),或者使用协程(如asyncio)并发发送多个请求,显著提升效率。
    • 缓存:对常见、标准的客服问答(如“退货政策是什么?”),其分析结果(意向为“一般咨询”,关键词[“退货”,“政策”])可以缓存起来,下次遇到相同或高度相似的问题直接返回缓存结果,减少不必要的API调用。
  • 数据隐私保护

    • 数据传输加密:确保所有Coze API调用都通过HTTPS进行。
    • 数据脱敏:在将对话文本发送给Coze前,可以对手机号、身份证号、具体地址等个人敏感信息进行替换或删除(如用[PHONE]代替)。
    • API密钥管理:绝不能将API密钥硬编码在代码中。应该使用环境变量或专业的密钥管理服务(如AWS Secrets Manager, HashiCorp Vault)来存储和读取。

5. 避坑指南:我遇到的那些“坑”

  1. 对话上下文丢失,分析不准

    • 问题:用户可能分多次提问,如果只截取最后几句分析,会丢失关键信息。
    • 解决:确保传递给Coze的 dialog_text 是完整的、按时间顺序拼接的本次会话全部内容。Coze的API通常有Token长度限制,对于超长对话,可以尝试两种策略:一是只保留最近N轮对话(保证核心上下文);二是先对长对话进行文本摘要,再分析摘要内容。
  2. 意图识别准确率不高

    • 问题:初期可能发现“高意向购买”和“一般咨询”容易混淆。
    • 解决优化Prompt是首要任务。提供更详细的分类定义和例子。例如,在Prompt中明确:“仅当对话中出现‘下单’、‘付款’、‘优惠券’、‘今天发货’等具体行动词汇时,才归类为‘高意向购买’”。其次,可以人工标注一批数据,在Coze平台内使用“工作流”或“插件”功能,利用这些数据对模型进行微调(Fine-tuning),让模型更适应你的业务场景。
  3. API调用超时或限流

    • 问题:高峰期调用API可能失败。
    • 解决:除了代码中的重试机制,还要在业务层面做好降级策略。例如,当分析服务连续失败时,可以先将对话标记为“待分析”,存入一个待处理队列,稍后重试,同时通知客服人员人工标记意向,不影响主流程。
  4. 关键词提取不理想

    • 问题:提取的关键词过于通用(如“产品”、“好吗”),没有业务价值。
    • 解决:在Prompt中引导模型关注业务实体。例如:“请提取与产品属性(如颜色、内存、尺寸)、购买因素(价格、优惠、物流)、竞品名称相关的关键词。” 也可以在后处理中,用一个自定义的业务关键词词典对结果进行筛选和增强。

6. 总结与延伸思考

通过以上步骤,我们就能搭建一个具备基础对话记录和购买意向分析能力的智能客服系统了。它不仅能自动给对话“打标签”,还能沉淀下结构化的分析数据,为后续的销售漏斗分析、客服质量评估、产品优化提供数据支持。

最后,留几个可以继续深入的方向给大家思考:

  1. 如何扩展多语言支持?如果我们的客户有海外业务,Coze平台是否支持多语言模型?在Prompt中是否需要指定语言?存储和分析结果时,是否要增加语言字段?
  2. 如何实现实时分析?现在的方案是对话结束后分析。能否在对话进行中,就实时分析当前用户的情绪和意向,并实时提示客服人员?这对系统的实时性和性能有什么新挑战?
  3. 如何与业务系统深度集成?分析出的“高意向购买”客户,能否自动创建一个CRM跟进任务?或者当识别出“投诉建议”时,自动触发一条预警消息给客服主管?

技术的价值在于解决实际问题。希望这篇笔记能为你提供一个清晰的起点,让你能快速上手Coze,构建出适合自己业务的智能客服模块。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐