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

相关推荐
pany10 分钟前
体验一款编程友好的显示器
前端·后端·程序员
Zuckjet15 分钟前
从零到百万:Notion如何用CRDT征服离线协作的终极挑战?
前端
ikonan20 分钟前
译:Chrome DevTools 实用技巧和窍门清单
前端·javascript
Juchecar20 分钟前
Vue3 v-if、v-show、v-for 详解及示例
前端·vue.js
ccc101823 分钟前
通过学长的分享,我学到了
前端
编辑胜编程24 分钟前
记录MCP开发表单
前端
可爱生存报告24 分钟前
vue3 vite quill-image-resize-module打包报错 Cannot set properties of undefined
前端·vite
__lll_24 分钟前
前端性能优化:Vue + Vite 全链路性能提升与打包体积压缩指南
前端·性能优化
weJee24 分钟前
pnpm原理
前端·前端工程化
小高00726 分钟前
⚡️ Vue 3.5 正式发布:10× 响应式性能、SSR 水合黑科技、告别 .value!
前端·javascript·vue.js