Java调用LLM大模型 - 基于 Spring AI 实现
Spring AI Alibaba实战:Java集成通义千问构建流式对话应用
一、Spring AI核心架构解析
1.1 框架定位与优势对比
graph TDA[Spring AI] --> B[统一API接口]A --> C[多模型支持]A --> D[企业级特性]B --> E(OpenAI/Azure/阿里云)C --> F(LLaMA/Qwen/Gemini)D --> G(安全审计/监控指标)
1.2 技术栈组成
组件 | 功能描述 | 对应Spring生态 |
---|---|---|
ChatClient | 标准化对话接口 | JdbcTemplate |
PromptTemplate | 动态提示词管理 | Thymeleaf |
EmbeddingClient | 向量计算支持 | Spring Data |
AudioClient | 语音处理能力 | Spring Integration |
二、环境准备与项目初始化
2.1 开发环境要求
# 验证环境 java -version # 要求17+ mvn -v # 3.6.3+ docker info # 可选容器化部署
2.2 阿里云密钥配置
-
登录阿里云百炼控制台
-
创建API Key并设置环境变量:
# Linux/Mac export AI_DASHSCOPE_API_KEY="sk-xxxxxxxx"# Windows(PowerShell) $env:AI_DASHSCOPE_API_KEY="sk-xxxxxxxx"
三、SpringBoot集成实战
3.1 POM关键配置
<!-- 仓库配置 --> <repositories><repository><id>spring-snapshots</id><url>https://repo.spring.io/snapshot</url></repository> </repositories><!-- 依赖配置 --> <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2</version></dependency><!-- 流式响应支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency> </dependencies>
运行 HTML
3.2 应用配置(application.yml)
spring:ai:dashscope:api-key: ${AI_DASHSCOPE_API_KEY}chat:options:model: qwen-max # 可选qwen-plus/qwen-turbotemperature: 0.7
四、核心代码实现
4.1 流式对话控制器
@RestController @RequestMapping("/ai") @CrossOrigin public class ChatController {private final StreamingChatClient chatClient;@Autowiredpublic ChatController(StreamingChatClient.Builder builder) {this.chatClient = builder.build();}@GetMapping("/stream")public Flux<String> streamChat(@RequestParam String question,@RequestParam(defaultValue = "false") boolean markdown) {String template = markdown ? "请用Markdown格式回答:{input}" : "{input}";Prompt prompt = new PromptTemplate(template).create(Map.of("input", question));return chatClient.stream(prompt).map(ChatResponse::getResults).flatMapIterable(list -> list).map(content -> content.getOutput().getContent());} }
4.2 增强型提示词模板
// resources/prompts/qa.st 你是专业IT顾问,请用中文回答技术问题。 用户问题:${input} 回答要求: 1. 包含代码示例 2. 给出参考资料链接 3. 使用${markdown ? 'Markdown' : '纯文本'}格式
五、前端集成方案
5.1 React流式接收实现
function ChatBox() {const [messages, setMessages] = useState([]);const handleSend = async (question) => {const response = await fetch(`/ai/stream?question=${encodeURIComponent(question)}&markdown=true`);const reader = response.body.getReader();const decoder = new TextDecoder();let fullResponse = '';while (true) {const { done, value } = await reader.read();if (done) break;const chunk = decoder.decode(value);fullResponse += chunk;setMessages([...messages, {id: Date.now(),content: fullResponse,isBot: true}]);}};return (<div className="chat-container"><MessageList messages={messages} /><InputArea onSend={handleSend} /></div>); }
六、生产环境最佳实践
6.1 性能优化方案
优化方向 | 具体措施 | 预期收益 |
---|---|---|
连接池 | 配置HTTP连接复用 | 降低30%延迟 |
缓存 | 启用Response缓存(Spring Cache) | 减少API调用 |
熔断机制 | 集成Resilience4j | 提高可用性 |
6.2 安全防护策略
-
输入过滤:
@GetMapping("/safe-stream") public Flux<String> safeStream(@RequestParam @Valid @Size(max=500) String input) {// 自动校验输入长度 }
-
速率限制:
@Bean RateLimiterRegistry rateLimiter() {return RateLimiterRegistry.custom().add("qwen-api", RateLimiterConfig.custom().limitForPeriod(50).limitRefreshPeriod(Duration.ofMinutes(1)).build()).build(); }
七、扩展应用场景
7.1 企业级应用架构
graph LRA[前端] --> B[API Gateway]B --> C{Spring AI Router}C -->|普通问答| D[Qwen]C -->|技术文档| E[LLaMA-3]C -->|安全审核| F[阿里云内容安全]
7.2 典型业务场景
-
智能客服:
@Prompt("你是{company}客服,请处理以下问题:{input}") Flux<String> handleComplaint();
-
代码生成:
@PromptTemplate("生成{language}代码实现:{requirement}") Mono<String> generateCode();
项目效果截图:
本文代码已通过以下环境验证:
JDK 17.0.8
Spring Boot 3.3.4
Qwen-72B-Chat模型
完整示例代码已上传Java调用LLM大模型 - 基于 Spring AI 实现