3.会话功能-AiServices工具类

1.引入AiService依赖

<!-- Ai Service相关的依赖 -->

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-spring-boot-starter</artifactId>

<version>1.0.1-beta6</version>

</dependency>

java 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>langchain4j-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>langchain4j-demo</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>17</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
            <version>1.0.1-beta6</version>
        </dependency>
        <!-- Ai Service相关的依赖 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
            <version>1.0.1-beta6</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
java 复制代码
/**
 * @descrition 声明接口
 * @date 2025/11/26
 */
public interface ConsultantService {
    //用于聊天的方法
    public String chat(String message);
}
java 复制代码
@Configuration
public class CommonConfig {
    @Autowired
    private OllamaChatModel model;

    @Bean
    public ConsultantService consultantService() {
        //使用AiServices为接口创建代理对象
        return AiServices.builder(ConsultantService.class)
                .chatModel(model)
                .build();
    }
}
java 复制代码
 @Autowired
    private ConsultantService consultantService;

    @GetMapping("/chat")
    public String chat(String message) {
        String chat = consultantService.chat(message);
        return chat;
    }

http://localhost:8080/model/chat?message=%E6%9F%B3%E5%B2%A9%E6%BC%82%E4%BA%AE%E5%90%97

java 复制代码
2025-11-26T23:12:36.829+08:00  INFO 9284 --- [nio-8080-exec-1] d.l.http.client.log.LoggingHttpClient    : HTTP request:
- method: POST
- url: http://localhost:11434/api/chat
- headers: [Content-Type: application/json]
- body: {
  "model" : "qwen3:0.6b",
  "messages" : [ {
    "role" : "user",
    "content" : "柳岩漂亮吗"
  } ],
  "options" : {
    "stop" : [ ]
  },
  "stream" : false,
  "tools" : [ ]
}

2025-11-26T23:12:53.105+08:00  INFO 9284 --- [nio-8080-exec-1] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [Content-Type: application/json; charset=utf-8], [Date: Wed, 26 Nov 2025 15:12:53 GMT], [Transfer-Encoding: chunked]
- body: {"model":"qwen3:0.6b","created_at":"2025-11-26T15:12:53.0460856Z","message":{"role":"assistant","content":"关于"柳岩漂亮吗",需要先明确您指的是柳岩这个人的外貌,还是其他事物。如果您是想了解柳岩的外貌特征,可以告诉我一些具体方面,比如五官、气质、发型等,我可以为您提供更详细的描述。如果涉及其他方面,比如柳树的象征意义,也可以告诉我,我可以解释相关背景。您更想从哪方面入手呢?","thinking":"嗯,用户问"柳岩漂亮吗",首先我需要确定用户想询问的是柳岩这个人的形象还是其他事物。可能用户是想了解柳岩的外貌,或者想表达对柳岩的评价。不过根据中文的表达习惯,"柳岩"可能是一个人名,或者是一个比喻,比如柳树,用来形容某人或某事物。\n\n首先,我需要确认用户的具体需求。如果是关于柳岩的外貌,可能需要提供一些关于她外表的描述,比如五官、肤色、发型等。如果是关于柳树的比喻,可能需要解释柳树的特点,或者用户想表达对柳树的赞美。但根据问题的结构,用户可能是在询问柳岩的外貌,或者想表达对柳岩的看法。\n\n另外,用户的问题可能带有情感色彩,比如是否漂亮,可能需要考虑用户的个人感受或背景。如果用户是想了解柳岩的外貌,可能需要提供一些具体的例子或描述,或者询问用户自己对柳岩的看法。但根据问题本身,可能需要直接回答,但可能需要更多的上下文。\n\n不过,考虑到用户的问题比较直接,可能需要直接回答,同时保持友好和开放的态度,鼓励用户进一步提供信息。例如,可以询问用户是否想了解柳岩的外貌,或者是否有其他方面需要讨论,这样用户可以根据自己的需求进行互动。\n"},"done":true,"done_reason":"stop","total_duration":16116775100,"load_duration":235510400,"prompt_eval_count":14,"prompt_eval_duration":2746462300,"eval_count":372,"eval_duration":12674198900}

声明式方式更简单

java 复制代码
@AiService(
        wiringMode = AiServiceWiringMode.EXPLICIT, //手动装配的方式
        chatModel = "ollamaChatModel") //指定模型
public interface ConsultantService {
    //用于聊天的方法
    public String chat(String message);
}

就不需要CommonConfig配置类。

**注意:**其实这里直接使用@AiService注解即可,无需指定上面的两个参数。因为从源码得知默认的wiringMode 就是手动装配方式,而且也会自动去找ioc容器中已有的模型。

java 复制代码
@AiService
public interface ConsultantService {
    //用于聊天的方法
    public String chat(String message);
}
相关推荐
代码不停2 小时前
Java单链表和哈希表题目练习
java·开发语言·散列表
Dxxyyyy2 小时前
零基础学JAVA--Day37(坦克大战1.0)
java·开发语言
OranTech2 小时前
第28节课-夕夕超市收银系统(下)-笔记
java
IDOlaoluo2 小时前
jakarta-tomcat-connectors-jk2-src.tar.gz 安装教程(详细步骤及附安装包)
java·tomcat
SheepHappy2 小时前
MyBatis-Plus 源码阅读(三)条件构造器原理深度剖析
java·源码阅读
zhaomy20252 小时前
从ThreadLocal到ScopedValue:Java上下文管理的架构演进与实战指南
java·后端
用户84913717547162 小时前
从源码看设计:Java 集合框架的安全性与性能权衡 (基于 JDK 1.8)
java·面试
华仔啊2 小时前
10分钟搞定!SpringBoot+Vue3 整合 SSE 实现实时消息推送
java·vue.js·后端
l***77522 小时前
总结:Spring Boot 之spring.factories
java·spring boot·spring