LangChain4j 提供了用于以下目的的 Spring Boot 启动器:
Spring Boot 启动器帮助通过属性创建和配置语言模型、嵌入模型、嵌入存储以及其他核心 LangChain4j 组件。
要使用其中一个 Spring Boot 启动器,请导入相应的依赖项。
Spring Boot 启动器依赖项的命名约定是: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-beta1</version>
</dependency>
然后,您可以在 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
...
在这种情况下,将自动创建一个 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);
}
}
如果您需要一个 StreamingChatLanguageModel 实例,可以使用 streaming-chat-model 属性,而不是 chat-model 属性:
langchain4j.open-ai.streaming-chat-model.api-key=${OPENAI_API_KEY}
...
LangChain4j 提供了一个 Spring Boot 启动器,用于自动配置 AI Services、RAG、工具等。
假设您已经导入了其中一个集成启动器(见上文),然后导入 langchain4j-spring-boot-starter:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.0.0-beta1</version>
</dependency>
现在,您可以定义 AI Services 接口,并使用 @AiService 注解:
@AiService
interface Assistant {
@SystemMessage("You are a polite assistant")
String chat(String userMessage);
}
可以将其视为标准的 Spring Boot @Service,但是具有 AI 能力。
当应用程序启动时,LangChain4j 启动器将扫描类路径并找到所有使用 @AiService 注解的接口。对于每个找到的 AI Services,启动器会使用应用程序上下文中可用的所有 LangChain4j 组件创建此接口的实现,并将其注册为一个 Bean,以便在需要时进行自动注入:
@RestController
class AssistantController {
@Autowired
Assistant assistant;
@GetMapping("/chat")
public String chat(String message) {
return assistant.chat(message);
}
}
如果应用程序上下文中有以下组件,它们将自动注入到 AI Services 中(如果可用):
例如:
@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);
}
}
注意:如果应用程序上下文中存在多个相同类型的组件,应用程序将无法启动。在这种情况下,请使用显式注入模式(在下面解释)。
如果您有多个 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);
}
注意:在这种情况下,您必须显式指定所有组件。
更多详细信息请查看这里。
在以声明式方式完成 AI Services 的开发后,您可以通过实现 ApplicationListener 接口来监听 AiServiceRegisteredEvent 事件。该事件在 AI Services 注册到 Spring 上下文时触发,允许您在运行时获取所有已注册的 AI Services 及其工具的信息。以下是一个示例:
@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));
}
}
}
在流式处理时,您可以使用 Flux 作为 AI Services 的返回类型:
@AiService
interface Assistant {
@SystemMessage("You are a polite assistant")
Flux<String> chat(String userMessage);
}
为此,请导入 langchain4j-reactor 模块。有关更多详细信息,请参阅此处。
为了启用 ChatLanguageModel 或 StreamingChatLanguageModel bean 的可观察性,您需要声明一个或多个 ChatModelListener bean:
@Configuration
class MyConfiguration {
@Bean
ChatModelListener chatModelListener() {
return new ChatModelListener() {
private static final Logger log = LoggerFactory.getLogger(ChatModelListener.class);
@Override
public void onRequest(ChatModelRequestContext requestContext) {
log.info("onRequest(): {}", requestContext.chatRequest());
}
@Override
public void onResponse(ChatModelResponseContext responseContext) {
log.info("onResponse(): {}", responseContext.chatResponse());
}
@Override
public void onError(ChatModelErrorContext errorContext) {
log.info("onError(): {}", errorContext.error().getMessage());
}
};
}
}
应用上下文中的每个 ChatModelListener bean 将自动注入到通过我们的 Spring Boot 启动器创建的所有 ChatLanguageModel 和 StreamingChatLanguageModel bean 中。
LangChain4j Spring Boot 集成要求 Java 17 和 Spring Boot 3.2。