AI 超级智能体 - 历史消息存储Advisor
在实现自定义mysql存储消息时发现,ChatMemory和MessageWindowChatMemory都是只能维持当前窗口的消息,即maxMessage窗口内的消息。一但消息超过maxMessage,就会进行一次覆盖。若是在自定义mysql存储消息实行增量存储而不覆盖的话,llm的上下文记忆又会出错,因此我在自定义mysql存储消息时也和内存和文件存储一样使用了覆盖并实现了这个历史消息存储Advisor,在消息发送和llm输出时实现拦截并将消息存储到mysql中,存储整个会话的所有消息。
▼text复制代码@Resource private HistoryMessageMapper historyMessageMapper; private int order = 1; public MessageToDBAdvisor() { } @Override public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) { HistoryMessage userHistoryMessage = before(chatClientRequest); ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest); after(chatClientResponse, chatClientRequest, userHistoryMessage); return chatClientResponse; } @Override public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) { HistoryMessage userHistoryMessage = before(chatClientRequest); Flux<ChatClientResponse> chatClientResponseFlux = streamAdvisorChain.nextStream(chatClientRequest); return afterFlux(chatClientResponseFlux, chatClientRequest, userHistoryMessage); } private Flux<ChatClientResponse> afterFlux(Flux<ChatClientResponse> chatClientResponseFlux, ChatClientRequest chatClientRequest, HistoryMessage userHistoryMessage) { String conversationId = chatClientRequest.context().get("chat_memory_conversation_id").toString(); String model = chatClientRequest.prompt().getOptions().getModel(); StringBuilder contentBuilder = new StringBuilder(); AtomicInteger promptTokens = new AtomicInteger(0); AtomicInteger completionTokens = new AtomicInteger(0); Flux<ChatClientResponse> responseFlux = chatClientResponseFlux.doOnNext(chatClientResponse -> { String chunk = chatClientResponse.chatResponse().getResult().getOutput().getText(); if (StrUtil.isNotBlank(chunk)) { contentBuilder.append(chunk); } promptTokens.set(chatClientResponse.chatResponse().getMetadata().getUsage().getPromptTokens()); completionTokens.set(chatClientResponse.chatResponse().getMetadata().getUsage().getCompletionTokens()); }).doOnComplete(() -> { String content = contentBuilder.toString(); HistoryMessage assistantHistoryMessage = new HistoryMessage(); assistantHistoryMessage.setConversationId(conversationId); assistantHistoryMessage.setRole(MessageType.ASSISTANT.getValue()); assistantHistoryMessage.setModel(model); assistantHistoryMessage.setContent(content); assistantHistoryMessage.setTokenCount(completionTokens.get()); historyMessageMapper.insert(assistantHistoryMessage); userHistoryMessage.setTokenCount(promptTokens.get()); historyMessageMapper.updateById(userHistoryMessage); }); return responseFlux; } public HistoryMessage before(ChatClientRequest chatClientRequest) { String conversationId = chatClientRequest.context().get("chat_memory_conversation_id").toString(); String model = chatClientRequest.prompt().getOptions().getModel(); String content = chatClientRequest.prompt().getUserMessage().getText(); HistoryMessage userHistoryMessage = new HistoryMessage(); userHistoryMessage.setConversationId(conversationId); userHistoryMessage.setModel(model); userHistoryMessage.setRole(MessageType.USER.getValue()); userHistoryMessage.setContent(content); historyMessageMapper.insert(userHistoryMessage); return userHistoryMessage; } public void after(ChatClientResponse chatClientResponse, ChatClientRequest chatClientRequest, HistoryMessage userHistoryMessage) { String conversationId = chatClientRequest.context().get("chat_memory_conversation_id").toString(); String model = chatClientRequest.prompt().getOptions().getModel(); String content = chatClientResponse.chatResponse().getResult().getOutput().getText(); Integer promptTokens = chatClientResponse.chatResponse().getMetadata().getUsage().getPromptTokens(); Integer completionTokens = chatClientResponse.chatResponse().getMetadata().getUsage().getCompletionTokens(); HistoryMessage assistantHistoryMessage = new HistoryMessage(); assistantHistoryMessage.setConversationId(conversationId); assistantHistoryMessage.setRole(MessageType.ASSISTANT.getValue()); assistantHistoryMessage.setModel(model); assistantHistoryMessage.setContent(content); assistantHistoryMessage.setTokenCount(completionTokens); userHistoryMessage.setTokenCount(promptTokens); historyMessageMapper.updateById(userHistoryMessage); historyMessageMapper.insert(assistantHistoryMessage); } @Override public int getOrder() { return this.order; } @Override public String getName() { return this.getClass().getSimpleName(); }
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 103✅ 今天做了:复习了多用户通信系统⏰ 明天计划:学习Java反射
1
Day 68时间19:00~ 22:00(3h)✅ 今天做了:Component注解、Mybatis配置、使用⏰ 明天计划:Lombok、Mapper映射、动态SQL📚 今日感悟:自动配置类DataSourceAutoConfiguration ,会读取properties文件,通过注解:@EnableConfigurationProperties(DataSourceProperties.cl
2
Day 19✅ 今天做了:MCP⏰ 明天计划:AI智能体构建📚 今日感悟:今天MCP问题有点多有点杂,明天找时间再捋一下。继续加油
1
Day 25✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习⏰ 明天计划:待定📚 今日感悟:Keep going!
2
Day 104✅ 今天做了:学习了Java反射及快速入门⏰ 明天计划:继续学习Java反射
1

