2025-04-06T19:59:11.860+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 获取记忆:
2025-04-06T19:59:11.833+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.856+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] c.n.b.Utility.Config.LangChainConf : MemoryId:memory:user:1:robot:2
2025-04-06T19:59:11.860+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 获取记忆:
2025-04-06T19:59:11.860+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.863+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 修改记忆:[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }]
2025-04-06T19:59:11.922+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.930+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 获取记忆:
2025-04-06T19:59:11.930+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.975+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 修改记忆:[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }, UserMessage { name = null contents = [TextContent { text = "我喜欢" }] }]
2025-04-06T19:59:11.984+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:11.987+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : 获取记忆:
2025-04-06T19:59:11.987+08:00 INFO 34068 --- [Bot-Heart] [ntLoopGroup-5-1] com.narwhal.botheart.RedisMemoryStore : memoryKey:memory:user:1:robot:2
2025-04-06T19:59:12.035+08:00 DEBUG 34068 --- [Bot-Heart] [ntLoopGroup-5-1] d.l.http.client.log.LoggingHttpClient : HTTP request:
上述为在自定义的记忆存储中增删查方法的日志记录,memoryKey是传入的键memoryId。
问题:为什么要多次获取记忆和修改记忆?
分析:
第一次获取记忆后紧跟着memoryId(检索器中打印的),可以判断是检索器先获取了chatMemory并填充到了Query的metadata中。
第二次获取记忆和第三次获取记忆是在分别将SystemMessage和UserMessage填充进对话历史中。ps:这个过程一共调用了两次修改记忆,我推测可能是方便不同信息种类的分类处理,因为不同信息类的差别较大,分别存储只需要拼接,会方便很多。
第三次获取记忆就很明了了,将拼接好用户信息和系统信息的对话历史一起发送给LLM获取响应,最后调用修改记忆填充AIMessage。