0%

langchain4j 分类(Classification)能力实现

分类(Classification)对于将文本归类到预定义标签中至关重要,例如情感分析意图检测实体识别,这里演示了使用 LangChain4j 的 AI 驱动服务进行情感分类

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

  1. 通过 AI Services 使用 LLM:当标签依赖于细微的自然语言推理时使用。
  2. 通过 TextClassifier 和 EmbeddingModelTextClassifier 使用嵌入:当你为每个类别提供了带标签的示例,并希望通过语义相似度进行分类时使用。

情感分类服务可用于多种应用场景,包括:

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

📖 原文出处:LangChain4j - Classification


情感分类服务

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

  • POSITIVE(积极)
  • NEUTRAL(中性)
  • NEGATIVE(消极)

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 {

// 使用 OpenAI 初始化聊天模型
static ChatModel chatModel = OpenAiChatModel.withApiKey("YOUR_OPENAI_API_KEY");

// 定义情感枚举
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}

// 定义 AI 驱动的情感分析器接口
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) {

// 创建 AI 驱动的情感分析器实例
SentimentAnalyzer sentimentAnalyzer = AiServices.create(
SentimentAnalyzer.class, chatModel);

// 情感分析示例
Sentiment sentiment = sentimentAnalyzer.analyzeSentimentOf("I love this product!");
System.out.println(sentiment); // 预期输出: POSITIVE

boolean positive = sentimentAnalyzer.isPositive("This is a terrible experience.");
System.out.println(positive); // 预期输出: false
}
}

组件说明

聊天模型初始化

1
static ChatModel chatModel = OpenAiChatModel.withApiKey("YOUR_OPENAI_API_KEY");

初始化 OpenAI 聊天模型以处理自然语言文本,将 "YOUR_OPENAI_API_KEY" 替换为实际的 OpenAI API 密钥。

定义情感类别

1
2
3
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}

Sentiment 枚举表示可能的情感分类。

创建 AI 驱动的情感分析器

1
2
3
4
5
6
7
8
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(积极)NEUTRAL(中性)NEGATIVE(消极)
  • isPositive(String text):如果文本具有积极情感则返回 true,否则返回 false

创建 AI 服务实例

1
SentimentAnalyzer sentimentAnalyzer = AiServices.create(SentimentAnalyzer.class, chatModel);

AiServices.create() 使用 AI 模型动态实现 SentimentAnalyzer 接口。

运行情感分析

1
2
3
4
5
Sentiment sentiment = sentimentAnalyzer.analyzeSentimentOf("I love this product!");
System.out.println(sentiment); // 输出: POSITIVE

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

AI 模型将给定文本分类为预定义的情感类别之一,isPositive() 方法提供布尔类型的结果。


基于嵌入的分类

实现

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
}
}

基于嵌入分类的说明

特性 说明
嵌入模型 使用 AllMiniLmL6V2QuantizedEmbeddingModel(轻量级量化模型)
示例数据 为每个情感类别提供代表性文本示例
分类原理 将输入文本嵌入后与各类别示例的嵌入进行相似度比较
优势 无需每次调用 LLM,速度快、成本低
适用场景 有充足标注样本、类别边界清晰的分类任务

两种方式对比

特性 LLM 分类(AI Services) 嵌入分类(EmbeddingModelTextClassifier)
推理能力 强,能理解 nuanced 语义 弱,仅基于语义相似度
是否需要标注数据 不需要 需要每个类别的示例
调用成本 较高(每次调用 LLM) 较低(本地嵌入计算)
适用场景 复杂推理、零样本分类 大量文本、已有标注数据
灵活性 高,可通过提示词调整 中,依赖示例质量