package space.anyi.springAiAlibabaLearn.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import space.anyi.springAiAlibabaLearn.model.Person; @RestController @RequestMapping("/chatClient") public class ChatClientController { private final Logger log = LoggerFactory.getLogger(ChatClientController.class); private final ChatClient chatClient; public ChatClientController(ChatModel chatModel) { this.chatClient = ChatClient.create(chatModel); } @GetMapping("/chat") public String call(@RequestParam("message") String message) { log.debug("message: {}", message); return chatClient .prompt(message) .call() .chatClientResponse() .chatResponse() .getResult() .getOutput() .getText(); } @GetMapping("/prompt") public String prompt(@RequestParam("message") String message) { log.debug("message: {}", message); SystemMessage systemMessage = SystemMessage.builder().text("你是一个机器人!无论用户问什么内容,你只会回答'Java是世界上最好的语言!'.").build(); log.debug("systemMessage:{}",systemMessage); UserMessage userMessage = new UserMessage(message); log.debug("userMessage:{}",userMessage); Prompt prompt = Prompt.builder() .messages(systemMessage,userMessage) .chatOptions( ChatOptions.builder() .maxTokens(4096) .temperature(0.2) .build() ) .build(); log.debug("prompt: {}", prompt); ChatResponse chatResponse = chatClient .prompt(prompt) .call() .chatClientResponse() .chatResponse(); log.debug("chatResponse: {}", chatResponse); return chatResponse.getResult().getOutput().getText(); } @GetMapping("/stream") public Flux stream(@RequestParam("message") String message) { log.debug("message: {}", message); return chatClient .prompt(message) .stream() .chatClientResponse() .doOnNext(chatClientResponse -> { String text = chatClientResponse.chatResponse().getResult().getOutput().getText(); log.debug("res:{}",text); }) .map(chatClientResponse -> chatClientResponse.chatResponse().getResult().getOutput().getText()); } @GetMapping("/entity") public Person entity(){ //将LLM的输出转换为Java对象 /** * 内部会在prompt中追加Person类的结构消息,并要求LLM输出符合格式的JSON字符串 */ return chatClient .prompt("生成一个人的消息.") .call() .entity(Person.class); } }