精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:如何實現大模型的連續對話?

人工智能
大模型連續對話功能不同的框架實現也是不同的,以行業使用最多的 Java AI 框架 Spring AI 和 Spring AI Alibaba 為例,給大家演示一下它們連續對話是如何實現的。

所有的大模型本身是不進行信息存儲的,也不提供連續對話功能,所以想要實現連續對話功能需要開發者自己寫代碼才能實現。那怎么才能實現大模型的連續對話功能呢?

大模型連續對話功能不同的框架實現也是不同的,以行業使用最多的 Java AI 框架 Spring AI 和 Spring AI Alibaba 為例,給大家演示一下它們連續對話是如何實現的。

1.SpringAI連續對話實現

Spring AI 以 MySQL 數據庫為例,我們來實現一下它的連續對話功能。

PS:我們只有先講對話存儲起來,才能實現連續對話功能,所以我們需要借助數據庫存儲來連續對話。

(1)準備工作

創建表:

CREATE TABLE chat_message (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  conversation_id VARCHAR(255) NOT NULL,
  role VARCHAR(50) NOT NULL,
  context TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

添加數據庫和 MyBatisPlus 依賴:

<dependency>
  <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.11</version>
</dependency>

<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>

設置配置文件:

spring:
  datasource:
    url:jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
    username:root
    password:12345678
    driver-class-name:com.mysql.cj.jdbc.Driver
# 配置打印 MyBatis 執行的 SQL
mybatis-plus:
configuration:
    log-impl:org.apache.ibatis.logging.stdout.StdOutImpl
# 配置打印 MyBatis 執行的 SQL
logging:
level:
    com:
      ai:
        deepseek:debug

編寫實體類:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.Date;

@Getter
@Setter
@TableName("chat_message")
publicclass ChatMessageDO implements Serializable {

    privatestaticfinallong serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    private String conversationId;

    private String role;

    private String context;

    private Date createdAt;
}

編寫 Mapper:

import com.ai.chat.entity.ChatMessageDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ChatMessageMapper extends BaseMapper<ChatMessageDO> {
}

(2)自定義ChatMemory類

自定義的 ChatMemory 實現類,將對話記錄存儲到 MySQL:

import com.ai.deepseek.entity.ChatMessageDO;
import com.ai.deepseek.mapper.ChatMessageMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
publicclass MySQLChatMemory implements ChatMemory {
    @Autowired
    private ChatMessageMapper repository;

    @Override
    public void add(String conversationId, Message message) {
        ChatMessageDO entity = new ChatMessageDO();
        entity.setConversationId(conversationId);
        entity.setRole(message.getMessageType().name());
        entity.setContext(message.getText());
        repository.insert(entity);
    }

    @Override
    public void add(String conversationId, List<Message> messages) {
        messages.forEach(message -> add(conversationId, message));
    }

    @Override
    public List<Message> get(String conversationId, int lastN) {
        LambdaQueryWrapper<ChatMessageDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ChatMessageDO::getConversationId, conversationId);
        // queryWrapper.orderByDesc(ChatMessageDO::getId);
        return repository.selectList(queryWrapper)
        .stream()
        .limit(lastN)
        .map(e -> new UserMessage(e.getContext()))
        .collect(Collectors.toList());
    }

    @Override
    public void clear(String conversationId) {
        LambdaQueryWrapper<ChatMessageDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ChatMessageDO::getConversationId, conversationId);
        repository.delete(queryWrapper);
    }
}

(3)代碼調用

編寫代碼測試歷史對話保存到 MySQL 的功能:

import com.ai.deepseek.component.MySQLChatMemory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/multi")
publicclass MultiChatController {

    @Autowired
    private ChatClient chatClient;
    @Autowired
    private MySQLChatMemory chatMemory;

    @RequestMapping("/chat")
    public Flux<String> chat(@RequestParam("msg") String msg,
                             @RequestParam(defaultValue = "default") String sessionId) {
        // 添加MessageChatMemoryAdvisor,自動管理上下文
        MessageChatMemoryAdvisor advisor =
        new MessageChatMemoryAdvisor(chatMemory, sessionId, 10); // 保留最近5條歷史
        return chatClient.prompt()
        .user(msg)
        .advisors(advisor) // 關鍵:注入記憶管理
        .stream()
        .content();
    }
}

以上程序執行結果如下:

2.SpringAIAlibaba實現連續對話

Spring AI Alibaba 連續對話的實現就簡單很多了,因為它內置了 MySQL 和 Redis 的連續對話存儲方式,接下來以 Redis 為例演示 SAA 的連續對話實現,它的實現步驟如下:

  • 添加依賴。
  • 設置配置文件,配置 Redis 連接信息。
  • 添加 Redis 配置類,注入 RedisChatMemoryRepository 對象。
  • 配置 ChatClient 實現連續對話。

具體實現如下。

(1)添加依賴

<dependency>
  <groupId>com.alibaba.cloud.ai</groupId>
  <artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
</dependency>

(2)設置配置文件

設置配置文件,配置 Redis 連接信息:

spring:
  ai:
    memory:
      redis:
        host: localhost
        port: 6379
        timeout: 5000

(3)添加Redis配置類

添加 Redis 配置類,注入 RedisChatMemoryRepository 對象,實現 Redis 自定義存儲器注入:

import com.alibaba.cloud.ai.memory.redis.RedisChatMemoryRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
publicclass RedisMemoryConfig {

    @Value("${spring.ai.memory.redis.host}")
    private String redisHost;
    @Value("${spring.ai.memory.redis.port}")
    privateint redisPort;
    //    @Value("${spring.ai.memory.redis.password}")
    //    private String redisPassword;
    @Value("${spring.ai.memory.redis.timeout}")
    privateint redisTimeout;

    @Bean
    public RedisChatMemoryRepository redisChatMemoryRepository() {
        return RedisChatMemoryRepository.builder()
        .host(redisHost)
        .port(redisPort)
        // 若沒有設置密碼則注釋該項
        //           .password(redisPassword)
        .timeout(redisTimeout)
        .build();
    }
}

(4)配置ChatClient實現連續對話

import com.alibaba.cloud.ai.memory.redis.RedisChatMemoryRepository;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

importstatic org.springframework.ai.chat.memory.ChatMemory.CONVERSATION_ID;

@RestController
@RequestMapping("/redis")
publicclass RedisMemoryController {

    privatefinal ChatClient chatClient;
    privatefinalint MAXMESSAGES = 10;
    privatefinal MessageWindowChatMemory messageWindowChatMemory;

    public RedisMemoryController(ChatModel dashscopeChatModel,
                                 RedisChatMemoryRepository redisChatMemoryRepository) {
        this.messageWindowChatMemory = MessageWindowChatMemory.builder()
        .chatMemoryRepository(redisChatMemoryRepository)
        .maxMessages(MAXMESSAGES)
        .build();

        this.chatClient = ChatClient.builder(dashscopeChatModel)
        .defaultAdvisors(
            MessageChatMemoryAdvisor.builder(messageWindowChatMemory)
            .build()
        )
        .build();
    }

    @GetMapping("/call")
    public String call(String msg, String cid) {
        return chatClient.prompt(msg)
        .advisors(
            a -> a.param(CONVERSATION_ID, cid)
        )
        .call().content();
    }
}

小結

通過以上代碼大家也可以看出來,使用 Spring AI 實現連續對話是比較復雜的,需要自己實現數據庫增刪改查的代碼,并且重寫 ChatMemory 才能實現連續對話功能;而 Spring AI Alibaba 因為內置了連續對話的多種實現(Redis 和其他數據庫),所以只需要簡單配置就可以實現了。

責任編輯:姜華 來源: 磊哥和Java
相關推薦

2024-09-11 22:51:19

線程通訊Object

2023-11-20 10:09:59

2024-02-20 14:10:55

系統緩存冗余

2015-08-13 10:29:12

面試面試官

2024-12-25 15:44:15

2024-02-04 10:08:34

2024-10-22 16:39:07

2024-01-19 14:03:59

Redis緩存系統Spring

2024-01-26 13:16:00

RabbitMQ延遲隊列docker

2024-04-09 10:40:04

2025-04-07 04:25:00

JDBCAPI加載器

2010-08-12 16:28:35

面試官

2022-08-08 13:45:12

Redis面試Hash

2021-10-26 10:29:45

掃碼登錄功能

2021-05-20 08:34:03

CDN原理網絡

2024-09-09 15:09:30

2021-05-19 06:07:21

CSS 斜線效果技巧

2021-12-15 06:58:13

List 集合LinkedHashS

2021-05-20 08:54:16

Go面向對象

2024-10-15 10:00:06

點贊
收藏

51CTO技術棧公眾號

国产a级全部精品| 亚洲美女自拍视频| gogo大胆日本视频一区| wwwwxxxxx欧美| 欧洲美女免费图片一区| 波多野结衣一二三四区| 久久国际精品| 欧美性少妇18aaaa视频| 亚洲精品日韩在线观看| 国产成人精品av在线观| 翔田千里一区二区| 另类图片亚洲另类| 99久久久久久久久久| 亚洲男女网站| 欧美午夜激情视频| 国产卡一卡二在线| 亚洲欧美综合一区二区| 激情六月婷婷久久| 日本伊人精品一区二区三区介绍 | 美女黄页在线观看| 欧美激情视频一区二区三区在线播放 | 国产精品久久久久永久免费观看 | 欧美一级在线免费观看| 日韩电影在线看| 久久久亚洲网站| 国产亚洲精品久久久久久豆腐| 免费福利视频一区| 日韩欧美国产午夜精品| 深夜黄色小视频| 性欧美又大又长又硬| 亚洲乱码国产乱码精品精可以看 | 日韩一卡二卡三卡四卡| 超碰影院在线观看| 毛片电影在线| 亚洲一区二区三区视频在线播放 | 一区二区伦理片| 美女主播精品视频一二三四| 日韩一区二区三区电影| 三上悠亚在线一区二区| jk漫画禁漫成人入口| 亚洲午夜精品久久久久久久久| 一本色道久久综合亚洲精品婷婷 | 爱情岛论坛成人| 在线人成日本视频| 亚洲高清一区二区三区| 日本三日本三级少妇三级66| aⅴ在线视频男人的天堂| 91蝌蚪porny| 九色综合婷婷综合| 人妻夜夜爽天天爽| 成人手机电影网| 成人在线视频网址| 丰满少妇在线观看bd| 国产精品影视网| 97免费高清电视剧观看| 99在线观看免费| 国产一区美女在线| 92国产精品久久久久首页| 一区二区三区免费观看视频| 捆绑紧缚一区二区三区视频| 国产精品美女免费视频| www.久久网| 免费在线视频一区| 国产美女搞久久| 国产女18毛片多18精品| 国产又黄又大久久| 成人免费在线看片| 色呦呦免费观看| 久久婷婷国产综合国色天香| 日本一区二区三区视频免费看| 国产一级片在线| 国产精品私房写真福利视频| 这里只有精品66| 中文字幕伦理免费在线视频 | av噜噜在线观看| 视频二区欧美毛片免费观看| 亚洲第一区在线观看| 亚洲中文字幕无码av| 亚洲免费福利一区| 一区二区成人精品| 国产免费美女视频| 欧美啪啪一区| 欧美影院久久久| 中日韩在线观看视频| 久久99最新地址| 91在线短视频| 视频三区在线观看| 国产精品福利av| 人妻无码一区二区三区四区| 国产伦子伦对白在线播放观看| 在线观看成人免费视频| 天天色天天综合网| 精品精品精品| 中文字幕亚洲图片| 精品无码一区二区三区电影桃花| 性欧美videos另类喷潮| 国产自摸综合网| 国产高清免费在线观看| 久久久噜噜噜久久中文字幕色伊伊| 日韩高清在线播放| 欧洲中文在线| 欧美综合在线视频| 在线播放av网址| 欧美日韩中文一区二区| 欧美美最猛性xxxxxx| 超碰超碰超碰超碰| 国产裸体歌舞团一区二区| 久久久久久久久久久一区| 国产原创视频在线观看| 日韩欧美国产成人| 日本泡妞xxxx免费视频软件| 国产成人久久| 午夜精品福利视频| 国产精品无码在线播放 | 极品日韩久久| а√天堂在线官网| 91久久人澡人人添人人爽欧美| 国产黄色一区二区三区| 欧洲杯半决赛直播| 国内精品久久久久| 国产叼嘿视频在线观看| 中文字幕乱码久久午夜不卡 | 欧美freesex| 精品国产成人系列| 日本一级特级毛片视频| 丝袜脚交一区二区| 久久精品人人做人人爽电影| 毛片在线网址| 在线不卡一区二区| 人妻无码一区二区三区免费| 久久福利毛片| 精品国产免费人成电影在线观...| dy888亚洲精品一区二区三区| 欧美性色综合网| 日本高清www| 在线日本成人| 国产高清在线一区二区| 高清免费电影在线观看| 欧美蜜桃一区二区三区 | 亚洲影视在线播放| 视频区 图片区 小说区| 久久国产电影| 国产欧美va欧美va香蕉在| 黄色毛片在线看| 一本色道a无线码一区v| 无码人妻精品一区二区三应用大全| 在线成人亚洲| 久久精品99| 亚洲精品动漫| 亚洲三级 欧美三级| 日韩色图在线观看| 337p粉嫩大胆噜噜噜噜噜91av| 人妻无码久久一区二区三区免费| 亚洲电影一区| 久久久亚洲精选| 天天摸夜夜添狠狠添婷婷| 天天色天天操综合| 成人手机在线免费视频| 国产日本精品| 日韩欧美精品一区二区三区经典| 97久久香蕉国产线看观看| 亚洲人成五月天| 中文字幕在线观看你懂的| 国产精品丝袜在线| 国产又粗又长又爽又黄的视频| 91精品久久久久久久蜜月| 亚洲一区二区三区在线视频| 91精品国产91久久久久久青草| 欧美α欧美αv大片| 欧美特黄aaaaaa| 久久精品免视看| 国内国产精品天干天干| 一区二区中文| 精品欧美日韩在线| 欧美日韩视频免费观看| 色七七影院综合| 亚洲欧美激情国产综合久久久| 欧美日韩国产在线| 性欧美精品男男| 韩国精品免费视频| 日本福利视频一区| 国产探花在线精品| 91最新国产视频| 天堂√8在线中文| 一区二区三区在线播放欧美| av一级黄色片| 色综合久久久久网| 欧美黄色aaa| 91麻豆国产精品久久| 欧美日韩中文不卡| 激情综合久久| 日本一区二区久久精品| 日韩精品成人在线观看| 琪琪第一精品导航| 成人午夜在线影视| 国产丝袜一区视频在线观看| 综合久久中文字幕| 亚洲va欧美va国产va天堂影院| 人人妻人人澡人人爽| 懂色一区二区三区免费观看| 久久久久久香蕉| 欧美日韩亚洲一区三区| 亚洲 国产 日韩 综合一区| 日韩精品成人在线观看| 国产精品女视频| a'aaa级片在线观看| 日韩在线观看免费高清完整版| 天堂在线观看视频| 51午夜精品国产| www.欧美色| 亚洲成人动漫精品| 粉嫩av性色av蜜臀av网站| 久久久亚洲综合| 久久久午夜精品福利内容| 久久激情综合网| 无码aⅴ精品一区二区三区浪潮| 香蕉综合视频| 亚洲精品一区二区毛豆| 日韩啪啪网站| 国产精品播放| 久久三级中文| 国产精品一香蕉国产线看观看| 日韩影院在线| 国内精品久久久久影院 日本资源| 麻豆视频在线观看免费网站| 亚洲日本中文字幕免费在线不卡| 天天操天天爱天天干| 欧美成人一级视频| 国产精品丝袜黑色高跟鞋| 欧美三片在线视频观看 | 日韩一区二区精品葵司在线| 中文字幕欧美人妻精品| 色网综合在线观看| 国偷自拍第113页| 亚洲国产日日夜夜| 九九视频在线观看| 亚洲激情网站免费观看| 日韩福利小视频| 中文字幕一区二区三区色视频 | 在线播放黄色av| 久久激情五月激情| 亚洲欧美自偷自拍另类| 蜜桃视频在线一区| 牛夜精品久久久久久久| 视频一区二区三区在线| 日韩中文字幕免费在线| 水野朝阳av一区二区三区| 一本大道熟女人妻中文字幕在线| 亚洲理伦在线| 毛片在线视频播放| 亚洲欧美日韩国产综合精品二区 | 亚洲欧洲免费无码| 三级电影一区| 日本免费在线视频观看| 小说区亚洲自拍另类图片专区| 一区中文字幕在线观看| 欧美成人日韩| 91成人综合网| 99国产精品久久久久久久成人热 | 蜜桃一区二区三区在线| 国产精品视频中文字幕| 精品系列免费在线观看| 99九九99九九九99九他书对| 国产成人在线观看免费网站| 久久久久无码国产精品一区李宗瑞| 成人在线一区二区三区| 欧美一区二区三区成人精品| 国产三级一区二区三区| 日本不卡一区视频| 亚洲精品免费在线| 国产一级久久久| 岛国av一区二区在线在线观看| 黄色大片网站在线观看| 欧美性极品少妇| 国产一区二区在线视频聊天| 日韩视频在线你懂得| 日韩中文字幕观看| 亚洲天堂av在线免费| 国产原创精品视频| 亚州av一区二区| 电影亚洲精品噜噜在线观看| 91人人爽人人爽人人精88v| 岛国精品一区| 日韩免费av一区二区三区| 久久精品影视| 国产h视频在线播放| 奇米色一区二区| 日本人妻一区二区三区| 国产日韩欧美高清| 婷婷久久综合网| 狠狠久久亚洲欧美专区| 一区二区视频播放| 欧美va亚洲va香蕉在线| 搞黄视频在线观看| 欧美激情a在线| 精品成人av| 国产乱码精品一区二区三区中文| 加勒比久久综合| 欧美大黑帍在线播放| 日韩高清中文字幕一区| 黑森林av导航| 国产精品久久久爽爽爽麻豆色哟哟| 国产一级在线视频| 欧美日韩视频在线第一区 | 亚洲视频第一页| 中文字幕在线三区| 国产精品视频在线观看| 国产精品x8x8一区二区| 桥本有菜av在线| 久久永久免费| 北京富婆泄欲对白| 中文字幕中文在线不卡住| 国产又黄又爽又色| 日韩视频中午一区| 求av网址在线观看| 国产成人免费91av在线| 精品亚洲自拍| 美女av免费观看| 国产在线播精品第三| 老司机福利在线观看| 欧美性猛交99久久久久99按摩| 亚洲av少妇一区二区在线观看| 中文字幕国产精品久久| av资源亚洲| 久久综合九九| 日韩网站在线| 影音先锋资源av| 亚洲精品免费视频| 国产精品无码在线播放| 在线免费看av不卡| 在线成人av观看| 国产综合欧美在线看| 影音先锋久久| 久久久久国产免费| 亚洲精品第1页| 国产aⅴ一区二区三区| 成年无码av片在线| 91精品一区| 午夜久久久久久久久久久| 久久99九九99精品| 亚洲一级理论片| 欧美日韩一区二区在线观看视频| 岛国视频免费在线观看| 国产a级全部精品| 欧美精品系列| 91小视频网站| 最新成人av在线| 国产一区二区在线不卡| 两个人的视频www国产精品| 成人污污www网站免费丝瓜| 91社在线播放| 国产91在线|亚洲| 精品无码人妻一区二区三区品| 亚洲精品一区二区在线观看| 国产免费拔擦拔擦8x在线播放 | 丰满大乳奶做爰ⅹxx视频| 亚洲成人av资源| 污视频在线免费| 国产成人精品午夜| 色欧美自拍视频| aaa一级黄色片| 一区二区三区在线观看动漫| 亚洲精品久久久久久久久久久久久久 | 久热国产精品| 国产视频123区| 欧美一区二区三区免费大片| a视频在线播放| 国产乱码精品一区二区三区中文 | 亚洲影院免费| 第一次破处视频| 欧美日韩久久不卡| caoporn97在线视频| 精品国产免费一区二区三区 | 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 免费试看一区| 久久精品国产精品亚洲精品| 欧美人禽zoz0强交| 日韩电视剧在线观看免费网站| 亚洲天堂一区二区| 警花观音坐莲激情销魂小说| 9人人澡人人爽人人精品| 国产精品国产精品国产| 九九久久久久99精品| 婷婷国产精品| 日韩欧美亚洲另类| 五月婷婷色综合| 在线日本中文字幕| 国产精品露出视频| 日本三级亚洲精品| 久久中文字幕无码| 国产亚洲精品综合一区91| 亚洲精品不卡在线观看| 人妻无码视频一区二区三区| 亚洲精品乱码久久久久久黑人| 欧美女优在线观看| 91九色蝌蚪嫩草| 久久在线精品| 国产一级黄色av| 日韩在线免费av| 亚洲大片精品免费|