在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM)的文本交互流程 ✨。本文结合 Alibaba DashScope 实践案例,从原理、代码实现到进阶用法,全面解析如何利用 Chat Model 构建智能对话应用 �
Chat Model 是 Spring AI 定义的文本对话模型接口,抽象了应用与大模型的交互逻辑:
输入 :使用 Prompt 封装用户输入,支持纯文本及多角色对话(如系统指令、用户问题)。
输出 :通过 ChatResponse 返回结构化结果,包含模型生成的文本内容及元数据(如 Token 消耗)。
交互流程 :接收 Prompt 后,Chat Model 将请求转发至后端大模型(如通义千问),基于训练数据生成响应,最终由应用处理并呈现。
跨模型适配 :通过 spring-ai-alibaba-starter 自动配置,支持无缝切换通义系列模型(QWEN_PLUS、QWEN_TURBO 等),底层网络请求与参数校验由框架统一管理。
// 自动注入 ChatModel 实例(由 spring-ai-alibaba 自动配置)
private final ChatModel dashScopeChat;
public DashScopeChatController(ChatModel dashScopeChat) {
this.dashScopeChat = dashScopeChat;
}
@GetMapping("/simpleChat")
public BaseResponse simpleChat() {
// 预设系统角色(情感专家)⚕️
String PROMOTE_CHAT = "你是一位经验丰富的情感专家,擅长处理复杂的人际关系和情感问题...";
// 调用模型并获取文本响应
ChatResponse chatResponse = dashScopeChat.call(new Prompt(PROMOTE_CHAT)); //调用模型
// 获取模型响应的文本
String text = chatResponse.getResult().getOutput().getText();
return ResultUtils.success(text);
}
核心逻辑 :通过 Prompt 传递固定指令,模型基于预设角色生成回复,适用于客服、问答机器人等场景 .
/**
* 简单对话 使用prompt作为用户的输入
* @return
*/
@PostMapping("/chatWithRole")
public CompletableFuture> ChatWithRole(@RequestBody ChatRequest chatRequest) {
return CompletableFuture.supplyAsync(() -> {
String content = chatRequest.getContent();
if (StringUtils.isBlank(content)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
String fullPrompt = PROMOTE_CHAT + "\n\n用户的问题:" + content;
ChatResponse chatResponse = dashScopeChat.call(new Prompt(fullPrompt));
String text = chatResponse.getResult().getOutput().getText();
return ResultUtils.success(text);
});
}
实践要点 ⚠️:校验用户输入合法性(如 StringUtils.isBlank),避免空参数导致的异常
/**
* 通过 ChatOptions 在每次调用中调整模型参数
* @param chatRequest
* @return
*/
@PostMapping("/chatWithOptions")
public BaseResponse ChatWithOptions(@RequestBody ChatRequest chatRequest) {
String content = chatRequest.getContent();
if (StringUtils.isBlank(content)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
String fullPrompt = PROMOTE_CHAT + "\n\n用户的问题:" + content;
Prompt prompt = new Prompt(fullPrompt, DashScopeChatOptions
.builder()
.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())
.withTemperature(0.7).withMaxToken(150)
.build());
ChatResponse chatResponse = dashScopeChat.call(prompt); //调用模型
// 获取模型响应的文本
String text = chatResponse.getResult().getOutput().getText();
return ResultUtils.success(text);
}
参数价值 :通过 Temperature 平衡回答的创造性与确定性,MaxToken 避免长文本导致的性能问题 ⚡
@PostMapping("/chatAndStringWithOptions")
public Flux ChatAndStreamWithOptions(@RequestBody ChatRequest chatRequest, HttpServletResponse response) {
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
String content = chatRequest.getContent();
if (StringUtils.isBlank(content)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
String fullPrompt = PROMOTE_CHAT + "\n\n用户的问题:" + content;
Prompt prompt = new Prompt(fullPrompt, DashScopeChatOptions
.builder()
.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())
.withTemperature(0.7).withMaxToken(150)
.build());
Flux responseStream = dashScopeChat.stream(prompt);//调用模型
// 获取模型响应的文本
return responseStream.mapNotNull(res -> res.getResult().getOutput().getText());
}
技术优势 :基于 Reactor 响应式编程,实时推送部分生成结果,提升用户交互体验 ✨,适合长文本生成场景
本文通过详细的代码示例和实践要点,全面解析了 Spring AI 中 Chat Model 的核心概念、基础使用方法以及进阶技巧 。开发者可以利用这些知识高效地构建智能对话应用,实现从简单对话到复杂交互的多样化功能 !