如何在一定时间的非活动后清除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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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