核心需求拆解
首先得明确什么是 “记忆隔离”。在对话系统里,这意味着:
- 用户 A 的历史对话不能被用户 B 获取
- 同一用户的多轮对话必须保持上下文连贯
技术选型思路
SpringAI 本身提供了对话记忆(ChatMemory),如果不用这个的话就得手动维护一轮对话中上下文内容,会非常麻烦,ChatMemory实际上内部也是封装了一个map,这个map大致就是Map<用户id,List<消息>>这样子的结构,通过这个id进行用户的记忆隔离。本文先用基于内存的方式实现
实现步骤详解
1.导入ChatMemory所用到的包,使用ChatMemoryAutoConfigure配置类
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-chat-memory</artifactId>
</dependency>
2.在构造出ChatClient加上ChatMemory的配置
ChatClient chatClient = ChatClient
.builder(dashScopeChatModel)
//chatMemory专门提供存储记录的功能
.defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build())
.defaultOptions(ChatOptions.builder().temperature(0.1).build())
.build();
3.在Promt设置用户id
String content = chatClient.prompt()
.user("我是路飞")
.advisors(pcm -> {
pcm.param(ChatMemory.CONVERSATION_ID, userId1);
})
.call()
.content();
ChatMemory.CONVERSATION_ID是一个key的标识 通过这个标识来确定是哪个用户
效果展示
完整代码
@RestController
public class IsolationController {
@Autowired
private DashScopeChatModel dashScopeChatModel;
@Autowired
private ChatMemory chatMemory;
@GetMapping("/ci")
public void ConversationIsolation() {
//假设有两个用户id
String userId1="userId1";
String userId2="userId2";
ChatClient chatClient = ChatClient
.builder(dashScopeChatModel)
//chatMemory专门提供存储记录的功能
.defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build())
.defaultOptions(ChatOptions.builder().temperature(0.1).build())
.build();
String content = chatClient.prompt()
.user("我是路飞")
.advisors(pcm -> {
pcm.param(ChatMemory.CONVERSATION_ID, userId1);
})
.call()
.content();
System.out.println(content);
System.out.println("-------------------------------------------我是分割线---------------------------------------");
String content1 = chatClient.prompt()
.user("我是谁???")
.advisors(pcm -> {
pcm.param(ChatMemory.CONVERSATION_ID, userId1);
})
.call()
.content();
System.out.println(content1);
System.out.println("-------------------------------------------我是分割线---------------------------------------");
String content2 = chatClient.prompt()
.user("我是谁???")
.advisors(pcm -> {
pcm.param(ChatMemory.CONVERSATION_ID, userId2);
})
.call()
.content();
System.out.println(content2);
}
}