springAI整合deepseek

springAI整合deepseek

起男 113 2025-03-27

springAI整合deepseek

简单访问

导入依赖

    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-M6</spring-ai.version>
    </properties>
	<dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <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>

配置文件

spring:
  ai:
    openai:
      api-key: xxxx
      base-url: https://api.deepseek.com
      chat:
        options:
          model: deepseek-chat

controller

@RestController
public class AIController {

    private final ChatClient chatClient;

    //这里需要注入ChatClient的构造器,不能直接注入
    public AIController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/ai")
    public String ai(String message) {
        return chatClient.prompt()//设置提示词
                .user(message)//用户信息
                .call()//请求大模型
                .content();//返回文本
    }
}

角色预设

通过构造器的defaultSystem方法可以实现角色预设

添加配置类

@Configuration
public class AIConfig {

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

controller

@RestController
@RequiredArgsConstructor
public class AIController {

    private final ChatClient chatClient;

    @GetMapping("/ai")
    public String ai(String message) {
        return chatClient.prompt()//也可以在这个参数里进行针对性设置
                .user(message)
            	//.system() //也可以在这里进行针对性设置
                .call()
                .content();
    }
}

流式响应

    @GetMapping(value = "/stream",produces = "text/html;charset=UTF-8")//解决乱码
    public Flux<String> stream(String message) {
        return chatClient.prompt()
                .user(message)
                .stream()//流式调用
                .content();
    }

会话日志

添加配置

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultAdvisors(new SimpleLoggerAdvisor())//springai通过aop来实现大模型日志记录
                .build();
    }

修改日志等级

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

会话记忆

添加配置

    @Bean
    public ChatMemory chatMemory() {
        return new InMemoryChatMemory();//内存存储
    }

	@Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
                .defaultAdvisors(new SimpleLoggerAdvisor(),
                        new MessageChatMemoryAdvisor(chatMemory()))//使用aop记录响应,并传到下一次的请求的assistant中
                .build();
    }

会话隔离

controller

    @GetMapping("/ai")
    public String ai(String message,String chatId) {
        return chatClient.prompt()
                .user(message)
                .advisors(advisorSpec ->
                        advisorSpec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))//使用chatId对会话进行隔离
                .call()
                .content();
    }

会话历史

会话记忆是存储在ChatMemory中的可以通过此接口获取历史数据

    @GetMapping("/history")
    public List<String> history(String chatId) {
        List<Message> messages = chatMemory.get(chatId, 10);
        return messages.stream()
                .filter(message -> MessageType.ASSISTANT.equals(message.getMessageType()))//过滤指定类型
                .map(Message::getText)
                .toList();
    }