对话机器人-会话记忆

一、对话机器人-会话记忆

我们的AI聊天机器人是没有记忆功能的,上一次聊天的内容,下一次就忘掉了。

让AI有会话记忆的方式就是把每一次历史对话内容拼接到Prompt中,一起发送过去。

通常消息的角色有三种:

角色 描述 示例
system 优先于user指令之前的指令,也就是给大模型设定角色和任务背景的系统指令 你是一个乐于助人的编程助手,你以小团团的风格来回答用户的问题。
user 终端用户输入的指令(类似于你在ChatGPT聊天框输入的内容) 你好,你是谁
assistant 由大模型生成的消息,可能是上一轮对话生成的结果 注意,用户可能与模型产生多轮对话,每轮对话模型都会生成不同结果。

step1.定义会话存储方式

会话记忆功能同样是基于AOP实现,Spring提供了一个MessageChatMemoryAdvisor的通知,我们可以像之前添加日志通知一样添加到ChatClient即可。

不过,要注意的是,MessageChatMemoryAdvisor需要指定一个ChatMemory实例,也就是会话历史保存的方式。

ChatMemory接口声明如下:

java 复制代码
public interface ChatMemory {

    // TODO: consider a non-blocking interface for streaming usages

    default void add(String conversationId, Message message) {
       this.add(conversationId, List.of(message));
    }

    // 添加会话信息到指定conversationId的会话历史中
    void add(String conversationId, List<Message> messages);

    // 根据conversationId查询历史会话
    List<Message> get(String conversationId, int lastN);

    // 清除指定conversationId的会话历史
    void clear(String conversationId);

}

step2.配置会话记忆

添加会话记忆Advisor

CommonConfiguration中注册ChatMemory对象

java 复制代码
@Bean
public ChatMemory chatMemory() {
    return new InMemoryChatMemory();
}

然后添加MessageChatMemoryAdvisorChatClient

java 复制代码
@Bean
public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) {
    return ChatClient.builder(model) // 创建ChatClient工厂实例
            .defaultSystem("")
            .defaultAdvisors(new SimpleLoggerAdvisor()) // 添加默认的Advisor,记录日志
            .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
            .build(); // 构建ChatClient实例
}

step3.添加会话id

添加会话id到advisorContext上下文中:

java 复制代码
 chatClient.prompt()
            .user(p -> p.text(prompt).media(medias.toArray(Media[]::new)))
            .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId))
            .stream()
            .content();

二、会话历史

会话历史与会话记忆是两个不同的事情:

会话记忆:是指让大模型记住每一轮对话的内容,不至于前一句刚问完,下一句就忘了。

会话历史:是指要记录总共有多少不同的对话。

在ChatMemory中,会记录一个会话中的所有消息,记录方式是以conversationId为key,以List<Message>为value,根据这些历史消息,大模型就能继续回答问题,这就是所谓的会话记忆。

而会话历史,就是每一个会话的conversationId,将来根据conversationId再去查询List<Message>

相关推荐
邂逅星河浪漫3 个月前
【LangChain4j+Redis】会话记忆功能实现
java·spring boot·后端·阿里云·langchain4j·会话记忆
百年bd1 年前
AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI
spring boot·elementui·vue2·ai助手·智谱ai·ai对话机器人