diff --git a/src/pages/api/chat/chat.ts b/src/pages/api/chat/chat.ts index 20112cce0..8374521b1 100644 --- a/src/pages/api/chat/chat.ts +++ b/src/pages/api/chat/chat.ts @@ -55,7 +55,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // 使用了知识库搜索 if (model.chat.useKb) { - const { code, searchPrompt, aiPrompt } = await searchKb({ + const { code, searchPrompts } = await searchKb({ userOpenAiKey, prompts, similarity: ModelVectorSearchModeMap[model.chat.searchMode]?.similarity, @@ -65,13 +65,10 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // search result is empty if (code === 201) { - return res.send(searchPrompt?.value); + return res.send(searchPrompts[0]?.value); } - if (aiPrompt) { - prompts.splice(prompts.length - 1, 0, aiPrompt); - } - searchPrompt && prompts.unshift(searchPrompt); + prompts.splice(prompts.length - 1, 0, ...searchPrompts); } else { // 没有用知识库搜索,仅用系统提示词 model.chat.systemPrompt && diff --git a/src/pages/api/openapi/chat/chat.ts b/src/pages/api/openapi/chat/chat.ts index bcacbb65f..14d688e55 100644 --- a/src/pages/api/openapi/chat/chat.ts +++ b/src/pages/api/openapi/chat/chat.ts @@ -73,7 +73,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) if (model.chat.useKb) { const similarity = ModelVectorSearchModeMap[model.chat.searchMode]?.similarity || 0.22; - const { code, searchPrompt } = await searchKb({ + const { code, searchPrompts } = await searchKb({ prompts, similarity, model, @@ -82,10 +82,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) // search result is empty if (code === 201) { - return res.send(searchPrompt?.value); + return res.send(searchPrompts[0]?.value); } - - searchPrompt && prompts.unshift(searchPrompt); + prompts.splice(prompts.length - 1, 0, ...searchPrompts); } else { // 没有用知识库搜索,仅用系统提示词 if (model.chat.systemPrompt) { diff --git a/src/pages/api/openapi/chat/lafGpt.ts b/src/pages/api/openapi/chat/lafGpt.ts index 15a37f82c..f11cec20d 100644 --- a/src/pages/api/openapi/chat/lafGpt.ts +++ b/src/pages/api/openapi/chat/lafGpt.ts @@ -122,14 +122,14 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const prompts = [prompt]; // 获取向量匹配到的提示词 - const { searchPrompt } = await searchKb({ + const { searchPrompts } = await searchKb({ similarity: ModelVectorSearchModeMap[model.chat.searchMode]?.similarity, prompts, model, userId }); - searchPrompt && prompts.unshift(searchPrompt); + prompts.splice(prompts.length - 1, 0, ...searchPrompts); // 计算温度 const temperature = (modelConstantsData.maxTemperature * (model.chat.temperature / 10)).toFixed( diff --git a/src/service/plugins/searchKb.ts b/src/service/plugins/searchKb.ts index 7e9ef3405..cff893ed0 100644 --- a/src/service/plugins/searchKb.ts +++ b/src/service/plugins/searchKb.ts @@ -23,14 +23,10 @@ export const searchKb = async ({ similarity?: number; }): Promise<{ code: 200 | 201; - searchPrompt?: { - obj: `${ChatRoleEnum.System}`; + searchPrompts: { + obj: ChatRoleEnum; value: string; - }; - aiPrompt?: { - obj: `${ChatRoleEnum.AI}`; - value: string; - }; + }[]; }> => { async function search(textArr: string[] = []) { // 获取提示词的向量 @@ -102,41 +98,58 @@ export const searchKb = async ({ if (!filterSystemPrompt && model.chat.searchMode === ModelVectorSearchModeEnum.hightSimilarity) { return { code: 201, - searchPrompt: { - obj: ChatRoleEnum.System, - value: '对不起,你的问题不在知识库中。' - } + searchPrompts: [ + { + obj: ChatRoleEnum.System, + value: '对不起,你的问题不在知识库中。' + } + ] }; } /* 高相似度+无上下文,不添加额外知识,仅用系统提示词 */ if (!filterSystemPrompt && model.chat.searchMode === ModelVectorSearchModeEnum.noContext) { return { code: 200, - searchPrompt: model.chat.systemPrompt - ? { - obj: ChatRoleEnum.System, - value: model.chat.systemPrompt - } - : undefined + searchPrompts: model.chat.systemPrompt + ? [ + { + obj: ChatRoleEnum.System, + value: model.chat.systemPrompt + } + ] + : [] }; } /* 有匹配 */ return { code: 200, - searchPrompt: { - obj: ChatRoleEnum.System, - value: `知识库:'${filterSystemPrompt}'` - }, - aiPrompt: ModelVectorSearchModeEnum.hightSimilarity - ? { - obj: 'AI', - value: `我来玩一个问答游戏,规则为: -1.我完全忘记我已有的知识 -2.我只能回答关于"${model.chat.systemPrompt || model.name}"的问题 -3.我只能从知识库中选择内容进行回答 -4.如果问题不在知识库中,我会回答"我不知道。"` - } - : undefined + searchPrompts: [ + { + obj: ChatRoleEnum.System, + value: `知识库:'${filterSystemPrompt}'` + }, + ...(model.chat.systemPrompt + ? [ + { + obj: ChatRoleEnum.System, + value: model.chat.systemPrompt + } + ] + : []), + ...(model.chat.searchMode !== ModelVectorSearchModeEnum.noContext + ? [ + { + obj: ChatRoleEnum.System, + value: `我们来玩问答游戏,规则为: +1.你完全忘记你已有的知识 +2.你只能回答关于"${model.name}"的问题 +3.你只能从知识库中选择内容进行回答 +4.如果问题不在知识库中,你会回答"我不知道。" +务必遵守规则` + } + ] + : []) + ] }; }; diff --git a/src/service/utils/chat/claude.ts b/src/service/utils/chat/claude.ts index 9aab8f313..f5735f3f2 100644 --- a/src/service/utils/chat/claude.ts +++ b/src/service/utils/chat/claude.ts @@ -27,7 +27,7 @@ export const lafClaudChat = async ({ .join('\n'); const systemPromptText = systemPrompt ? `\n知识库内容:'${systemPrompt}'\n` : ''; - const prompt = `${systemPromptText}我的问题:'${messages[messages.length - 1].value}'`; + const prompt = `${systemPromptText}\n我的问题是:'${messages[messages.length - 1].value}'`; const lafResponse = await axios.post( 'https://hnvacz.laf.run/claude-gpt',