伴随着大模型应用的兴起,webflux逐渐引起关注。为了以java的方式运行AI应用,让我们一起学习webflux集成langchain4j吧。
1. 项目依赖
首先,你需要在 pom.xml
中添加必要的依赖:
<dependencies>
<!-- Spring WebFlux -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>last version</version>
</dependency>
<!-- LangChain4j -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>last version</version>
</dependency>
</dependencies>
2. 创建配置类
创建一个配置类来初始化 LangChain4j 的 OpenAiChatModel
:
import dev.langchain4j.agent.tool.ToolExecutor;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
@Configuration
public class LangChain4jConfig {
@Value("${openai.api.key:xxxxxx}")
private String openaiApiKey;
@Bean
public ChatLanguageModel chatLanguageModel() {
return OpenAiChatModel.withApiKey(openaiApiKey)
.setMaxTokens(2048)
.setTemperature(0.7)
.setTimeout(Duration.ofSeconds(30))
.build();
}
}
3. 创建服务类
创建一个服务类来处理与大语言模型的交互:
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import java.util.List;
@Service
public class LangChain4jService {
private final ChatLanguageModel chatLanguageModel;
public LangChain4jService(ChatLanguageModel chatLanguageModel) {
this.chatLanguageModel = chatLanguageModel;
}
public Mono<String> generateResponse(String input) {
UserMessage userMessage = UserMessage.from(input);
return Mono.fromCallable(() -> {
List<ChatMessage> messages = List.of(userMessage);
return chatLanguageModel.generate(messages).text();
});
}
public Flux<String> generateResponseStream(String input) {
UserMessage userMessage = UserMessage.from(input);
List<ChatMessage> messages = List.of(userMessage);
return Flux.fromStream(chatLanguageModel.generateStream(messages)
.map(part -> part.text()));
}
}
4. 创建控制器类
创建一个控制器类来暴露 Web 接口:
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/api")
public class LangChain4jController {
private final LangChain4jService langChain4jService;
public LangChain4jController(LangChain4jService langChain4jService) {
this.langChain4jService = langChain4jService;
}
@PostMapping(value = "/chat", consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaType.TEXT_PLAIN_VALUE)
public Mono<String> chat(@RequestBody String input) {
return langChain4jService.generateResponse(input);
}
@PostMapping(value = "/chat/stream", consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> chatStream(@RequestBody String input) {
return langChain4jService.generateResponseStream(input);
}
}
5. 运行项目
创建一个 Spring Boot 应用主类并运行:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringWebFluxLangChain4jApplication {
public static void main(String[] args) {
SpringApplication.run(SpringWebFluxLangChain4jApplication.class, args);
}
}
6. 测试服务
使用工具(如 Postman)向 http://localhost:8080/api/chat
发送 POST 请求,请求体为你要询问的问题,例如:
curl -X POST -H "Content-Type: text/plain" -d "hello" http://localhost:8080/api/chat
代码解释
- 配置类:
LangChain4jConfig
类初始化了OpenAiChatModel
,并设置了一些参数,如最大令牌数、温度和超时时间。 - 服务类:
LangChain4jService
类封装了与大语言模型的交互逻辑,通过generateResponse
方法接收用户输入并返回模型生成的响应。 - 控制器类:
LangChain4jController
类暴露了一个/api/chat
的 POST 接口,接收用户输入并调用LangChain4jService
处理请求。