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. 上面完成了查询聊天详情的接口,启动服务,然后增加几个聊天内容和记录,然后查看接口消息。


    聊天后,刷新页面,会发现我们的聊天内容还在,这就说明了,会话的历史已经记录了。
相关推荐
翊众建站20 小时前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
梦想不只是梦与想21 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合21 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
冬奇Lab21 小时前
一天一个开源项目(第253篇):dsh-superagent —— DeepSeek 开源的“主动式”编程智能体原型,核心原则是少占人的注意力
人工智能·开源·资讯
罗西的思考21 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
拓恒技术21 小时前
从“可见光漏检”到“热异常锁定”:无人机河道排污口识别与溯源的技术链路
人工智能·视觉检测·无人机
2601_9689007721 小时前
按量计费接口实战:从接入、预算到对账的完整链路
人工智能
七牛云行业应用21 小时前
MIT “权重空间编程”:GPT-6 Astra 修改 0.016% 的 Qwen 权重,MATH-500 从 7.9% 升至 48.1%
人工智能·gpt·ai
故七月1 天前
AI 答案里的竞品共现:怎么看出赛道格局
大数据·人工智能
正在走向自律1 天前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付