主题
分类
概述
本文档提供了使用 Java 中 LangChain4j 实现的分类系统。分类对于将文本归入预定义标签至关重要,例如情感分析、意图检测与实体识别。
本示例演示如何使用 LangChain4j 的 AI 驱动服务进行情感分类。
LangChain4j 支持三种常见的文本分类方法:
- 当标签依赖于细腻的自然语言推理时,通过 AI 服务使用 LLM。
- 当你为每个类别都有带标签的示例、并希望按语义相似度分类时,通过
TextClassifier与EmbeddingModelTextClassifier使用嵌入。 - 当你希望在不使用训练数据的情况下为每个标签得到带概率的答案时,通过决策服务使用决策模型。专用决策模型通常比聊天模型更快、更便宜。
情感分类服务
该情感分类系统将输入文本归入以下情感类别之一:
- POSITIVE
- NEUTRAL
- NEGATIVE
实现
java
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. 聊天模型初始化
java
static ChatModel chatModel = OpenAiChatModel.withApiKey("YOUR_OPENAI_API_KEY");- 初始化 OpenAI 聊天模型以处理自然语言文本。
- 将
"YOUR_OPENAI_API_KEY"替换为一个真实的 OpenAI API 密钥。
2. 定义情感类别
java
enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}Sentiment枚举表示可能的情感分类。
3. 创建 AI 驱动的情感分析器
java
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。
4. 创建 AI 服务实例
java
SentimentAnalyzer sentimentAnalyzer = AiServices.create(SentimentAnalyzer.class, chatModel);AiServices.create()使用该 AI 模型动态实现SentimentAnalyzer接口。
5. 运行情感分析
java
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 时,这种方法很有用。
java
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(...)。根据分类器的 maxResults、minScore 与 meanToMaxScoreRatio 设置,它可以返回零个、一个或多个标签。
使用场景
该情感分类服务可用于各种应用,包括:
✅ 客户反馈分析:将客户评论分类为正面、中性或负面。
✅ 社交媒体监控:分析社交媒体评论中的情感趋势。
✅ 聊天机器人响应:理解用户情绪以提供更好的响应。