前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多领域智能客服:基于Java的智能分发与定制化问答系统

多领域智能客服:基于Java的智能分发与定制化问答系统

原创
作者头像
别惹CC
发布于 2025-01-10 08:26:57
发布于 2025-01-10 08:26:57
1730
举报

一、引子

AI客服的概念早已不再新鲜,随着自然语言处理技术的不断进步,越来越多的企业尝试将 AI 客服引入实际业务中。然而,尽管大模型具备强大的语言理解能力,受限于业务场景的复杂性和大模型自身的局限性,AI 客服在许多企业中的应用落地效果并不理想。尤其是在面对多领域、多场景的客户需求时,单一的 AI 模型往往难以提供精准且符合上下文的回答,进而影响了用户体验和企业的运营效率。

二、业务梳理

业务场景的多样性使得客户问题不仅限于某一个方面。客户可能会询问产品信息(售前)、订单和退换货等服务(售后),以及公司政策或流程等日常事务(业务支持)。面对这些高度垂直化的需求,传统的 AI 客服难以兼顾各个领域,导致服务体验割裂、回答不准确。

为了解决这一问题,我们采用了一种更为灵活的方式,客服系统按照业务维度进行划分,拆解为多个专门负责不同领域的 AI 客服模块。比如,可以按照问题类型分别构建售前售后日常业务三大问题领域的AI客服,对于用户发送的问题,首先通过一个中转服务利用AI进行判断属于那个领域的问题,再转发到适配的客服。

三、架构设计

在本次的设计中,我们需要用到一个平台 - Dify,我们通过它去连接大模型可以单独部署AI应用,这样在项目里只需要封装API进行调用即可,把业务系统与AI应用进行解耦。因此,我们可以抽象出业务架构图如下:

通过架构图可以看出,我们这个系统需要4个AI应用来支持,每个应用的开发和维护都通过Dify进行,我们的业务系统直接调用即可。

四、技术实现

部署Dify

本文对Dify的部署不予演示,感兴趣的同学直接去官网下载即可,部署非常简单,通过docker可以一键部署。

创建应用

接下来开始创建AI应用,应用开发的重点在提示词的编写。我们先以判断客户需求的AI客服为例,如下:

提示词如下:

提示词编写完成后,可以在右侧测试效果,同时记得点击发布,如下:

同理,另外三个业务客服都采用上述方式创建。这里我以业务客服为例,给大家展示下提示词,如下:

可以看到提示词里提到了知识库,知识库简单地说可以为AI提供一些上下文,比如我们客服的场景里就可以把相关客服的培训手册提供给应用。我们可以通过Dify直接管理知识库,也可以通过API操作,我们这里方便管理,直接上传即可。如下:

我们可以在知识库里可以直接创建,如下:

可以看到知识库文本的格式支持很广泛,如下:

我这里为了方便演示,就直接建一个客服中心的word文档,输入以下内容,如下:

数据的清洗和分段都可以自动进行,我们这步也不做什么调整,直接下一步就行,如下:

最后为我们的应用关联上,我们可以测试下开发票的效果,可以看到它根据知识库的内容回答,如下:

API封装

Dify已经对API封装的格式做了说明,如下:

这里需要说明下,我们在每个应用里创建的API-Key都是调用这个应用的凭证,所以在项目里调用应用都需要先生成它的Key,并把它配置在项目里,如下:

代码语言:java
AI代码解释
复制
public class DifyServerConstants {

    /**
     * The base URL of the Dify API.
     */
    public static final String BASE_URL = "https://dify.xxxxxxxx.com.cn/v1";

    /**
     * XX应用api key
     */
    public static final String APP_API_KEY = "XXXXXXXXXX";
}

在实际中根据自己的应用使用情况可以把key都统一管理起来,常量类是种实现,写在配置文件里也是。然后我们基于官方的文档简单封装下,代码如下:

代码语言:java
AI代码解释
复制
private String getResultByDify(String text, String BearerAuth) {
    //设置请求体
    JSONObject body = new JSONObject();
    body.put("query", text);
    body.put("response_mode", "blocking");
    // 注:这个userId是调用dify应用的必须参数,一般取当前登录用户即可,如没有特殊要求也可随意指定
    Long userId = LoginHelper.getUserId();
    body.put("inputs", "");
    // 封装请求体和请求头
    String jsonString = body.toJSONString();
    //发送post请求,阻塞式
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(List.of(MediaType.APPLICATION_JSON));
    headers.setBearerAuth(BearerAuth);
    // 封装请求体和请求头
    HttpEntity<String> entity = new HttpEntity<>(jsonString, headers);
    //url
    String url = DifyServerConstants.BASE_URL + "/chat-messages";
    //发送请求
    ResponseEntity<String> stringResponseEntity =
        restTemplate.postForEntity(url, entity, String.class);
    //获取answer字段
    if (ObjectUtil.isNotEmpty(stringResponseEntity.getBody())) {
        JSONObject jsonObject = JSONObject.parseObject(stringResponseEntity.getBody());
        String answer = jsonObject.getString("answer");
        //去掉markdown
        answer = StrUtil.removeAll(answer, "```json");
        answer = StrUtil.removeAll(answer, "```");
        return answer;
    }
    return null;
}

我们可以把它声明为一个接口或者工具类,只需要传入问题和应用的key就可以实现通用调用了,如下:

代码语言:java
AI代码解释
复制
String answer = getResultByDify(question, DifyServerConstants.XXX_KEY);

转发逻辑实现

编写一个接口用来接收用户输入的问题,代码如下:

代码语言:java
AI代码解释
复制
  /**
     * 根据问题分类并调用相应的Dify服务获取答案
     *
     * @param userQuery 用户提出的问题
     * @param BearerAuth Dify的Bearer token
     * @return Dify返回的答案
     */
    public String handleUserQuery(String userQuery, String BearerAuth) {
        // 调用分类模型,获取类型
        String domainJson = getResultByDify(userQuery, BearerAuth);
        // 解析结果json并返回类型
        int domainType = extractTypeFromJson(domainJson);

        // 根据分类结果调用不同的Dify服务
        switch (domainType) {
            case 1:
                return getResultByDify(userQuery, BearerAuth);  // 售前
            case 2:
                return getResultByDify(userQuery, BearerAuth); // 售后
            case 3:
                return getResultByDify(userQuery, BearerAuth); // 日常业务
            // 后续可扩展的其他领域,如技术支持
            default:
                return "抱歉,我无法识别您的问题类别。";
        }
    }

另外,还需要对AI返回的结果解析下,代码如下:

代码语言:java
AI代码解释
复制
    /**
     * 从分类结果的JSON中提取领域类型
     *
     * @param jsonResponse 分类结果的JSON字符串
     * @return 领域类型数字
     */
    private int extractTypeFromJson(String jsonResponse) {
        JSONObject jsonObject = JSONObject.parseObject(jsonResponse);
        return jsonObject.getInteger("type");
    }

至此,我们就简单地实现了这个AI客服智能分发系统,我们通过日志记录下一次测试过程,如下:

五、小结

其实上述的这个小demo仅仅依靠dify的工作流就可以实现多应用的协作,但实际业务中,我们可能会遇到在现有的客服系统中去集成AI;或者我们的系统需要先接入AI客服,但客户问题并未得到解决,再接入人工客服,自然就需要我们需要相应的服务管理。因此,本文重点在实现的思路和方案上,希望对大家有所帮助!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【建议收藏】Jetpack Compose编程知识全汇总 (含详细实例讲解)
Jetpack Compose是Google I/O 2019 发布的Andorid UI框架,它不同于Andorid常见的Xml+命令式Coding的UI开发范式,而是基于Kotlin的DSL实现了一套类似React的声明式UI框架。Jetpack Compose目前仍然处于Alpha版本目标是2020年能够发布稳定的Beta版本。伴随React Native、Flutter等大前端框架的兴起以及Jetpack Compose、SwiftUI等native框架的出现,声明式UI正逐渐成为客户端UI开发的新趋势。
网易Leo
2021/12/09
6.6K0
【建议收藏】Jetpack Compose编程知识全汇总 (含详细实例讲解)
compose--初入compose、资源获取、标准控件与布局
compose正式发布已经一年多了,越来越多的开发人员选择使用它,声明式UI也是未来的一个主流趋势,本人也是一年前学习后,并没有真正的使用,所以本着边学习,边分享的心态,准备写个compose系列的文章 首先compose目前只支持kotlin,基于google对移动端的鸿图,未来应该也不会支持其他语言,和传统安卓的xml布局不同,compose是通过kotlin定义一个一个组件,由于是通过代码定义的组件,每个组件都可以很方便的重用,这点在UI开发时确实便利了不少。至于声明式UI和命令式UI的区别,相信你会在后续实际使用时有很大的感触
aruba
2022/12/06
6.6K0
compose--初入compose、资源获取、标准控件与布局
Android | Compose 初上手
Jetpack Compose 是用于构建原生 Andorid 界面的新工具包,Compose 使用了更少的代码,强大的工具和直观的 Kotlin Api 简化并且加快了 Android 上界面的开发。
345
2022/06/12
5.5K0
Android | Compose 初上手
Jetpack-Compose 学习笔记(一)—— Compose 初探
历时两年,Android 团队推出了全新的原生 Android 界面 UI 库——Compose。当然,Compose 也是属于 Jetpack 工具库中的一部分,官方宣称可以简化并加快 Android 上的界面开发,可以用更少的代码去快速打造生动而精彩的应用。1.0 版本就在上个月底刚刚发布,而且可以在生产环境中使用!不管咋样,先上手看一看!
修之竹
2022/08/19
2.3K0
Jetpack-Compose 学习笔记(一)—— Compose 初探
安卓软件开发:使用Jetpack Compose和Room开发NimWishApp-上篇
在Demo中,采用了最新的Jetpack ComposeM3技术栈,结合了Room数据库实现数据的持久化存储,提供了一个从UI层到数据层的完整解决方案,展示了从0到1的开发。
Nimyears
2024/10/03
4550
安卓软件开发:用JetpackCompose实现NimReplyAppUI上篇
NimReplyApp 是一个模拟电子邮件应用的案例项目,用户可以浏览邮件、查看详细内容和发送回复,在日常工作和生活中都很常见。
Nimyears
2024/10/15
5400
Android | Compose 状态管理
应用中的状态指的是可以随时间变化的任何值。这个定义非常广泛,例如从数据库到类的变量,页面上显示的提示信息等。
345
2022/06/12
1.7K0
Android | Compose 状态管理
Jetpack Compose中的基本组件及组件提取
除了布局组件外,Jetpack Compose 还提供了一系列其他常用的 UI 组件。
码客说
2024/03/29
3160
Jetpack Compose中的基本组件及组件提取
从0上手Jetpack Compose,看这一篇就够了~
2月底的时候,Android 官方发布了Compose的完整课程。了解到许多小伙伴还没开始学习Compose,所以我写了一篇基础文章,让我们一起轻松上手Compose~
黄林晴
2024/01/11
1.8K0
从0上手Jetpack Compose,看这一篇就够了~
Android | Compose 生命周期和附带效应
可组合项 应该没有附带效应,但是,如果在对应用状态进行转变时需要使用可组合项。此时你应该使用 Effect API , 以便以可以预测的方式来执行这些附带效应
345
2022/06/12
1.4K0
Android | Compose 生命周期和附带效应
安卓软件开发:使用Jetpack Compose和M3的轮播图和列表App-上篇
这个应用中常见的 UI 需求是轮播图、列表和弹窗,使用 Jetpack Compose 和 M3 的组件,可以快速、高效编码现代化的 UI。
Nimyears
2024/10/12
8100
掌握 Android Compose:从基础到性能优化全面指南
本文介绍了 Android Compose 的基本概念,探讨其状态管理、列表处理以及性能优化的关键技术,帮助读者更好地理解和运用这一强大的 UI 框架。
陆业聪
2024/09/24
1.3K0
掌握 Android Compose:从基础到性能优化全面指南
Jetpack Compose中的分页器Pager的使用
如需以左右或上下方式浏览内容,您可以分别使用 HorizontalPager 和 VerticalPager可组合项。
码客说
2024/03/29
7500
Android Compose 新闻App(五)Room复杂数据、AlertDialog弹窗、页面导航
  在上篇文章中,我们进一步对EpidemicNews的Desc数据进行处理,本文章中,要解决根本问题,那就是把EpidemicNews直接保存到数据库中。本篇文章运行效果图
晨曦_LLW
2022/04/22
1.7K0
Android Compose 新闻App(五)Room复杂数据、AlertDialog弹窗、页面导航
compose--附带效应、传统项目集成、导航
该文章将是compose基础系列中最后一篇,附带效应是这篇文章的重点,其余补充内容为如何在传统xml中集成compose、compose导航的使用
aruba
2023/01/18
2.3K0
Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?
前面几篇笔记讲了那么多内容,都是基于静态界面的展示来说的,即给我一个不变的数据,然后将它展示出来。如何在 Compose 中构建一个随数据而变化的动态界面呢?相信看完这篇就知道了。
修之竹
2022/08/19
2.4K0
Jetpack-Compose 学习笔记(五)—— State 状态是个啥?又是新概念?
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用
  现在数据已经有了,现在主要就是Compose UI的设计。完成本篇文章,效果图如下:
晨曦_LLW
2022/04/15
3.3K0
Android Compose 新闻App(三)网络数据Compose UI显示加载、Room和DataStore使用
深度解析 Jetpack Compose 布局
Jetpack Compose 是用于构建原生 Android 界面的新工具包。它可简化并加快 Android 上的界面开发,使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。Compose 使用全新的组件——可组合项 (Composable) 来布局界面,使用 修饰符 (Modifier) 来配置可组合项。
Android 开发者
2022/03/29
2.2K0
深度解析 Jetpack Compose 布局
安卓软件开发:Jetpack Compose 和 Material 3 实现高级登录页面(Kotlin)
在项目的 build.gradle 文件中添加 Compose 和 Material 3 的依赖项:
Nimyears
2024/09/14
9470
安卓软件开发:使用 Hilt 在 Jetpack Compose 和 M3 实现依赖注入App
Hilt 是 Android 官方推荐的依赖注入框架,简化了组件之间的依赖管理,特别是当项目复杂度增加时,依赖注入可以简化了代码。
Nimyears
2024/09/29
7320
推荐阅读
相关推荐
【建议收藏】Jetpack Compose编程知识全汇总 (含详细实例讲解)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档