Skip to content
xiaoyang 的头像xiaoyang发布于 2025-01-165,796 字阅读约 19 分钟浏览加载中

Spring Boot 集成 ​

LangChain4j 提供了 Spring Boot starters 用于:

Spring Boot starters 用于流行集成 ​

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

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

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

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

xml
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
    <version>1.0.0-alpha1</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 的实现)将自动创建, 您可以在需要的地方自动注入:

java
@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}
...

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

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

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

xml
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-spring-boot-starter</artifactId>
    <version>1.0.0-alpha1</version>
</dependency>

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

java
@AiService
interface Assistant {

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

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

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

java
@RestController
class AssistantController {

    @Autowired
    Assistant assistant;

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

自动组件注入 ​

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

  • ChatLanguageModel
  • StreamingChatLanguageModel
  • ChatMemory
  • ChatMemoryProvider
  • ContentRetriever
  • RetrievalAugmentor
  • 所有用 @Tool 注解的 @Component 或 @Service 类的方法 示例:
java
@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:

properties
# 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 服务注册事件 ​

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

java
@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 ​

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

java
@AiService
interface Assistant {

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

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

测试 ​

支持的版本 ​

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

示例 ​

DISCUSSION

评论区

欢迎分享你的思考、补充或问题。

基于 VitePress 搭建