AI 大模型之spring alibaba篇

一  知识篇

1.1 常见大模型

三者之间的比较:

1.2 spirng ai baba版本对比

1.3 大模型的3要素

1.秘钥;2.模型名;3.调用地址

其中秘钥需要配置到环境变量中,防止明文显示

2.程序中引用

1.4 chatclient于chatmodel的区别联系

1.4.1 chatmodel

chat model 对话模型:接收一系列消息作为输入,与模型LLM服务进行交互,并接受返回的聊天消息作为输出,相比与普通的程序输入,模型的输入与输出消息不仅支持纯字符文本,还支持包括语音,图片,视频等作为输入输出。同时,在spring ai ailbaba中,消息中还支持包含不同的角色,帮助底层模型区分来自模型、用户和系统指令等的不同消息。

对话模型chatmodel是底层接口,直接与具体大语言模型交互,提供call()和stream()方法,适合简单大模型交互场景。

1.4.2 chatclient*

chatclient是高级封装,基于chatmodel构建,适合快速构建标准化复杂AI服务,支持同步和流式交互。集成多种高级功能。

1.4.3   chatclient和chatmodel区别

1.4.4 chatclient的使用

chatclient 不支持自动注入

解决方法:

方法1:使用构造器注入

方法2:作为bean放到spring容器中

使用@autowired引用

1.5 资料参考

二  流式处理

2.1 简介与作用

Server-Sent Events (SSE) 是一种允许服务端可以持续推送数据片段(如逐词或逐句)到前端的 Web 技术。通过单向的HTTP长连接,使用一个长期存在的连接,让服务器可以主动将数据"推"给客户端,SSE是轻量级的单向通信协议,适合AI对话这类服务端主导的场景

SSE 的核心思想是:客户端发起一个请求,服务器保持这个连接打开并在有新数据时,通过这个连接将数据发送给客户端。这与传统的请求-响应模式(客户端请求一次,服务器响应一次,连接关闭)有本质区别。SSE下一代(Stream able Http)。

2.2 适用场景

概述:sse :一种让服务器能够主动、持续地向客户端(比如你的网页浏览器)推送数据的技术。

sse非常适合需要服务器向客户端实时推送更新的场景。

1.实时通知:股票更新,新闻推送,聊天应用,系统告警

2.状态更新:长时间运行的任务进度

3.实时数据流:传感器数据,监控仪表盘

4.协作应用:显示其他用户在线状态或操作。

2.3 使用flux编程式响应案例

1.配置

2.Flux是SpringWebFlux中的一个核心组件,属于响应式编程模型的一部分。它主要用于处理异步、非阻塞的流式数据,能够高效地处理高并发场景。Flux可以生成和处理一系列的事件或数据如流式输出等。看类注释和类所在的jar包我们就明白:
SAA中的流式输出是通过ReactorStreams技术实现的和SpringWebFlux的底层实现是一样的技术
具体执行流程:ReactorStreams会订阅数据源,当有数据时,ReactorStreams以分块流的方式发送给客户端用户。

三  提示词prompt

3.1 提示词作用

prompt提示词:引导AI模型生成特定输出的输入格式,提示词的设计和措辞会显著影响模型的响应。

通常使用chatModel的call()方法,该方法接受prompt实例并返回chatResponse。

3.2 提示词的四种角色*

1.系统角色:system role:设置AI行为边界/角色/定位, 指导AI的行为和响应的方式,设置AI如何解释和回复输入的参数或规则,这类似于在发起对话之前向AI提供说明。

2.用户橘色:user role;代表用户的输入,他们向AI提出问题,命令或陈述;这个角色至关重要,因为他构成了AI响应的基础。

3.助手橘色:AI对用户输入的响应。

4.工具/功能角色:工具/功能角色专注于响应工具调用助手消息返回附加信息。

3.3 提示词的2种用法

3.4 提示词模板

promptTemplate类旨在促进结构化提示的创建,然后将其发送到AI模型进行处理。

案例:

要使用 **Spring Boot + Spring AI** 快速对接阿里巴巴的通义千问(Qwen)大模型,目前官方 Spring AI 尚未内置对阿里 `DashScope` 的支持模块,但你可以通过以下方式实现: ✅ **推荐方案:基于 Spring AI 标准接口封装一个 Qwen 客户端**,实现与通义千问 API 的对接。这种方式结构清晰、可维护性强,并且完全兼容 Spring 生态。 --- ### ✅ 第一步:环境准备 #### 1. 获取阿里云 DashScope API Key 前往 [https://dashscope.console.aliyun.com/](https://dashscope.console.aliyun.com/) - 登录后进入「密钥管理」 - 创建或复制你的 `API Key` #### 2. 选择模型称 常用模型: - `qwen-turbo`:响应快,适合简单任务(如客服问答) - `qwen-plus`:性能均衡 - `qwen-max`:强推理能力,接近 GPT-4 水平 --- ### ✅ 第二步:创建 Spring Boot 项目并添加依赖 ```xml <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring AI Core --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>0.8.1</version> </dependency> <!-- JSON 处理 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies> ``` > ⚠️ 版本要求: > - Java 17+ > - Spring Boot 3.1+ > - Spring AI 0.8.x(支持 LLM 抽象) --- ### ✅ 第三步:编写配置文件 `application.yml` ```yaml server: port: 8080 qwen: api-key: YOUR_DASHSCOPE_API_KEY_HERE # 替换为真实 KEY model: qwen-turbo # 可选:qwen-plus, qwen-max endpoint: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation ``` --- ### ✅ 第四步:定义通义千问客户端(实现 Spring AI 的 ChatClient) ```java import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.Generation; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.http.*; import java.util.Collections; @Component public class QwenChatClient implements ChatClient { private final RestTemplate restTemplate = new RestTemplate(); @Value("${qwen.api-key}") private String apiKey; @Value("${qwen.model}") private String model; @Value("${qwen.endpoint}") private String endpoint; @Override public ChatResponse call(Prompt prompt) { // 提取用户输入内容 String userContent = extractUserMessage(prompt); // 构建请求体 RequestBody request = new RequestBody(); request.setModel(model); request.setInput(new Input(Collections.singletonList( new Input.Message("user", userContent) ))); request.setParameter(new Parameter()); // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + apiKey); HttpEntity<RequestBody> entity = new HttpEntity<>(request, headers); try { ResponseEntity<ResponseData> response = restTemplate.exchange( endpoint, HttpMethod.POST, entity, ResponseData.class); String resultText = response.getBody().getOutput().getText(); return new ChatResponse(new Generation(resultText)); } catch (Exception e) { throw new RuntimeException("调用通义千问失败: " + e.getMessage(), e); } } private String extractUserMessage(Prompt prompt) { return prompt.getInstructions().stream() .filter(m -> m instanceof UserMessage) .map(Message::getContent) .findFirst() .orElseThrow(() -> new IllegalArgumentException("未提供有效的用户消息")); } // --- 数据传输对象 DTO --- static class RequestBody { private String model; private Input input; private Parameter parameter; public String getModel() { return model; } public void setModel(String model) { this.model = model; } public Input getInput() { return input; } public void setInput(Input input) { this.input = input; } public Parameter getParameter() { return parameter; } public void setParameter(Parameter parameter) { this.parameter = parameter; } } static class Input { private java.util.List<Message> messages; public Input(java.util.List<Message> messages) { this.messages = messages; } static class Message { private String role; private String content; public Message(String role, String content) { this.role = role; this.content = content; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } public java.util.List<Message> getMessages() { return messages; } } static class Parameter { private double temperature = 0.7; private int max_tokens = 512; // 默认参数,也可从配置注入 } static class ResponseData { private Output output; public Output getOutput() { return output; } static class Output { private String text; public String getText() { return text; } public void setText(String text) { this.text = text; } } } } ``` --- ### ✅ 第五步:编写业务接口(例如生成商品描述) ```java import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class ProductDescriptionController { @Autowired private ChatClient chatClient; /** * 自动生成商品营销文案 */ @GetMapping("/ai/product-desc") public String generateDesc( @RequestParam String name, @RequestParam String features) { String instruction = String.format( "你是一个电商文案专家,请为商品 '%s' 写一段不超过80字的中文促销语,突出其特点:%s", name, features); Prompt prompt = new Prompt(new UserMessage(instruction)); return chatClient.call(prompt).getResult().getOutput().getContent(); } } ``` --- ### ✅ 第六步:启动应用并测试 运行主类: ```java @SpringBootApplication public class QwenApplication { public static void main(String[] args) { SpringApplication.run(QwenApplication.class, args); } } ``` 访问测试 URL: ```bash GET http://localhost:8080/ai/product-desc?name=降噪蓝牙耳机&features=主动降噪,续航30小时,高清音质 ``` 返回示例: > “沉浸式静谧体验!主动降噪技术隔绝喧嚣,30小时持久续航,搭配高清音质,通勤出行更享受。” ✅ 成功接入! --- ### ✅ 优势总结 | 特性 | 实现效果 | |------|----------| | 使用标准 Spring AI 接口 | 后续可无缝切换 OpenAI / 百度文心一言等 | | 低耦合高内聚 | 修改模型只需改配置 | | 易于扩展 | 支持流式输出、多轮对话、提示词模板等 | | 适用于电商场景 | 文案生成、智能客服、搜索增强 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值