LangChain4j 分类(Classification)—— 小白也能懂的通俗版

LangChain4j 分类(Classification)—— 小白也能懂的通俗版
先搞懂什么是分类分类就是让 LLM 当裁判把一段文本扔进去告诉它这段文字属于哪个预定义的类别。比如客服收到的 1000 条留言哪些是投诉、哪些是咨询、哪些是表扬不用人工一条条看让 AI 自动打标就行。打个比方分类 给文本贴标签LLM 就是你的智能分拣员。⚡核心结论一句话定义一个返回enum/boolean/ 基本类型的 AI Service 方法用UserMessage写好提示词AiServices.create()一行代码搞定——不需要自己写 prompt engineering框架帮你把输入塞进模板再交给 LLM。 文章结构总览主题作用概述分类是将文本划分到预定义标签的基础任务情感分类示例POSITIVE / NEUTRAL / NEGATIVE 三分类组件解释聊天模型 → 枚举定义 → AI 接口 → AiServices → 调用应用场景客户反馈、社媒监测、聊天机器人路由两种分类方式LLM 直接分类 vs Embedding 相似度分类一、没有分类 vs 有分类的效果对比❌没有分类时人工肉眼判断用户发来这个产品太差了用了两天就坏了 → 客服需要逐条阅读手动标记为投诉 → 一天处理几百条累死人还容易漏✅有分类时AI 自动打标Sentimentsentimentanalyzer.analyzeSentimentOf(这个产品太差了用了两天就坏了);// → NEGATIVE ✅ 自动识别毫秒级完成二、完整实现代码 —— 情感分类服务importdev.langchain4j.model.chat.ChatModel;importdev.langchain4j.model.openai.OpenAiChatModel;importdev.langchain4j.service.AiServices;importdev.langchain4j.service.UserMessage;publicclassSentimentClassification{// Step 1: 初始化聊天模型staticChatModelchatModelOpenAiChatModel.withApiKey(YOUR_OPENAI_API_KEY);// Step 2: 定义情感类别枚举enumSentiment{POSITIVE,NEUTRAL,NEGATIVE}// Step 3: 定义 AI 驱动的情感分析接口interfaceSentimentAnalyzer{UserMessage(Analyze sentiment of {{it}})SentimentanalyzeSentimentOf(Stringtext);UserMessage(Does {{it}} have a positive sentiment?)booleanisPositive(Stringtext);}// Step 4: 创建 AI 服务实例publicstaticvoidmain(String[]args){SentimentAnalyzeranalyzerAiServices.create(SentimentAnalyzer.class,chatModel);// Step 5: 运行分类Sentimentsentimentanalyzer.analyzeSentimentOf(I love this product!);System.out.println(sentiment);// → POSITIVEbooleanpositiveanalyzer.isPositive(This is a terrible experience.);System.out.println(positive);// → false}}三、五种分类结果类型分类不只是返回枚举还可以返回各种 Java 原生类型返回枚举最常用enumCategory{SUPPORT,SALES,COMPLAINT,FEEDBACK}interfaceTicketClassifier{UserMessage(Classify the ticket: {{it}})Categoryclassify(StringticketDescription);}// 用法Category category classifier.classify(我的订单还没收到...);// → SUPPORT返回布尔值是非题interfaceSpamDetector{UserMessage(Is this email spam? {{it}})booleanisSpam(StringemailBody);}// 用法boolean spam detector.isSpam(恭喜中奖点击领取...);// → true返回字符串自由分类interfaceTopicTagger{UserMessage(What topic does this article belong to? {{it}})StringtagTopic(StringarticleContent);}// 用法String topic tagger.tagTopic(苹果发布了新款 iPhone...);// → technology返回整数多选项计数/评分interfaceRatingPredictor{UserMessage(Rate the satisfaction level (1-5): {{it}})intpredictRating(Stringfeedback);}返回 List/Set多标签分类interfaceMultiLabelTagger{UserMessage(Extract all relevant tags: {{it}})SetStringextractTags(Stringtext);}// 一条新闻可能同时被打上 [politics, economy, international]四、两种分类策略策略一LLM 直接分类⭐ 推荐上面所有例子都是这种——直接把文本丢给 LLM让它理解语义后分类。优点是不需要额外数据缺点是每次都要调 LLM API。// 直接用 LLM 理解语义分类Sentimentsanalyzer.analyzeSentimentOf(物流太慢了等了两周);策略二Embedding 相似度分类适合大规模、低成本场景通过向量相似度来分类不经过 LLM速度快成本低// 先用 Embedding Model 提取特征向量EmbeddingModelembeddingModelOpenAiEmbeddingModel.builder().apiKey(System.getenv(OPENAI_API_KEY)).model(TextEmbeddingModelName.EMBEDDING_V3_SMALL).build();// 预设各类别的代表文本及其向量MapString,double[]categoriesnewLinkedHashMap();categories.put(POSITIVE,embeddingModel.embed(非常满意谢谢).content().vector());categories.put(NEUTRAL,embeddingModel.embed(一般般吧。).content().vector());categories.put(NEGATIVE,embeddingModel.embed(很差不满意。).content().vector());// 新文本分类计算与各个类别向量的余弦相似度double[]queryVectorembeddingModel.embed(东西还行。).content().vector();StringbestMatchfindMostSimilar(queryVector,categories);// → NEUTRAL怎么选LLM 分类准确度高但贵Embedding 分类便宜快速但不擅长模糊边界的情况。两者可以结合——用 Embedding 做初筛不确定时才调 LLM。五、进阶技巧技巧一Few-Shot 分类给样例提高准确率interfaceSentimentAnalyzer{UserMessage( Classify the sentiment as POSITIVE, NEUTRAL or NEGATIVE. Examples: - Great service! → POSITIVE - Its okay. → NEUTRAL - Terrible experience. → NEGATIVE Now classify: {{it}} )Sentimentclassify(Stringtext);}给 LLM 几个例子它的分类准确度会显著提升。技巧二带置信度的分类classClassifiedT{privatefinalTlabel;privatefinaldoubleconfidence;// 0.0 ~ 1.0// constructor, getters...}interfaceSmartClassifier{UserMessage( Classify: {{it}} Return format: {label: ..., confidence: 0.XX} )ClassifiedSentimentclassifyWithConfidence(Stringtext);}让 LLM 不仅给出分类结果还附带一个置信度分数方便你做阈值过滤。技巧三多层级分类enumDepartment{HR,IT,FINANCE,LEGAL}enumPriority{LOW,MEDIUM,HIGH,URGENT}interfaceTicketRouter{UserMessage(Which department should handle this? {{it}})DepartmentrouteToDepartment(Stringticket);UserMessage(How urgent is this? {{it}})PriorityassessPriority(Stringticket);}先按部门分流再按优先级排序两步走比一步到位更可靠。六、应用场景一览场景分类目标典型类别客户反馈分析情感倾向POSITIVE / NEUTRAL / NEGATIVE社交媒体监测话题归属technology / politics / sports / entertainment聊天机器人路由意图识别order_query / complaint / refund / general_inquiry邮件自动分拣紧急程度spam / promotion / social / primary / important工单自动分配所属部门HR / IT / Finance / Legal内容审核敏感度safe / borderline / unsafe多语言检测语种识别zh / en / ja / ko / … 面试高频追问Q1分类和结构化输出有什么区别答分类是让 LLM 从有限集合中选一个标签比如 3 种情感输出简单通常是 enum / boolean结构化输出是让 LLM 按照 JSON Schema 生成复杂数据结构多个字段、嵌套对象。分类是结构化输出的特例——只不过结构非常简单。Q2如何提高分类的准确率答① Few-shot learning在 prompt 中提供几个分类样例② 清晰的类别定义每个类别的描述越具体越好③ 温度参数调低classification 场景建议 temperature0④ 如果 LLM 仍然不稳定考虑用 Embedding 相似度作为补充手段。Q3分类可以用流式吗答分类本身是一问一答的短任务不太适合流式输出。流式更适合长篇对话或内容生成。如果你非要用可以把返回类型改为FluxString但没有实际意义。Q4分类任务的 token 消耗大吗答很小。分类通常只需要用户的原始文本 简短的系统提示不像 RAG 那样要带上大量检索文档。一条分类请求通常在几十到几百 tokens 之间。Q5分类和意图识别是一回事吗答很相似但有区别。分类是把文本分到已知类别中如情感三分类意图识别是理解用户想干什么如查快递、“退换货”、“咨询政策”。实践中经常混用本质上都属于 NLP 的分类任务。✅ 总结分类是 LangChain4j 中最简单的入门场景之一核心思路定义返回 enum/boolean/String 的 AI Service 方法LLM 负责分类决策五种结果类型枚举、布尔、字符串、整数、集合覆盖大多数分类需求两种策略LLM 直接分类准但贵vs Embedding 相似度分类快但浅四大提升技巧Few-shot 样例、置信度输出、多层级分类、温度调低六大场景情感分析、社媒监测、聊天路由、邮件分拣、工单分配、内容审核极简代码无需手写 promptUserMessage(classify: {{it}})一行搞定