gpt4 book ai didi

java - 如何在一段时间不活动后清除 map 条目

转载 作者:行者123 更新时间:2023-12-02 22:45:06 26 4
gpt4 key购买 nike

<分区>

我正在开发一个由 OpenAI 提供支持的聊天机器人。我正在使用带有 ChatCompletion 请求的新 gpt-3.5-turbo 模型。我已经想出了一种方法,让机器人使用 HashMap 记住每个用户的对话,并且一切正常。机器人能够记住所有以前的响应并使用历史作为上下文生成新响应。但是,查询中的响应越多,使用的 token 就越多,从而增加了成本。如果有一定数量的不活动(比如 2 分钟不与机器人交谈),我想将其设置为清除历史记录并开始新的对话以节省 token 。实现这一目标的最佳方法是什么?

这是我的代码:

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,只清除与非 Activity 用户关联的条目。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com