一、项目概述

智能客服系统是一款基于 Python 语言、采用 Django 框架开发的企业级智能服务解决方案,深度集成自然语言处理(NLP)技术与知识库管理功能,致力于为企业提供智能化、高效率的客户服务体验。系统融合了智能问答、自动回复与人工客服协同机制,可广泛应用于企业客户服务、在线咨询、技术支持等场景,支持网站、App、微信等多渠道接入,并具备处理大规模并发访问的能力,有效提升客户服务效率与质量。

二、核心功能模块

(一)智能问答系统

系统基于自然语言处理技术构建智能对话引擎,支持上下文理解与多轮对话交互,能够精准捕捉用户意图并生成针对性回复。通过智能推荐算法,系统可根据用户问题关联相关常见问题与答案,提升服务效率。同时,具备自动学习机制,通过用户反馈不断优化回答质量,实现服务能力的持续进化。例如,在电商场景中,系统可自动识别用户关于订单查询、物流跟踪的问题,并快速返回准确信息,减少人工客服工作量。

(二)知识库管理

采用多级分类的知识库结构,支持知识条目的创建、编辑、发布与归档全生命周期管理。基于向量搜索技术实现相似内容匹配,当用户提问时,系统可快速检索知识库中语义相近的内容,提升答案匹配精度。此外,系统内置知识内容反馈与质量评估机制,通过用户对答案的评分与反馈,持续优化知识库内容的准确性与实用性。例如,企业可将产品说明书、常见问题解答等内容结构化存入知识库,实现标准化服务输出。

(三)客服工单系统

具备自动工单分配与多级审批流程,支持工单状态实时跟踪与处理时效监控,帮助企业规范服务流程。通过工单分类统计与处理效率分析,管理者可直观了解客服团队工作负荷与服务质量,为资源调配与流程优化提供数据支持。系统同时支持工单转人工与协同处理功能,当智能客服无法解决复杂问题时,可无缝转接至人工客服,确保服务连续性。例如,技术支持场景中,用户提交的复杂故障申报可通过工单系统自动分配给对应技术团队,实现闭环处理。

(四)数据分析功能

通过客户行为分析与服务质量评估,帮助企业深入了解用户需求与服务短板。热门问题与关键词分析可识别高频咨询内容,为知识库优化与业务决策提供依据。对话长度与满意度统计功能可量化服务效果,助力客服团队提升服务水平。系统提供可视化报表与数据导出功能,支持管理者通过图表直观查看服务数据,例如客户咨询高峰时段、常见问题分布等,为运营策略调整提供数据支撑。

(五)系统集成能力

支持与企业现有 CRM、ERP 等系统无缝集成,实现客户数据与业务流程的互通互联。通过开放 API 接口,便于第三方应用对接,提升系统扩展性。支持多渠道接入,用户可通过网站、移动端 App、微信公众号等不同终端获取服务,实现全渠道服务统一管理。可扩展的插件机制允许企业根据业务需求定制功能模块,例如集成特定行业的知识图谱或业务流程插件。

三、技术架构设计

(一)后端架构

  • Django REST Framework:提供标准化 RESTful API 接口,实现前后端数据交互与服务能力输出。
  • WebSocket:基于 WebSocket 协议实现实时聊天功能,确保客服与用户对话的低延迟交互。
  • 向量数据库:存储知识条目的向量嵌入,支持高效的语义搜索与相似内容匹配。
  • 异步处理:采用 asyncio 框架实现异步任务处理,提升系统并发性能,确保大规模访问下的服务稳定性。

(二)前端架构

  • Vue.js:构建响应式用户界面,实现客服工作台、知识库查询等功能模块的动态渲染。
  • WebSocket 客户端:与后端 WebSocket 服务对接,实现实时消息推送与对话同步。
  • ECharts:提供数据可视化能力,将服务统计数据转化为图表,便于管理者直观查看。
  • 响应式设计:采用弹性布局与适配技术,确保系统在 PC 端与移动端均具备良好的用户体验。

(三)智能对话处理流程

  1. 用户输入处理:对用户文本进行预处理(分词、去停用词等),通过意图识别模型判断问题类型。
  2. 知识库匹配:基于向量搜索技术,在知识库中检索与用户问题语义相似的内容。
  3. 回复生成:根据匹配结果与对话上下文,生成自然语言回复,若匹配度不足则触发人工转接机制。
  4. 学习优化:收集用户对回复的反馈,更新知识库与模型参数,持续提升回答准确率。

四、项目目录结构

(一)基础管理应用(hzadmin)

  • admin_views:管理员视图模块,包含系统配置、用户管理等功能页面。
  • client_views:客户端视图模块,包括 AI 助手、数据分析、认证与通知等功能接口。
  • utils:工具类模块,包含 AI 模型客户端(ollama_client.py)与语音识别客户端(asr_client.py)。
  • models.py:基础数据模型,定义用户、聊天会话等核心实体。
  • client_urls:客户端 URL 配置,映射前端请求到后端视图。

(二)知识库应用(knowledge)

  • views.py:知识库视图模块,处理知识条目增删改查等请求。
  • models.py:知识库数据模型,定义知识分类、知识条目等实体。
  • utils.py:知识库工具函数,包含向量搜索、知识匹配等核心算法。
  • urls.py:知识库 URL 配置,规范接口访问路径。

(三)前端应用(hzsystem_ui)

  • src/views:视图组件目录,包含聊天、首页、知识库等功能组件。
  • src/api:API 接口目录,封装 AI 服务、知识库查询、系统信息等接口。
  • src/utils:前端工具函数,提供数据处理、请求封装等辅助功能。

(四)项目配置(hzsystem_django)

  • bean:通用对象目录,存储可复用的数据结构。
  • config:系统配置目录,包含环境变量、服务参数等配置文件。
  • settings.py:项目全局设置,定义数据库连接、中间件等关键配置。

五、数据模型设计

(一)用户信息模型(UserInfo)

存储用户基本信息、联系方式、个人偏好设置及权限角色,支持多角色权限管理(管理员、客服人员、普通用户),确保系统操作的安全性与权限隔离。

(二)AI 聊天模型(AIChat)

记录聊天会话基本信息,包括用户关联、创建与更新时间、会话标题等,用于管理历史对话记录,支持会话回溯与状态跟踪。

(三)AI 聊天消息模型(AIChatMessage)

存储聊天内容、消息角色(用户 / 助手 / 系统)及创建时间,与聊天会话模型关联,构建完整的对话上下文,为多轮对话理解提供数据支撑。

(四)知识分类模型(KnowledgeCategory)

采用树状结构定义知识分类,包含分类名称、描述及父分类关联,实现知识库的层级化管理,便于知识条目检索与维护。

(五)知识库条目模型(KnowledgeBase)

核心知识存储实体,包含标题、内容、关键词、分类关联、状态(草稿 / 已发布 / 已归档)及向量嵌入字段,通过向量嵌入实现语义搜索功能。

(六)知识搜索日志模型(KnowledgeSearchLog)

记录用户搜索关键词、搜索时间及结果数量,用于分析用户查询习惯,优化知识库检索策略。

(七)知识反馈模型(KnowledgeFeedback)

收集用户对知识条目的反馈类型、内容及时间,作为知识库质量评估与优化的依据,形成 “用户反馈 - 知识更新” 的闭环机制。

)环境要求

  • 后端环境:Python 3.8+、Django 3.2+、PostgreSQL 12+/MySQL 8.0+
  • 前端环境:Node.js 14+、Vue.js 3.0+

、核心代码实现

(一)AI 聊天消息处理机制

智能对话的核心在于上下文管理与消息流转控制,以下代码展示了后端处理用户消息的关键逻辑,包括会话验证、消息存储及上下文构建:

class AIChatMessageView(APIView):
    def post(self, request, chat_id, *args, **kwargs):
        try:
            # 验证聊天会话归属(确保当前用户有权限操作)
            chat = AIChat.objects.get(id=chat_id, user=request.user)
            # 解析请求数据(支持JSON与表单数据格式)
            data = json.loads(request.body) if isinstance(request.body, bytes) else request.data
            content = data.get('content', '').strip()
            # 输入合法性校验
            if not content:
                return Response({"code": 400, "msg": "消息内容不能为空"}, status=HTTP_400_BAD_REQUEST)
            # 保存用户消息到数据库(记录消息角色与会话关联)
            user_message = AIChatMessage.objects.create(
                chat=chat,
                role='user',
                content=content
            )
            # 构建历史对话上下文(最多获取最近20条消息)
            messages = []
            chat_messages = AIChatMessage.objects.filter(chat=chat).order_by('created_at')[:20]
            for msg in chat_messages:
                messages.append({
                    'role': msg.role,
                    'content': msg.content
                })
            # 调用AI模型生成回复(示例中省略具体模型调用逻辑)
            ai_reply = self._call_ai_model(messages, content)
            
            # 保存AI回复并返回结果
            ai_message = AIChatMessage.objects.create(
                chat=chat,
                role='assistant',
                content=ai_reply
            )
            return Response({
                "code": 200,
                "data": {
                    "reply": ai_reply,
                    "message_id": ai_message.id
                }
            })
        except AIChat.DoesNotExist:
            return Response({"code": 404, "msg": "聊天会话不存在"}, status=HTTP_404_NOT_FOUND)
        except Exception as e:
            return Response({"code": 500, "msg": f"服务器错误: {str(e)}"}, status=HTTP_500_INTERNAL_SERVER_ERROR)
    def _call_ai_model(self, context, user_input):
        """调用AI模型核心方法(实际项目中需集成具体LLM服务)"""
        # 示例逻辑:通过Ollama客户端发送请求
        from hzadmin.utils.ollama_client import OllamaClient
        client = OllamaClient()
        return client.generate_response(context, user_input)

代码说明

  • 该模块实现了 RESTful 接口,处理用户消息的发送与 AI 回复的接收
  • 通过AIChatAIChatMessage模型关联会话与消息,构建对话历史
  • 采用上下文窗口机制(最多 20 条历史消息),确保多轮对话的语义连贯性
  • 抽象出_call_ai_model方法,便于后续扩展不同 AI 模型(如 Ollama、OpenAI 等)

(二)知识库向量搜索核心算法

基于语义的知识检索是智能客服的关键能力,以下代码展示了向量搜索的完整流程,包括嵌入生成、相似度计算与结果排序:

# knowledge/utils.py
import numpy as np
from sentence_transformers import SentenceTransformer
from django.db.models import Q
class VectorSearchEngine:
    def __init__(self):
        # 加载预训练语义模型(示例使用sentence-transformers)
        self.model = SentenceTransformer('all-MiniLM-L6-v2')
        # 相似度阈值(仅返回相似度>0.6的结果)
        self.similarity_threshold = 0.6
    def generate_embedding(self, text):
        """将文本转换为向量嵌入"""
        if not text:
            return None
        try:
            # 使用预训练模型生成向量(维度通常为384或768)
            embedding = self.model.encode([text])[0]
            # 转换为numpy数组便于计算
            return np.array(embedding, dtype=np.float32)
        except Exception as e:
            print(f"嵌入生成错误: {str(e)}")
            return None
    def compute_similarity(self, embedding1, embedding2):
        """计算两个向量的余弦相似度"""
        if embedding1 is None or embedding2 is None:
            return 0
        # 向量归一化
        embedding1 = embedding1 / np.linalg.norm(embedding1)
        embedding2 = embedding2 / np.linalg.norm(embedding2)
        # 计算点积(余弦相似度)
        return np.dot(embedding1, embedding2)
    def search(self, query_text, top_k=5, categories=None):
        """
        知识库向量搜索主方法
        query_text: 查询文本
        top_k: 返回结果数量
        categories: 限定搜索的分类ID列表
        """
        # 生成查询向量
        query_embedding = self.generate_embedding(query_text)
        if query_embedding is None:
            return []
        # 获取待搜索的知识条目(仅已发布状态)
        queryset = KnowledgeBase.objects.filter(
            status='published',
            **({Q(category__in=categories) | Q(category__isnull=True)} if categories else {})
        )
        # 批量获取已有向量嵌入的知识条目
        results = []
        for item in queryset:
            if item.vector_embedding:
                # 反序列化向量(数据库中存储为JSON数组)
                item_embedding = np.array(item.vector_embedding, dtype=np.float32)
                # 计算相似度
                similarity = self.compute_similarity(query_embedding, item_embedding)
                if similarity > self.similarity_threshold:
                    results.append({
                        'id': item.id,
                        'title': item.title,
                        'content': item.content,
                        'similarity': similarity,
                        'category_id': item.category.id if item.category else None,
                        'category_name': item.category.name if item.category else '未分类'
                    })
        
        # 按相似度降序排序并返回top_k结果
        results.sort(key=lambda x: x['similarity'], reverse=True)
        return results[:top_k]
# 向量搜索示例函数(供外部调用)
def vector_search(query_text, top_k=5, categories=None):
    engine = VectorSearchEngine()
return engine.search(query_text, top_k, categories)

技术要点解析

  • 采用 SentenceTransformer 模型生成文本向量,支持中文语义理解
  • 余弦相似度计算确保语义相近的文本(如如何退款退款流程)能被正确匹配
  • 支持按知识分类过滤搜索范围,提升垂直领域检索效率
  • 向量嵌入存储于数据库vector_embedding字段(JSON 格式),实现快速检索

(三)前端实时聊天组件实现

前端交互的核心在于实时消息推送与用户体验优化,以下代码展示了 Vue.js 聊天组件的消息发送逻辑:

// hzsystem_ui/src/views/chat/components/ChatMessage.vue

<template>

  <div class="chat-container">

    <div v-for="msg in messageList" :key="msg.id" class="message-item">

      <div class="message-content" :class="{'user-message': msg.role === 'user'}">

        <div v-if="msg.role === 'user'">用户提问: {{ msg.content }}</div>

        <div v-if="msg.role === 'assistant'">AI回复: {{ msg.content }}</div>

        <div v-if="msg.role === 'system'" class="system-message">{{ msg.content }}</div>

      </div>

      <div class="message-time">{{ formatTime(msg.time) }}</div>

    </div>

    <div v-if="isAiTyping" class="ai-typing">AI正在思考中... 🤔</div>

    <div class="input-area">

      <textarea v-model="inputMessage" placeholder="请输入您的问题..." @keyup.enter="sendMessage"></textarea>

      <button @click="sendMessage">发送</button>

    </div>

  </div>

</template>

<script setup>

import { ref, onMounted, onUnmounted } from 'vue';

import { sendMessageAPI } from '@/api/ai';

import { useChatStore } from '@/stores/chat';

// 状态管理

const messageList = ref([]);

const inputMessage = ref('');

const isAiTyping = ref(false);

const currentChat = useChatStore(state => state.currentChat);

// 发送消息主函数

const sendMessage = async () => {

  const content = inputMessage.value.trim();

  if (!content) return;

  // 1. 先添加用户消息到界面(本地优先渲染)

  const userMessage = {

    id: Date.now(),

    role: 'user',

    content,

    time: new Date()

  };

  messageList.value.push(userMessage);

  inputMessage.value = '';

  // 2. 显示AI输入状态

  isAiTyping.value = true;

  try {

    // 3. 调用API发送消息到后端

    const response = await sendMessageAPI(currentChat.id, content);

    if (response.code === 200) {

      // 4. 接收AI回复并添加到消息列表

      messageList.value.push({

        id: Date.now() + 1,

        role: 'assistant',

        content: response.data.reply,

        time: new Date()

      });

    } else {

      // 错误处理

      messageList.value.push({

        id: Date.now() + 1,

        role: 'system',

        content: `消息发送失败: ${response.msg}`,

        time: new Date()

      });

    }

  } catch (error) {

    console.error('网络错误:', error);

    messageList.value.push({

      id: Date.now() + 1,

      role: 'system',

      content: '网络错误,请稍后重试',

      time: new Date()

    });

  } finally {

    // 5. 结束AI输入状态并滚动到底部

    isAiTyping.value = false;

    scrollToBottom();

  }

};

// 滚动到聊天底部

const scrollToBottom = () => {

  const chatContainer = document.querySelector('.chat-container');

  if (chatContainer) {

    chatContainer.scrollTop = chatContainer.scrollHeight;

  }

};

// 时间格式化

const formatTime = (date) => {

  const now = new Date();

  const isToday = date.toDateString() === now.toDateString();

  const hours = date.getHours().toString().padStart(2, '0');

  const minutes = date.getMinutes().toString().padStart(2, '0');

  return isToday ? `${hours}:${minutes}` : `${date.getMonth() + 1}/${date.getDate()} ${hours}:${minutes}`;

};

// 生命周期钩子:初始化时加载历史消息

onMounted(() => {

  if (currentChat.id) {

    loadHistoryMessages(currentChat.id);

  }

});

// 加载历史消息(示例函数)

const loadHistoryMessages = async (chatId) => {

  try {

    const response = await fetchHistoryMessagesAPI(chatId);

    if (response.code === 200) {

      messageList.value = response.data.messages.map(msg => ({

        ...msg,

        time: new Date(msg.created_at)

      }));

      scrollToBottom();

    }

  } catch (error) {

    console.error('加载历史消息失败', error);

  }

};

</script>

前端交互逻辑说明

  • 采用本地优先渲染策略,用户发送消息后立即显示在界面,提升响应速度
  • 通过 WebSocket 与后端保持长连接(代码中未展示,但sendMessageAPI可封装 WebSocket 发送)
  • isAiTyping状态控制正在输入动画,改善用户等待体验
  • 消息列表采用虚拟滚动优化(示例中简化为普通列表,实际项目可集成 Vue Virtual Scroll
  • 历史消息加载与时间格式化确保对话记录的可读性

七、技术架构与代码设计亮点

  1. 分层架构设计
    • 前端层(Vue.js)与后端层(Django)解耦,通过 API 通信
    • 业务逻辑层(知识库、AI 对话)与数据访问层分离,便于扩展
    • 向量搜索模块抽象为独立服务,支持替换不同向量数据库
  2. 可扩展的 AI 模型接口
    • 通过OllamaClient等抽象类封装模型调用,支持切换至 OpenAIHugging Face 等模型
    • 上下文管理模块独立于具体模型,确保多轮对话逻辑可复用
  3. 性能优化策略
    • 向量搜索采用余弦相似度阈值过滤,减少无效计算
    • 前端消息本地优先渲染,避免等待后端响应的 UI 卡顿
    • 数据库索引优化(GIN 索引)提升大规模知识库的检索效率
  4. 工程化实践
    • 代码模块化(如VectorSearchEngine独立成类),提升可维护性
    • 类型注解与文档字符串(Docstring)规范,便于团队协作
    • 异常处理与日志记录机制,增强系统稳定性
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐