当前位置: 首页 > news >正文

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 阿里云密钥配置

  1. 登录阿里云百炼控制台

  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 安全防护策略

  1. 输入过滤

@GetMapping("/safe-stream")
public Flux<String> safeStream(@RequestParam @Valid @Size(max=500) String input) {// 自动校验输入长度
}
  1. 速率限制

@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 典型业务场景

  1. 智能客服

    @Prompt("你是{company}客服,请处理以下问题:{input}")
    Flux<String> handleComplaint();
  2. 代码生成

    @PromptTemplate("生成{language}代码实现:{requirement}")
    Mono<String> generateCode();

项目效果截图:

本文代码已通过以下环境验证:

  • JDK 17.0.8

  • Spring Boot 3.3.4

  • Qwen-72B-Chat模型
    完整示例代码已上传Java调用LLM大模型 - 基于 Spring AI 实现

相关文章:

  • 中间件--ClickHouse-11--部署示例(Linux宿主机部署,Docker容器部署)
  • 研一自救指南 - 07. CSS面向面试学习
  • MySQL如何实现行行比较
  • php多种方法实现xss过滤
  • 工厂模式具体应用在什么场景?
  • End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱
  • 【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景
  • 第二模块·语法迁移篇 —— 第七章 指针的消亡与引用的新生:从内存操作到对象访问的革命
  • 商标起名换了暗示词,通过初审!
  • Linux系统中的网络管理
  • SQL系列:常用函数
  • 每日OJ_牛客_最小差值_排序_C++_Java
  • ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之LCD)
  • 深入理解前端安全:CSRF与XSS攻击详解
  • 在小米AX6000中通过米家控制tailscale
  • 使用ref和refs获取DOM元素和组件方法,使用$nextTick解决Vue异步更新的逻辑下无法获取DOM的问题
  • 力扣面试150题-- 存在重复元素 II和最长连续序列
  • 系统架构设计师:计算机组成与体系结构(如CPU、存储系统、I/O系统)案例分析与简答题、详细解析与评分要点
  • 中间件--ClickHouse-12--案例-1-日志分析和监控
  • 如何0基础学stm32?
  • 全球安全倡议提出三周年,外交部介绍有关情况
  • 体坛联播|皇马补时绝杀毕尔巴鄂,利物浦最快下轮即可夺冠
  • 解放日报:订单不撤,中国工程师有能力
  • 专访|松重丰:“美食家”不孤独,他在自由地吃饭
  • 谷雨播种正当时,上海黄道婆纪念公园种下“都市棉田”
  • 一季度工业对宏观经济增长的贡献率达36.3%