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