作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在开发一个由 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 用户关联的条目。
我是一名优秀的程序员,十分优秀!