From 67020a3c085b28461093f73bfa314eee895688a4 Mon Sep 17 00:00:00 2001 From: lichengwu Date: Sun, 17 Dec 2023 07:55:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=9A=E8=AF=91=E5=8D=83?= =?UTF-8?q?=E9=97=AE=E6=9C=80=E6=96=B0=E6=8E=A5=E5=8F=A3=EF=BC=9A1.?= =?UTF-8?q?=E5=88=A0=E9=99=A4history=E5=8F=82=E6=95=B0=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E5=AE=98=E6=96=B9=E6=8E=A8=E8=8D=90=E7=9A=84messages?= =?UTF-8?q?=E5=8F=82=E6=95=B0=202.=E6=95=B4=E7=90=86messages=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=A1=BA=E5=BA=8F=EF=BC=8C=E8=A1=A5=E5=85=85=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E4=B8=8A=E4=B8=8B=E6=96=87=E4=BF=A1=E6=81=AF=203.?= =?UTF-8?q?=E7=94=A8autogen=E8=B0=83=E8=AF=95=E6=B5=8B=E8=AF=95=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/relay-ali.go | 90 +++++++++++++++++++++++++++++++---------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/controller/relay-ali.go b/controller/relay-ali.go index b41ca327..e129effb 100644 --- a/controller/relay-ali.go +++ b/controller/relay-ali.go @@ -13,13 +13,13 @@ import ( // https://help.aliyun.com/document_detail/613695.html?spm=a2c4g.2399480.0.0.1adb778fAdzP9w#341800c0f8w0r type AliMessage struct { - User string `json:"user"` - Bot string `json:"bot"` + Content string `json:"content"` + Role string `json:"role"` } type AliInput struct { - Prompt string `json:"prompt"` - History []AliMessage `json:"history"` + //Prompt string `json:"prompt"` + Messages []AliMessage `json:"messages"` } type AliParameters struct { @@ -83,32 +83,78 @@ type AliChatResponse struct { func requestOpenAI2Ali(request GeneralOpenAIRequest) *AliChatRequest { messages := make([]AliMessage, 0, len(request.Messages)) - prompt := "" - for i := 0; i < len(request.Messages); i++ { - message := request.Messages[i] - if message.Role == "system" { - messages = append(messages, AliMessage{ - User: message.StringContent(), - Bot: "Okay", - }) - continue - } else { - if i == len(request.Messages)-1 { - prompt = message.StringContent() - break + if len(messages) == 1 { + messages = append(messages, AliMessage{ + Content: request.Messages[0].StringContent(), + Role: "user", + }) + } else { + //1. 系统消息在最前面 + //2. user和assistant必须交替成对出现 + //3. 相邻同role消息合并 + lastRole := "" + systemMessage := AliMessage{ + Content: "", + Role: "system", + } + for i := 0; i < len(request.Messages); i++ { + message := request.Messages[i] + content := message.StringContent() + if content == "" || len(content) <= 0 { + continue } + if strings.ToLower(message.Role) == "system" { + systemMessage.Content += "\n" + content + lastRole = "system" + } else if strings.ToLower(message.Role) == "user" { + if lastRole == "user" { + messages[len(messages)-1].Content += "\n" + content + } else { + messages = append(messages, AliMessage{ + Content: content, + Role: "user", + }) + } + lastRole = "user" + } else { + if lastRole == "assistant" { + messages[len(messages)-1].Content += "\n" + content + } else { + messages = append(messages, AliMessage{ + Content: content, + Role: "assistant", + }) + } + lastRole = "assistant" + } + } + // 用户需要首先提问 + if messages[0].Role != "user" { + messages = append([]AliMessage{ + { + Content: "?", + Role: "user", + }, + }, messages...) + } + // 把系统消息补充到头部 + if len(systemMessage.Content) > 0 { + messages = append([]AliMessage{systemMessage}, messages...) + } + //最后如果不是user提问,补充一个没有问题了 + if messages[len(messages)-1].Role != "user" { messages = append(messages, AliMessage{ - User: message.StringContent(), - Bot: request.Messages[i+1].StringContent(), + Content: "?", + Role: "user", }) - i++ } } + return &AliChatRequest{ Model: request.Model, Input: AliInput{ - Prompt: prompt, - History: messages, + //Prompt: prompt, + Messages: messages, }, //Parameters: AliParameters{ // ChatGPT's parameters are not compatible with Ali's // TopP: request.TopP,