尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

langchain4j 学习系列(7)-文本分类

langchain4j 学习系列(7)-文本分类
📅 发布时间:2026/6/21 5:44:58

继续我们的langchain4j学习之旅,很多“智能客服”之类的AI应用,“问题分类”是非常重要的功能之一。比如:客人进来咨询问题,得判断出客人的问题是“订单相关”(比如:我要取消订单),还是“支付相关”(比如:我要退款),还是“投诉相关”(比如:你们的服务太差了,我要投诉到相关部门)。识别出对应分类后,就可以交给相应的流程(或细分的sub agent)做进一步处理。

langchain4j 提供了2种分类方法:

一、基于LLM的语义理解

1.1 定义分类枚举

    enum CustomerServiceCategory {PRODUCT("产品相关"),ORDER("订单相关"),ACCOUNT("账户相关"),MEMBER("会员相关"),PAYMENT("支付相关"),OTHERS("其它问题");@Getterprivate final String desc;CustomerServiceCategory(String desc) {this.desc = desc;}}

1.2 定义AIService的接口

    interface CustomerServiceCategoryClassifier {@UserMessage("将客人遇到的问题【{{text}}】归类")CustomerServiceCategory classify(String text);}

1.3 测试

    @GetMapping(value = "/classify", produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity<String> classify(@RequestParam String query) {try {CustomerServiceCategoryClassifier customerServiceClassifier = AiServices.create(CustomerServiceCategoryClassifier.class, ollamaChatModel);CustomerServiceCategory classify = customerServiceClassifier.classify(query);return ResponseEntity.ok(classify.getDesc());} catch (Exception e) {log.error("classify", e);return ResponseEntity.ok("{\"error\":\"classify error: " + e.getMessage() + "\"}");}}

效果:

image

image

观察日志的话,能看到与LLM的交互:

2025-12-09T21:00:57.280+08:00  INFO 5948 --- [langchain4j-study] [io-8080-exec-10] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {"model" : "deepseek-v3.1:671b-cloud","messages" : [ {"role" : "user","content" : "将客人遇到的问题【我的退款为什么还没到账?】归类\nYou must answer strictly with one of these enums:\nPRODUCT\nORDER\nACCOUNT\nMEMBER\nPAYMENT\nOTHERS"} ],"options" : {"stop" : [ ]},"stream" : false,"tools" : [ ]
}

这种方法的准确性完全取决于模型能力的强弱,大多数情况下是OK的,但有些case可能会不太符合我们的预期,比如:

image

一些互联网平台,对于“积分”可能会归到【会员相关】(比如:积分累积到了一定程度,可以兑换成高等级会员),这时候就可以考虑第2种方法。

  

二、基于向量数据库的相似度计算

2.1 先梳理已知问题的归类

    Map<CustomerServiceCategory, List<String>> getExamples() {Map<CustomerServiceCategory, List<String>> examples = new HashMap<>();examples.put(PRODUCT, asList("怎么没有产品说明书?","产品的保修期过了怎么办?","我新买的东西用了一周就坏了?","产品无法使用?"));examples.put(ORDER, asList("我的订单现在到哪里了?","能给我一个快递单号吗?","我怎么知道我的订单已经发货了?","我可以更改配送方式吗?","你们提供次日达服务吗?","可以选择到店自提吗?","我的订单什么时候能到?","为什么我的配送延迟了?","我可以指定配送日期吗?","已经过了预计送达日期,我的订单在哪里?","如果出现延迟,我会收到通知吗?","天气原因会导致配送延迟多久?","我收到了订单,但少了一件商品。","包裹送达时是空的。","我收到的商品错了,该怎么办?","我所有的商品会同时送达吗?","为什么我只收到部分订单商品?","剩下的商品能更快送达吗?"));examples.put(PAYMENT, asList("能用支付宝吗?","微信支付可以吗?","支持信用卡吗?","付款时我遇到一个错误","可以通过银行转账付款吗?","为什么我的付款被拒绝了","可以给我发送上一笔订单的发票吗?","发票会自动发送到我的电子邮箱吗?","如何申请退款?"));examples.put(MEMBER, asList("我的会员等级变低了?","我的积分过期了?","我的优惠券不能用了?","能给我发个支付95折优惠券吗?","满减优惠券当次消费就能用吗?","能送100点优惠积分吗?"));examples.put(ACCOUNT, asList("如何注销账号?","我的密码过期了?","为什么无法登录","登录时手机收不到验证码","如果更换账号绑定的手机号"));examples.put(OTHERS, asList("厂商的联系电话是多少?","如何加盟?","你们公司还招人吗?"));return examples;}

2.2 使用embedding模型分类

    @GetMapping(value = "/classify/embed", produces = MediaType.APPLICATION_JSON_VALUE)public ResponseEntity<String> classifyEmbed(@RequestParam String query) {try {TextClassifier<CustomerServiceCategory> classifier = new EmbeddingModelTextClassifier<>(ollamaEmbeddingModel, getExamples());List<CustomerServiceCategory> categories = classifier.classify(query);String result = "";if (!CollectionUtils.isEmpty(categories)) {CustomerServiceCategory classify = categories.get(0);result += classify.getDesc() + ",";}return ResponseEntity.ok(StringUtils.trimTrailingCharacter(result, ','));} catch (Exception e) {log.error("classify", e);return ResponseEntity.ok("{\"error\":\"classify error: " + e.getMessage() + "\"}");}}

image

刚才的case符合预期了,但该方法有缺陷也十分明显,如果梳理的已知问题分类不够全面,会出现误判,比如:

image

这个问题不在事先准备好的问题列表中,计算出来的结果就差强人意了。实际应用中,如何取舍看业务场景,或者二者结合使用(比如:2个方法都跑一遍,看是否一致,然后再根据一定策略做处理。或者先用方法1,先做一轮分类,将结果人工复检后,用于完善方法2中的分类列表)

 

文中示例代码:GitHub - yjmyzz/langchain4j-study at day07

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

相关新闻

  • 实用指南:OCR与AI赋能医药资质审核的全流程自动化方案
  • Spark的运行架构,RDD自带容错机制分析 - f
  • 解码多态、虚函数——动态行为扩展

最新新闻

  • 小程序安全通信机制深度解析:从签名算法到逆向分析实践
  • vLLM+llama-factory本地部署实战:生产级LLM落地操作手册
  • GLM-5.1开源实战:本地部署、量化推理与VS Code集成指南
  • 嵌入式开发板电压与时钟配置:从原理到实战排查指南
  • 终极FGO自动化战斗解决方案:Fate/Grand Automata深度使用指南
  • Hermes本地AI Agent架构升级实战:模块化、持久化与沙箱化

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号