LangChain4J Spring Boot 集成 LLMs

LangChain4J Spring Boot 集成 LLMs

LangChain4j 提供了用于以下目的的 Spring Boot 启动器:

  • 流行的集成
  • 声明式 AI Services
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}
...
Spring Boot 启动器用于声明式 AI Services

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 中(如果可用):

  • 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);
    }
}

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

显式组件注入

如果您有多个 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 服务注册事件

在以声明式方式完成 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

在流式处理时,您可以使用 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。

示例
  • 使用 ChatLanguageModel API 的低层次 Spring Boot 示例
  • 使用 AI Services 的高层次 Spring Boot 示例
  • 使用 Spring Boot 的代理示例

你可能感兴趣的:(LangChain4J,解读,spring,boot,java)