From ff2043c0fb3ac81437f2f7314e572d19c82b9efc Mon Sep 17 00:00:00 2001 From: archer <545436317@qq.com> Date: Sun, 18 Jun 2023 21:23:36 +0800 Subject: [PATCH] feat: maxToken setting --- client/src/constants/model.ts | 1 + .../pages/api/openapi/v1/chat/completions.ts | 1 + .../components/detail/components/Settings.tsx | 40 ++++++++++++++++--- client/src/service/models/model.ts | 5 +++ client/src/service/utils/chat/index.ts | 1 + client/src/service/utils/chat/openai.ts | 11 ++++- client/src/types/mongoSchema.d.ts | 1 + 7 files changed, 54 insertions(+), 6 deletions(-) diff --git a/client/src/constants/model.ts b/client/src/constants/model.ts index 3fd55b1e3..303696d25 100644 --- a/client/src/constants/model.ts +++ b/client/src/constants/model.ts @@ -83,6 +83,7 @@ export const defaultModel: ModelSchema = { searchEmptyText: '', systemPrompt: '', temperature: 0, + maxToken: 4000, chatModel: OpenAiChatEnum.GPT35 }, share: { diff --git a/client/src/pages/api/openapi/v1/chat/completions.ts b/client/src/pages/api/openapi/v1/chat/completions.ts index c47fd202f..11d4a2db1 100644 --- a/client/src/pages/api/openapi/v1/chat/completions.ts +++ b/client/src/pages/api/openapi/v1/chat/completions.ts @@ -180,6 +180,7 @@ export default withNextCors(async function handler(req: NextApiRequest, res: Nex await modelServiceToolMap[model.chat.chatModel].chatCompletion({ apiKey: userOpenAiKey || apiKey, temperature: +temperature, + maxToken: model.chat.maxToken, messages: completePrompts, stream, res diff --git a/client/src/pages/model/components/detail/components/Settings.tsx b/client/src/pages/model/components/detail/components/Settings.tsx index 7ffce006c..c9e03acc9 100644 --- a/client/src/pages/model/components/detail/components/Settings.tsx +++ b/client/src/pages/model/components/detail/components/Settings.tsx @@ -36,11 +36,6 @@ const Settings = ({ modelId }: { modelId: string }) => { const [btnLoading, setBtnLoading] = useState(false); const [refresh, setRefresh] = useState(false); - const isOwner = useMemo( - () => modelDetail.userId === userInfo?._id, - [modelDetail.userId, userInfo?._id] - ); - const { register, setValue, @@ -52,6 +47,20 @@ const Settings = ({ modelId }: { modelId: string }) => { defaultValues: modelDetail }); + const isOwner = useMemo( + () => modelDetail.userId === userInfo?._id, + [modelDetail.userId, userInfo?._id] + ); + const tokenLimit = useMemo(() => { + const max = ChatModelMap[getValues('chat.chatModel')]?.contextMaxToken || 4000; + + if (max < getValues('chat.maxToken')) { + setValue('chat.maxToken', max); + } + + return max; + }, [getValues, setValue, refresh]); + // 提交保存模型修改 const saveSubmitSuccess = useCallback( async (data: ModelSchema) => { @@ -256,6 +265,27 @@ const Settings = ({ modelId }: { modelId: string }) => { /> + + + 最大长度 + + + { + setValue('chat.maxToken', val); + setRefresh(!refresh); + }} + /> + + 提示词 diff --git a/client/src/service/models/model.ts b/client/src/service/models/model.ts index c87fdd5ce..1b537b9ca 100644 --- a/client/src/service/models/model.ts +++ b/client/src/service/models/model.ts @@ -47,6 +47,11 @@ const ModelSchema = new Schema({ type: String, default: '' }, + maxToken: { + type: Number, + default: 4000, + min: 100 + }, temperature: { type: Number, min: 0, diff --git a/client/src/service/utils/chat/index.ts b/client/src/service/utils/chat/index.ts index b96518844..0daf56465 100644 --- a/client/src/service/utils/chat/index.ts +++ b/client/src/service/utils/chat/index.ts @@ -12,6 +12,7 @@ import { textAdaptGptResponse } from '@/utils/adapt'; export type ChatCompletionType = { apiKey: string; temperature: number; + maxToken?: number; messages: ChatItemType[]; chatId?: string; [key: string]: any; diff --git a/client/src/service/utils/chat/openai.ts b/client/src/service/utils/chat/openai.ts index 484fe75c6..ecfe8105e 100644 --- a/client/src/service/utils/chat/openai.ts +++ b/client/src/service/utils/chat/openai.ts @@ -19,22 +19,31 @@ export const chatResponse = async ({ model, apiKey, temperature, + maxToken = 4000, messages, stream }: ChatCompletionType & { model: `${OpenAiChatEnum}` }) => { + const modelTokenLimit = ChatModelMap[model]?.contextMaxToken || 4000; const filterMessages = ChatContextFilter({ model, prompts: messages, - maxTokens: Math.ceil(ChatModelMap[model].contextMaxToken * 0.85) + maxTokens: Math.ceil(modelTokenLimit - 300) // filter token. not response maxToken }); const adaptMessages = adaptChatItem_openAI({ messages: filterMessages, reserveId: false }); const chatAPI = getOpenAIApi(); + const promptsToken = modelToolMap[model].countTokens({ + messages: filterMessages + }); + + maxToken = maxToken + promptsToken > modelTokenLimit ? modelTokenLimit - promptsToken : maxToken; + const response = await chatAPI.createChatCompletion( { model, temperature: Number(temperature || 0), + max_tokens: maxToken, messages: adaptMessages, frequency_penalty: 0.5, // 越大,重复内容越少 presence_penalty: -0.5, // 越大,越容易出现新内容 diff --git a/client/src/types/mongoSchema.d.ts b/client/src/types/mongoSchema.d.ts index 497776933..b0338b065 100644 --- a/client/src/types/mongoSchema.d.ts +++ b/client/src/types/mongoSchema.d.ts @@ -44,6 +44,7 @@ export interface ModelSchema { searchEmptyText: string; systemPrompt: string; temperature: number; + maxToken: number; chatModel: ChatModelType; // 聊天时用的模型,训练后就是训练的模型 }; share: {