上一篇 下一篇 分享链接 返回 返回顶部

Coze 落地企业智能客服:从知识库到工单流转的完整实战源码方案

发布人:慈云数据-客服中心 发布时间:21小时前 阅读量:4

Coze 企业级实战方案|附源码

在企业数字化转型持续深入的背景下,越来越多团队开始尝试使用 AI Agent 来替代传统的人工客服、知识库检索、流程咨询、数据问答以及内部自动化助理。相比单纯调用大模型接口,Coze 提供了更完整的智能体构建能力,包括工作流、插件、知识库、变量、数据库、触发器、多渠道发布等能力,非常适合企业快速搭建可落地的 AI 应用。

本文将围绕一个真实企业级场景,介绍如何使用 Coze 构建一套“企业智能知识助手 + 工单流转 + 外部系统集成”的实战方案,并提供核心源码示例,帮助你快速理解 Coze 在企业项目中的落地方式。


一、项目背景

假设一家中大型企业已经拥有如下系统:

  • 企业官网;
  • 内部知识库;
  • CRM 客户管理系统;
  • 工单系统;
  • 企业微信或飞书办公平台;
  • 人工客服团队。

目前存在的问题包括:

  1. 客户重复咨询较多,例如产品价格、售后流程、服务时间、技术文档等;
  2. 内部员工查询制度、流程、系统操作说明效率低;
  3. 客服人员需要频繁切换 CRM、知识库、工单系统;
  4. 简单问题占用大量人工客服时间;
  5. 缺少统一的智能问答入口;
  6. 工单创建、分类、流转仍然依赖人工判断。

因此,我们希望基于 Coze 搭建一个企业级智能助手,实现以下目标:

  • 自动回答客户和员工的常见问题;
  • 支持基于企业知识库的精准问答;
  • 对复杂问题自动创建工单;
  • 支持查询 CRM 客户信息;
  • 支持将对话结果推送到企业微信或飞书;
  • 支持多渠道接入,例如网页、企业微信、API;
  • 保留人工兜底能力;
  • 降低人工客服压力,提高响应效率。

二、整体架构设计

企业级 Coze 应用不能只看成一个简单聊天机器人,而应该设计成一个完整的智能应用系统。

整体架构如下:

用户入口
├── 官网 H5 聊天窗口
├── 企业微信 / 飞书
├── 客服系统
└── 第三方业务系统

        ↓

Coze 智能体
├── Prompt 角色设定
├── 企业知识库
├── 工作流 Workflow
├── 插件 Plugin
├── 变量与上下文
├── 数据库
└── 人工转接策略

        ↓

企业后端服务
├── CRM 系统
├── 工单系统
├── 用户系统
├── 消息通知服务
├── 日志分析服务
└── 权限鉴权服务

        ↓

运维与安全体系
├── API 网关
├── Token 鉴权
├── 日志审计
├── 敏感信息脱敏
├── 数据权限控制
└── 监控告警

在这个架构中,Coze 主要承担智能理解、知识问答、流程编排和多渠道交互的角色;企业后端服务负责真实业务数据处理、权限控制和系统集成。


三、核心功能规划

本方案主要实现以下几个核心功能。

1. 企业知识库问答

将企业文档、产品手册、售后说明、FAQ、内部制度等资料上传至 Coze 知识库,用户提问时优先从知识库检索相关内容,然后结合大模型生成自然语言回复。

适用场景包括:

  • 产品说明查询;
  • 售后政策咨询;
  • 内部流程问答;
  • 合同模板说明;
  • 技术文档检索;
  • 员工入职指南。

2. 客户信息查询

当用户输入手机号、客户编号或订单号时,智能体可以调用企业后端接口查询 CRM 数据,并返回客户基本信息、服务状态、订单信息等。

例如:

用户:帮我查一下客户 C10086 的服务状态。
AI:该客户当前为企业版客户,服务状态正常,合同有效期至 2026 年 3 月 31 日。

3. 自动创建工单

当问题无法直接解决,或用户明确要求人工跟进时,Coze 可以通过工作流调用后端接口创建工单。

工单信息包括:

  • 用户姓名;
  • 联系方式;
  • 问题描述;
  • 问题分类;
  • 优先级;
  • 来源渠道;
  • 对话摘要。

4. 人工客服兜底

对于以下情况,需要自动触发人工转接:

  • 用户情绪强烈;
  • 涉及投诉、退款、合同争议;
  • 多轮对话仍无法解决;
  • 知识库没有命中有效内容;
  • 用户主动要求人工服务。

5. 多渠道接入

Coze 支持将 Bot 发布至多个渠道,同时也可通过 API 与企业自有系统集成。企业可以根据实际情况选择:

  • Coze Web SDK;
  • API 调用;
  • 企业微信机器人;
  • 飞书机器人;
  • 官网客服入口;
  • 内部管理后台。

四、Coze 智能体设计

1. 角色设定 Prompt

企业级智能体的 Prompt 不应该写得过于宽泛,而应该具备明确的身份、服务范围、回答边界和安全约束。

示例:

你是某某科技公司的企业智能服务助手,负责为客户和内部员工提供产品咨询、售后流程、工单创建、客户信息查询以及企业知识库问答服务。

你的回答要求:
1. 优先基于企业知识库和工具调用结果回答;
2. 不编造不存在的政策、价格、合同条款和技术参数;
3. 如果知识库没有明确答案,应说明“暂未查询到相关信息”,并建议创建工单或转人工;
4. 对涉及客户隐私、合同金额、账号密码等敏感信息的问题,必须先进行权限判断;
5. 回答应简洁、专业、友好;
6. 对投诉、退款、法务争议类问题,应引导创建工单并转人工处理;
7. 不输出内部系统密钥、接口地址、数据库字段等敏感信息。

这个 Prompt 的重点是限制智能体的能力边界,避免模型“自由发挥”。在企业场景中,准确性往往比创造性更重要。


五、知识库建设方案

知识库质量直接决定智能助手的实际效果。企业在导入知识库时,建议遵循以下原则。

1. 文档结构清晰

不要直接上传大量未经整理的 Word、PDF 或网页内容。建议先将文档拆分为结构化内容,例如:

# 售后服务政策

## 服务时间

工作日 9:00-18:00 提供在线客服支持。

## 响应时效

标准版客户:24 小时内响应。
专业版客户:8 小时内响应。
企业版客户:2 小时内响应。

## 不支持范围

以下情况不在免费售后范围:
1. 非官方渠道购买的产品;
2. 用户自行修改系统源码导致的问题;
3. 第三方插件兼容性问题。

2. 控制知识片段粒度

知识片段过长会影响召回准确率,过短又容易丢失上下文。一般建议每个片段保持在 300-800 字之间。

3. 设置关键词

对常见问题添加关键词可以提高命中率,例如:

售后、服务时间、响应时效、企业版、标准版、技术支持

4. 定期维护

知识库不是一次性工作。企业应建立更新机制:

  • 产品版本更新后同步知识库;
  • 政策变化后重新上传;
  • 根据用户高频问题补充 FAQ;
  • 定期分析未命中问题;
  • 删除过期文档。

六、工作流设计

Coze 工作流适合承载复杂业务逻辑。下面设计一个典型的企业客服工作流。

工作流名称

customer_service_workflow

工作流输入

{
  "user_id": "用户ID",
  "question": "用户问题",
  "channel": "来源渠道",
  "contact": "联系方式"
}

工作流处理逻辑

开始
 ↓
识别问题类型
 ├── 知识库问答
 ├── CRM 查询
 ├── 工单创建
 ├── 投诉退款
 └── 其他问题
 ↓
根据类型执行不同节点
 ↓
返回结果

问题分类规则

可以让大模型先对问题进行分类:

请判断用户问题属于以下哪一类:
1. knowledge:普通知识库问答;
2. crm_query:客户信息或订单查询;
3. ticket_create:需要创建工单;
4. complaint:投诉、退款、争议;
5. unknown:无法判断。

只返回分类标识,不要返回解释。

七、插件接口设计

企业系统通常不会直接暴露给 Coze,而是通过一个中间层服务进行封装。这样可以统一鉴权、日志、限流和数据脱敏。

下面给出一个基于 Node.js + Express 的插件服务示例。

1. 项目结构

coze-enterprise-demo
├── package.json
├── server.js
├── routes
│   ├── crm.js
│   ├── ticket.js
│   └── notify.js
├── services
│   ├── crmService.js
│   ├── ticketService.js
│   └── notifyService.js
└── middleware
    └── auth.js

八、源码示例

1. package.json

{
  "name": "coze-enterprise-demo",
  "version": "1.0.0",
  "description": "Coze 企业级智能助手后端插件示例",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },
  "dependencies": {
    "axios": "^1.6.8",
    "cors": "^2.8.5",
    "dotenv": "^16.4.5",
    "express": "^4.18.3",
    "helmet": "^7.1.0",
    "morgan": "^1.10.0"
  },
  "devDependencies": {
    "nodemon": "^3.1.0"
  }
}

2. server.js

require("dotenv").config();

const express = require("express");
const cors = require("cors");
const helmet = require("helmet");
const morgan = require("morgan");

const crmRoutes = require("./routes/crm");
const ticketRoutes = require("./routes/ticket");
const notifyRoutes = require("./routes/notify");

const app = express();

app.use(helmet());
app.use(cors());
app.use(express.json({ limit: "1mb" }));
app.use(morgan("combined"));

app.get("/health", (req, res) => {
  res.json({
    status: "ok",
    service: "coze-enterprise-plugin",
    timestamp: new Date().toISOString()
  });
});

app.use("/api/crm", crmRoutes);
app.use("/api/ticket", ticketRoutes);
app.use("/api/notify", notifyRoutes);

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`Coze enterprise plugin server running on port ${PORT}`);
});

3. middleware/auth.js

module.exports = function auth(req, res, next) {
  const token = req.headers["x-api-token"];

  if (!token) {
    return res.status(401).json({
      success: false,
      message: "Missing x-api-token"
    });
  }

  if (token !== process.env.API_TOKEN) {
    return res.status(403).json({
      success: false,
      message: "Invalid token"
    });
  }

  next();
};

4. routes/crm.js

const express = require("express");
const router = express.Router();
const auth = require("../middleware/auth");
const crmService = require("../services/crmService");

router.post("/customer", auth, async (req, res) => {
  try {
    const { customerId, phone } = req.body;

    if (!customerId && !phone) {
      return res.status(400).json({
        success: false,
        message: "customerId or phone is required"
      });
    }

    const customer = await crmService.getCustomer({ customerId, phone });

    res.json({
      success: true,
      data: customer
    });
  } catch (error) {
    console.error("CRM query error:", error);
    res.status(500).json({
      success: false,
      message: "CRM query failed"
    });
  }
});

module.exports = router;

5. services/crmService.js

const axios = require("axios");

async function getCustomer({ customerId, phone }) {
  /**
   * 实际项目中,这里应该调用企业 CRM 系统。
   * 为了演示,下面返回模拟数据。
   */

  if (customerId === "C10086" || phone === "13800000000") {
    return {
      customerId: "C10086",
      name: "北京示例科技有限公司",
      level: "企业版客户",
      serviceStatus: "正常",
      contractExpireDate: "2026-03-31",
      owner: "客户成功部-张经理"
    };
  }

  return {
    customerId: customerId || null,
    name: null,
    level: null,
    serviceStatus: "未查询到客户信息",
    contractExpireDate: null,
    owner: null
  };
}

module.exports = {
  getCustomer
};

6. routes/ticket.js

const express = require("express");
const router = express.Router();
const auth = require("../middleware/auth");
const ticketService = require("../services/ticketService");

router.post("/create", auth, async (req, res) => {
  try {
    const {
      userId,
      userName,
      contact,
      title,
      description,
      category,
      priority,
      channel
    } = req.body;

    if (!contact || !description) {
      return res.status(400).json({
        success: false,
        message: "contact and description are required"
      });
    }

    const ticket = await ticketService.createTicket({
      userId,
      userName,
      contact,
      title,
      description,
      category,
      priority,
      channel
    });

    res.json({
      success: true,
      data: ticket
    });
  } catch (error) {
    console.error("Create ticket error:", error);
    res.status(500).json({
      success: false,
      message: "Create ticket failed"
    });
  }
});

module.exports = router;

7. services/ticketService.js

function generateTicketNo() {
  const date = new Date();
  const ymd = date.toISOString().slice(0, 10).replace(/-/g, "");
  const random = Math.floor(Math.random() * 9000 + 1000);
  return `TK${ymd}${random}`;
}

async function createTicket(payload) {
  /**
   * 实际项目中,这里应该写入企业工单系统数据库,
   * 或调用第三方工单系统 API。
   */

  const ticketNo = generateTicketNo();

  return {
    ticketNo,
    status: "created",
    priority: payload.priority || "normal",
    category: payload.category || "general",
    title: payload.title || "用户咨询工单",
    description: payload.description,
    contact: payload.contact,
    channel: payload.channel || "coze",
    createdAt: new Date().toISOString()
  };
}

module.exports = {
  createTicket
};

8. routes/notify.js

const express = require("express");
const router = express.Router();
const auth = require("../middleware/auth");
const notifyService = require("../services/notifyService");

router.post("/wechat", auth, async (req, res) => {
  try {
    const { title, content, receiver } = req.body;

    if (!content) {
      return res.status(400).json({
        success: false,
        message: "content is required"
      });
    }

    const result = await notifyService.sendWechatMessage({
      title,
      content,
      receiver
    });

    res.json({
      success: true,
      data: result
    });
  } catch (error) {
    console.error("Notify error:", error);
    res.status(500).json({
      success: false,
      message: "Notify failed"
    });
  }
});

module.exports = router;

9. services/notifyService.js

const axios = require("axios");

async function sendWechatMessage({ title, content, receiver }) {
  /**
   * 实际项目中可以调用企业微信机器人 Webhook。
   * 这里给出示例结构。
   */

  const webhook = process.env.WECHAT_WEBHOOK;

  if (!webhook) {
    return {
      sent: false,
      message: "WECHAT_WEBHOOK not configured"
    };
  }

  const payload = {
    msgtype: "markdown",
    markdown: {
      content: `## ${title || "Coze 工单通知"}\n\n${content}\n\n接收人:${receiver || "未指定"}`
    }
  };

  await axios.post(webhook, payload);

  return {
    sent: true,
    channel: "wechat",
    sentAt: new Date().toISOString()
  };
}

module.exports = {
  sendWechatMessage
};

10. .env 示例

PORT=3000
API_TOKEN=your-secure-token
WECHAT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx

九、Coze 插件配置说明

在 Coze 中配置插件时,可以将上述接口注册为工具。

例如 CRM 查询接口:

name: query_customer
description: 根据客户编号或手机号查询客户信息
method: POST
url: https://your-domain.com/api/crm/customer
headers:
  x-api-token: your-secure-token
request_body:
  customerId: string
  phone: string
response:
  success: boolean
  data: object

工单创建接口:

name: create_ticket
description: 为用户创建售后、咨询、投诉或技术支持工单
method: POST
url: https://your-domain.com/api/ticket/create
headers:
  x-api-token: your-secure-token
request_body:
  userId: string
  userName: string
  contact: string
  title: string
  description: string
  category: string
  priority: string
  channel: string
response:
  success: boolean
  data: object

企业微信通知接口:

name: send_wechat_notify
description: 将重要工单或咨询信息推送到企业微信群
method: POST
url: https://your-domain.com/api/notify/wechat
headers:
  x-api-token: your-secure-token
request_body:
  title: string
  content: string
  receiver: string
response:
  success: boolean
  data: object

十、典型对话流程

场景一:知识库问答

用户:企业版客户售后响应时间是多久?

AI:
根据售后服务政策,企业版客户的售后响应时间为 2 小时内。
如果你需要提交具体问题,我也可以帮你创建售后工单。

场景二:CRM 查询

用户:帮我查询客户 C10086 的服务状态。

AI 调用 query_customer 工具。

AI:
查询结果如下:
客户名称:北京示例科技有限公司
客户等级:企业版客户
服务状态:正常
合同到期时间:2026-03-31
客户负责人:客户成功部-张经理

场景三:自动创建工单

用户:我们系统今天一直登录失败,需要技术人员处理,联系电话 13800000000。

AI 调用 create_ticket 工具。

AI:
已为你创建技术支持工单。

工单编号:TK202603011026
状态:已创建
优先级:普通
我们会尽快安排技术人员与你联系。

场景四:投诉转人工

用户:我要投诉,你们服务响应太慢了。

AI:
非常抱歉给你带来不好的体验。此类问题需要人工客服进一步核实和处理。
请提供你的联系方式、公司名称以及具体问题描述,我可以立即帮你创建投诉工单并通知客服负责人。

十一、企业级安全设计

企业使用 Coze 时,安全是必须重点考虑的部分。

1. 接口鉴权

所有插件接口必须增加鉴权,例如:

  • API Token;
  • OAuth2;
  • 签名认证;
  • IP 白名单;
  • 企业网关统一认证。

不要将内部系统接口直接暴露给 Coze 或公网。

2. 数据脱敏

返回给 AI 的数据应经过脱敏处理。例如:

手机号:138****0000
身份证号:110101********1234
邮箱:u***@example.com

敏感字段不应返回给大模型,包括:

  • 密码;
  • Token;
  • 合同原文;
  • 银行账户;
  • 身份证完整号码;
  • 内部系统权限字段。

3. 权限控制

不同用户可以查询的数据范围不同。例如:

  • 客户只能查自己的订单;
  • 销售只能查自己负责的客户;
  • 管理者可以查团队数据;
  • 普通员工不能查询合同金额。

权限判断应放在企业后端服务中,而不是完全依赖 Prompt。

4. 日志审计

建议记录以下信息:

  • 用户 ID;
  • 会话 ID;
  • 问题内容;
  • 工具调用记录;
  • 接口返回结果;
  • 创建工单结果;
  • 异常信息;
  • 操作时间。

日志可用于排查问题、优化知识库和进行安全审计。


十二、部署方案

企业部署插件服务时,建议采用如下方式:

Nginx / API Gateway
        ↓
Node.js Plugin Service
        ↓
企业内部系统

推荐部署环境:

  • Docker;
  • Kubernetes;
  • 云服务器;
  • Serverless;
  • 企业内网网关。

Dockerfile 示例

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install --production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

docker-compose.yml 示例

version: "3.9"

services:
  coze-plugin:
    build: .
    container_name: coze-enterprise-plugin
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - API_TOKEN=your-secure-token
      - WECHAT_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx
    restart: always

启动命令:

docker compose up -d

十三、效果评估指标

企业级 AI 应用上线后,不能只看“能不能聊天”,还要持续评估业务价值。

建议关注以下指标:

指标 说明
问题自动解决率 AI 独立解决的问题占比
人工转接率 需要转人工的问题比例
知识库命中率 用户问题被知识库正确召回的比例
平均响应时间 用户从提问到得到回复的时间
工单创建准确率 AI 创建工单分类和描述是否准确
用户满意度 用户对 AI 服务的评价
未解决问题数 AI 无法回答或回答错误的问题
接口调用成功率 插件服务稳定性指标

通过这些指标,可以持续优化 Prompt、知识库、工作流和后端接口。


十四、常见问题与优化建议

1. AI 回答不准确怎么办?

优先检查知识库内容是否完整、结构是否清晰、文档是否过期。其次优化 Prompt,让 AI 明确“不知道就不要编造”。

2. 工具调用不稳定怎么办?

需要检查插件接口是否稳定、网络是否超时、参数定义是否清晰。建议给接口增加错误重试、日志记录和超时控制。

3. 用户问题太口语化怎么办?

可以在工作流前置一个“问题改写节点”,将用户口语化表达转换为标准查询语句,再进入知识库检索。

4. 如何降低大模型幻觉?

核心方法包括:

  • 强制基于知识库回答;
  • 工具返回结果优先;
  • 未命中时明确说明;
  • 限制回答范围;
  • 增加人工兜底;
  • 定期回放错误案例。

5. 如何适配多个业务部门?

建议按部门拆分知识库和工作流,例如:

  • 售前咨询助手;
  • 售后服务助手;
  • HR 助手;
  • 财务流程助手;
  • IT 运维助手。

不同部门使用不同 Bot 或不同入口,避免一个智能体承担过多任务。


十五、总结

Coze 的优势不只是快速创建聊天机器人,更在于它能够通过知识库、工作流、插件和多渠道发布能力,帮助企业快速构建真正可落地的 AI Agent 应用。

在企业级实践中,推荐采用以下思路:

  1. 先从高频、低风险、规则清晰的场景开始;
  2. 使用知识库解决标准化问答;
  3. 使用插件连接 CRM、工单、通知等业务系统;
  4. 使用工作流控制复杂业务流程;
  5. 使用后端服务完成权限、安全、日志和数据脱敏;
  6. 保留人工兜底机制;
  7. 持续通过数据指标优化系统效果。

本文提供的源码可以作为企业 Coze 插件服务的基础模板。你可以在此基础上继续扩展订单查询、合同查询、审批流、数据报表、内部系统操作等能力。对于企业而言,真正有价值的 AI 应用并不是“会聊天”,而是能够安全、稳定、准确地参与业务流程,帮助组织提升效率、降低成本,并形成可持续迭代的智能化能力。

目录结构
全文