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

相关推荐
m0_738120721 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
程序员爱钓鱼8 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder8 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL9 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码9 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_9 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy9 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌9 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
sg_knight9 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm