RAG增强对话

114 阅读2分钟

连续对话

代码实例

@PostMapping("/chat/call8")
public String call8(@RequestBody Map<String, String> messageMap) {
    List<Message> messages = new ArrayList<>(16);
    String userRequest = messageMap.getOrDefault("userMessage", StrUtil.EMPTY);
    if (StrUtil.isNotBlank(userRequest)) {
        System.out.println(">>>>> USER request:" + userRequest);
        UserMessage userMessage = new UserMessage(userRequest);
        messages.add(userMessage);
    }
    String aiRequest = messageMap.getOrDefault("aiMessage", StrUtil.EMPTY);
    if (StrUtil.isNotBlank(aiRequest)) {
        //System.out.println(">>>>> AI request:" + aiRequest);
        AssistantMessage aiMessage = new AssistantMessage(aiRequest);
        messages.add(aiMessage);
    }
    Prompt prompt = new Prompt(messages);
    ChatResponse chatResponse = chatClient.call(prompt);
    AssistantMessage output = chatResponse.getResult().getOutput();
    System.out.println(">>>>> AI response:" + output.getContent());
    ThreadUtil.sleep(1000);
    return output.getContent();
}

单元测试

@Test
public void call8Test() throws Exception {
    String url = "/chat/call8";
    Map<String, String> messageMap = new HashMap<>(16);
    List<String> list = new ArrayList<>();
    list.add("深圳的天气如何?");
    list.add("今天是否会下雨?");
    list.add("深圳的天气如何?");
    list.add("exit");
    for (String str : list) {
        if (str.equals("exit")) {
            break;
        }
        //添加到消息历史
        messageMap.put("userMessage", str);
        String content = JSONUtil.toJsonStr(messageMap);
        String response = mockMvc.perform(postRequestBuilder(url, content)).andReturn().getResponse().getContentAsString();
        // 响应乱码处理
        String aiMessage = new String(response.getBytes("ISO-8859-1"), "UTF-8");
        messageMap.put("aiMessage", aiMessage);
    }
}

执行结果

>>>>> USER request:深圳的天气如何?
>>>>> AI response:深圳属于亚热带季风气候,四季分明,雨量充沛。
>>>>> USER request:今天是否会下雨?
>>>>> AI response:今天深圳的天气预报显示为阴天,所以今天不会下雨。
>>>>> USER request:深圳的天气如何?
>>>>> AI response:建议您出门前关注实时天气预报信息,以便更好地规划出行。

预设上下文

代码实例

@PostMapping("/chat/call8")
public String call8(@RequestBody Map<String, String> messageMap) {
    List<Message> messages = new ArrayList<>(16);
    String sysRequest = messageMap.getOrDefault("sysMessage", StrUtil.EMPTY);
    if (StrUtil.isNotBlank(sysRequest)) {
        //System.out.println(">>>>> SYS request:" + aiRequest);
        SystemMessage sysMessage = new SystemMessage(sysRequest);
        messages.add(sysMessage);
    }
    String userRequest = messageMap.getOrDefault("userMessage", StrUtil.EMPTY);
    if (StrUtil.isNotBlank(userRequest)) {
        System.out.println(">>>>> USER request:" + userRequest);
        UserMessage userMessage = new UserMessage(userRequest);
        messages.add(userMessage);
    }
    String aiRequest = messageMap.getOrDefault("aiMessage", StrUtil.EMPTY);
    if (StrUtil.isNotBlank(aiRequest)) {
        //System.out.println(">>>>> AI request:" + aiRequest);
        AssistantMessage aiMessage = new AssistantMessage(aiRequest);
        messages.add(aiMessage);
    }
    Prompt prompt = new Prompt(messages);
    ChatResponse chatResponse = chatClient.call(prompt);
    AssistantMessage output = chatResponse.getResult().getOutput();
    System.out.println(">>>>> AI response:" + output.getContent());
    ThreadUtil.sleep(1000);
    return output.getContent();
}

单元测试

@Test
public void call8Test() throws Exception {
    String url = "/chat/call8";
    Map<String, String> messageMap = new HashMap<>(16);
    messageMap.put("sysMessage", "深圳市,简称“深”,别称鹏城,广东省辖地级市、副省级市、国家计划单列市,超大城市,地处广东省南部,珠江口东岸,北回归线以南,东临大亚湾和大鹏湾,西濒珠江口和伶仃洋,南与香港特别行政区相连,北部与东莞市、惠州市接壤。");

    List<String> list = new ArrayList<>();
    list.add("深圳的天气如何?");
    list.add("今天是否会下雨?");
    list.add("深圳的天气如何?");
    list.add("exit");
    for (String str : list) {
        if (str.equals("exit")) {
            break;
        }
        //添加到消息历史
        messageMap.put("userMessage", str);
        String content = JSONUtil.toJsonStr(messageMap);
        String response = mockMvc.perform(postRequestBuilder(url, content)).andReturn().getResponse().getContentAsString();
        // 响应乱码处理
        String aiMessage = new String(response.getBytes("ISO-8859-1"), "UTF-8");
        messageMap.put("aiMessage", aiMessage);
    }
}

执行结果

>>>>> USER request:深圳的天气如何?
>>>>> AI response:深圳属于亚热带季风性气候,四季分明,雨量充沛。
>>>>> USER request:今天是否会下雨?
>>>>> AI response:根据天气预报,今天深圳可能会有小雨,建议出门携带雨具。
>>>>> USER request:深圳的天气如何?
>>>>> AI response:明天深圳可能会有中雨,建议出门携带雨具,并尽量避免外出。

增加上下文后,AI的回答更满足期望了。