大模型如何实现会话记忆?

1.什么是assistant?

我们已经知道,role中的user角色存储的是用户输入的内容,system角色是用来指定大模型角色和任务背景的系统指令。

大模型是没有会话记忆的,如果想实现会话记忆功能,唯一的办法就是把之前聊过天的内容与新的提示词,一起发给大模型。这里我们就要借助大模型的一个重要角色assistant来实现。assistant里存储的是大模型生成的消息,可能是上一轮生成的结果。注意:用户可能与模型产生多轮对话,每轮对话模型都会生成不同的结果。

2.实现过程

2.1 定义会话存储方式

Spring AI会自动配置一个ChatMemory bean,您可以直接在应用程序中使用它。默认情况下,它使用内存中的存储库来存储消息(InMemoryChatMemoryRepository),并使用MessageWindowChatMemory实现来管理对话历史。如果已经配置了不同的存储库(例如Cassandra、JDBC或Neo4j),Spring AI将使用它。更多ChatMemory的详情可以参考原文链接:https://blog.csdn.net/xiatiaohcx/article/details/148570555

  • Message Window Chat Memory
    MessageWindowChatMemory维护一个消息窗口,其大小不超过指定的最大值。当消息数量超过最大值时,旧消息将被删除,同时保留系统消息。默认窗口大小为20条消息。
MessageWindowChatMemory memory = MessageWindowChatMemory.builder()
    .maxMessages(10)
    .build();

这是Spring AI用于自动配置ChatMemory bean的默认消息类型。

  • In-Memory Repository
    InMemoryChatMemoryRepository使用ConcurrentHashMap将消息存储在内存中。
    默认情况下,如果尚未配置其他存储库,Spring AI会自动配置InMemoryChatMemoryRepository类型的ChatMemoryRepository bean,您可以直接在应用程序中使用它。
    这里我就用MessageWindowChatMemory来实现一下,生产建议用RedisChatMemoryRepository(模仿InMemoryChatMemoryRepository),没有的话可以自己实现一波。
@Bean
public ChatMemory chatMemory() {
    return MessageWindowChatMemory.builder()
            //InMemoryChatMemoryRepository后续可以自己用redis,mongodb,mysql,es等等数据库来实现
            .chatMemoryRepository(new InMemoryChatMemoryRepository())
            //缓存10条消息
            .maxMessages(10)
            .build();
    }

2.2 配置会话记忆(Advisor)

@Bean
    public ChatClient chatClient(OllamaChatModel model) {
        return ChatClient
                .builder(model)
                .defaultSystem("一你是一个专业,可爱的智能助手,你的名字叫小辰辰,请以小辰辰的身份和语气回答问题。")
                //添加一个日志环绕通知
                .defaultAdvisors(new SimpleLoggerAdvisor(),
                        //添加一个消息窗口的记忆通知
                        MessageChatMemoryAdvisor.builder(chatMemory()).build())
                .build();
    }
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐