Skip to content

Commit a3d63a3

Browse files
authored
Merge pull request #71 from mirrorange/feature/prompt_with_special_tokens
feat: 更新 messagesPrepare 方法,改用特殊 Token 处理多轮会话
2 parents f763faa + 18529d1 commit a3d63a3

File tree

1 file changed

+47
-34
lines changed

1 file changed

+47
-34
lines changed

src/api/controllers/chat.ts

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -470,41 +470,54 @@ async function createCompletionStream(
470470
*
471471
* @param messages 参考gpt系列消息格式,多轮对话请完整提供上下文
472472
*/
473-
function messagesPrepare(messages: any[]) {
474-
let content;
475-
if (messages.length < 2) {
476-
content = messages.reduce((content, message) => {
477-
if (_.isArray(message.content)) {
478-
return (
479-
message.content.reduce((_content, v) => {
480-
if (!_.isObject(v) || v["type"] != "text") return _content;
481-
return _content + (v["text"] || "") + "\n";
482-
}, content)
483-
);
484-
}
485-
return content + `${message.content}\n`;
486-
}, "");
487-
logger.info("\n透传内容:\n" + content);
488-
}
489-
else {
490-
content = (
491-
messages.reduce((content, message) => {
492-
if (_.isArray(message.content)) {
493-
return (
494-
message.content.reduce((_content, v) => {
495-
if (!_.isObject(v) || v["type"] != "text") return _content;
496-
return _content + (`${message.role}:` + v["text"] || "") + "\n";
497-
}, content)
498-
);
499-
}
500-
return (content += `${message.role}:${message.content}\n`);
501-
}, "") + "assistant:"
502-
)
503-
// 移除MD图像URL避免幻觉
504-
.replace(/\!\[.+\]\(.+\)/g, "");
505-
logger.info("\n对话合并:\n" + content);
473+
function messagesPrepare(messages: any[]): string {
474+
// 处理消息内容
475+
const processedMessages = messages.map(message => {
476+
let text: string;
477+
if (Array.isArray(message.content)) {
478+
// 过滤出 type 为 "text" 的项并连接文本
479+
const texts = message.content
480+
.filter((item: any) => item.type === "text")
481+
.map((item: any) => item.text);
482+
text = texts.join('\n');
483+
} else {
484+
text = String(message.content);
485+
}
486+
return { role: message.role, text };
487+
});
488+
489+
if (processedMessages.length === 0) return '';
490+
491+
// 合并连续相同角色的消息
492+
const mergedBlocks: { role: string; text: string }[] = [];
493+
let currentBlock = { ...processedMessages[0] };
494+
495+
for (let i = 1; i < processedMessages.length; i++) {
496+
const msg = processedMessages[i];
497+
if (msg.role === currentBlock.role) {
498+
currentBlock.text += `\n\n${msg.text}`;
499+
} else {
500+
mergedBlocks.push(currentBlock);
501+
currentBlock = { ...msg };
502+
}
506503
}
507-
return content;
504+
mergedBlocks.push(currentBlock);
505+
506+
// 添加标签并连接结果
507+
return mergedBlocks
508+
.map((block, index) => {
509+
if (block.role === "assistant") {
510+
return `<|Assistant|>${block.text}<|end▁of▁sentence|>`;
511+
}
512+
513+
if (block.role === "user" || block.role === "system") {
514+
return index > 0 ? `<|User|>${block.text}` : block.text;
515+
}
516+
517+
return block.text;
518+
})
519+
.join('')
520+
.replace(/\!\[.+\]\(.+\)/g, "");
508521
}
509522

510523
/**

0 commit comments

Comments
 (0)