Spring AI如何实现对话记忆
大模型开发/技术交流
- LLM
2024.12.02555看过
什么是对话记忆?
先来解释一下什么是对话记忆功能。
以下是来自ChatGPT的回答:
对话记忆功能是一种技术,使得应用程序或智能助手能够在一段时间内“记住”用户提供的信息,以便在后续对话中参考和使用。这种记忆可以让对话更加连贯,并使助手能够理解用户的背景和偏好,从而提供更加个性化和精准的回复。
对话记忆功能的用途
-
用户信息的持久化:记住用户提供的背景信息或个人偏好。例如,用户可以告诉助手他们喜欢什么类型的电影,助手就会在推荐内容时自动应用这些偏好。
-
上下文跟踪:在多轮对话中保持上下文一致性。比如,如果用户在前几轮对话中提到了一个任务或一个具体需求,助手在之后的对话中可以自然地参考该信息,而不需要用户重复说明。
-
更好地回答追问:在复杂的多轮对话中,当用户询问更详细的问题或追问之前提到的内容时,记忆功能使助手能更好地理解用户的意图。例如,如果用户在对话中问到某个推荐项目的“优缺点”,助手可以直接从先前的推荐内容中引用相关信息。
常见的实现方式
-
短期记忆:仅在当前对话会话中有效,随着会话结束即丢失,适用于临时会话。
-
长期记忆:保存跨对话的长期信息,例如用户的偏好、习惯等,适用于个性化体验。
对话记忆的挑战
-
隐私与安全:记忆功能需要妥善处理用户的数据,确保信息不会被滥用或泄露。
-
记忆过载:过多的信息存储可能会导致不必要的噪声,影响助手的回复质量,因此要精确选择保存的信息内容。
-
记忆更新:用户的偏好和需求会不断变化,因此需要支持记忆的更新、修改和删除。
通过Spring AI实现对话记忆功能
对话记忆是大模型应用开发中的一项基本功能。这里介绍的是短期记忆的实现,对于长期记忆的实现在理解了短期记忆的实现基础上,在做工程化方面的改造。
为了实现这个功能,我查阅了中文博客中介绍Spring AI如何实现对话记忆的方法。大多数方案都采用类似的思路:创建一个全局的HistoryMessages List对象,将之前的对话记录存储其中,然后在新对话中将原有对话历史添加到prompt中。然而,这种实现方式不仅存在安全隐患(设置为全局变量),而且缺乏优雅性。作为一名程序员,我的直觉告诉我:像Spring这样成熟的大型框架,不太可能没有内置大模型最常用的对话记忆功能,这似乎有些说不过去。
本着打游戏必须通关的精神,我去翻阅了Spring AI的官方文档,还是比较轻松的找到了官方关于对话记忆的实现方案。这就是Advisors API。
这里贴一段官网上对话记忆实现的demo:
var chatClient = ChatClient.builder(chatModel).defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory), // chat-memory advisornew 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实现的智能对话助手的一个演示视频
最后
中文技术社区的文章质量参差不齐,作为开发人员,我们需要培养辨别能力。这不仅要求我们不断提升自身的技术水平,还需要保持对新技术的敏锐嗅觉。
————————————————
版权声明:本文为稀土掘金博主「皮皮的江山」的原创文章
原文链接:https://juejin.cn/post/7433302959826698290
如有侵权,请联系千帆社区进行删除
评论