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将我们之间的对话记录给整理了一遍

相关推荐
wenzhangli75 小时前
Ooder A2UI 核心架构深度解析:WEB 拦截层的设计与实现
前端·架构
前端百草阁5 小时前
【前端性能优化全链路指南】从开发编写到构建运行的多维度实践
前端·性能优化
女生也可以敲代码5 小时前
AI时代下的50道前端开发面试题:从基础到大模型应用
前端·面试
ZhengEnCi6 小时前
M5-markconv自定义CSS样式指南 📝
前端·css·python
IT_陈寒6 小时前
SpringBoot自动配置的坑差点让我加班到天亮
前端·人工智能·后端
xingpanvip6 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
@PHARAOH6 小时前
WHAT - GitLens supercharged 插件
前端
TT模板6 小时前
苹果cms整合西瓜播放器XGplayer插件支持跳过片头尾
前端·html5
Wect7 小时前
React 性能优化精讲
前端·react.js·性能优化
追风筝的人er8 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端