AI大模型实用(八)Java快速实现智能体整理(使用LangChain4j-agentic来进行情感分析/分类)

一、情感分析及其应用场景

百度百科给「情感分析」的定义:

情感分析是人工智能领域中计算语言学的分支,属于自然语言处理的核心内容,其定义为通过自动技术判定文本中观点持有者对特定话题的情感倾向或态度(如褒贬性判断)。该方法主要依赖文本预处理、特征标注、模型训练等流程,++可分为基于情感词典、机器学习和深度学习的分析方法++++应用场景覆盖舆情监测、电子商务、客服系统及精神健康等领域,并与情感计算技术协同实现多情感理解 。++

应用场景:

客户反馈分析 :将客户评价分类为正面、中立或负面。

社交媒体监控 :分析社交媒体评论中的情绪趋势。

聊天机器人回复 :了解用户情绪,提供更好的回复。

二、情感分析示例

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 处理用户输入
相关推荐
开开心心_Every2 小时前
优化C盘存储:自定义软件文档保存路径工具
java·网络·数据库·typescript·word·asp.net·excel
m0_692457102 小时前
ROI切割-感兴趣区域
人工智能·深度学习·计算机视觉
love530love2 小时前
Win11+RTX3090 亲测 · ComfyUI Hunyuan3D 全程实录 ③:diso 源码编译实战(CUDA 13.1 零降级)
开发语言·人工智能·windows·python·comfyui·hunyuan3d·diso
落羽的落羽2 小时前
【C++】深入浅出“图”——图的遍历与最小生成树算法
linux·服务器·c++·人工智能·算法·机器学习·深度优先
qq_377112372 小时前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(2)-06
java·开发语言·jvm
用户2190326527352 小时前
别再到处try-catch了!SpringBoot全局异常处理这样设计
java·spring boot·后端
独自归家的兔2 小时前
Qwen3-Omni-Captioner:通义千问 3-Omni 基座的智能音频描述开源模型
人工智能·语音识别
yesyesyoucan2 小时前
AI证件照生成技术全解析:人脸识别、背景分割与格式合规性实现方案
人工智能·考研·高考
李少兄2 小时前
深入理解 Java Web 开发中的 HttpServletRequest 与 HttpServletResponse
java·开发语言·前端