我正在开发一个由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); } // 剩余代码未变}