快速上手SpringAI

快速入门

导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <artifactId>springAi_deepseek</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <!-- 明确指定Spring Boot和Spring AI版本 -->
        <spring-boot.version>3.2.0</spring-boot.version>
        <spring-ai.version>1.0.0-M5</spring-ai.version>
    </properties>

    <!-- 仓库配置:确保依赖可下载 -->
    <repositories>
        <repository>
            <id>maven-central</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- Spring Boot Web Starter(版本由下方BOM管理) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 复用OpenAI Starter兼容DeepSeek(版本由Spring AI BOM管理) -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>

        <!-- Spring Boot Test Starter(版本由下方BOM管理) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 关键:手动导入Spring Boot和Spring AI的BOM管理版本 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot的BOM,管理所有starter的版本 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring AI的BOM,管理AI相关依赖版本 -->
            <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>

</project>

配置文件

server.port=8899  
spring.application.name=spring-ai-deepseek-demo  
  
spring.ai.openai.api-key=sk-43745c46cd5a4d80821e998030******  
spring.ai.openai.base-url=https://api.deepseek.com  
spring.ai.openai.chat.options.model=deepseek-chat  
spring.ai.openai.chat.options.temperature=0.7
    • temperature参数用于控制生成文本的多样性。具体来说:

      ‌值越高‌,生成的文本越多样化,但也可能包含更多的随机性和不可预测的内容。 ‌值越低‌,生成的文本越接近于确定性的结果,即生成的文本会更加一致和可预测。

启动类

@SpringBootApplication  
public class SpringAiDemoApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(SpringAiDemoApplication.class, args);  
    }  
}

controller

@RestController  
public class ChatDeepSeekController {  
  
    @Autowired  
    private OpenAiChatModel openAiChatModel;  
  
    @GetMapping("/hello")  
    public String generate(@RequestParam(value = "message", defaultValue = "hello") String message){  
        String call = openAiChatModel.call(message);  
        System.out.println("call: " + call);  
        return call;  
    }  
}

Spring AI的聊天模型

ChatClient接口

  • ChatClient 是一个接口,定义了与聊天服务交互的客户端。这个接口主要用于创建聊天客户端对象,设置请求规范,以及发起聊天请求。

实现简单的对话

  • 用户输入设置用户消息的内容,通过SpringBoot AI封装的方法向 AI 模型发送请求,以字符串形式返回 AI 模型的响应。
@RestController  
public class ChatDeepSeekController {  
  
    private final ChatClient chatClient;  
  
    public ChatDeepSeekController(ChatClient.Builder chatClientBuilder) {  
        chatClient = chatClientBuilder.build();  
    }  
  
    @GetMapping("/chat")  
    public String chat(@RequestParam(value = "msg", defaultValue = "hello") String message) {  
        return chatClient  
                .prompt()            // 提示词  
                .user(message)       // 用户输入  
                .call()              // 调用大模型  
                .content();          // 返回文本  
    }  
}

实现角色预设

  • 配置默认角色
@Configuration  
public class AiConfig {  
  
    @Bean  
    public ChatClient chatClient(ChatClient.Builder builder) {  
        return builder  
                .defaultSystem("你是一个已经毕业多年,有丰富工作经验的Java工程师,你的名字是呵帅")  
                .build();  
    }  
}
  • 编写controller
@RestController  
public class ChatDeepSeekController {  
  
    @Autowired  
    private ChatClient chatClient;  
  
    @GetMapping("chatai")  
    public String chatAi(@RequestParam("msg") String msg) {  
        return chatClient  
                .prompt()  
                .user(msg)  
                .call()  
                .content();  
    }  
}

实现流式响应

  1. 非流式输出 call:等待大模型把回答结果全部生成后输出给用户;

  2. 流式输出stream:逐个字符输出,一方面符合大模型生成方式的本质,另一方面当模型推理效率不是很高时,流式输出比起全部生成后再输出大大提高用户体验。

  • controller=
@GetMapping(value = "chatAiStream", produces = "text/html;charset=UTF-8")  
public Flux<String> chatAiStream(@RequestParam("msg") String msg){  
    return chatClient  
            .prompt()  
            .user(msg)  
            .stream()  
            .content();  
}

ChatModel接口

  • 在ChatModel接口中,带有String参数的call()方法简化了实际的使用,避免了更复杂的Prompt和 ChatResponse类的复杂性。

实现简单的对话

@RestController  
public class ChatModelController {  
  
    @Autowired  
    private ChatModel chatModel;  
  
    @GetMapping("/chatModel01")  
    public String chatModel01(@RequestParam("msg") String msg) {  
        return chatModel.call(msg);  
    }  
  
    @GetMapping("/chatModel02")  
    public String chatModel02(@RequestParam("msg") String msg){  
        ChatResponse chatResponse = chatModel.call(  
                new Prompt(  
                        msg,  
                        ChatOptions.  
                                builder()  
                                .model("deepseek-chat")  
                                .temperature(0.8)  
                                .build()  
                )  
        );  
        return chatResponse.getResult().getOutput().getContent();  
    }  
}

提示词

评价:难用,不如langchain4j

@GetMapping("/chatModel03")  
public String chatModel03(@RequestParam("name") String name,  
                          @RequestParam("voice") String voice) {  
    String userText = "给我推荐三个Java的框架";  
    UserMessage userMessage = new UserMessage(userText);  
    String systemText = "你是一个Java高手,在Java行业已经工作多年,你非常喜欢帮助别人来了解这个行业相关的内容,你的名字是{name},推荐框架的难度是{voice}。";  
    SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);  
    Message message = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));  
    Prompt prompt = new Prompt(userMessage, message);  
    ChatResponse chatResponse = chatModel.call(prompt);  
    List<Generation> results = chatResponse.getResults();  
    return results.stream().map(x->x.getOutput().getContent()).collect(Collectors.joining(""));  
  
}

Function Calling函数调用

  • 函数调用功能允许大语言模型在生成回答时触发预定义的外部函数,从而实现动态数据获取或业务逻辑操作(如查询数据库、调用 API 等)

自定义Function

@Configuration  
public class CalculatorService {  
    public record addOperation(int a, int b) {  
  
    }  
  
    public record subtractOperation(int n, int m) {  
  
    }  
  
    @Bean  
    @Description("加法运算")  
    public Function<addOperation, Integer> addOperation() {  
        return op -> {  
            return op.a + op.b;  
        };  
    }  
  
    @Bean  
    @Description("乘法运算")  
    public Function<subtractOperation, Integer> subtractOperation() {  
        return op -> {  
            return op.n * op.m;  
        };  
    }  
}
Posted on:
July 13, 2025
Length:
3 minute read, 447 words
Tags:
Agent
See Also:
RAG
Token
超级智能体