跳到主要内容

分类

概述

本文档介绍如何使用 Java 中的 LangChain4j 实现分类系统。分类对于将文本归入预定义标签至关重要,例如情感分析、意图检测实体识别

本示例演示使用 LangChain4j 的 AI 驱动服务进行情感分类


LangChain4j 支持两种常见的文本分类方法:

  • 当标签依赖细致的自然语言推理时,通过 AI Services 使用 LLM。
  • 当你为每个类别准备了带标签的示例、并希望按语义相似度分类时,通过 TextClassifierEmbeddingModelTextClassifier 使用嵌入

情感分类服务

情感分类系统将输入文本归入以下情感类别之一:

  • POSITIVE
  • NEUTRAL
  • NEGATIVE

实现

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.UserMessage;

public class SentimentClassification {

// Initialize the chat model using OpenAI
static ChatModel chatModel = OpenAiChatModel.withApiKey("YOUR_OPENAI_API_KEY");

// Define the Sentiment enum
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}

// Define the AI-powered Sentiment Analyzer interface
interface SentimentAnalyzer {

@UserMessage("Analyze sentiment of {{it}}")
Sentiment analyzeSentimentOf(String text);

@UserMessage("Does {{it}} have a positive sentiment?")
boolean isPositive(String text);
}

public static void main(String[] args) {

// Create an AI-powered Sentiment Analyzer instance
SentimentAnalyzer sentimentAnalyzer = AiServices.create(SentimentAnalyzer.class, chatModel);

// Example Sentiment Analysis
Sentiment sentiment = sentimentAnalyzer.analyzeSentimentOf("I love this product!");
System.out.println(sentiment); // Expected Output: POSITIVE

boolean positive = sentimentAnalyzer.isPositive("This is a terrible experience.");
System.out.println(positive); // Expected Output: false
}
}

组件说明

1. 聊天模型初始化

static ChatModel chatModel = OpenAiChatModel.withApiKey("YOUR_OPENAI_API_KEY");
  • 初始化 OpenAI 聊天模型以处理自然语言文本。
  • "YOUR_OPENAI_API_KEY" 替换为实际的 OpenAI API 密钥。

2. 定义情感类别

enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
  • Sentiment 枚举表示可能的情感分类。

3. 创建 AI 驱动的情感分析器

interface SentimentAnalyzer {

@UserMessage("Analyze sentiment of {{it}}")
Sentiment analyzeSentimentOf(String text);

@UserMessage("Does {{it}} have a positive sentiment?")
boolean isPositive(String text);
}
  • 该接口定义了两个 AI 驱动的方法:
    • analyzeSentimentOf(String text):将给定文本分类为 POSITIVE、NEUTRALNEGATIVE
    • isPositive(String text):若文本具有积极情感则返回 true;否则返回 false

4. 创建 AI 服务实例

SentimentAnalyzer sentimentAnalyzer = AiServices.create(SentimentAnalyzer.class, chatModel);
  • AiServices.create() 使用 AI 模型动态实现 SentimentAnalyzer 接口。

5. 运行情感分析

Sentiment sentiment = sentimentAnalyzer.analyzeSentimentOf("I love this product!");
System.out.println(sentiment); // Output: POSITIVE

boolean positive = sentimentAnalyzer.isPositive("This is a terrible experience.");
System.out.println(positive); // Output: false
  • AI 模型将给定文本归入预定义的情感类别之一。
  • isPositive() 方法提供布尔结果。

基于嵌入的分类

EmbeddingModelTextClassifier 通过对输入进行嵌入,并与每个标签的嵌入示例进行比较来分类文本。当你能为每个类别提供代表性示例、且无需为每次分类请求调用 LLM 时,这种方法很有用。

import dev.langchain4j.classification.EmbeddingModelTextClassifier;
import dev.langchain4j.classification.TextClassifier;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.embedding.onnx.allminilml6v2q.AllMiniLmL6V2QuantizedEmbeddingModel;

import java.util.List;
import java.util.Map;

public class EmbeddingBasedSentimentClassification {

enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}

public static void main(String[] args) {

Map<Sentiment, List<String>> examples = Map.of(
Sentiment.POSITIVE, List.of("This is great!", "I love this product."),
Sentiment.NEUTRAL, List.of("It is okay.", "This works as expected."),
Sentiment.NEGATIVE, List.of("This is terrible.", "I am disappointed."));

EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel();

TextClassifier<Sentiment> classifier = new EmbeddingModelTextClassifier<>(embeddingModel, examples);

List<Sentiment> sentiments = classifier.classify("Awesome experience!");
System.out.println(sentiments); // [POSITIVE]
}
}

当你需要每个返回标签的相似度分数时,也可以使用 classifyWithScores(...)。根据 maxResultsminScoremeanToMaxScoreRatio 设置,分类器可以返回零个、一个或多个标签。


使用场景

该情感分类服务可用于各种应用,包括:

客户反馈分析:将客户评论分类为积极、中性或消极。
社交媒体监控:分析社交媒体评论中的情感趋势。
聊天机器人响应:理解用户情感以提供更好的响应。

示例