伴随着大模型应用的兴起,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;@Beanpublic 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
处理请求。