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>
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
...
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);
}
}
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}
...
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>
2
3
4
5
现在,您可以定义 AI 服务接口并使用 @AiService
注解它:
@AiService
interface Assistant {
@SystemMessage("You are a polite assistant")
String chat(String userMessage);
}
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);
}
}
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);
}
}
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);
}
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));
}
}
}
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);
}
2
3
4
5
6
为此,请导入 langchain4j-reactor
模块。 更多详情请参见 这里。
# 测试
# 支持的版本
LangChain4j Spring Boot 集成要求 Java 17 和 Spring Boot 3.2。