大模型应用开发04-Spring AI如何实现对话记忆

980 阅读4分钟

什么是对话记忆?

先来解释一下什么是对话记忆功能。 以下是来自ChatGPT的回答:

对话记忆功能是一种技术,使得应用程序或智能助手能够在一段时间内“记住”用户提供的信息,以便在后续对话中参考和使用。这种记忆可以让对话更加连贯,并使助手能够理解用户的背景和偏好,从而提供更加个性化和精准的回复。

对话记忆功能的用途

  1. 用户信息的持久化:记住用户提供的背景信息或个人偏好。例如,用户可以告诉助手他们喜欢什么类型的电影,助手就会在推荐内容时自动应用这些偏好。
  2. 上下文跟踪:在多轮对话中保持上下文一致性。比如,如果用户在前几轮对话中提到了一个任务或一个具体需求,助手在之后的对话中可以自然地参考该信息,而不需要用户重复说明。
  3. 更好地回答追问:在复杂的多轮对话中,当用户询问更详细的问题或追问之前提到的内容时,记忆功能使助手能更好地理解用户的意图。例如,如果用户在对话中问到某个推荐项目的“优缺点”,助手可以直接从先前的推荐内容中引用相关信息。

常见的实现方式

  • 短期记忆:仅在当前对话会话中有效,随着会话结束即丢失,适用于临时会话。
  • 长期记忆:保存跨对话的长期信息,例如用户的偏好、习惯等,适用于个性化体验。

对话记忆的挑战

  • 隐私与安全:记忆功能需要妥善处理用户的数据,确保信息不会被滥用或泄露。
  • 记忆过载:过多的信息存储可能会导致不必要的噪声,影响助手的回复质量,因此要精确选择保存的信息内容。
  • 记忆更新:用户的偏好和需求会不断变化,因此需要支持记忆的更新、修改和删除。

通过Spring AI实现对话记忆功能

对话记忆是大模型应用开发中的一项基本功能。这里介绍的是短期记忆的实现,对于长期记忆的实现在理解了短期记忆的实现基础上,在做工程化方面的改造。

为了实现这个功能,我查阅了中文博客中介绍Spring AI如何实现对话记忆的方法。大多数方案都采用类似的思路:创建一个全局的HistoryMessages List对象,将之前的对话记录存储其中,然后在新对话中将原有对话历史添加到prompt中。然而,这种实现方式不仅存在安全隐患(设置为全局变量),而且缺乏优雅性。作为一名程序员,我的直觉告诉我:像Spring这样成熟的大型框架,不太可能没有内置大模型最常用的对话记忆功能,这似乎有些说不过去。

本着打游戏必须通关的精神,我去翻阅了Spring AI的官方文档,还是比较轻松的找到了官方关于对话记忆的实现方案。这就是Advisors API

这里贴一段官网上对话记忆实现的demo:

var chatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(
        new MessageChatMemoryAdvisor(chatMemory), // chat-memory advisor
        new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()) // RAG advisor
    )
    .build();

String response = this.chatClient.prompt()
    // Set advisor parameters at runtime
    .advisors(advisor -> advisor.param("chat_memory_conversation_id", "678")
            .param("chat_memory_response_size", 100))
    .user(userText)
    .call()
	.content();

以上介绍了两种实现方式。第一种是在初始化ChatClient时指定chat memory;第二种是在运行对话时进行设置。在第二种方式中,保持对话的conversation_id相同可以利用对话历史记录。将chat_memory_response_size设置为100表示最多保留最新的100轮对话内容。

我们在使用第二种方式实现对话记忆时,前端在初次进入对话页面时可以随机生成一个conversation_id,之后的每次对话都使用同一个conversation_id,直到用户选择新建一个对话,或者关闭之前的对话,重新打开一个新对话窗口。

以上是关于对话记忆的正确实现方式。

另外,去看官网文档总是最靠谱的选择。

这里是我基于Sping AI实现的智能对话助手的一个演示视频

最后

中文技术社区的文章质量参差不齐,作为开发人员,我们需要培养辨别能力。这不仅要求我们不断提升自身的技术水平,还需要保持对新技术的敏锐嗅觉。