AI 驱动业务重塑:基于 RAG 的智能工单质检与自动分流系统的架构实践

一、人工客服工单处理的现实挑战

客诉客服系统在很多行业里都是维系客户关系的关键环节。但当日均工单量超过一万件时,纯人工的分发与质检流程就开始显现出不足。工单的初步划分和定级主要靠客服人员在后台主观判断,流转错分、漏分类的情况时有发生,导致高优先级的重要问题容易被普通工单淹没。

质检主管面对海量历史回复进行合规审查时,通常只能抽样检查,难以实现全面覆盖。一些不合规的回复(比如客服做出违反公司政策的赔偿承诺)可能引发后续纠纷。结合检索增强生成(RAG)与大语言模型(LLM)能力,在工单入口实现自动清洗、精准分类,并对自动回复草稿进行边界拦截,是解决这些问题的有效途径。


二、基于知识库 RAG 与大模型判定的智能工单质检架构

系统需要将用户提交的工单与企业历史 FAQ 数据库进行相似度匹配,提取最相关的条款作为约束条件,引导大模型做出判定。

以下是智能工单自动清洗、质检与分流流向架构设计图:

graph TD
    A[用户提交客诉工单] --> B[本地文本脱敏与清洗]
    B --> C[FAQ 规则库 RAG 检索]
    C -->|匹配度高| D[拼装包含标准参考的 Prompt]
    C -->|无匹配| E[直接归入人工专家处理队列]
    
    D --> F[调用 LLM 分类并生成初稿]
    F --> G{安全敏感词与红线校验}
    G -->|通过| H[自动流转对应业务线结案]
    G -->|未通过| E

    style E fill:#faa,stroke:#333,stroke-width:2px
    style H fill:#afa,stroke:#333,stroke-width:2px

架构的核心思路是:用本地检索快速拦截,将高风险和不确定的场景转交人工处理


三、工单内容清洗、匹配检索与 Prompt 动态注入引擎实现

系统需要一个工单前置处理和 RAG 规则检索的核心管理器,负责过滤危险字符、计算关键词覆盖率,并生成安全的提示词结构。

以下是使用 JavaScript (Node.js) 实现的智能工单质检处理器源码:

class SupportTicketRAGEngine {
    constructor(faqDatabase) {
        this.faqDatabase = faqDatabase; // FAQ 知识库,包含 { category, keywords, replyTemplate }
    }

    /**
     * 清洗工单内容,移除潜在的 SQL 注入和 HTML 注入字符
     * @param {string} rawText 
     */
    cleanTicketText(rawText) {
        if (typeof rawText !== 'string') return "";
        return rawText
            .trim()
            .replace(/<\/?[^>]+(>|$)/g, "") // 移除 HTML 标签
            .replace(/[\\'`"]/g, "")         // 移除敏感引号
            .toLowerCase();
    }

    /**
     * 本地分词匹配检索,计算置信度
     * @param {string} cleanText 
     */
    retrieveBestMatch(cleanText) {
        let bestMatch = null;
        let highestScore = 0;

        for (const item of this.faqDatabase) {
            let score = 0;
            item.keywords.forEach(keyword => {
                if (cleanText.includes(keyword)) {
                    score += 1;
                }
            });

            if (score > highestScore) {
                highestScore = score;
                bestMatch = item;
            }
        }

        // 匹配置信度:匹配中 2 个以上关键词认为合格
        const confidence = highestScore >= 2 ? (highestScore / 4.0) : 0.0;
        return { match: bestMatch, score: confidence };
    }

    /**
     * 动态拼装用于大模型分类与回复的 Prompt
     * @param {string} rawTicket 
     */
    async processAndRoute(rawTicket) {
        console.log("=== 启动 AI 工单质检与分流流程 ===");
        const cleanText = this.cleanTicketText(rawTicket);
        console.log(`[步骤 1: 文本规范化清洗]: "${cleanText}"`);

        const { match, score } = this.retrieveBestMatch(cleanText);
        console.log(`[步骤 2: RAG 规则对齐完成] 置信度评分: ${score.toFixed(2)}`);

        let targetAction = "DISPATCH_TO_HUMAN"; // 默认安全策略:流转人工
        let generatedPrompt = "";

        if (match && score >= 0.5) {
            targetAction = "PROPOSE_AUTO_REPLY";
            generatedPrompt = `
[角色指引]: 你是专业的客户服务助理大模型。请根据提供的知识库标准参考解答用户的疑问,严禁自由发挥或捏造未经核实的事实。

标准参考知识:
"${match.replyTemplate}"

用户所提工单问题:
"${rawTicket.trim()}"

高置信度回复草稿:`;
        } else {
            console.log("⚠️ 匹配置信度不足。工单已自动挂载至人工审核收件箱。");
            generatedPrompt = `工单内容: "${rawTicket.trim()}",请求分发至人工处理队列。`;
        }

        return {
            action: targetAction,
            targetQueue: match ? match.category : "GENERAL_INBOX",
            finalPrompt: generatedPrompt.trim()
        };
    }
}

// 快速启动模拟
(async () => {
    // 模拟本地存储的标准 RAG 知识库 FAQ
    const faqBase = [
        {
            category: "ACCOUNT_HELP",
            keywords: ["密码", "忘记", "重置", "登录"],
            replyTemplate: "请访问用户中心页面,点击「忘记密码」,使用您注册绑定的手机验证码自主重置密码。"
        },
        {
            category: "REFUND_HELP",
            keywords: ["退款", "退货", "地址", "拦截"],
            replyTemplate: "若订单仍处于「待发货」状态,您可以点击申请退款,系统将自动极速放款。若已发货,请拒签物流件。"
        }
    ];

    const engine = new SupportTicketRAGEngine(faqBase);

    // 测试 1:高置信度匹配,自动构建 Prompt
    const ticketA = "  我的账号密码忘记了,无法登录了,怎么重置密码?  ";
    const resA = await engine.processAndRoute(ticketA);
    console.log(`\n[工单 A 路由指令]:`, resA.action);
    console.log(`[生成的 Prompt]:\n${resA.finalPrompt}\n`);

    // 测试 2:匹配置信度不足,无缝回源人审
    const ticketB = "你们的产品在 Linux 系统上如何安装部署?";
    const resB = await engine.processAndRoute(ticketB);
    console.log(`[工单 B 路由指令]:`, resB.action);
    console.log(`[处理动作]: ${resB.finalPrompt}`);
})();

四、自动化流转与人工安全兜底的边界权衡

在实际落地中,需要在自动化率和安全风险之间找到平衡:

  1. 自动回复比率与客诉风险的平衡:降低语义匹配置信度可以让自动结案率从 40% 提升到 70%,但这会增加大模型误读复杂客诉的风险。一旦在涉及"赔偿"、"退款金额"或"投诉法律诉讼"等关键词上给出违反政策的承诺,将引发公关和财务损失。这类工单在第一阶段必须直接进入人工队列。
  2. 轻量内存哈希与分布式向量数据库的选择:如果 FAQ 数据集在几百条以内,使用内存中的直接匹配或 pgvector 的极简索引,性能和成本都有优势。对于初创团队,初期没必要采购维护昂贵的 Pinecone 或 Milvus 分布式集群。
  3. 数据隐私合规与第三方 API 请求:将客户敏感工单(可能包含电话、订单号)传输给外部闭源 API 存在合规风险。若合规要求严格,应选用本地单机部署的 7B 等中轻量开源大模型,进行工单的提取分类与初步过滤,虽然牺牲了部分复杂推理能力,但保证了数据不出网。

五、总结

AI 在客服场景的落地价值,核心在于作为效率工具拦截并消化 80% 以上的基础同质化问题。通过引入轻量 RAG 本地检索作为前置防线,辅以高置信度 Prompt 大模型约束,能够让客服团队用较小的技术配置和服务器预算,获得业务处理效率的显著提升。


所做更改总结:

  • 删除了"维系客户关系的核心纽带"等宣传性表述,改为更中性的"维系客户关系的关键环节"
  • 将"作为追求极致效率和实用主义的技术实践者"简化为直接陈述
  • 删除了"无感流转"等可能不够自然的术语
  • 将"绝无必要"改为"没必要",避免绝对化表述
  • 将"指数级提升"改为"显著提升",避免过度宣传
  • 调整了部分句子结构,使节奏更自然
  • 删除了部分冗余的修饰词和填充短语
  • 将"核心不在于...而在于..."的否定式排比改为更直接的陈述

质量评分:

维度 得分
直接性 8/10
节奏 8/10
信任度 9/10
真实性 8/10
精炼度 8/10
总分 41/50
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐