SpringAI-1.0.0使用

SpringAI-1.0.0使用

起男 16 2025-06-19

SpringAI-1.0.0使用

依赖

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-openai</artifactId>
        </dependency>
    </dependencies>

配置文件

spring:
  ai:
    openai:
      api-key: ${env.ALI_API_KEY}
      base-url: https://dashscope.aliyuncs.com/compatible-mode
      chat:
        options:
          model: qwen-plus

注意:需要去掉官方提供的base-url后的v1

配置ChatClient

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.build();
    }

简单对话

    @Autowired
    private ChatClient chatClient;
    
	@GetMapping("{message}")
    public String chat(@PathVariable String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }

流式输出

    @GetMapping(value = "stream/{message}",produces = "text/stream;charset=utf-8")
    public Flux<String> stream(@PathVariable String message) {
        return chatClient.prompt()
                .user(message)
                .stream()
                .content();
    }

角色预设

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultSystem("你是一个法律专家")
                .build();
    }

打印日志

添加日志Advisor

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultAdvisors(new SimpleLoggerAdvisor())
                .build();
    }

设置日志等级

logging:
  level:
    org.springframework.ai.chat.client.advisor: debug

对话记忆

    @Autowired
    private ChatMemory chatMemory; //新版本可直接使用,默认基于内存
    
	@Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultAdvisors(MessageChatMemoryAdvisor
                        .builder(chatMemory).build())
                .build();
    }

对话隔离

    @GetMapping("quarantine/{id}/{message}")
    public String quarantine(@PathVariable Integer id,
                             @PathVariable String message) {
        return chatClient.prompt()
                .user(message)
                .advisors(ds -> ds.param(ChatMemory.CONVERSATION_ID,id))//根据id进行隔离
                .call()
                .content();
    }

查看历史

    @Autowired
    private ChatMemory chatMemory;

	@GetMapping("history/{id}")
    public List<String>  history(@PathVariable Integer id) {
        List<Message> messages = chatMemory.get(id.toString());
        return messages.stream()
                .filter(message -> MessageType.USER.equals(message.getMessageType()))//筛选类型
                .map(Message::getText)
                .toList();
    }

使用工具

定义工具

public class MyTools {

    @Tool(description = "获取城市的天气")
    String getWeather(@ToolParam(description = "城市") String city){
        if ("杭州".equals(city)){
            return "暴雨";
        }
        return "晴天";
    }
}

配置工具

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultTools(new MyTools())
                .build();
    }

使用Ollama

依赖

        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-ollama</artifactId>
        </dependency>

配置

spring:
  ai:
    ollama:
      chat:
        model: deepseek-r1:1.5b
      base-url: http://localhost:11434

使用

@RestController
@RequestMapping("ollama")
public class OllamaController {

    private ChatClient chatClient;

    public OllamaController(@Qualifier("ollamaChatModel") ChatModel chatModel) {
        chatClient = ChatClient.builder(chatModel)
                .build();
    }

    @GetMapping("chat/{message}")
    public String chat(@PathVariable("message") String message) {
        return chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}

注意:如果项目中同时引入多个模型,需要使用ChatModel并使用@Qualifier进行区分,ChatClient.Builder方式会报错