038-Spring AI Alibaba VLLM Chat 功能完整案例

本案例将引导您一步步构建一个 Spring Boot 应用,演示如何利用 Spring AI Alibaba 集成 VLLM 模型,实现多种聊天交互方式,包括简单聊天、流式聊天和自定义参数聊天。
1. 案例目标
我们将创建一个包含三个核心功能的 Web 应用:
- 简单聊天 (
/vllm/chat-model/simple/chat):最基本的大模型调用方式,不传入任何自定义参数。 - 流式聊天 (
/vllm/chat-model/stream/chat):实现打字机效果的流式输出,提升用户体验。 - 自定义参数聊天 (
/vllm/chat-model/custom/chat):通过编程方式自定义大模型参数,如温度、最大令牌数等。
2. 技术栈与核心依赖
- Spring Boot 3.x
- Spring AI (用于对接 OpenAI 兼容接口,包括 VLLM)
- Maven (项目构建工具)
在 pom.xml 中,你需要引入以下核心依赖:
<dependencies><!-- Spring Web 用于构建 RESTful API --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI OpenAI 兼容接口,用于对接 VLLM --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency>
</dependencies>3. 项目配置
在 src/main/resources/application.yml 文件中,配置 VLLM 服务的连接信息。
server:port: 10003spring:application:name: spring-ai-alibaba-vllm-chat-model-exampleai:openai:api-key: ${OPENAI_API_KEY} # VLLM 服务的 API Keybase-url: https://api.openai-hk.com # VLLM 服务的访问地址重要提示:请将 OPENAI_API_KEY 环境变量设置为你从 VLLM 服务获取的有效 API Key。你也可以直接将其写在配置文件中,但这不推荐用于生产环境。
4. 编写 Java 代码
4.1 VllmChatModelApplication.java
Spring Boot 应用程序入口类。
package com.alibaba.cloud.ai.example.chat.vllm;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class VllmChatModelApplication {public static void main(String[] args) {SpringApplication.run(VllmChatModelApplication.class, args);}
}4.2 VllmChatModelController.java
实现三种聊天交互方式的控制器类。
package com.alibaba.cloud.ai.example.chat.vllm.controller;import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
@RequestMapping("/vllm/chat-model")
public class VllmChatModelController {private static final String DEFAULT_PROMPT = "你好,介绍下你自己吧。";private static final String JSON_OUTPUT_PROMPT = "how can I solve 8x + 7 = -23";private final ChatModel ChatModel;public VllmChatModelController(ChatModel chatModel) {this.ChatModel = chatModel;}/*** 最简单的使用方式,没有任何 LLMs 参数注入。** @return String types.*/@GetMapping("/simple/chat")public String simpleChat() {return ChatModel.call(new Prompt(DEFAULT_PROMPT)).getResult().getOutput().getText();}/*** Stream 流式调用。可以使大模型的输出信息实现打字机效果。** @return Flux<String> types.*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response) {// 避免返回乱码response.setCharacterEncoding("UTF-8");Flux<ChatResponse> chatResponseFlux = ChatModel.stream(new Prompt(DEFAULT_PROMPT));return chatResponseFlux.map(resp -> resp.getResult().getOutput().getText());}/*** 使用编程方式自定义 LLMs ChatOptions 参数, {@link org.springframework.ai.openai.OpenAiChatOptions}* 优先级高于在 application.yml 中配置的 LLMs 参数!*/@GetMapping("/custom/chat")public String customChat() {OpenAiChatOptions customOptions = OpenAiChatOptions.builder().topP(0.7).model("111").maxTokens(1000).temperature(0.8).build();return ChatModel.call(new Prompt(DEFAULT_PROMPT, customOptions)).getResult().getOutput().getText();}
}5. 运行与测试
- 启动应用:运行你的 Spring Boot 主程序。
- 使用浏览器或 API 工具(如 Postman, curl)进行测试。
测试 1:简单聊天
访问以下 URL,进行最基本的聊天交互。
http://localhost:10003/vllm/chat-model/simple/chat预期响应:
你好!我是一个基于大型语言模型的AI助手,可以回答问题、提供信息和帮助解决各种问题。我的知识涵盖了广泛的领域,包括科学、历史、文化、技术等等。如果你有任何问题或需要帮助,请随时告诉我,我会尽力提供有用的回答。
测试 2:流式聊天
访问以下 URL,体验流式输出的打字机效果。
http://localhost:10003/vllm/chat-model/stream/chat预期响应:
你
好
!
我
是
一
个
基
于
大
型
语
言
模
型
的
A
I
助
手
,
可
以
回
答
问
题
、
提
供
信
息
和
帮
助
解
决
各
种
问
题
。
测试 3:自定义参数聊天
访问以下 URL,使用自定义参数进行聊天。
http://localhost:10003/vllm/chat-model/custom/chat预期响应:
你好!我是一个AI助手,基于大型语言模型技术构建。我能够理解和生成人类语言,回答各种问题,提供信息,并帮助解决各种任务。我的知识库涵盖了广泛的领域,包括科学、历史、文化、技术等。如果你有任何问题或需要帮助,请随时告诉我,我会尽力提供有用的回答。
6. 实现思路与扩展建议
实现思路
本案例的核心思想是通过 Spring AI 简化与 VLLM 服务的集成。Spring AI 提供了统一的 API 接口,使得我们可以轻松切换不同的模型提供商,而无需修改业务代码。这使得:
- 代码简洁:通过 Spring AI 的抽象,我们无需处理底层的 HTTP 请求和响应处理。
- 易于扩展:可以轻松添加新的聊天功能,如多轮对话、上下文管理等。
- 参数灵活:既可以在配置文件中设置全局参数,也可以在代码中动态调整单个请求的参数。
扩展建议
- 多轮对话管理:实现会话管理,支持多轮对话,保持上下文连贯性。
- 参数动态调整:根据不同的业务场景,动态调整模型参数,如温度、最大令牌数等。
- 模型选择:支持在多个 VLLM 模型之间动态切换,根据任务类型选择最合适的模型。
- 结果缓存:对于常见问题,实现结果缓存,提高响应速度并降低 API 调用成本。
- 错误处理与重试:增强错误处理机制,实现自动重试和降级策略。
- 安全与认证:添加 API 访问认证、请求限流等安全机制。
