Spring Cloud Alibaba AI 对话记忆

对话记忆介绍

"大模型的对话记忆"这一概念,根植于人工智能与自然语言处理领域,特别是针对具有深度学习能力的大型语言模型而言,它指的是模型在与用户进行交互式对话过程中,能够追踪、理解并利用先前对话上下文的能力。 此机制使得大模型不仅能够响应即时的输入请求,还能基于之前的交流内容能够在对话中记住先前的对话内容,并根据这些信息进行后续的响应。这种记忆机制使得模型能够在对话中持续跟踪和理解用户的意图和上下文,从而实现更自然和连贯的对话。

  • 我们先从没有聊天记忆的案例看起:

我们调用接口,随便发起回话,最后我们发送提问,让AI总结我们的对话,我们看下效果

在没有对话记忆的情况下,AI是没有办法进行总结的


  • 开始改造代码让形成对话记忆

我们先把每次对话的内容给持久化起来, 为了方便这里使用DB来进行存储对话, 当然我们也可以选择其他方式来进行持久化我们的回话

sql 复制代码
create table chat_session_record_detail
(
    id           bigint auto_increment
        primary key,
    session_id   varchar(255)                       not null comment '会话id',
    subject_type varchar(255)                       not null comment '主题类型',
    session_text text                               null comment '会话内容',
    create_time  datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_time  datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间'
);
scss 复制代码
    @Bean
    public ChatClient dashScopeChatClient(ChatModel chatModel) {
        return ChatClient.builder(chatModel)
                .defaultSystem("You are a helpful assistant.")
                .defaultAdvisors(MessageChatMemoryAdvisor.builder(persistentChatMemory).build())
                .defaultOptions(DashScopeChatOptions.builder()
                        .withTopP(0.7)
                        .build()).build();
    }
less 复制代码
@Component
@RequiredArgsConstructor
public class PersistentChatMemory implements ChatMemory {
    private final ChatMemoryService chatMemoryService;
    private final ChatSessionRecordDetailMapper chatSessionRecordDetailMapper;

    @Override
    public void add(@NotNull String conversationId, List<Message> messages) {
        messages.stream().map(it -> new ChatSessionRecordDetail(conversationId, it))
                .forEach(chatSessionRecordDetailMapper::insert);
    }

    @NotNull
    @Override
    public List<Message> get(@NotNull String conversationId) {
        return chatMemoryService.findLatestChatRecordDetail(conversationId);
    }

    @Override
    public void clear(String conversationId) {

    }
}
scss 复制代码
    public SseEmitter streamChat(ChatRequest chatRequest) throws Exception {
        final String sessionId = chatRequest.getSessionId();
        if (StringUtils.isBlank(sessionId)) {
            throw new Exception("回话没有创建");
        }
        final SseEmitter sseEmitter = new SseEmitter(30L * 1000);
        dashScopeChatClient
                .prompt()
                // 设置回话id
                .advisors(advisorSpec -> advisorSpec.param("chat_memory_conversation_id", sessionId))
                .user(chatRequest.getText())
                .stream()
                .chatClientResponse()
                .map(it -> {
                    if (Objects.isNull(it.chatResponse().getResult())) {
                        return "";
                    }
                    return it.chatResponse().getResult().getOutput().getText();
                })
                .doOnNext(text -> {
                    try {
                        sseEmitter.send(text, MediaType.TEXT_EVENT_STREAM);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                })
                .subscribe(it -> {},
                        e -> {
                            log.info("session id: {}, occur error", sessionId, e);
                            sseEmitter.completeWithError(e);
                        },
                        sseEmitter::complete
                );
        return sseEmitter;
    }
  • 对话记录改造后

总整个返回结果来看, AI将我们之间的对话记录给整理了一遍

相关推荐
trsoliu16 小时前
前端基于 TypeScript 使用 Mastra 来开发一个 AI 应用 / AI 代理(Agent)
前端·人工智能
鸡吃丸子16 小时前
前端权限控制:深入理解与实现RBAC模型
前端
Larry_zhang双栖16 小时前
低版本Chrome 内核兼容性问题的优美解决
前端·chrome
qq_124987075317 小时前
基于node.js+vue的医院陪诊系统的设计与实现(源码+论文+部署+安装)
前端·vue.js·node.js·毕业设计
袁煦丞17 小时前
9.12 Halo的“傻瓜建站魔法”:cpolar内网穿透实验室第637个成功挑战
前端·程序员·远程工作
universe_0118 小时前
day27|前端框架学习
前端·笔记
沙尘暴炒饭18 小时前
前端vue使用canvas封装图片标注功能,鼠标画矩形框,标注文字 包含下载标注之后的图片
前端·vue.js·计算机外设
百思可瑞教育18 小时前
Vue中使用keep-alive实现页面前进刷新、后退缓存的完整方案
前端·javascript·vue.js·缓存·uni-app·北京百思可瑞教育
yinuo18 小时前
Uni-App跨端实战:APP的WebView与H5通信全流程解析(03)
前端
yinuo18 小时前
Uni-App跨端实战:支付宝小程序WebView与H5通信全流程解析(02)
前端