From eb2b3795d6f28530c31e6a04322e583c46c755c1 Mon Sep 17 00:00:00 2001 From: Yanyutin753 <132346501+Yanyutin753@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:49:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=B7=BB=E5=8A=A0prompt?= =?UTF-8?q?=E6=94=B9=E5=96=84=E4=BC=A0=E6=96=87=E4=BB=B6=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/controllers/chat.ts | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts index b19af87..f173a65 100644 --- a/src/api/controllers/chat.ts +++ b/src/api/controllers/chat.ts @@ -386,12 +386,41 @@ function extractRefFileUrls(messages: any[]) { * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 */ function messagesPrepare(convId: string, messages: any[], refs: any[]) { + // 只保留最新消息以及不包含"type": "image_url"或"type": "file"的消息 let validMessages = messages.filter((message, index) => { if (index === messages.length - 1) return true; if (!Array.isArray(message.content)) return true; // 不含"type": "image_url"或"type": "file"的消息保留 return !message.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type']))); }); + + // 检查最新消息是否含有"type": "image_url"或"type": "file",如果有则注入消息 + let latestMessage = validMessages[validMessages.length - 1]; + let hasFileOrImage = Array.isArray(latestMessage.content) + && latestMessage.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type']))); + if (hasFileOrImage) { + // 对 latestMessage.content 进行过滤,只保留不含base64的内容 + latestMessage.content = latestMessage.content.filter(v => { + if (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])) { + return !util.isBASE64Data(v['image_url']['url']); + } + return true; + }); + let newFileMessage = { + "content": "关注用户最新发送文件和消息结尾", + "role": "system" + }; + validMessages.splice(validMessages.length - 1, 0, newFileMessage); + logger.info("检查注入文件消息"); + } else { + let newTextMessage = { + "content": "关注用户消息的结尾", + "role": "system" + }; + validMessages.splice(validMessages.length - 1, 0, newTextMessage); + logger.info("检查注入文本消息"); + } + const content = validMessages.reduce((content, message) => { if (_.isArray(message.content)) { return message.content.reduce((_content, v) => { @@ -486,11 +515,11 @@ async function receiveStream(model: string, convId: string, stream: any) { let length = 0; let sizeLength = 0; let i = 0; - if(buffer[buffer.length - 1] != 125) { + if (buffer[buffer.length - 1] != 125) { temp = Buffer.concat([temp, buffer]); return; } - else if(temp.length > 0) { + else if (temp.length > 0) { buffer = Buffer.concat([temp, buffer]); temp = Buffer.from([]); } From e7df8f6ff29f1a3b18e4293e261e3424f28c2ccd Mon Sep 17 00:00:00 2001 From: Yanyutin753 <132346501+Yanyutin753@users.noreply.github.com> Date: Tue, 2 Apr 2024 20:55:02 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=80=9A=E8=BF=87=E6=B7=BB=E5=8A=A0prompt?= =?UTF-8?q?=E6=94=B9=E5=96=84=E4=BC=A0=E6=96=87=E4=BB=B6=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/controllers/chat.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts index f173a65..4754e3a 100644 --- a/src/api/controllers/chat.ts +++ b/src/api/controllers/chat.ts @@ -372,6 +372,7 @@ function extractRefFileUrls(messages: any[]) { urls.push(v['image_url']['url']); }); } + logger.info("本次请求上传:" + urls.length + "个文件"); return urls; } @@ -420,7 +421,7 @@ function messagesPrepare(convId: string, messages: any[], refs: any[]) { validMessages.splice(validMessages.length - 1, 0, newTextMessage); logger.info("检查注入文本消息"); } - + const content = validMessages.reduce((content, message) => { if (_.isArray(message.content)) { return message.content.reduce((_content, v) => { From e2e8f58a0e23b7d2b20dcea87c502c5d90ba4f3f Mon Sep 17 00:00:00 2001 From: Yanyutin753 <132346501+Yanyutin753@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:26:52 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix=20=E4=B8=8A=E4=B8=8B=E6=96=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=96=87=E4=BB=B6=E8=81=8A=E5=A4=A9=E4=B8=8D=E8=BF=9E?= =?UTF-8?q?=E8=B4=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/controllers/chat.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts index 4754e3a..71659b3 100644 --- a/src/api/controllers/chat.ts +++ b/src/api/controllers/chat.ts @@ -387,12 +387,19 @@ function extractRefFileUrls(messages: any[]) { * @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文 */ function messagesPrepare(convId: string, messages: any[], refs: any[]) { - // 只保留最新消息以及不包含"type": "image_url"或"type": "file"的消息 - let validMessages = messages.filter((message, index) => { - if (index === messages.length - 1) return true; - if (!Array.isArray(message.content)) return true; - // 不含"type": "image_url"或"type": "file"的消息保留 - return !message.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type']))); + // 先剔除所有的 base64 数据 + let validMessages = messages.map((message) => { + if (Array.isArray(message.content)) { + message.content = message.content.filter(v => { + if (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])) { + // 如果内容是 base64 数据,就剔除 + return !util.isBASE64Data(v['url']); + } + // 如果不是 base64 数据,就保留 + return true; + }); + } + return message; }); // 检查最新消息是否含有"type": "image_url"或"type": "file",如果有则注入消息 @@ -400,13 +407,6 @@ function messagesPrepare(convId: string, messages: any[], refs: any[]) { let hasFileOrImage = Array.isArray(latestMessage.content) && latestMessage.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type']))); if (hasFileOrImage) { - // 对 latestMessage.content 进行过滤,只保留不含base64的内容 - latestMessage.content = latestMessage.content.filter(v => { - if (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])) { - return !util.isBASE64Data(v['image_url']['url']); - } - return true; - }); let newFileMessage = { "content": "关注用户最新发送文件和消息结尾", "role": "system" @@ -426,7 +426,7 @@ function messagesPrepare(convId: string, messages: any[], refs: any[]) { if (_.isArray(message.content)) { return message.content.reduce((_content, v) => { if (!_.isObject(v) || v["type"] != "text") return _content; - return _content + (v["text"] || ""); + return _content + ('user:' + v['text'] || "") + "\n"; }, content); } return (content += `${message.role || "user"}:${message.content}\n`);