Spring AI(6) :对话机器人-会话历史

本章代码已分享至Gitee:https://gitee.com/lengcz/ai-study.git

文章目录

本章代码已分享至Gitee:https://gitee.com/lengcz/ai-study.git

会话历史

  1. 添加ChatHisoryRepository
java 复制代码
import java.util.List;

public interface ChatHistoryRepository {

    /**
     * 保存会话记录
     * @param type
     * @param chatId
     */
    void save(String type,String chatId);

    /**
     * 获取会话id集合
     * @param type
     * @return
     */
    List<String> getChatIds(String type);

    /**
     * 删除会话
     * @param chatId
     */
    void delete(String chatId);
}
  1. 添加实现类
java 复制代码
public class InMemoryChatHistoryRepository implements ChatHistoryRepository{

   private final Map<String,List<String>> chatHistory = new HashMap<>();

    @Override
    public void save(String type, String chatId) {
        chatHistory.computeIfAbsent(type,k->new ArrayList<>());
        List<String> chatIds = chatHistory.get(type);
        if(chatIds.contains(chatId)){
            return;
        }
        chatIds.add(chatId);
    }

    @Override
    public List<String> getChatIds(String type) {
        return chatHistory.getOrDefault(type,new ArrayList<>());
    }

    @Override
    public void delete(String chatId) {

    }
}
  1. 聊天时保存chatId
java 复制代码
//1.保存会话id
   chatHistoryRepository.save("chat",chatId);
  1. 编写获取chatIds 的接口
java 复制代码
@RequiredArgsConstructor //有参构造器
@RestController
@RequestMapping("/ai/history")
public class ChatHistoryController {

    private final ChatHistoryRepository chatHistoryRepository;

    private final ChatMemory chatMemory;

    /**
     * 获取会话ID列表
     * @param type
     * @return
     */
    @GetMapping("/{type}")
    public List<String> getChatIds(@PathVariable("type") String type){
        return chatHistoryRepository.getChatIds(type);
    }
}
  1. 启动服务器测试这个接口,这样这个页面的左侧聊天历史就可以了。
bash 复制代码
http://localhost:8080/ai/history/chat
  1. 编写历史消息接口,定义一个消息实体MessageVO ,然后通过ChatMemory查询历史消息,并将消息转换成刚才定义的List< MessageVO >
java 复制代码
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.ai.chat.messages.Message;

@NoArgsConstructor
@Data
public class MessageVO {

    private String role;

    private String content;

    public MessageVO(Message message){
        switch (message.getMessageType()){
            case USER:
                role ="user";
                break;
            case ASSISTANT:
                role = "assistant";
                break;
//            case  SYSTEM:
//                role = "system";
//                break;
//            case TOOL:
//                role = "function";
//                break;
            default:
                role= "unknown";
                break;
        }
        this.content = message.getText();
    }
}
java 复制代码
**
     * 查询历史消息详情
     * @param type
     * @param chatId
     * @return
     */
    @GetMapping("/{type}/{chatId}")
    public List<MessageVO> getChatHistory(@PathVariable("type") String type, @PathVariable("chatId") String chatId){
        List<Message> messages = chatMemory.get(chatId, Integer.MAX_VALUE);
        if(null== messages){
            return List.of();
        }
        return messages.stream().map(MessageVO::new).toList();
    }
  1. 上面完成了查询聊天详情的接口,启动服务,然后增加几个聊天内容和记录,然后查看接口消息。


    聊天后,刷新页面,会发现我们的聊天内容还在,这就说明了,会话的历史已经记录了。
相关推荐
小羊没烦恼!4 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
回眸&啤酒鸭4 天前
【回眸】Minicart 电商购物车核心功能落地指南
人工智能
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
AI的探索之旅4 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
AlbertZein4 天前
Step-5-Preview 上手实测:3D 游戏、金融分析、网页设计一次跑完
人工智能·aigc
俊昭喜喜里4 天前
java中的继承和多态的区别
java
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
LaughingZhu4 天前
Product Hunt 每日热榜 | 2026-09-19
人工智能·深度学习·神经网络·搜索引擎·百度
譕痕4 天前
JSONObject与JSONArray封装数据格式区别
java·json