文章目录
- 前提
- maven依赖
- 创建OpenAiController,代码
- postman发送请求
- 推荐使用bom机制
- 完整pom.xml
- openAi配置
- openAi-百炼配置
- openAi-deepseek配置
- springAI对rag的支持
- 实现SSE流式
- 报错
- 报错 cannot retry due to server authentication, in streaming mode
做ai当然是python好,但是springAI支持了,也熟悉下。
如果之前做传统项目,一般都用java8。springai可不是加个包这么简单,整体环境都要换,jdk要用17,springboot要用3.x,相当于整体版本变了。
前提
Spring Boot 3.x # 例如3.3.5
java17
环境变量设置好,例如用阿里百炼的openAi。
DASHSCOPE_API_KEY=具体的apikey值# python用这个名字AI_DASHSCOPE_API_KEY=具体的apikey值# java用这个名字,前面多了AI_maven依赖
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version><!-- 版本号请根据实际仓库调整,建议使用最新 Milestone --></dependency>完整pom.xml见下文。
创建OpenAiController,代码
package com.example.demo.web;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.*;importjava.util.HashMap;importjava.util.Map;@RestController@RequestMapping("/openai")publicclassOpenAiController{private final ChatClient chatClient;public OpenAiController(ChatClient.Builder chatClientBuilder){this.chatClient=chatClientBuilder.build();}@PostMapping("/chat")public ResponseEntity<String>chat(@RequestBody Map<String,String>request){try{String message=request.getOrDefault("message","你好");String answer=chatClient.prompt().user(message).call().content();returnResponseEntity.ok(answer);}catch(Exception e){returnResponseEntity.internalServerError().body("Error: "+e.getMessage());}}@GetMapping("/chat")public ResponseEntity<String>chatGet(@RequestParam String message){try{String answer=chatClient.prompt().user(message).call().content();returnResponseEntity.ok(answer);}catch(Exception e){returnResponseEntity.internalServerError().body("Error: "+e.getMessage());}}}postman发送请求
请求地址:
{{url}}/api/openai/chat
请求报文:
{"message":"今天是几号"}返回报文:
今天的具体日期我这里没办法直接查看,因为我没有实时访问系统日期的功能。你可以通过查看设备右下角的任务栏、使用智能助手或者直接搜索“今天的日期”来获取准确的信息。如果你告诉我你所在的时区或地区,我可以帮助你理解如何更好地查找这个信息。这回答。。。不过也算调试通了。
推荐使用bom机制
添加版本号:
<properties><!-- 添加如下内容 --><spring.ai.version>2021.0.5.0</spring.ai.version></properties>添加bom管理:
<dependencyManagement><dependencies><!-- 如果之前已有dependencyManagement标签,只添加这段内容 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring.ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>作用:
springAi的其他相关依赖不用写版本号了,统一受bom管理。
完整pom.xml
拿来就能用,方便,可以作为一套boot3.x的方案。
注:springai是通过bom管理的,见本文。
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 1. 基础 Spring Boot 父工程 (推荐 3.4.5) --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.5</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-ai-demo</artifactId><version>1.0.0-SNAPSHOT</version><name>spring-ai-demo</name><properties><java.version>17</java.version><!-- Spring Boot 3.x 强制要求 JDK 17+ --><spring-ai.version>1.1.2</spring-ai.version></properties><!-- 2. 统一版本管理 (BOM) --><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- 3. 核心依赖 --><dependencies><!-- Spring Boot Web (用于暴露 REST API) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring AI OpenAI Starter (以 OpenAI 为例,可替换为其他模型) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency><!-- 测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.9</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>4.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency></dependencies><!-- 4. 必须配置的仓库 (Spring AI 1.0.0 以上已发布至 Maven Central,但建议保留以防需要快照) --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>openAi配置
是统一的配置形式,只用改这几个参数即可:
ase-url、api-key 和 model
openAi-百炼配置
spring:ai:openai:api-key:${AI_DASHSCOPE_API_KEY}# 读取你配置好的环境变量base-url:https://dashscope.aliyuncs.com/compatible-mode# 百炼兼容模式地址chat:options:model:qwen-max# 或 qwen-plusopenAi-deepseek配置
spring:ai:openai:api-key:${DEEPSEEK_API_KEY}# 读取你配置好的环境变量base-url:https://api.deepseek.com/v1# 百炼兼容模式地址chat:options:model:deepseek-chat# 或 deepseek-reasonerspringAI对rag的支持
见rag笔记。
实现SSE流式
非常简单,已经封装好了。
/** * 流式对话接口 * 前端通过 EventSource 或 fetch+ReadableStream 消费 */@PostMapping(value="/chat/stream",produces=MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>streamChat(@RequestBodyMap<String,String>request){Stringmessage=request.getOrDefault("message","你好");returnchatClient.prompt().user(message).stream()// 关键:把 .call() 换成 .stream().content();// 返回 Flux<String>,逐 token 发射}用postman等post工具就能测,见sse笔记。
报错
报错 cannot retry due to server authentication, in streaming mode
提示授权,一般是apikey的问题。
1、环境变量是否已设置apikey
如果是报错后才设置的,需要重启idea
直接在yaml中写apikey值不用重启idea,因为直接赋值,不涉及读取环境变量
2、yaml中有没有引入
3、apikey值是否正确
实测自己遇到的是没有设置环境变量,后来设置了也没重启,还是报错,重启后问题解决。