一、情感分析及其应用场景
百度百科给「情感分析」的定义:
情感分析是人工智能领域中计算语言学的分支,属于自然语言处理的核心内容,其定义为通过自动技术判定文本中观点持有者对特定话题的情感倾向或态度(如褒贬性判断)。该方法主要依赖文本预处理、特征标注、模型训练等流程,++可分为基于情感词典、机器学习和深度学习的分析方法++ 。++应用场景覆盖舆情监测、电子商务、客服系统及精神健康等领域,并与情感计算技术协同实现多情感理解 。++
应用场景:
客户反馈分析 :将客户评价分类为正面、中立或负面。
社交媒体监控 :分析社交媒体评论中的情绪趋势。
聊天机器人回复 :了解用户情绪,提供更好的回复。
二、情感分析示例
2.1 判断输入是积极/中性/消极
定义情感类型:
java
package com.ai.LangChain4j.sentiment;
//枚举代表可能的情感分类
public enum Sentiment {
POSITIVE, NEUTRAL, NEGATIVE
}
定义AiService
java
package com.ai.LangChain4j.sentiment;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;
@AiService
public interface SentimentAnalyzer {
//将文本分类为正面、中立或负面
// @UserMessage("Analyze sentiment of {{it}}")
@UserMessage("针对{{it}}进行分析情感")
Sentiment analyzeSentimentOf(String text);
//如果文本带有正面情感,则返回为真 ;否则, 就是假的
// @UserMessage("Does {{it}} have a positive sentiment?")
@UserMessage("请问{{it}}是否拥有积极的情感?")
boolean isPositive(String text);
@UserMessage("Does {{it}} have a positive sentiment?. Analyze sentiment of {{it}}")
SenAnalyzerResult getSentimentAnalyzer(String text);
record SenAnalyzerResult(Sentiment sentiment, boolean isPositive){}
}
创建实例并注册成bean:
java
package com.ai.LangChain4j.sentiment;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.service.AiServices;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
@Resource
public class SentimentConfig {
@Resource
private ChatModel chatModel;
//@Bean注解通常与@Configuration注解配合使用。@Configuration标注的类被视为配置类,相当于XML配置文件,其中的方法使用@Bean注解来声明bean实例
@Bean
public SentimentAnalyzer sentimentAnalyzer() {
return AiServices
.create(SentimentAnalyzer.class, chatModel);
}
}
controller调用:
java
@Autowired
private SentimentAnalyzer sentimentAnalyzer;
@GetMapping("/analyzeSentiment")
public SentimentAnalyzer.SenAnalyzerResult analyzeSentiment(String message) {
// Sentiment result = sentimentAnalyzer.analyzeSentimentOf(message);
// boolean positive = sentimentAnalyzer.isPositive(message);
return sentimentAnalyzer.getSentimentAnalyzer(message);
}


2.2 从输入提取自定义对象
自定义类
java
package com.ai.LangChain4j.sentiment;
import lombok.Data;
@Data
public class Person {
private String firstName;
private String lastName;
private String birthDate;
@Override
public String toString() {
return "Person {" +
" firstName = \"" + firstName + "\"" +
", lastName = \"" + lastName + "\"" +
", birthDate = " + birthDate +
" }";
}
}
定义AiService
java
package com.ai.LangChain4j.sentiment;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;
/**
* {{it}} 是一个占位符,通常用于提示模板(Prompt Templates)中,表示将动态内容插入到提示文本里。
* 它允许开发者构建灵活的提示,其中 {{it}} 会被实际的输入变量(如用户消息)替换
*/
@AiService
public interface PersonExtractor {
@UserMessage("Extract information about a person from {{it}}.")
Person extractPersonFrom(String text);
//@UserMessage("从{{text}}中提取关于某人的信息。如果不知道具体的出生月份和日期信息,可以默认日期1月1日,如果不知道年龄,年龄可以默认为不知道。")
//String extractPersonFrom(String text);
}
注意: 返回类型时Person自定义类
创建实例并注册
java
@Bean
public PersonExtractor personExtractor() {
return AiServices
.create(PersonExtractor.class, chatModel);
}
controller及其调用
java
@Autowired
private PersonExtractor personExtractor;
@ResponseBody
@GetMapping(path = "/extractPersonFrom",produces = "application/json;charset=utf-8")
public Person extractPersonFrom(String message) throws JsonProcessingException {
if (message == null || message.isEmpty()) {
message = "In 1968, amidst the fading echoes of Independence Day, "
+ "a child named John arrived under the calm evening sky. "
+ "This newborn, bearing the surname Doe, marked the start of a new journey.";
// 返回 { firstName = "John", lastName = "Doe", birthDate = 1968-07-04 }
}
return personExtractor.extractPersonFrom(message);
}
返回:


2.3 从输入提取数值或数字
定义AiService
java
package com.ai.LangChain4j.sentiment;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;
import java.math.BigDecimal;
import java.math.BigInteger;
@AiService
public interface NumberExtractor {
@UserMessage("Extract number from {{it}}")
int extractInt(String text);
@UserMessage("Extract number from {{it}}")
long extractLong(String text);
@UserMessage("Extract number from {{it}}")
BigInteger extractBigInteger(String text);
@UserMessage("Extract number from {{it}}")
float extractFloat(String text);
@UserMessage("Extract number from {{it}}")
double extractDouble(String text);
@UserMessage("Extract number from {{it}}")
BigDecimal extractBigDecimal(String text);
}
创建实例并注册:
java
@Bean
public NumberExtractor numberExtractor() {
return AiServices
.create(NumberExtractor.class, chatModel);
}
定义controller:
java
@Autowired
private NumberExtractor numberExtractor;
@GetMapping(path = "/extractNumberFrom")
public double extractNumberFrom(String message) throws JsonProcessingException {
System.out.println("提取int = " + numberExtractor.extractInt(message));
System.out.println("提取big int = " + numberExtractor.extractBigInteger(message));
System.out.println("提取BigDecimal = " + numberExtractor.extractBigDecimal(message));
return numberExtractor.extractDouble(message);
}

2.4 对输入翻译成任意国家语言或总结要点
定义AiService
java
package com.ai.LangChain4j.sentiment;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;
import java.util.List;
@AiService
public interface TranslatorUtils {
@SystemMessage("你是一名 {{language}}语言方面专业翻译专家。")
@UserMessage("请将文本{{text}}翻译成{{language}}")
String translate(@V("text") String text, @V("language") String language);
@SystemMessage("You are a professional translator into {{language}}")
@UserMessage("Translate the following text: {{text}}")
String translate2(@V("text") String text, @V("language") String language);
@SystemMessage("将用户每条消息以{{n}}个要点的形式总结。仅提供要点。")
List<String> summarize(@UserMessage String text, @V("n") int n);
}
创建实例
java
@Bean
public TranslatorUtils translatorUtils() {
return AiServices
.create(TranslatorUtils.class, chatModel);
}
定义controller内容:
java
@Autowired
private TranslatorUtils translatorUtils;
/**
* 翻译
* @param message
* @param language English,Chinese
* @return
*http://127.0.0.1:8886/sentiment/translate?message=大家好,我是赵阳,一位23岁的年轻人。我性别男,喜欢滑雪,画画,看电影。&language=Chinese
*Hello everyone, I am Zhao Yang, a 23-year-old young man. I am male, and I enjoy skiing, painting, and watching movies.
*
*/
@GetMapping("/translate")
public String translate(String message,String language) {
return translatorUtils.translate(message, language);
}
@GetMapping("/translate2")
public String translate2(String message,String language) {
return translatorUtils.translate2(message, language);
}
/**
*
* @param message
* @param n
* @return
* *http://127.0.0.1:8886/sentiment/summarize?message=大家好,我是赵阳,一位23岁的年轻人。我性别男,喜欢滑雪,画画,看电影。&n = 3
*
*/
@ResponseBody
@GetMapping("/summarize")
public List<String> summarize(String message, int n) {
return translatorUtils.summarize(message, n);
}
返回结果



当使用英文作为提示词时(@UserMessage 和 @SystemMessage 是构建 AI 服务时控制提示词(Prompt)的核心注解)



注: 如果全中文语境下的用户,使用中文作为提示词比较好。
2.4 对输入进行要点提取
对下面内容提取5点关键点:
在处理自然语言处理(NLP)和生成式人工智能任务时,
langchain4j可能不是一个广泛认知的库或工具。通常,当我们谈论与自然语言相关的库或框架时,langchain是一个更为常见的名称。langchain是一个由 Hugging Face 开发的 Python 库,主要用于构建复杂的语言处理模型和应用。

三、提示词注解
@UserMessage 和 @SystemMessage 是构建 AI 服务时控制提示词(Prompt)的核心注解
- 通过
@SystemMessage实现角色扮演(如作家、法律顾问),动态参数通过{``{变量}}注入。 SystemMessage作为系统指令影响 AI 行为,UserMessage处理用户输入
