对话记忆介绍
"大模型的对话记忆"这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利用先前对话上下文的能力。 此机制使得大模型不仅能够响应即时的输入请求,还能基于之前的交流内容能够在对话中记住先前的对话内容,并根据这些信息进行后续的响应。这种记忆机制使得模型能够在对话中持续跟踪和理解用户的意图和上下文,从而实现更自然和连贯的对话。
- 我们先从没有聊天记忆的案例看起:
我们调用接口,随便发起回话,最后我们发送提问,让AI总结我们的对话,我们看下效果

在没有对话记忆的情况下,AI是没有办法进行总结的
- 开始改造代码让形成对话记忆
我们先把每次对话的内容给持久化起来, 为了方便这里使用DB来进行存储对话, 当然我们也可以选择其他方式来进行持久化我们的回话
sql
create table chat_session_record_detail
(
id bigint auto_increment
primary key,
session_id varchar(255) not null comment '会话id',
subject_type varchar(255) not null comment '主题类型',
session_text text null comment '会话内容',
create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',
update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间'
);
scss
@Bean
public ChatClient dashScopeChatClient(ChatModel chatModel) {
return ChatClient.builder(chatModel)
.defaultSystem("You are a helpful assistant.")
.defaultAdvisors(MessageChatMemoryAdvisor.builder(persistentChatMemory).build())
.defaultOptions(DashScopeChatOptions.builder()
.withTopP(0.7)
.build()).build();
}
less
@Component
@RequiredArgsConstructor
public class PersistentChatMemory implements ChatMemory {
private final ChatMemoryService chatMemoryService;
private final ChatSessionRecordDetailMapper chatSessionRecordDetailMapper;
@Override
public void add(@NotNull String conversationId, List<Message> messages) {
messages.stream().map(it -> new ChatSessionRecordDetail(conversationId, it))
.forEach(chatSessionRecordDetailMapper::insert);
}
@NotNull
@Override
public List<Message> get(@NotNull String conversationId) {
return chatMemoryService.findLatestChatRecordDetail(conversationId);
}
@Override
public void clear(String conversationId) {
}
}
scss
public SseEmitter streamChat(ChatRequest chatRequest) throws Exception {
final String sessionId = chatRequest.getSessionId();
if (StringUtils.isBlank(sessionId)) {
throw new Exception("回话没有创建");
}
final SseEmitter sseEmitter = new SseEmitter(30L * 1000);
dashScopeChatClient
.prompt()
// 设置回话id
.advisors(advisorSpec -> advisorSpec.param("chat_memory_conversation_id", sessionId))
.user(chatRequest.getText())
.stream()
.chatClientResponse()
.map(it -> {
if (Objects.isNull(it.chatResponse().getResult())) {
return "";
}
return it.chatResponse().getResult().getOutput().getText();
})
.doOnNext(text -> {
try {
sseEmitter.send(text, MediaType.TEXT_EVENT_STREAM);
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.subscribe(it -> {},
e -> {
log.info("session id: {}, occur error", sessionId, e);
sseEmitter.completeWithError(e);
},
sseEmitter::complete
);
return sseEmitter;
}
- 对话记录改造后


总整个返回结果来看, AI将我们之间的对话记录给整理了一遍