From 757961e12caea6fee331d80dfef0745a9570653d Mon Sep 17 00:00:00 2001 From: wangxiang <1827945911@qq.com> Date: Mon, 4 Dec 2023 11:15:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BA=BF=E4=B8=8A?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=A2=84=E8=A7=88=E6=89=BE=E4=B8=8D=E5=88=B0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/config/OpenAiConfigProperties.java | 3 +++ .../service/impl/ImContentServiceImpl.java | 27 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java index 8a1261e6..982f40aa 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/config/OpenAiConfigProperties.java @@ -54,4 +54,7 @@ public class OpenAiConfigProperties { /** System Rules Limit */ private String systemRule = "是与AI助手的对话。助手乐于助人,富有创造力,聪明限制每次回答在120字以内不得超过120字。"; + /** Context Window Max */ + private String contextMessageMaxCount = "15"; + } diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java index c2c58906..979e160f 100644 --- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java +++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/ImContentServiceImpl.java @@ -18,6 +18,7 @@ import com.cloud.kicc.system.mapper.ImContentMapper; import com.cloud.kicc.system.service.FileService; import com.cloud.kicc.system.service.IImContentService; import com.cloud.kicc.system.util.AiUtil; +import com.knuddels.jtokkit.api.ModelType; import com.pig4cloud.plugin.oss.OssProperties; import com.pig4cloud.plugin.oss.service.OssTemplate; import com.theokanning.openai.audio.CreateSpeechRequest; @@ -28,6 +29,7 @@ import com.theokanning.openai.completion.chat.ChatCompletionResult; import com.theokanning.openai.completion.chat.ChatMessage; import com.theokanning.openai.completion.chat.ChatMessageRole; import com.theokanning.openai.service.OpenAiService; +import com.theokanning.openai.utils.TikTokensUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import okhttp3.ResponseBody; @@ -40,7 +42,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.time.Duration; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.Objects; @@ -92,7 +93,8 @@ public class ImContentServiceImpl extends ServiceImpl i.eq(ImContent::getSendUserId, imContent.getReceiveUserId()) .eq(ImContent::getReceiveUserId, imContent.getSendUserId()) - ) .orderByAsc(ImContent::getSendTime)); + ).last(String.format("LIMIT %s", openAiConfigProperties.getContextMessageMaxCount())) + .orderByAsc(ImContent::getSendTime)); // 历史上下文消息 List historyMessages = imContents.stream().map(item -> { @@ -101,6 +103,8 @@ public class ImContentServiceImpl extends ServiceImpl messages) { + ModelType modelType = ModelType.fromName(modelName) + .orElseThrow(() -> new CheckedException(String.format("找不到指定的:%s模型请检查配置!", modelName)));; + int sumTokens = TikTokensUtil.tokens(modelName, messages); + // 从前向后遍历消息,直到总 token 数在限制之内 + while (!messages.isEmpty() && sumTokens > modelType.getMaxContextLength()) { + // 移除列表中的第一个消息 + messages.remove(0); + // 重新计算总 token 数 + sumTokens = TikTokensUtil.tokens(modelName, messages); + } + } + }