Spring AI 学习之路 对话记录(内存存储)

对话记录(内存存储)

在现代智能对话系统中,能够有效地记录和管理对话历史是至关重要的。它不仅帮助提升对话的上下文理解,还能优化用户体验,尤其是在需要跨多轮对话时。在 Spring AI 框架下,内存存储对话记录是一个简单但强大的方法,可以让我们更灵活地处理对话内容,进行状态跟踪和数据分析。今天,我们将探索如何利用 Spring AI 来实现内存存储的对话记录。

为什么需要对话记录?

在一个对话系统中,特别是多轮对话的场景下,每个对话回合都需要理解前文的内容以确保流畅的交互。如果没有对话记录,系统很难维持上下文,进而导致用户体验的下降。对话记录的作用体现在以下几个方面:

  1. 上下文保持:让系统能够记住并理解当前对话状态。
  2. 个性化推荐:根据用户历史记录,定制推荐内容和回应。
  3. 状态追踪:在多轮对话中维持用户的状态信息,避免重复询问。
  4. 错误分析:记录对话中出现的问题,便于后续的修复和优化。

内存存储与持久化存储的区别

在实现对话记录时,我们通常有两种选择:内存存储和持久化存储。
内存存储:对话历史保存在内存中,一旦应用停止或重启,所有数据都会丢失。适合用于临时、短期内的对话管理。
持久化存储:对话历史保存到数据库、文件或其他持久化介质中,能够在应用重启后恢复数据。适合用于长期的数据存储和分析。
在实际应用中,内存存储通常用于轻量级的对话系统,尤其是那些对持久化要求不高的场景。它的优势在于高效性和简易性。

使用 Spring AI 实现内存存储的对话记录

Spring AI 提供了一种高效的方法来实现这一点——通过 MessageChatMemoryAdvisor 来存储会话数据。

1. 添加 Spring AI 依赖

首先,确保你已经将 Spring AI 的相关依赖添加到你的 pom.xml 中,这里使用的是阿里的灵积AI服务。以下是一个常见的依赖配置:

		<dependency>
			<groupId>com.alibaba.cloud.ai</groupId>
			<artifactId>spring-ai-alibaba-starter</artifactId>
			<version>1.0.0-M5.1</version>
		</dependency>

2. 创建 MessageChatMemoryAdvisor

MessageChatMemoryAdvisor 是 Spring AI 中用于处理会话历史记录的核心类。我们可以创建一个自定义的 MemoryAdvisor,并使用它来存储对话数据。

    // ali
    private final ChatModel chatModel;
    // 模拟数据库存储会话和消息
    private final ChatMemory chatMemory = new InMemoryChatMemory();
    /**
     * 根据会话id,从数据库中查找历史消息,并将消息作为上下文回答非流式相应。
     *
     * @param prompt    用户的提问
     * @param sessionId 会话id
     */
    @GetMapping(value = "chat/history")
    public String chatWithHistory(@RequestParam String prompt,@RequestParam String sessionId) {
        // 1. 如果需要存储会话和消息到数据库,自己可以实现ChatMemory接口,
        //    这里使用InMemoryChatMemory,内存存储。
        // 2. 传入会话id,MessageChatMemoryAdvisor会根据会话id去查找消息。
        // 3. 只需要携带最近10条消息
        var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, sessionId, 10);
        return ChatClient.create(chatModel).prompt()
                .user(prompt)
                // MessageChatMemoryAdvisor会在消息发送给大模型之前,从ChatMemory中获取会话的历史消息,
                // 然后一起发送给大模型。
                .advisors(messageChatMemoryAdvisor)
                .call()
                .content();
    }

历史消息的实现过程:

提供ChatMemory,通过sesssion id查找历史消息。MessageChatMemoryAdvisor会在运行时调用ChatMemory,通过会话id查找历史消息。然后把消息列表拼接到历史的消息中。
发送消息给大模型得到答案

提问演示

首先告诉大模型 "我是谁"如下所示

然后再向大模型提问该问题?

posted @   brother_four  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2017-02-28 git 学习之基础知识
2017-02-28 git 学习之什么是版本库
2017-02-28 orcale 之PL/SQL 控制语句
点击右上角即可分享
微信分享提示