英文:
How to clear Map entry after certain time of inactivity
问题
我正在开发一个由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 brief wait or 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;
}
每当用户发送消息时,都会调用“generateChatResponse”方法。它获取用户的ID,并从HashMap中提取对话(如果存在的话),如果不存在,则创建一个新对话。
我不知道要尝试什么。
我不想清除整个HashMap,只想清除与不活动用户关联的条目。
英文:
I'm working on a chatbot powered by OpenAI. I'm using the new gpt-3.5-turbo model with ChatCompletion requests. I've already come up with a way for the bot to remember conversations for each individual user using a HashMap and it all works. The bot is able to remember all the previous responses and generate a new response using the history as context. However, the more responses in the query, the more tokens that it'll use, increasing costs. I want make it where if there is a certain amount of inactivity (like 2 minutes of not talking to the bot), it'll clear the history and start a fresh new conversation to save on tokens. What would be the best way to accomplish this?
Here is my code:
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;
}
The "generateChatResonse" method gets called each time a message is sent by a user. It get's the user's ID and pulls the conversation from the HashMap if it exists, if not it creates a new conversation.
I don't know what to try.
I don't want to clear the entire HashMap, just the entry associated with the inactive user.
答案1
得分: 1
I've added Guava to my project and replaced the Map with a LoadingCache object. It takes the same type of parameters and allows me to easily set the time before expiration.
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);
}
// Remaining code is unchanged
}
英文:
I've added Guava to my project and replaced the Map with a LoadingCache object. It takes the same type of parameters and allows me to easily set the time before expiration.
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);
}
// Remaining code is unchanged
}
答案2
得分: -1
检查是否有更改,如果没有,经过一段时间将其清除?
英文:
How about a thread ? Check if there are changes , and if not for an amount of time to clear it ?
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论