精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产福利影院在线观看| 岛国av在线一区| 国产精品久久久久影院色老大 | 亚洲精品亚洲人成在线| 亚洲色图视频网| 国产a∨精品一区二区三区不卡| 亚洲一区三区视频在线观看| 国产做受高潮漫动| 日韩成人在线看| 一区在线观看免费| 91精品国产综合久久久久久久久| 欧美黄色激情视频| a欧美人片人妖| 97se亚洲国产综合自在线| 欧美激情在线观看视频| 欧美熟妇另类久久久久久多毛| av电影在线观看一区二区三区| 网曝91综合精品门事件在线| 亚洲自拍偷拍图区| 亚洲精品日产aⅴ| 国产又粗又猛又爽又黄的视频小说| 在线毛片观看| 久久只精品国产| 91高清视频免费| 蜜臀av一区二区三区有限公司| 欧美aaaxxxx做受视频| 国产高清一区日本| 欧美激情xxxxx| 亚洲成a人片在线www| 牛牛电影国产一区二区| 国产欧美一区二区三区在线老狼| 国产福利精品在线| 99自拍偷拍视频| 国产精品一区二区三区av| 亚洲三级久久久| 日本一区二区三区视频在线播放| 日韩在线 中文字幕| 欧美亚洲高清| 欧美老女人在线| www.69av| 天天爽夜夜爽夜夜爽| 国产视频一区三区| 国产午夜精品免费一区二区三区 | 欧美亚洲免费| 亚洲老头老太hd| 91av俱乐部| 在线视频二区| 中文字幕精品在线不卡| 成人免费视频网址| 国产真实乱偷精品视频| 日韩伦理一区二区三区| 亚洲精品一区二区三区四区高清| 波多野结衣乳巨码无在线| 裸体xxxx视频在线| 国产在线视频一区二区| 欧美激情视频一区| 欧美三级在线免费观看| 精品国产影院| 欧美在线观看禁18| 欧美精品在欧美一区二区| 亚洲av成人无码久久精品老人| 另类国产ts人妖高潮视频| 日韩在线播放av| 亚洲国产精品无码久久久久高潮| 日韩一区二区三区免费视频| 夜夜夜精品看看| 大荫蒂性生交片| 国产区av在线| 成人黄页在线观看| 国产美女精品免费电影| 日韩aaaaaa| 五月婷婷亚洲| 亚洲色在线视频| 日本精品一二三| av成人资源| 欧美三级视频在线观看| www.av毛片| 黄色在线播放网站| 2023国产精品视频| 日韩.欧美.亚洲| 手机看片福利永久| 久久久久久一二三区| 99久久免费国| 97在线视频人妻无码| 国产亚洲精品v| 国产z一区二区三区| 亚洲午夜激情视频| 久久婷婷麻豆| 性日韩欧美在线视频| 精品国产视频在线观看| 精品久久久久久久| 亚洲跨种族黑人xxx| 337人体粉嫩噜噜噜| 亚洲精品国产setv| 中文亚洲视频在线| 最近中文字幕免费| 99久久99热这里只有精品 | 久久国产日韩欧美| 国产精品熟女久久久久久| 国产成人在线视频网址| 欧美h视频在线| 手机在线观看毛片| 中文字幕av一区二区三区| 天天想你在线观看完整版电影免费| a'aaa级片在线观看| 一区二区三区不卡在线观看| 免费欧美一级视频| 日本不卡1234视频| 午夜精品久久久久久久久久久| japanese在线播放| 日本成人三级电影| 91国偷自产一区二区三区成为亚洲经典| 日本午夜激情视频| 川上优av中文字幕一区二区| 中文字幕字幕中文在线中不卡视频| av在线播放亚洲| 粉嫩av国产一区二区三区| 亚洲国产一区二区三区在线观看| 日本女人黄色片| 一区二区三区欧洲区| 日韩欧美中文字幕公布| zjzjzjzjzj亚洲女人| 色综合蜜月久久综合网| 久久精品人人爽| 黄色一级视频在线观看| 欧美激情五月| 欧美激情视频在线观看| 自拍偷拍精品视频| 狠狠色伊人亚洲综合成人| 亚洲一区制服诱惑| 91大神xh98hx在线播放| 欧美日韩在线影院| 一区二区三区 欧美| www欧美在线观看| 精品不卡在线视频| 极品颜值美女露脸啪啪| 久久国产福利国产秒拍| 97se亚洲综合在线| 丝袜视频国产在线播放| 中文字幕第一区| 欧美aⅴ在线观看| 欧美高清你懂的| 日韩欧美第一区| 中文字幕乱码在线| 欧美日韩视频| 99视频在线播放| 羞羞视频在线观看免费| 精品久久久久久国产| 天天操天天爱天天爽| 国产一区二区三区四区大秀| 久久九九精品99国产精品| 中文字幕精品在线观看| 国产.欧美.日韩| 日本精品一区二区三区高清 久久| 免费av不卡在线观看| 欧美第一区第二区| 国产亚洲色婷婷久久99精品| 日日摸夜夜添夜夜添亚洲女人| 91视频免费网站| 日本又骚又刺激的视频在线观看| 国产精品久久久久7777按摩 | 亚洲福利电影| 国产成人一区二区三区| 国产三级视频在线| 欧美日韩一区二区三区四区 | 欧美日韩伦理在线免费| 国产精品久久久久久久美男| 国产chinasex对白videos麻豆| av中文一区二区三区| 一区视频二区视频| 高清毛片在线观看| 日韩精品黄色网| 中文字幕亚洲欧美日韩| 亚洲免费高清| 91午夜在线播放| 久草在线新免费首页资源站| 亚洲国产精品资源| 亚洲国产成人精品女人久久| 粉嫩一区二区三区性色av| 搞av.com| 免费一级欧美在线大片| 在线观看久久av| 成人毛片18女人毛片| 国产剧情一区在线| 亚洲区一区二区三区| av日韩电影| 久久精品视频中文字幕| 日本韩国免费观看| 亚洲情趣在线观看| 中文在线观看免费视频| 欧美a级在线| 91久久久在线| 国产拍在线视频| 这里只有精品视频| 亚洲第一页视频| 亚洲激情男女视频| 91免费视频污| 亚洲成人一区| 91精品中国老女人| 国产直播在线| 久久精品国产v日韩v亚洲| 十八禁一区二区三区| 欧美日韩精品一区二区三区| 无码一区二区三区在线| 精久久久久久久久久久| 精品一区二区中文字幕| 欧美va天堂在线| 翔田千里亚洲一二三区| 99亚洲伊人久久精品影院| 伊人久久精品视频| 亚洲av永久纯肉无码精品动漫| 色系网站成人免费| x88av在线| 日韩国产欧美三级| 国产真实老熟女无套内射| 日韩一区二区在线| 蜜桃av色综合| 国产成人在线中文字幕| 97精品久久久| 岛国成人毛片| 欧美大片日本大片免费观看| 影音先锋国产资源| 一本一道综合狠狠老| 久久综合久久鬼| 亚洲啪啪综合av一区二区三区| 91成年人网站| 麻豆高清免费国产一区| 免费久久久久久| 999精品视频在这里| 国产在线精品播放| 777午夜精品电影免费看| 97国产精品视频人人做人人爱| 欧美成年黄网站色视频| 日韩精品中午字幕| ,一级淫片a看免费| 一片黄亚洲嫩模| 日韩一区二区三区四区在线| 国产精品美女一区二区| 国产一区二区三区四区五区六区| 91在线精品一区二区| 稀缺小u女呦精品呦| 高清免费成人av| 中文字幕在线播放一区二区| 国产老肥熟一区二区三区| 国产在线观看中文字幕| 国内成+人亚洲+欧美+综合在线| 中文久久久久久| 秋霞影院一区二区| 男人添女人下部视频免费| 午夜精品毛片| 99亚洲精品视频| 欧美a级片网站| av在线免费观看国产| 亚洲国产高清视频| 亚洲综合视频一区| 99久久.com| 激情图片qvod| 国产一区二区三区四区五区| 欧美精品欧美精品系列c| 国产精品毛片无码| 51精品国产人成在线观看| 91蝌蚪精品视频| 国产欧美日韩视频一区二区三区| 国产精品第一国产精品| 国产精品视频网址| 国产成年精品| 懂色中文一区二区三区在线视频| 日本综合视频| 国产在线观看不卡| 欧美a在线观看| 国产一区在线免费观看| 九色成人国产蝌蚪91| www国产亚洲精品| 久久久精品国产**网站| 免费看国产精品一二区视频| 青青草97国产精品麻豆| 亚洲黄色网址在线观看| 亚洲激情二区| 国产三级三级三级看三级| 精品综合免费视频观看| 午夜福利三级理论电影| 久久久精品天堂| 日韩三级久久久| 国产欧美一区二区精品性色超碰| 日本精品久久久久中文| 亚洲蜜桃精久久久久久久| 久久久久久国产免费a片| 1区2区3区精品视频| 国产精品16p| 色噜噜狠狠色综合欧洲selulu| 91福利免费视频| 亚洲国产欧美在线成人app| 黄色电影免费在线看| 亚洲黄色av网站| www.亚洲资源| 这里只有精品丝袜| 久久香蕉av| 国产精品久久久久秋霞鲁丝| 欧美欧美在线| 日韩一区不卡| 99xxxx成人网| 日本高清一区二区视频| 久久草av在线| 亚洲第一黄色网址| **性色生活片久久毛片| 国产区一区二区三| 色综合天天在线| 精品国产乱码久久久久久蜜臀网站| 欧美精品日韩综合在线| 四虎成人免费在线| 欧美放荡办公室videos4k| 美女色狠狠久久| 久久久久久草| 亚洲午夜精品久久久久久app| 天堂а√在线中文在线| 久久三级视频| 亚洲观看黄色网| 亚洲在线一区二区三区| 依依成人在线视频| 亚洲欧美精品中文字幕在线| 肉体视频在线| 91精品国产综合久久香蕉922| 一本久久青青| 午夜精品久久久久久久无码| 国产成人鲁色资源国产91色综| 亚洲第一视频区| 色综合亚洲欧洲| 手机看片福利在线观看| 欧美精品18videos性欧| 欧美国产中文高清| 日本丰满少妇黄大片在线观看| 日韩中文字幕不卡| 女~淫辱の触手3d动漫| 精品国产乱码久久久久久婷婷| 亚洲第一页在线观看| 欧美国产日韩一区二区三区| 国产高清精品二区| 国产a级片免费看| 美国十次了思思久久精品导航| 精品国产成人亚洲午夜福利| 欧美性猛交xxx| 香蕉国产在线视频| 91av在线不卡| 校花撩起jk露出白色内裤国产精品| 亚洲精品蜜桃久久久久久| 国产成a人亚洲精品| 久久久久久激情| 精品卡一卡二卡三卡四在线| 欧美理论在线观看| 欧美中文字幕精品| 国产精品毛片aⅴ一区二区三区| 亚洲一区在线免费| 精品一区二区综合| 在线免费看av网站| 欧美一区二区网站| 毛片在线播放网站| 国产精品第3页| 北条麻妃一区二区三区在线| 精品成在人线av无码免费看| 成人激情校园春色| 久久亚洲精品国产| 亚洲人成伊人成综合网久久久| 成人亚洲欧美| 亚洲欧美影院| 国产精品自产自拍| 中文字幕第28页| 亚洲精品网站在线播放gif| caopeng在线| 国产精品毛片va一区二区三区| 日韩精品免费一区二区在线观看 | 免费一区二区三区四区| 一区二区三区四区国产| 国产精品亚洲一区二区三区妖精| 精品少妇爆乳无码av无码专区| 日韩精品在线观看一区| 国产成人福利夜色影视| 白白操在线视频| 91视频www| 久久精品第一页| 精品一区二区亚洲| 日韩在线激情| 日本一区二区三区视频在线播放| 蜜臀久久99精品久久久久宅男 | 韩国日本在线视频| 国产精品美女久久久久久久久| 精品久久久免费视频| 欧美一区二区三区四区在线| 91精品久久久久久综合五月天 | 久久网中文字幕| 亚洲美女黄色片| 欧美成人精品午夜一区二区| 日本www在线播放| 国产精品嫩草影院com| 亚洲高清精品视频| 国产精品青青在线观看爽香蕉| 欧美日韩影院| jizzjizzjizz国产| 日韩国产高清污视频在线观看| 看片一区二区| 东京热加勒比无码少妇|