做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;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/openai")
public class OpenAiController {

    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();

            return ResponseEntity.ok(answer);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("Error: " + e.getMessage());
        }
    }

    @GetMapping("/chat")
    public ResponseEntity<String> chatGet(@RequestParam String message) {
        try {
            String answer = chatClient.prompt()
                    .user(message)
                    .call()
                    .content();

            return ResponseEntity.ok(answer);
        } catch (Exception e) {
            return ResponseEntity.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管理的,见本文。

<project
    xmlns="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-plus
openAi-deepseek配置
spring:
  ai:
    openai:
      api-key: ${DEEPSEEK_API_KEY} # 读取你配置好的环境变量
      base-url: https://api.deepseek.com/v1 # 百炼兼容模式地址
      chat:
        options:
          model: deepseek-chat # 或 deepseek-reasoner

报错

报错 cannot retry due to server authentication, in streaming mode

提示授权,一般是apikey的问题。
1、环境变量是否已设置apikey
如果是报错后才设置的,需要重启idea
直接在yaml中写apikey值不用重启idea,因为直接赋值,不涉及读取环境变量
2、yaml中有没有引入
3、apikey值是否正确

实测自己遇到的是没有设置环境变量,后来设置了也没重启,还是报错,重启后问题解决。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐