Yang's blog Yang's blog
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xiaoyang

编程爱好者
首页
Java
密码学
机器学习
命令手册
关于
友链
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • SpringCloud

    • 微服务架构介绍
    • SpringCloud介绍
    • Spring Cloud:生产者与消费者
    • Spring Cloud Eureka:构建可靠的服务注册与发现
    • Spring Cloud Ribbon:负载均衡
    • Spring Cloud Fegin:服务调用
    • Spring Cloud Hystrix:熔断器
    • Spring Cloud Zuul:统一网关路由
    • Spring Cloud Config:配置中心
  • Java后端框架

    • LangChain4j

      • 介绍
      • 快速开始
      • Chat and Language Models
      • Chat Memory
      • Model Parameters
      • Response Streaming
      • AI Services
      • Agent
      • Tools (Function Calling)
      • RAG
      • Structured Outputs
      • Classification
      • Embedding (Vector) Stores
      • Image Models
      • Quarkus Integration
      • Spring Boot Integration
        • Spring Boot starters 用于流行集成
        • Spring Boot starter 用于声明式 AI 服务
          • 自动组件注入
          • 显式组件注入
          • 监听 AI 服务注册事件
        • Flux
        • 测试
        • 支持的版本
        • 示例
      • Kotlin Support
      • Logging
      • Observability
      • Testing and Evaluation
      • Model Context Protocol
  • 八股文

    • 操作系统
    • JVM介绍
    • Java多线程
    • Java集合框架
    • Java反射
    • JavaIO
    • Mybatis介绍
    • Spring介绍
    • SpringBoot介绍
    • Mysql
    • Redis
    • 数据结构
    • 云计算
    • 设计模式
    • 计算机网络
    • 锁核心类AQS
    • Nginx
  • 前端技术

    • 初识Vue3
    • Vue3数据双向绑定
    • Vue3生命周期
    • Vue-Router 组件
    • Pinia 集中式状态存储
  • 中间件

    • RocketMQ
  • 开发知识

    • 请求参数注解
    • 时间复杂度和空间复杂度
    • JSON序列化与反序列化
    • Timestamp vs Datetime
    • Java开发中必备能力单元测试
    • 正向代理和反向代理
    • 什么是VPN
    • 正则表达式
  • Java
  • Java后端框架
  • LangChain4j
xiaoyang
2025-01-16
目录

Spring Boot Integration

# Spring Boot 集成

LangChain4j 提供了 Spring Boot starters (opens new window) 用于:

  • 流行集成
  • 声明式的 AI 服务

# Spring Boot starters 用于流行集成

Spring Boot starters 帮助通过属性创建和配置 语言模型 (opens new window), 嵌入模型 (opens new window), 嵌入存储 (opens new window), 以及其他核心 LangChain4j 组件。

要使用某个 Spring Boot starter,导入相应的依赖。

Spring Boot starter 依赖的命名约定是:langchain4j-{integration-name}-spring-boot-starter。

例如,对于 OpenAI(langchain4j-open-ai),依赖名称应为 langchain4j-open-ai-spring-boot-starter:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-alpha1</version>
</dependency>
1
2
3
4
5

然后,您可以在 application.properties 文件中配置模型参数,如下所示:

langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai.chat-model.model-name=gpt-4o
langchain4j.open-ai.chat-model.log-requests=true
langchain4j.open-ai.chat-model.log-responses=true
...
1
2
3
4
5

在这种情况下,OpenAiChatModel(一个 ChatLanguageModel 的实现)将自动创建, 您可以在需要的地方自动注入:

@RestController
public class ChatController {

    ChatLanguageModel chatLanguageModel;

    public ChatController(ChatLanguageModel chatLanguageModel) {
        this.chatLanguageModel = chatLanguageModel;
    }

    @GetMapping("/chat")
    public String model(@RequestParam(value = "message", defaultValue = "Hello") String message) {
        return chatLanguageModel.generate(message);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

如果您需要一个 StreamingChatLanguageModel 实例, 请使用 streaming-chat-model 代替 chat-model 属性:

langchain4j.open-ai.streaming-chat-model.api-key=${OPENAI_API_KEY}
...
1
2

# Spring Boot starter 用于声明式 AI 服务

LangChain4j 提供了一个 Spring Boot starter,用于自动配置 AI 服务, RAG, 工具 等。

假设您已经导入了某个集成 starter(见上文), 导入 langchain4j-spring-boot-starter:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
    <version>1.0.0-alpha1</version>
</dependency>
1
2
3
4
5

现在,您可以定义 AI 服务接口并使用 @AiService 注解它:

@AiService
interface Assistant {

    @SystemMessage("You are a polite assistant")
    String chat(String userMessage);
}
1
2
3
4
5
6

将其视为一个标准的 Spring Boot @Service,但具有 AI 能力。

当应用程序启动时,LangChain4j starter 将扫描类路径 并找到所有用 @AiService 注解的接口。 对于每个找到的 AI 服务,它将使用应用上下文中所有可用的 LangChain4j 组件创建该接口的实现,并将其注册为一个 bean, 这样您就可以在需要的地方自动注入:

@RestController
class AssistantController {

    @Autowired
    Assistant assistant;

    @GetMapping("/chat")
    public String chat(String message) {
        return assistant.chat(message);
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 自动组件注入

以下组件将在 AI 服务中自动注入(如果它们在应用上下文中可用):

  • ChatLanguageModel
  • StreamingChatLanguageModel
  • ChatMemory
  • ChatMemoryProvider
  • ContentRetriever
  • RetrievalAugmentor
  • 所有用 @Tool 注解的 @Component 或 @Service 类的方法 示例:
@Component
public class BookingTools {

    private final BookingService bookingService;

    public BookingTools(BookingService bookingService) {
        this.bookingService = bookingService;
    }

    @Tool
    public Booking getBookingDetails(String bookingNumber, String customerName, String customerSurname) {
        return bookingService.getBookingDetails(bookingNumber, customerName, customerSurname);
    }

    @Tool
    public void cancelBooking(String bookingNumber, String customerName, String customerSurname) {
        bookingService.cancelBooking(bookingNumber, customerName, customerSurname);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

如果应用上下文中存在多个相同类型的组件,应用将无法启动。 在这种情况下,请使用显式注入模式(下文解释)。

# 显式组件注入

如果您有多个 AI 服务并希望将不同的 LangChain4j 组件注入到它们中, 您可以通过显式注入模式(@AiService(wiringMode = EXPLICIT))来指定要使用的组件。

假设我们有两个已配置的 ChatLanguageModel:

# OpenAI
langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai.chat-model.model-name=gpt-4o-mini

# Ollama
langchain4j.ollama.chat-model.base-url=http://localhost:11434
langchain4j.ollama.chat-model.model-name=llama3.1
@AiService(wiringMode = EXPLICIT, chatModel = "openAiChatModel")
interface OpenAiAssistant {

    @SystemMessage("You are a polite assistant")
    String chat(String userMessage);
}

@AiService(wiringMode = EXPLICIT, chatModel = "ollamaChatModel")
interface OllamaAssistant {

    @SystemMessage("You are a polite assistant")
    String chat(String userMessage);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

在这种情况下,您必须显式指定 所有 组件。

更多详情可以在 这里 (opens new window) 找到。

# 监听 AI 服务注册事件

在您以声明式方式完成 AI 服务开发后,您可以通过实现 ApplicationListener<AiServiceRegisteredEvent> 接口来监听 AiServiceRegisteredEvent。 当 AI 服务在 Spring 上下文中注册时,将触发此事件, 允许您在运行时获取有关所有已注册的 AI 服务及其工具的信息。 以下是一个示例:

@Component
class AiServiceRegisteredEventListener implements ApplicationListener<AiServiceRegisteredEvent> {

    @Override
    public void onApplicationEvent(AiServiceRegisteredEvent event) {
        Class<?> aiServiceClass = event.aiServiceClass();
        List<ToolSpecification> toolSpecifications = event.toolSpecifications();
        for (int i = 0; i < toolSpecifications.size(); i++) {
            System.out.printf("[%s]: [Tool-%s]: %s%n", aiServiceClass.getSimpleName(), i + 1, toolSpecifications.get(i));
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# Flux

在进行流式处理时,您可以使用 Flux<String> 作为 AI 服务的返回类型:

@AiService
interface Assistant {

    @SystemMessage("You are a polite assistant")
    Flux<String> chat(String userMessage);
}
1
2
3
4
5
6

为此,请导入 langchain4j-reactor 模块。 更多详情请参见 这里。

# 测试

  • 客户支持代理的集成测试示例 (opens new window)

# 支持的版本

LangChain4j Spring Boot 集成要求 Java 17 和 Spring Boot 3.2。

# 示例

  • 低级 Spring Boot 示例 (opens new window) 使用 ChatLanguageModel API
  • 高级 Spring Boot 示例 (opens new window) 使用 AI 服务
  • 使用 Spring Boot 的客户支持代理示例 (opens new window)
编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12

← Quarkus Integration Kotlin Support→

最近更新
01
操作系统
03-18
02
Nginx
03-17
03
后端服务端主动推送消息的常见方式
03-11
更多文章>
Theme by Vdoing | Copyright © 2023-2025 xiaoyang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式