如何在一定时间的非活动后清除Map条目 [重复]

我正在开发一个由OpenAI驱动的聊天机器人。我使用的是新的gpt-3.5-turbo模型和ChatCompletion请求。我已经想出了一个方法,让机器人使用HashMap记住每个用户的对话,一切正常。机器人能够记住所有之前的响应,并使用历史记录作为上下文生成新的响应。然而,查询中的响应越多,使用到的标记就越多,成本也会增加。我希望在一定时间的非活动后(例如2分钟内不与机器人对话),清除历史记录并开始一个全新的对话,以节省标记。这应该如何实现呢?

这是我的代码:

private static OpenAiService service;    private static Map<String, List<ChatMessage>> conversations = new HashMap<String, List<ChatMessage>>();            public static void initializeOpenAi() {    service = new OpenAiService(Settings.OPENAI_ACCESS_KEY);}public static String generateChatResponse(User user, String prompt) {    List<ChatMessage> conversation;            if (conversations.containsKey(user.getId())) {        conversation = conversations.get(user.getId());    } else {        conversation = new ArrayList<ChatMessage>();    }            if (conversation.size() < 1) {        ChatMessage system = new ChatMessage();        system.setRole("system");        system.setContent("Omnis is a chatbot with sarcasm");        conversation.add(system);    }            ChatMessage userPrompt = new ChatMessage();    userPrompt.setRole("user");    userPrompt.setContent(prompt);    conversation.add(userPrompt);            ChatCompletionRequest chatRequest = ChatCompletionRequest.builder()            .model("gpt-3.5-turbo")            .maxTokens(1000)            .temperature(0.9)            .topP(0.3)            .frequencyPenalty(0.9)            .presencePenalty(0.0)            .messages(conversation)            .build();            ChatCompletionResult chatResult = null;            try {        chatResult = service.createChatCompletion(chatRequest);    } catch (Exception e) {        System.out.println("An OpenAI request failed!");                    if (e.getMessage().contains("timeout")) {            return "Your request timed out. Please try again after a breif wait for try a different request.";        }                    if (e.getMessage().contains("Rate limit")) {            return "Rate limit for chat requests has been reached!";        }                    return "Something went wrong with your request. Cause of error is " + e.getMessage();    }            if (chatResult != null) {        System.out.println("Created chat completion request that used " + chatResult.getUsage().getTotalTokens() + " tokens with " + chatResult.getModel());    }            String response = chatResult.getChoices().get(0).getMessage().getContent();            ChatMessage assistantPrompt = new ChatMessage();    assistantPrompt.setRole("assistant");    assistantPrompt.setContent(response);    conversation.add(assistantPrompt);            conversations.put(user.getId(), conversation);            return response;}

每次用户发送消息时都会调用”generateChatResonse”方法。它会获取用户的ID,并从HashMap中拉取对话,如果不存在则创建一个新的对话。

我不知道该尝试什么。

我不想清除整个HashMap,只想清除与非活动用户相关的条目。


回答:

我已经在项目中添加了Guava,并用LoadingCache对象替换了Map。它接受相同类型的参数,并允许我轻松设置过期时间。

private static LoadingCache<String, List<ChatMessage>> conversations;public static void initializeOpenAi() {    service = new OpenAiService(Settings.OPENAI_ACCESS_KEY);            conversations = CacheBuilder.newBuilder()            .maximumSize(10000)            .expireAfterWrite(2, TimeUnit.MINUTES)            .build(                new CacheLoader<String, List<ChatMessage>>() {                    @Override                    public List<ChatMessage> load(String key) throws Exception {                        return conversations.get(key);                    }                });}public static String generateChatResponse(User user, String prompt) {    List<ChatMessage> conversation = conversations.getIfPresent(user.getId());            if (conversation == null) {        conversation = new ArrayList<ChatMessage>();                    ChatMessage system = new ChatMessage();        system.setRole("system");        system.setContent("Omnis is a chatbot with sarcasm");                    conversation.add(system);    }    // 剩余代码未变}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注