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


    聊天后,刷新页面,会发现我们的聊天内容还在,这就说明了,会话的历史已经记录了。
相关推荐
DevNo9 分钟前
英文会议转中文纪要,三款AI工具实测体验
人工智能
深小乐11 分钟前
AI 说话越来越难懂?Anthropic 员工都在用 ELI5 这个图解 Skill
人工智能
问天_观心15 分钟前
大模型微调学习(二)
人工智能·python·深度学习·学习·语言模型·transformer
甲维斯20 分钟前
我要吹爆GPT6了!实测3列惊为天人!
人工智能
zhanghe68722 分钟前
es的密码带有特殊字符,导出
java
pnoker34 分钟前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
my_realmy35 分钟前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
Fnetlink11 小时前
Fnet 云网安 260904
网络·人工智能·安全·web安全·网络安全
ZGIAI1 小时前
Agent 越来越强,企业为什么反而更需要“运行层”?
人工智能·架构
ZGIAI1 小时前
企业级 Agent 平台开源:ZGI 把模型、知识库、Skills 和 Workflow 放进同一个 Runtime
人工智能·架构